GNU Linux-libre 4.14.294-gnu1
[releases.git] / drivers / clk / sunxi-ng / ccu_common.h
1 /*
2  * Copyright (c) 2016 Maxime Ripard. All rights reserved.
3  *
4  * This software is licensed under the terms of the GNU General Public
5  * License version 2, as published by the Free Software Foundation, and
6  * may be copied, distributed, and modified under those terms.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  */
13
14 #ifndef _COMMON_H_
15 #define _COMMON_H_
16
17 #include <linux/compiler.h>
18 #include <linux/clk-provider.h>
19
20 #define CCU_FEATURE_FRACTIONAL          BIT(0)
21 #define CCU_FEATURE_VARIABLE_PREDIV     BIT(1)
22 #define CCU_FEATURE_FIXED_PREDIV        BIT(2)
23 #define CCU_FEATURE_FIXED_POSTDIV       BIT(3)
24 #define CCU_FEATURE_ALL_PREDIV          BIT(4)
25 #define CCU_FEATURE_LOCK_REG            BIT(5)
26 #define CCU_FEATURE_MMC_TIMING_SWITCH   BIT(6)
27
28 /* MMC timing mode switch bit */
29 #define CCU_MMC_NEW_TIMING_MODE         BIT(30)
30
31 struct device_node;
32
33 #define CLK_HW_INIT(_name, _parent, _ops, _flags)                       \
34         &(struct clk_init_data) {                                       \
35                 .flags          = _flags,                               \
36                 .name           = _name,                                \
37                 .parent_names   = (const char *[]) { _parent },         \
38                 .num_parents    = 1,                                    \
39                 .ops            = _ops,                                 \
40         }
41
42 #define CLK_HW_INIT_PARENTS(_name, _parents, _ops, _flags)              \
43         &(struct clk_init_data) {                                       \
44                 .flags          = _flags,                               \
45                 .name           = _name,                                \
46                 .parent_names   = _parents,                             \
47                 .num_parents    = ARRAY_SIZE(_parents),                 \
48                 .ops            = _ops,                                 \
49         }
50
51 #define CLK_FIXED_FACTOR(_struct, _name, _parent,                       \
52                         _div, _mult, _flags)                            \
53         struct clk_fixed_factor _struct = {                             \
54                 .div            = _div,                                 \
55                 .mult           = _mult,                                \
56                 .hw.init        = CLK_HW_INIT(_name,                    \
57                                               _parent,                  \
58                                               &clk_fixed_factor_ops,    \
59                                               _flags),                  \
60         }
61
62 struct ccu_common {
63         void __iomem    *base;
64         u16             reg;
65         u16             lock_reg;
66         u32             prediv;
67
68         unsigned long   features;
69         spinlock_t      *lock;
70         struct clk_hw   hw;
71 };
72
73 static inline struct ccu_common *hw_to_ccu_common(struct clk_hw *hw)
74 {
75         return container_of(hw, struct ccu_common, hw);
76 }
77
78 struct sunxi_ccu_desc {
79         struct ccu_common               **ccu_clks;
80         unsigned long                   num_ccu_clks;
81
82         struct clk_hw_onecell_data      *hw_clks;
83
84         struct ccu_reset_map            *resets;
85         unsigned long                   num_resets;
86 };
87
88 void ccu_helper_wait_for_lock(struct ccu_common *common, u32 lock);
89
90 struct ccu_pll_nb {
91         struct notifier_block   clk_nb;
92         struct ccu_common       *common;
93
94         u32     enable;
95         u32     lock;
96 };
97
98 #define to_ccu_pll_nb(_nb) container_of(_nb, struct ccu_pll_nb, clk_nb)
99
100 int ccu_pll_notifier_register(struct ccu_pll_nb *pll_nb);
101
102 int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
103                     const struct sunxi_ccu_desc *desc);
104
105 #endif /* _COMMON_H_ */