1*a7b7c7c6SXukai Wang // SPDX-License-Identifier: GPL-2.0-only
2*a7b7c7c6SXukai Wang /*
3*a7b7c7c6SXukai Wang * Kendryte Canaan K230 Clock Drivers
4*a7b7c7c6SXukai Wang *
5*a7b7c7c6SXukai Wang * Author: Xukai Wang <kingxukai@zohomail.com>
6*a7b7c7c6SXukai Wang * Author: Troy Mitchell <troymitchell988@gmail.com>
7*a7b7c7c6SXukai Wang */
8*a7b7c7c6SXukai Wang
9*a7b7c7c6SXukai Wang #include <linux/bitfield.h>
10*a7b7c7c6SXukai Wang #include <linux/clk.h>
11*a7b7c7c6SXukai Wang #include <linux/clkdev.h>
12*a7b7c7c6SXukai Wang #include <linux/clk-provider.h>
13*a7b7c7c6SXukai Wang #include <linux/iopoll.h>
14*a7b7c7c6SXukai Wang #include <linux/platform_device.h>
15*a7b7c7c6SXukai Wang #include <linux/rational.h>
16*a7b7c7c6SXukai Wang #include <linux/spinlock.h>
17*a7b7c7c6SXukai Wang
18*a7b7c7c6SXukai Wang #include <dt-bindings/clock/canaan,k230-clk.h>
19*a7b7c7c6SXukai Wang
20*a7b7c7c6SXukai Wang /* PLL control register bits. */
21*a7b7c7c6SXukai Wang #define K230_PLL_BYPASS_ENABLE BIT(19)
22*a7b7c7c6SXukai Wang #define K230_PLL_GATE_ENABLE BIT(2)
23*a7b7c7c6SXukai Wang #define K230_PLL_GATE_WRITE_ENABLE BIT(18)
24*a7b7c7c6SXukai Wang #define K230_PLL_OD_MASK GENMASK(27, 24)
25*a7b7c7c6SXukai Wang #define K230_PLL_R_MASK GENMASK(21, 16)
26*a7b7c7c6SXukai Wang #define K230_PLL_F_MASK GENMASK(12, 0)
27*a7b7c7c6SXukai Wang #define K230_PLL_DIV_REG_OFFSET 0x00
28*a7b7c7c6SXukai Wang #define K230_PLL_BYPASS_REG_OFFSET 0x04
29*a7b7c7c6SXukai Wang #define K230_PLL_GATE_REG_OFFSET 0x08
30*a7b7c7c6SXukai Wang #define K230_PLL_LOCK_REG_OFFSET 0x0C
31*a7b7c7c6SXukai Wang
32*a7b7c7c6SXukai Wang /* PLL lock register */
33*a7b7c7c6SXukai Wang #define K230_PLL_LOCK_STATUS_MASK BIT(0)
34*a7b7c7c6SXukai Wang #define K230_PLL_LOCK_TIME_DELAY 400
35*a7b7c7c6SXukai Wang #define K230_PLL_LOCK_TIMEOUT 0
36*a7b7c7c6SXukai Wang
37*a7b7c7c6SXukai Wang /* K230 CLK registers offset */
38*a7b7c7c6SXukai Wang #define K230_CLK_AUDIO_CLKDIV_OFFSET 0x34
39*a7b7c7c6SXukai Wang #define K230_CLK_PDM_CLKDIV_OFFSET 0x40
40*a7b7c7c6SXukai Wang #define K230_CLK_CODEC_ADC_MCLKDIV_OFFSET 0x38
41*a7b7c7c6SXukai Wang #define K230_CLK_CODEC_DAC_MCLKDIV_OFFSET 0x3c
42*a7b7c7c6SXukai Wang
43*a7b7c7c6SXukai Wang #define K230_PLLX_DIV_ADDR(base, idx) \
44*a7b7c7c6SXukai Wang (K230_PLL_DIV_REG_OFFSET + (base) + (idx) * 0x10)
45*a7b7c7c6SXukai Wang
46*a7b7c7c6SXukai Wang #define K230_PLLX_BYPASS_ADDR(base, idx) \
47*a7b7c7c6SXukai Wang (K230_PLL_BYPASS_REG_OFFSET + (base) + (idx) * 0x10)
48*a7b7c7c6SXukai Wang
49*a7b7c7c6SXukai Wang #define K230_PLLX_GATE_ADDR(base, idx) \
50*a7b7c7c6SXukai Wang (K230_PLL_GATE_REG_OFFSET + (base) + (idx) * 0x10)
51*a7b7c7c6SXukai Wang
52*a7b7c7c6SXukai Wang #define K230_PLLX_LOCK_ADDR(base, idx) \
53*a7b7c7c6SXukai Wang (K230_PLL_LOCK_REG_OFFSET + (base) + (idx) * 0x10)
54*a7b7c7c6SXukai Wang
55*a7b7c7c6SXukai Wang #define K230_CLK_RATE_FORMAT_PNAME(_var, _id, \
56*a7b7c7c6SXukai Wang _mul_min, _mul_max, _mul_shift, _mul_mask, \
57*a7b7c7c6SXukai Wang _div_min, _div_max, _div_shift, _div_mask, \
58*a7b7c7c6SXukai Wang _reg, _bit, _method, _reg2, \
59*a7b7c7c6SXukai Wang _read_only, _flags, \
60*a7b7c7c6SXukai Wang _pname) \
61*a7b7c7c6SXukai Wang static struct k230_clk_rate _var = { \
62*a7b7c7c6SXukai Wang .div_reg_off = _reg, \
63*a7b7c7c6SXukai Wang .mul_reg_off = _reg2, \
64*a7b7c7c6SXukai Wang .id = _id, \
65*a7b7c7c6SXukai Wang .clk = { \
66*a7b7c7c6SXukai Wang .write_enable_bit = _bit, \
67*a7b7c7c6SXukai Wang .mul_min = _mul_min, \
68*a7b7c7c6SXukai Wang .mul_max = _mul_max, \
69*a7b7c7c6SXukai Wang .mul_shift = _mul_shift, \
70*a7b7c7c6SXukai Wang .mul_mask = _mul_mask, \
71*a7b7c7c6SXukai Wang .div_min = _div_min, \
72*a7b7c7c6SXukai Wang .div_max = _div_max, \
73*a7b7c7c6SXukai Wang .div_shift = _div_shift, \
74*a7b7c7c6SXukai Wang .div_mask = _div_mask, \
75*a7b7c7c6SXukai Wang .read_only = _read_only, \
76*a7b7c7c6SXukai Wang .hw.init = CLK_HW_INIT_FW_NAME(#_var, \
77*a7b7c7c6SXukai Wang _pname, &k230_clk_ops_##_method, \
78*a7b7c7c6SXukai Wang _flags), \
79*a7b7c7c6SXukai Wang }, \
80*a7b7c7c6SXukai Wang }
81*a7b7c7c6SXukai Wang
82*a7b7c7c6SXukai Wang #define K230_CLK_RATE_FORMAT(_var, _id, \
83*a7b7c7c6SXukai Wang _mul_min, _mul_max, _mul_shift, _mul_mask, \
84*a7b7c7c6SXukai Wang _div_min, _div_max, _div_shift, _div_mask, \
85*a7b7c7c6SXukai Wang _reg, _bit, _method, _reg2, \
86*a7b7c7c6SXukai Wang _read_only, _flags, \
87*a7b7c7c6SXukai Wang _phw) \
88*a7b7c7c6SXukai Wang static struct k230_clk_rate _var = { \
89*a7b7c7c6SXukai Wang .div_reg_off = _reg, \
90*a7b7c7c6SXukai Wang .mul_reg_off = _reg2, \
91*a7b7c7c6SXukai Wang .id = _id, \
92*a7b7c7c6SXukai Wang .clk = { \
93*a7b7c7c6SXukai Wang .write_enable_bit = _bit, \
94*a7b7c7c6SXukai Wang .mul_min = _mul_min, \
95*a7b7c7c6SXukai Wang .mul_max = _mul_max, \
96*a7b7c7c6SXukai Wang .mul_shift = _mul_shift, \
97*a7b7c7c6SXukai Wang .mul_mask = _mul_mask, \
98*a7b7c7c6SXukai Wang .div_min = _div_min, \
99*a7b7c7c6SXukai Wang .div_max = _div_max, \
100*a7b7c7c6SXukai Wang .div_shift = _div_shift, \
101*a7b7c7c6SXukai Wang .div_mask = _div_mask, \
102*a7b7c7c6SXukai Wang .read_only = _read_only, \
103*a7b7c7c6SXukai Wang .hw.init = CLK_HW_INIT_HW(#_var, \
104*a7b7c7c6SXukai Wang _phw, &k230_clk_ops_##_method, \
105*a7b7c7c6SXukai Wang _flags), \
106*a7b7c7c6SXukai Wang }, \
107*a7b7c7c6SXukai Wang }
108*a7b7c7c6SXukai Wang
109*a7b7c7c6SXukai Wang #define K230_CLK_GATE_FORMAT_PNAME(_var, _id, \
110*a7b7c7c6SXukai Wang _reg, _bit, _flags, _gate_flags, \
111*a7b7c7c6SXukai Wang _pname) \
112*a7b7c7c6SXukai Wang static struct k230_clk_gate _var = { \
113*a7b7c7c6SXukai Wang .reg_off = _reg, \
114*a7b7c7c6SXukai Wang .id = _id, \
115*a7b7c7c6SXukai Wang .clk = { \
116*a7b7c7c6SXukai Wang .bit_idx = _bit, \
117*a7b7c7c6SXukai Wang .flags = _gate_flags, \
118*a7b7c7c6SXukai Wang .hw.init = CLK_HW_INIT_FW_NAME(#_var, \
119*a7b7c7c6SXukai Wang _pname, &clk_gate_ops, _flags), \
120*a7b7c7c6SXukai Wang }, \
121*a7b7c7c6SXukai Wang }
122*a7b7c7c6SXukai Wang
123*a7b7c7c6SXukai Wang #define K230_CLK_GATE_FORMAT(_var, _id, \
124*a7b7c7c6SXukai Wang _reg, _bit, _flags, _gate_flags, \
125*a7b7c7c6SXukai Wang _phw) \
126*a7b7c7c6SXukai Wang static struct k230_clk_gate _var = { \
127*a7b7c7c6SXukai Wang .reg_off = _reg, \
128*a7b7c7c6SXukai Wang .id = _id, \
129*a7b7c7c6SXukai Wang .clk = { \
130*a7b7c7c6SXukai Wang .bit_idx = _bit, \
131*a7b7c7c6SXukai Wang .flags = _gate_flags, \
132*a7b7c7c6SXukai Wang .hw.init = CLK_HW_INIT_HW(#_var, \
133*a7b7c7c6SXukai Wang _phw, &clk_gate_ops, _flags), \
134*a7b7c7c6SXukai Wang }, \
135*a7b7c7c6SXukai Wang }
136*a7b7c7c6SXukai Wang
137*a7b7c7c6SXukai Wang #define K230_CLK_MUX_FORMAT(_var, _id, \
138*a7b7c7c6SXukai Wang _reg, _shift, _mask, _flags, _mux_flags, _pdata) \
139*a7b7c7c6SXukai Wang static struct k230_clk_mux _var = { \
140*a7b7c7c6SXukai Wang .reg_off = _reg, \
141*a7b7c7c6SXukai Wang .id = _id, \
142*a7b7c7c6SXukai Wang .clk = { \
143*a7b7c7c6SXukai Wang .flags = _mux_flags, \
144*a7b7c7c6SXukai Wang .shift = _shift, \
145*a7b7c7c6SXukai Wang .mask = _mask, \
146*a7b7c7c6SXukai Wang .hw.init = CLK_HW_INIT_PARENTS_DATA(#_var, \
147*a7b7c7c6SXukai Wang _pdata, &clk_mux_ops, _flags), \
148*a7b7c7c6SXukai Wang }, \
149*a7b7c7c6SXukai Wang }
150*a7b7c7c6SXukai Wang
151*a7b7c7c6SXukai Wang #define K230_CLK_FIXED_FACTOR_FORMAT(_var, \
152*a7b7c7c6SXukai Wang _mul, _div, _flags, \
153*a7b7c7c6SXukai Wang _phw) \
154*a7b7c7c6SXukai Wang static struct clk_fixed_factor _var = { \
155*a7b7c7c6SXukai Wang .mult = _mul, \
156*a7b7c7c6SXukai Wang .div = _div, \
157*a7b7c7c6SXukai Wang .hw.init = CLK_HW_INIT_HW(#_var, \
158*a7b7c7c6SXukai Wang _phw, &clk_fixed_factor_ops, _flags), \
159*a7b7c7c6SXukai Wang }
160*a7b7c7c6SXukai Wang
161*a7b7c7c6SXukai Wang #define K230_CLK_PLL_FORMAT(_var, _id, _flags, _pname) \
162*a7b7c7c6SXukai Wang static struct k230_pll _var = { \
163*a7b7c7c6SXukai Wang .hw.init = CLK_HW_INIT_FW_NAME(#_var, \
164*a7b7c7c6SXukai Wang _pname, &k230_pll_ops, _flags), \
165*a7b7c7c6SXukai Wang .id = _id, \
166*a7b7c7c6SXukai Wang }
167*a7b7c7c6SXukai Wang
168*a7b7c7c6SXukai Wang struct k230_pll {
169*a7b7c7c6SXukai Wang struct clk_hw hw;
170*a7b7c7c6SXukai Wang void __iomem *reg;
171*a7b7c7c6SXukai Wang /* ensures mutual exclusion for concurrent register access. */
172*a7b7c7c6SXukai Wang spinlock_t *lock;
173*a7b7c7c6SXukai Wang int id;
174*a7b7c7c6SXukai Wang };
175*a7b7c7c6SXukai Wang
176*a7b7c7c6SXukai Wang #define hw_to_k230_pll(_hw) container_of(_hw, struct k230_pll, hw)
177*a7b7c7c6SXukai Wang
178*a7b7c7c6SXukai Wang struct k230_clk_rate_self {
179*a7b7c7c6SXukai Wang struct clk_hw hw;
180*a7b7c7c6SXukai Wang void __iomem *reg;
181*a7b7c7c6SXukai Wang bool read_only;
182*a7b7c7c6SXukai Wang u32 write_enable_bit;
183*a7b7c7c6SXukai Wang u32 mul_min;
184*a7b7c7c6SXukai Wang u32 mul_max;
185*a7b7c7c6SXukai Wang u32 mul_shift;
186*a7b7c7c6SXukai Wang u32 mul_mask;
187*a7b7c7c6SXukai Wang u32 div_min;
188*a7b7c7c6SXukai Wang u32 div_max;
189*a7b7c7c6SXukai Wang u32 div_shift;
190*a7b7c7c6SXukai Wang u32 div_mask;
191*a7b7c7c6SXukai Wang /* ensures mutual exclusion for concurrent register access. */
192*a7b7c7c6SXukai Wang spinlock_t *lock;
193*a7b7c7c6SXukai Wang };
194*a7b7c7c6SXukai Wang
195*a7b7c7c6SXukai Wang #define hw_to_k230_clk_rate_self(_hw) container_of(_hw, \
196*a7b7c7c6SXukai Wang struct k230_clk_rate_self, hw)
197*a7b7c7c6SXukai Wang
198*a7b7c7c6SXukai Wang struct k230_clk_rate {
199*a7b7c7c6SXukai Wang u32 mul_reg_off;
200*a7b7c7c6SXukai Wang u32 div_reg_off;
201*a7b7c7c6SXukai Wang struct k230_clk_rate_self clk;
202*a7b7c7c6SXukai Wang int id;
203*a7b7c7c6SXukai Wang };
204*a7b7c7c6SXukai Wang
hw_to_k230_clk_rate(struct clk_hw * hw)205*a7b7c7c6SXukai Wang static inline struct k230_clk_rate *hw_to_k230_clk_rate(struct clk_hw *hw)
206*a7b7c7c6SXukai Wang {
207*a7b7c7c6SXukai Wang return container_of(hw_to_k230_clk_rate_self(hw), struct k230_clk_rate,
208*a7b7c7c6SXukai Wang clk);
209*a7b7c7c6SXukai Wang }
210*a7b7c7c6SXukai Wang
211*a7b7c7c6SXukai Wang struct k230_clk_gate {
212*a7b7c7c6SXukai Wang u32 reg_off;
213*a7b7c7c6SXukai Wang struct clk_gate clk;
214*a7b7c7c6SXukai Wang int id;
215*a7b7c7c6SXukai Wang };
216*a7b7c7c6SXukai Wang
217*a7b7c7c6SXukai Wang struct k230_clk_mux {
218*a7b7c7c6SXukai Wang u32 reg_off;
219*a7b7c7c6SXukai Wang struct clk_mux clk;
220*a7b7c7c6SXukai Wang int id;
221*a7b7c7c6SXukai Wang };
222*a7b7c7c6SXukai Wang
223*a7b7c7c6SXukai Wang static int k230_pll_prepare(struct clk_hw *hw);
224*a7b7c7c6SXukai Wang static int k230_pll_enable(struct clk_hw *hw);
225*a7b7c7c6SXukai Wang static void k230_pll_disable(struct clk_hw *hw);
226*a7b7c7c6SXukai Wang static int k230_pll_is_enabled(struct clk_hw *hw);
227*a7b7c7c6SXukai Wang static unsigned long k230_pll_get_rate(struct clk_hw *hw, unsigned long parent_rate);
228*a7b7c7c6SXukai Wang static int k230_clk_set_rate_mul(struct clk_hw *hw, unsigned long rate,
229*a7b7c7c6SXukai Wang unsigned long parent_rate);
230*a7b7c7c6SXukai Wang static int k230_clk_determine_rate_mul(struct clk_hw *hw, struct clk_rate_request *req);
231*a7b7c7c6SXukai Wang static unsigned long k230_clk_get_rate_mul(struct clk_hw *hw,
232*a7b7c7c6SXukai Wang unsigned long parent_rate);
233*a7b7c7c6SXukai Wang static int k230_clk_set_rate_div(struct clk_hw *hw, unsigned long rate,
234*a7b7c7c6SXukai Wang unsigned long parent_rate);
235*a7b7c7c6SXukai Wang static int k230_clk_determine_rate_div(struct clk_hw *hw, struct clk_rate_request *req);
236*a7b7c7c6SXukai Wang static unsigned long k230_clk_get_rate_div(struct clk_hw *hw,
237*a7b7c7c6SXukai Wang unsigned long parent_rate);
238*a7b7c7c6SXukai Wang static int k230_clk_set_rate_mul_div(struct clk_hw *hw, unsigned long rate,
239*a7b7c7c6SXukai Wang unsigned long parent_rate);
240*a7b7c7c6SXukai Wang static int k230_clk_determine_rate_mul_div(struct clk_hw *hw, struct clk_rate_request *req);
241*a7b7c7c6SXukai Wang static unsigned long k230_clk_get_rate_mul_div(struct clk_hw *hw,
242*a7b7c7c6SXukai Wang unsigned long parent_rate);
243*a7b7c7c6SXukai Wang
244*a7b7c7c6SXukai Wang static const struct clk_ops k230_pll_ops = {
245*a7b7c7c6SXukai Wang .prepare = k230_pll_prepare,
246*a7b7c7c6SXukai Wang .enable = k230_pll_enable,
247*a7b7c7c6SXukai Wang .disable = k230_pll_disable,
248*a7b7c7c6SXukai Wang .is_enabled = k230_pll_is_enabled,
249*a7b7c7c6SXukai Wang .recalc_rate = k230_pll_get_rate,
250*a7b7c7c6SXukai Wang };
251*a7b7c7c6SXukai Wang
252*a7b7c7c6SXukai Wang /* clk_ops for clocks whose rate is determined by a configurable multiplier */
253*a7b7c7c6SXukai Wang static const struct clk_ops k230_clk_ops_mul = {
254*a7b7c7c6SXukai Wang .set_rate = k230_clk_set_rate_mul,
255*a7b7c7c6SXukai Wang .determine_rate = k230_clk_determine_rate_mul,
256*a7b7c7c6SXukai Wang .recalc_rate = k230_clk_get_rate_mul,
257*a7b7c7c6SXukai Wang };
258*a7b7c7c6SXukai Wang
259*a7b7c7c6SXukai Wang /* clk_ops for clocks whose rate is determined by a configurable divider */
260*a7b7c7c6SXukai Wang static const struct clk_ops k230_clk_ops_div = {
261*a7b7c7c6SXukai Wang .set_rate = k230_clk_set_rate_div,
262*a7b7c7c6SXukai Wang .determine_rate = k230_clk_determine_rate_div,
263*a7b7c7c6SXukai Wang .recalc_rate = k230_clk_get_rate_div,
264*a7b7c7c6SXukai Wang };
265*a7b7c7c6SXukai Wang
266*a7b7c7c6SXukai Wang /* clk_ops for clocks whose rate is determined by both a multiplier and a divider */
267*a7b7c7c6SXukai Wang static const struct clk_ops k230_clk_ops_mul_div = {
268*a7b7c7c6SXukai Wang .set_rate = k230_clk_set_rate_mul_div,
269*a7b7c7c6SXukai Wang .determine_rate = k230_clk_determine_rate_mul_div,
270*a7b7c7c6SXukai Wang .recalc_rate = k230_clk_get_rate_mul_div,
271*a7b7c7c6SXukai Wang };
272*a7b7c7c6SXukai Wang
273*a7b7c7c6SXukai Wang K230_CLK_PLL_FORMAT(pll0, 0, CLK_IS_CRITICAL, NULL);
274*a7b7c7c6SXukai Wang K230_CLK_PLL_FORMAT(pll1, 1, CLK_IS_CRITICAL, NULL);
275*a7b7c7c6SXukai Wang K230_CLK_PLL_FORMAT(pll2, 2, CLK_IS_CRITICAL, NULL);
276*a7b7c7c6SXukai Wang K230_CLK_PLL_FORMAT(pll3, 3, CLK_IS_CRITICAL, NULL);
277*a7b7c7c6SXukai Wang
278*a7b7c7c6SXukai Wang static struct k230_pll *k230_plls[] = {
279*a7b7c7c6SXukai Wang &pll0,
280*a7b7c7c6SXukai Wang &pll1,
281*a7b7c7c6SXukai Wang &pll2,
282*a7b7c7c6SXukai Wang &pll3,
283*a7b7c7c6SXukai Wang };
284*a7b7c7c6SXukai Wang
285*a7b7c7c6SXukai Wang K230_CLK_FIXED_FACTOR_FORMAT(pll0_div2, 1, 2, 0, &pll0.hw);
286*a7b7c7c6SXukai Wang K230_CLK_FIXED_FACTOR_FORMAT(pll0_div3, 1, 3, 0, &pll0.hw);
287*a7b7c7c6SXukai Wang K230_CLK_FIXED_FACTOR_FORMAT(pll0_div4, 1, 4, 0, &pll0.hw);
288*a7b7c7c6SXukai Wang K230_CLK_FIXED_FACTOR_FORMAT(pll0_div16, 1, 16, 0, &pll0.hw);
289*a7b7c7c6SXukai Wang K230_CLK_FIXED_FACTOR_FORMAT(pll1_div2, 1, 2, 0, &pll1.hw);
290*a7b7c7c6SXukai Wang K230_CLK_FIXED_FACTOR_FORMAT(pll1_div3, 1, 3, 0, &pll1.hw);
291*a7b7c7c6SXukai Wang K230_CLK_FIXED_FACTOR_FORMAT(pll1_div4, 1, 4, 0, &pll1.hw);
292*a7b7c7c6SXukai Wang K230_CLK_FIXED_FACTOR_FORMAT(pll2_div2, 1, 2, 0, &pll2.hw);
293*a7b7c7c6SXukai Wang K230_CLK_FIXED_FACTOR_FORMAT(pll2_div3, 1, 3, 0, &pll2.hw);
294*a7b7c7c6SXukai Wang K230_CLK_FIXED_FACTOR_FORMAT(pll2_div4, 1, 4, 0, &pll2.hw);
295*a7b7c7c6SXukai Wang K230_CLK_FIXED_FACTOR_FORMAT(pll3_div2, 1, 2, 0, &pll3.hw);
296*a7b7c7c6SXukai Wang K230_CLK_FIXED_FACTOR_FORMAT(pll3_div3, 1, 3, 0, &pll3.hw);
297*a7b7c7c6SXukai Wang K230_CLK_FIXED_FACTOR_FORMAT(pll3_div4, 1, 4, 0, &pll3.hw);
298*a7b7c7c6SXukai Wang
299*a7b7c7c6SXukai Wang static struct clk_fixed_factor *k230_pll_divs[] = {
300*a7b7c7c6SXukai Wang &pll0_div2,
301*a7b7c7c6SXukai Wang &pll0_div3,
302*a7b7c7c6SXukai Wang &pll0_div4,
303*a7b7c7c6SXukai Wang &pll0_div16,
304*a7b7c7c6SXukai Wang &pll1_div2,
305*a7b7c7c6SXukai Wang &pll1_div3,
306*a7b7c7c6SXukai Wang &pll1_div4,
307*a7b7c7c6SXukai Wang &pll2_div2,
308*a7b7c7c6SXukai Wang &pll2_div3,
309*a7b7c7c6SXukai Wang &pll2_div4,
310*a7b7c7c6SXukai Wang &pll3_div2,
311*a7b7c7c6SXukai Wang &pll3_div3,
312*a7b7c7c6SXukai Wang &pll3_div4,
313*a7b7c7c6SXukai Wang };
314*a7b7c7c6SXukai Wang
315*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(cpu0_src_gate,
316*a7b7c7c6SXukai Wang K230_CPU0_SRC_GATE,
317*a7b7c7c6SXukai Wang 0, 0, CLK_IS_CRITICAL, 0,
318*a7b7c7c6SXukai Wang &pll0_div2.hw);
319*a7b7c7c6SXukai Wang
320*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(cpu0_src_rate,
321*a7b7c7c6SXukai Wang K230_CPU0_SRC_RATE,
322*a7b7c7c6SXukai Wang 1, 16, 1, 0xF,
323*a7b7c7c6SXukai Wang 16, 16, 0, 0x0,
324*a7b7c7c6SXukai Wang 0x0, 31, mul, 0x0,
325*a7b7c7c6SXukai Wang false, 0,
326*a7b7c7c6SXukai Wang &cpu0_src_gate.clk.hw);
327*a7b7c7c6SXukai Wang
328*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(cpu0_axi_rate,
329*a7b7c7c6SXukai Wang K230_CPU0_AXI_RATE,
330*a7b7c7c6SXukai Wang 1, 1, 0, 0,
331*a7b7c7c6SXukai Wang 1, 8, 6, 0x7,
332*a7b7c7c6SXukai Wang 0x0, 31, div, 0x0,
333*a7b7c7c6SXukai Wang 0, 0,
334*a7b7c7c6SXukai Wang &cpu0_src_rate.clk.hw);
335*a7b7c7c6SXukai Wang
336*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(cpu0_plic_gate,
337*a7b7c7c6SXukai Wang K230_CPU0_PLIC_GATE,
338*a7b7c7c6SXukai Wang 0x0, 9, CLK_IS_CRITICAL, 0,
339*a7b7c7c6SXukai Wang &cpu0_src_rate.clk.hw);
340*a7b7c7c6SXukai Wang
341*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(cpu0_plic_rate,
342*a7b7c7c6SXukai Wang K230_CPU0_PLIC_RATE,
343*a7b7c7c6SXukai Wang 1, 1, 0, 0,
344*a7b7c7c6SXukai Wang 1, 8, 10, 0x7,
345*a7b7c7c6SXukai Wang 0x0, 31, div, 0x0,
346*a7b7c7c6SXukai Wang false, 0,
347*a7b7c7c6SXukai Wang &cpu0_plic_gate.clk.hw);
348*a7b7c7c6SXukai Wang
349*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(cpu0_noc_ddrcp4_gate,
350*a7b7c7c6SXukai Wang K230_CPU0_NOC_DDRCP4_GATE,
351*a7b7c7c6SXukai Wang 0x60, 7, CLK_IS_CRITICAL, 0,
352*a7b7c7c6SXukai Wang &cpu0_src_rate.clk.hw);
353*a7b7c7c6SXukai Wang
354*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(cpu0_apb_gate,
355*a7b7c7c6SXukai Wang K230_CPU0_APB_GATE,
356*a7b7c7c6SXukai Wang 0x0, 13, CLK_IS_CRITICAL, 0,
357*a7b7c7c6SXukai Wang &pll0_div4.hw);
358*a7b7c7c6SXukai Wang
359*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(cpu0_apb_rate,
360*a7b7c7c6SXukai Wang K230_CPU0_APB_RATE,
361*a7b7c7c6SXukai Wang 1, 1, 0, 0,
362*a7b7c7c6SXukai Wang 1, 8, 15, 0x7,
363*a7b7c7c6SXukai Wang 0x0, 31, div, 0x0,
364*a7b7c7c6SXukai Wang false, 0,
365*a7b7c7c6SXukai Wang &cpu0_apb_gate.clk.hw);
366*a7b7c7c6SXukai Wang
367*a7b7c7c6SXukai Wang static const struct clk_parent_data k230_cpu1_src_mux_pdata[] = {
368*a7b7c7c6SXukai Wang { .hw = &pll1_div2.hw, },
369*a7b7c7c6SXukai Wang { .hw = &pll3.hw, },
370*a7b7c7c6SXukai Wang { .hw = &pll0.hw, },
371*a7b7c7c6SXukai Wang };
372*a7b7c7c6SXukai Wang
373*a7b7c7c6SXukai Wang K230_CLK_MUX_FORMAT(cpu1_src_mux,
374*a7b7c7c6SXukai Wang K230_CPU1_SRC_MUX,
375*a7b7c7c6SXukai Wang 0x4, 1, 0x3,
376*a7b7c7c6SXukai Wang 0, 0,
377*a7b7c7c6SXukai Wang k230_cpu1_src_mux_pdata);
378*a7b7c7c6SXukai Wang
379*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(cpu1_src_gate,
380*a7b7c7c6SXukai Wang K230_CPU1_SRC_GATE,
381*a7b7c7c6SXukai Wang 0x4, 0, CLK_IS_CRITICAL, 0,
382*a7b7c7c6SXukai Wang &cpu1_src_mux.clk.hw);
383*a7b7c7c6SXukai Wang
384*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(cpu1_src_rate,
385*a7b7c7c6SXukai Wang K230_CPU1_SRC_RATE,
386*a7b7c7c6SXukai Wang 1, 1, 0, 0,
387*a7b7c7c6SXukai Wang 1, 8, 3, 0x7,
388*a7b7c7c6SXukai Wang 0x4, 31, div, 0x0,
389*a7b7c7c6SXukai Wang false, 0,
390*a7b7c7c6SXukai Wang &cpu1_src_gate.clk.hw);
391*a7b7c7c6SXukai Wang
392*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(cpu1_axi_rate,
393*a7b7c7c6SXukai Wang K230_CPU1_AXI_RATE,
394*a7b7c7c6SXukai Wang 1, 1, 0, 0,
395*a7b7c7c6SXukai Wang 1, 8, 12, 0x7,
396*a7b7c7c6SXukai Wang 0x4, 31, div, 0x0,
397*a7b7c7c6SXukai Wang false, 0,
398*a7b7c7c6SXukai Wang &cpu1_src_rate.clk.hw);
399*a7b7c7c6SXukai Wang
400*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(cpu1_plic_gate,
401*a7b7c7c6SXukai Wang K230_CPU1_PLIC_GATE,
402*a7b7c7c6SXukai Wang 0x4, 15, CLK_IS_CRITICAL, 0,
403*a7b7c7c6SXukai Wang &cpu1_src_rate.clk.hw);
404*a7b7c7c6SXukai Wang
405*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(cpu1_plic_rate,
406*a7b7c7c6SXukai Wang K230_CPU1_PLIC_RATE,
407*a7b7c7c6SXukai Wang 1, 1, 0, 0,
408*a7b7c7c6SXukai Wang 1, 8, 16, 0x7,
409*a7b7c7c6SXukai Wang 0x4, 31, div, 0x0,
410*a7b7c7c6SXukai Wang false, 0,
411*a7b7c7c6SXukai Wang &cpu1_plic_gate.clk.hw);
412*a7b7c7c6SXukai Wang
413*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(cpu1_apb_gate,
414*a7b7c7c6SXukai Wang K230_CPU1_APB_GATE,
415*a7b7c7c6SXukai Wang 0x4, 19, CLK_IS_CRITICAL, 0,
416*a7b7c7c6SXukai Wang &pll0_div4.hw);
417*a7b7c7c6SXukai Wang
418*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT_PNAME(pmu_apb_gate,
419*a7b7c7c6SXukai Wang K230_PMU_APB_GATE,
420*a7b7c7c6SXukai Wang 0x10, 0, 0, 0,
421*a7b7c7c6SXukai Wang "osc24m");
422*a7b7c7c6SXukai Wang
423*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_hclk_high_gate,
424*a7b7c7c6SXukai Wang K230_HS_HCLK_HIGH_GATE,
425*a7b7c7c6SXukai Wang 0x18, 1, 0, 0,
426*a7b7c7c6SXukai Wang &pll0_div4.hw);
427*a7b7c7c6SXukai Wang
428*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(hs_hclk_high_rate,
429*a7b7c7c6SXukai Wang K230_HS_HCLK_HIGH_RATE,
430*a7b7c7c6SXukai Wang 1, 1, 0, 0,
431*a7b7c7c6SXukai Wang 1, 8, 0, 0x7,
432*a7b7c7c6SXukai Wang 0x1C, 31, div, 0x0,
433*a7b7c7c6SXukai Wang false, 0,
434*a7b7c7c6SXukai Wang &hs_hclk_high_gate.clk.hw);
435*a7b7c7c6SXukai Wang
436*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_hclk_gate,
437*a7b7c7c6SXukai Wang K230_HS_HCLK_GATE,
438*a7b7c7c6SXukai Wang 0x18, 0, 0, 0,
439*a7b7c7c6SXukai Wang &hs_hclk_high_rate.clk.hw);
440*a7b7c7c6SXukai Wang
441*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(hs_hclk_rate,
442*a7b7c7c6SXukai Wang K230_HS_HCLK_RATE,
443*a7b7c7c6SXukai Wang 1, 1, 0, 0,
444*a7b7c7c6SXukai Wang 1, 8, 3, 0x7,
445*a7b7c7c6SXukai Wang 0x1C, 31, div, 0x0,
446*a7b7c7c6SXukai Wang false, 0,
447*a7b7c7c6SXukai Wang &hs_hclk_gate.clk.hw);
448*a7b7c7c6SXukai Wang
449*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_sd0_ahb_gate,
450*a7b7c7c6SXukai Wang K230_HS_SD0_AHB_GATE,
451*a7b7c7c6SXukai Wang 0x18, 2, 0, 0,
452*a7b7c7c6SXukai Wang &hs_hclk_rate.clk.hw);
453*a7b7c7c6SXukai Wang
454*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_sd1_ahb_gate,
455*a7b7c7c6SXukai Wang K230_HS_SD1_AHB_GATE,
456*a7b7c7c6SXukai Wang 0x18, 3, 0, 0,
457*a7b7c7c6SXukai Wang &hs_hclk_rate.clk.hw);
458*a7b7c7c6SXukai Wang
459*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_ssi1_ahb_gate,
460*a7b7c7c6SXukai Wang K230_HS_SSI1_AHB_GATE,
461*a7b7c7c6SXukai Wang 0x18, 7, 0, 0,
462*a7b7c7c6SXukai Wang &hs_hclk_rate.clk.hw);
463*a7b7c7c6SXukai Wang
464*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_ssi2_ahb_gate,
465*a7b7c7c6SXukai Wang K230_HS_SSI2_AHB_GATE,
466*a7b7c7c6SXukai Wang 0x18, 8, 0, 0,
467*a7b7c7c6SXukai Wang &hs_hclk_rate.clk.hw);
468*a7b7c7c6SXukai Wang
469*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_usb0_ahb_gate,
470*a7b7c7c6SXukai Wang K230_HS_USB0_AHB_GATE,
471*a7b7c7c6SXukai Wang 0x18, 4, 0, 0,
472*a7b7c7c6SXukai Wang &hs_hclk_rate.clk.hw);
473*a7b7c7c6SXukai Wang
474*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_usb1_ahb_gate,
475*a7b7c7c6SXukai Wang K230_HS_USB1_AHB_GATE,
476*a7b7c7c6SXukai Wang 0x18, 5, 0, 0,
477*a7b7c7c6SXukai Wang &hs_hclk_rate.clk.hw);
478*a7b7c7c6SXukai Wang
479*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_ssi0_axi_gate,
480*a7b7c7c6SXukai Wang K230_HS_SSI0_AXI_GATE,
481*a7b7c7c6SXukai Wang 0x18, 27, 0, 0,
482*a7b7c7c6SXukai Wang &pll0_div4.hw);
483*a7b7c7c6SXukai Wang
484*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(hs_ssi0_axi_rate,
485*a7b7c7c6SXukai Wang K230_HS_SSI0_AXI_RATE,
486*a7b7c7c6SXukai Wang 1, 1, 0, 0,
487*a7b7c7c6SXukai Wang 1, 8, 9, 0x7,
488*a7b7c7c6SXukai Wang 0x20, 31, div, 0x0,
489*a7b7c7c6SXukai Wang false, 0,
490*a7b7c7c6SXukai Wang &hs_ssi0_axi_gate.clk.hw);
491*a7b7c7c6SXukai Wang
492*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_ssi1_gate,
493*a7b7c7c6SXukai Wang K230_HS_SSI1_GATE,
494*a7b7c7c6SXukai Wang 0x18, 25, 0, 0,
495*a7b7c7c6SXukai Wang &pll0_div4.hw);
496*a7b7c7c6SXukai Wang
497*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(hs_ssi1_rate,
498*a7b7c7c6SXukai Wang K230_HS_SSI1_RATE,
499*a7b7c7c6SXukai Wang 1, 1, 0, 0,
500*a7b7c7c6SXukai Wang 1, 8, 3, 0x7,
501*a7b7c7c6SXukai Wang 0x20, 31, div, 0x0,
502*a7b7c7c6SXukai Wang false, 0,
503*a7b7c7c6SXukai Wang &hs_ssi1_gate.clk.hw);
504*a7b7c7c6SXukai Wang
505*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_ssi2_gate,
506*a7b7c7c6SXukai Wang K230_HS_SSI2_GATE,
507*a7b7c7c6SXukai Wang 0x18, 26, 0, 0,
508*a7b7c7c6SXukai Wang &pll0_div4.hw);
509*a7b7c7c6SXukai Wang
510*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(hs_ssi2_rate,
511*a7b7c7c6SXukai Wang K230_HS_SSI2_RATE,
512*a7b7c7c6SXukai Wang 1, 1, 0, 0,
513*a7b7c7c6SXukai Wang 1, 8, 6, 0x7,
514*a7b7c7c6SXukai Wang 0x20, 31, div, 0x0,
515*a7b7c7c6SXukai Wang false, 0,
516*a7b7c7c6SXukai Wang &hs_ssi2_gate.clk.hw);
517*a7b7c7c6SXukai Wang
518*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_qspi_axi_src_gate,
519*a7b7c7c6SXukai Wang K230_HS_QSPI_AXI_SRC_GATE,
520*a7b7c7c6SXukai Wang 0x18, 28, 0, 0,
521*a7b7c7c6SXukai Wang &pll0_div4.hw);
522*a7b7c7c6SXukai Wang
523*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(hs_qspi_axi_src_rate,
524*a7b7c7c6SXukai Wang K230_HS_QSPI_AXI_SRC_RATE,
525*a7b7c7c6SXukai Wang 1, 1, 0, 0,
526*a7b7c7c6SXukai Wang 1, 8, 12, 0x7,
527*a7b7c7c6SXukai Wang 0x20, 31, div, 0x0,
528*a7b7c7c6SXukai Wang false, 0,
529*a7b7c7c6SXukai Wang &hs_qspi_axi_src_gate.clk.hw);
530*a7b7c7c6SXukai Wang
531*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_ssi1_axi_gate,
532*a7b7c7c6SXukai Wang K230_HS_SSI1_AXI_GATE,
533*a7b7c7c6SXukai Wang 0x18, 29, 0, 0,
534*a7b7c7c6SXukai Wang &hs_qspi_axi_src_rate.clk.hw);
535*a7b7c7c6SXukai Wang
536*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_ssi2_axi_gate,
537*a7b7c7c6SXukai Wang K230_HS_SSI2_AXI_GATE,
538*a7b7c7c6SXukai Wang 0x18, 30, 0, 0,
539*a7b7c7c6SXukai Wang &hs_qspi_axi_src_rate.clk.hw);
540*a7b7c7c6SXukai Wang
541*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_sd_card_src_gate,
542*a7b7c7c6SXukai Wang K230_HS_SD_CARD_SRC_GATE,
543*a7b7c7c6SXukai Wang 0x18, 11, 0, 0,
544*a7b7c7c6SXukai Wang &pll0_div4.hw);
545*a7b7c7c6SXukai Wang
546*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(hs_sd_card_src_rate,
547*a7b7c7c6SXukai Wang K230_HS_SD_CARD_SRC_RATE,
548*a7b7c7c6SXukai Wang 1, 1, 0, 0,
549*a7b7c7c6SXukai Wang 2, 8, 12, 0x7,
550*a7b7c7c6SXukai Wang 0x1C, 31, div, 0x0,
551*a7b7c7c6SXukai Wang false, 0,
552*a7b7c7c6SXukai Wang &hs_sd_card_src_gate.clk.hw);
553*a7b7c7c6SXukai Wang
554*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_sd0_card_gate,
555*a7b7c7c6SXukai Wang K230_HS_SD0_CARD_GATE,
556*a7b7c7c6SXukai Wang 0x18, 15, 0, 0,
557*a7b7c7c6SXukai Wang &hs_sd_card_src_rate.clk.hw);
558*a7b7c7c6SXukai Wang
559*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_sd1_card_gate,
560*a7b7c7c6SXukai Wang K230_HS_SD1_CARD_GATE,
561*a7b7c7c6SXukai Wang 0x18, 19, 0, 0,
562*a7b7c7c6SXukai Wang &hs_sd_card_src_rate.clk.hw);
563*a7b7c7c6SXukai Wang
564*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_sd_axi_src_gate,
565*a7b7c7c6SXukai Wang K230_HS_SD_AXI_SRC_GATE,
566*a7b7c7c6SXukai Wang 0x18, 9, 0, 0,
567*a7b7c7c6SXukai Wang &pll2_div4.hw);
568*a7b7c7c6SXukai Wang
569*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(hs_sd_axi_src_rate,
570*a7b7c7c6SXukai Wang K230_HS_SD_AXI_SRC_RATE,
571*a7b7c7c6SXukai Wang 1, 1, 0, 0,
572*a7b7c7c6SXukai Wang 1, 8, 6, 0x7,
573*a7b7c7c6SXukai Wang 0x1C, 31, div, 0x0,
574*a7b7c7c6SXukai Wang false, 0,
575*a7b7c7c6SXukai Wang &hs_sd_axi_src_gate.clk.hw);
576*a7b7c7c6SXukai Wang
577*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_sd0_axi_gate,
578*a7b7c7c6SXukai Wang K230_HS_SD0_AXI_GATE,
579*a7b7c7c6SXukai Wang 0x18, 13, 0, 0,
580*a7b7c7c6SXukai Wang &hs_sd_axi_src_rate.clk.hw);
581*a7b7c7c6SXukai Wang
582*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_sd1_axi_gate,
583*a7b7c7c6SXukai Wang K230_HS_SD1_AXI_GATE,
584*a7b7c7c6SXukai Wang 0x18, 17, 0, 0,
585*a7b7c7c6SXukai Wang &hs_sd_axi_src_rate.clk.hw);
586*a7b7c7c6SXukai Wang
587*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_sd0_base_gate,
588*a7b7c7c6SXukai Wang K230_HS_SD0_BASE_GATE,
589*a7b7c7c6SXukai Wang 0x18, 14, 0, 0,
590*a7b7c7c6SXukai Wang &hs_sd_axi_src_rate.clk.hw);
591*a7b7c7c6SXukai Wang
592*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_sd1_base_gate,
593*a7b7c7c6SXukai Wang K230_HS_SD1_BASE_GATE,
594*a7b7c7c6SXukai Wang 0x18, 18, 0, 0,
595*a7b7c7c6SXukai Wang &hs_sd_axi_src_rate.clk.hw);
596*a7b7c7c6SXukai Wang
597*a7b7c7c6SXukai Wang static const struct clk_parent_data k230_hs_ssi0_mux_pdata[] = {
598*a7b7c7c6SXukai Wang { .hw = &pll0_div2.hw, },
599*a7b7c7c6SXukai Wang { .hw = &pll2_div4.hw, },
600*a7b7c7c6SXukai Wang };
601*a7b7c7c6SXukai Wang
602*a7b7c7c6SXukai Wang K230_CLK_MUX_FORMAT(hs_ssi0_mux,
603*a7b7c7c6SXukai Wang K230_HS_SSI0_MUX,
604*a7b7c7c6SXukai Wang 0x20, 18, 0x1,
605*a7b7c7c6SXukai Wang 0, 0,
606*a7b7c7c6SXukai Wang k230_hs_ssi0_mux_pdata);
607*a7b7c7c6SXukai Wang
608*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_ssi0_gate,
609*a7b7c7c6SXukai Wang K230_HS_SSI0_GATE,
610*a7b7c7c6SXukai Wang 0x18, 24, CLK_IGNORE_UNUSED, 0,
611*a7b7c7c6SXukai Wang &hs_ssi0_mux.clk.hw);
612*a7b7c7c6SXukai Wang
613*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(hs_usb_ref_50m_rate,
614*a7b7c7c6SXukai Wang K230_HS_USB_REF_50M_RATE,
615*a7b7c7c6SXukai Wang 1, 1, 0, 0,
616*a7b7c7c6SXukai Wang 1, 8, 15, 0x7,
617*a7b7c7c6SXukai Wang 0x20, 31, div, 0x0,
618*a7b7c7c6SXukai Wang false, 0,
619*a7b7c7c6SXukai Wang &pll0_div16.hw);
620*a7b7c7c6SXukai Wang
621*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT_PNAME(hs_sd_timer_src_gate,
622*a7b7c7c6SXukai Wang K230_HS_SD_TIMER_SRC_GATE,
623*a7b7c7c6SXukai Wang 0x18, 12, 0, 0,
624*a7b7c7c6SXukai Wang "osc24m");
625*a7b7c7c6SXukai Wang
626*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(hs_sd_timer_src_rate,
627*a7b7c7c6SXukai Wang K230_HS_SD_TIMER_SRC_RATE,
628*a7b7c7c6SXukai Wang 1, 1, 0, 0,
629*a7b7c7c6SXukai Wang 24, 32, 15, 0x1F,
630*a7b7c7c6SXukai Wang 0x1C, 31, div, 0x0,
631*a7b7c7c6SXukai Wang false, 0,
632*a7b7c7c6SXukai Wang &hs_sd_timer_src_gate.clk.hw);
633*a7b7c7c6SXukai Wang
634*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_sd0_timer_gate,
635*a7b7c7c6SXukai Wang K230_HS_SD0_TIMER_GATE,
636*a7b7c7c6SXukai Wang 0x18, 16, 0, 0,
637*a7b7c7c6SXukai Wang &hs_sd_timer_src_rate.clk.hw);
638*a7b7c7c6SXukai Wang
639*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_sd1_timer_gate,
640*a7b7c7c6SXukai Wang K230_HS_SD1_TIMER_GATE,
641*a7b7c7c6SXukai Wang 0x18, 20, 0, 0,
642*a7b7c7c6SXukai Wang &hs_sd_timer_src_rate.clk.hw);
643*a7b7c7c6SXukai Wang
644*a7b7c7c6SXukai Wang static const struct clk_parent_data k230_hs_usb_ref_mux_pdata[] = {
645*a7b7c7c6SXukai Wang { .fw_name = "osc24m", },
646*a7b7c7c6SXukai Wang { .hw = &hs_usb_ref_50m_rate.clk.hw, },
647*a7b7c7c6SXukai Wang };
648*a7b7c7c6SXukai Wang
649*a7b7c7c6SXukai Wang K230_CLK_MUX_FORMAT(hs_usb_ref_mux,
650*a7b7c7c6SXukai Wang K230_HS_USB_REF_MUX,
651*a7b7c7c6SXukai Wang 0x18, 23, 0x1,
652*a7b7c7c6SXukai Wang 0, 0,
653*a7b7c7c6SXukai Wang k230_hs_usb_ref_mux_pdata);
654*a7b7c7c6SXukai Wang
655*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_usb0_ref_gate,
656*a7b7c7c6SXukai Wang K230_HS_USB0_REF_GATE,
657*a7b7c7c6SXukai Wang 0x18, 21, CLK_IGNORE_UNUSED, 0,
658*a7b7c7c6SXukai Wang &hs_usb_ref_mux.clk.hw);
659*a7b7c7c6SXukai Wang
660*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(hs_usb1_ref_gate,
661*a7b7c7c6SXukai Wang K230_HS_USB1_REF_GATE,
662*a7b7c7c6SXukai Wang 0x18, 22, CLK_IGNORE_UNUSED, 0,
663*a7b7c7c6SXukai Wang &hs_usb_ref_mux.clk.hw);
664*a7b7c7c6SXukai Wang
665*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_apb_src_gate,
666*a7b7c7c6SXukai Wang K230_LS_APB_SRC_GATE,
667*a7b7c7c6SXukai Wang 0x24, 0, CLK_IS_CRITICAL, 0,
668*a7b7c7c6SXukai Wang &pll0_div4.hw);
669*a7b7c7c6SXukai Wang
670*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ls_apb_src_rate,
671*a7b7c7c6SXukai Wang K230_LS_APB_SRC_RATE,
672*a7b7c7c6SXukai Wang 1, 1, 0, 0,
673*a7b7c7c6SXukai Wang 1, 8, 0, 0x7,
674*a7b7c7c6SXukai Wang 0x30, 31, div, 0x0,
675*a7b7c7c6SXukai Wang false, 0,
676*a7b7c7c6SXukai Wang &ls_apb_src_gate.clk.hw);
677*a7b7c7c6SXukai Wang
678*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_uart0_apb_gate,
679*a7b7c7c6SXukai Wang K230_LS_UART0_APB_GATE,
680*a7b7c7c6SXukai Wang 0x24, 1, CLK_IS_CRITICAL, 0,
681*a7b7c7c6SXukai Wang &ls_apb_src_rate.clk.hw);
682*a7b7c7c6SXukai Wang
683*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_uart1_apb_gate,
684*a7b7c7c6SXukai Wang K230_LS_UART1_APB_GATE,
685*a7b7c7c6SXukai Wang 0x24, 2, CLK_IS_CRITICAL, 0,
686*a7b7c7c6SXukai Wang &ls_apb_src_rate.clk.hw);
687*a7b7c7c6SXukai Wang
688*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_uart2_apb_gate,
689*a7b7c7c6SXukai Wang K230_LS_UART2_APB_GATE,
690*a7b7c7c6SXukai Wang 0x24, 3, CLK_IS_CRITICAL, 0,
691*a7b7c7c6SXukai Wang &ls_apb_src_rate.clk.hw);
692*a7b7c7c6SXukai Wang
693*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_uart3_apb_gate,
694*a7b7c7c6SXukai Wang K230_LS_UART3_APB_GATE,
695*a7b7c7c6SXukai Wang 0x24, 4, CLK_IS_CRITICAL, 0,
696*a7b7c7c6SXukai Wang &ls_apb_src_rate.clk.hw);
697*a7b7c7c6SXukai Wang
698*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_uart4_apb_gate,
699*a7b7c7c6SXukai Wang K230_LS_UART4_APB_GATE,
700*a7b7c7c6SXukai Wang 0x24, 5, CLK_IS_CRITICAL, 0,
701*a7b7c7c6SXukai Wang &ls_apb_src_rate.clk.hw);
702*a7b7c7c6SXukai Wang
703*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_i2c0_apb_gate,
704*a7b7c7c6SXukai Wang K230_LS_I2C0_APB_GATE,
705*a7b7c7c6SXukai Wang 0x24, 6, 0, 0,
706*a7b7c7c6SXukai Wang &ls_apb_src_rate.clk.hw);
707*a7b7c7c6SXukai Wang
708*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_i2c1_apb_gate,
709*a7b7c7c6SXukai Wang K230_LS_I2C1_APB_GATE,
710*a7b7c7c6SXukai Wang 0x24, 7, 0, 0,
711*a7b7c7c6SXukai Wang &ls_apb_src_rate.clk.hw);
712*a7b7c7c6SXukai Wang
713*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_i2c2_apb_gate,
714*a7b7c7c6SXukai Wang K230_LS_I2C2_APB_GATE,
715*a7b7c7c6SXukai Wang 0x24, 8, 0, 0,
716*a7b7c7c6SXukai Wang &ls_apb_src_rate.clk.hw);
717*a7b7c7c6SXukai Wang
718*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_i2c3_apb_gate,
719*a7b7c7c6SXukai Wang K230_LS_I2C3_APB_GATE,
720*a7b7c7c6SXukai Wang 0x24, 9, 0, 0,
721*a7b7c7c6SXukai Wang &ls_apb_src_rate.clk.hw);
722*a7b7c7c6SXukai Wang
723*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_i2c4_apb_gate,
724*a7b7c7c6SXukai Wang K230_LS_I2C4_APB_GATE,
725*a7b7c7c6SXukai Wang 0x24, 10, 0, 0,
726*a7b7c7c6SXukai Wang &ls_apb_src_rate.clk.hw);
727*a7b7c7c6SXukai Wang
728*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_gpio_apb_gate,
729*a7b7c7c6SXukai Wang K230_LS_GPIO_APB_GATE,
730*a7b7c7c6SXukai Wang 0x24, 11, 0, 0,
731*a7b7c7c6SXukai Wang &ls_apb_src_rate.clk.hw);
732*a7b7c7c6SXukai Wang
733*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_pwm_apb_gate,
734*a7b7c7c6SXukai Wang K230_LS_PWM_APB_GATE,
735*a7b7c7c6SXukai Wang 0x24, 12, 0, 0,
736*a7b7c7c6SXukai Wang &ls_apb_src_rate.clk.hw);
737*a7b7c7c6SXukai Wang
738*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_jamlink0_apb_gate,
739*a7b7c7c6SXukai Wang K230_LS_JAMLINK0_APB_GATE,
740*a7b7c7c6SXukai Wang 0x28, 4, 0, 0,
741*a7b7c7c6SXukai Wang &ls_apb_src_rate.clk.hw);
742*a7b7c7c6SXukai Wang
743*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_jamlink1_apb_gate,
744*a7b7c7c6SXukai Wang K230_LS_JAMLINK1_APB_GATE,
745*a7b7c7c6SXukai Wang 0x28, 5, 0, 0,
746*a7b7c7c6SXukai Wang &ls_apb_src_rate.clk.hw);
747*a7b7c7c6SXukai Wang
748*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_jamlink2_apb_gate,
749*a7b7c7c6SXukai Wang K230_LS_JAMLINK2_APB_GATE,
750*a7b7c7c6SXukai Wang 0x28, 6, 0, 0,
751*a7b7c7c6SXukai Wang &ls_apb_src_rate.clk.hw);
752*a7b7c7c6SXukai Wang
753*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_jamlink3_apb_gate,
754*a7b7c7c6SXukai Wang K230_LS_JAMLINK3_APB_GATE,
755*a7b7c7c6SXukai Wang 0x28, 7, 0, 0,
756*a7b7c7c6SXukai Wang &ls_apb_src_rate.clk.hw);
757*a7b7c7c6SXukai Wang
758*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_audio_apb_gate,
759*a7b7c7c6SXukai Wang K230_LS_AUDIO_APB_GATE,
760*a7b7c7c6SXukai Wang 0x24, 13, 0, 0,
761*a7b7c7c6SXukai Wang &ls_apb_src_rate.clk.hw);
762*a7b7c7c6SXukai Wang
763*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_adc_apb_gate,
764*a7b7c7c6SXukai Wang K230_LS_ADC_APB_GATE,
765*a7b7c7c6SXukai Wang 0x24, 15, 0, 0,
766*a7b7c7c6SXukai Wang &ls_apb_src_rate.clk.hw);
767*a7b7c7c6SXukai Wang
768*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_codec_apb_gate,
769*a7b7c7c6SXukai Wang K230_LS_CODEC_APB_GATE,
770*a7b7c7c6SXukai Wang 0x24, 14, 0, 0,
771*a7b7c7c6SXukai Wang &ls_apb_src_rate.clk.hw);
772*a7b7c7c6SXukai Wang
773*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_i2c0_gate,
774*a7b7c7c6SXukai Wang K230_LS_I2C0_GATE,
775*a7b7c7c6SXukai Wang 0x24, 21, 0, 0,
776*a7b7c7c6SXukai Wang &pll0_div4.hw);
777*a7b7c7c6SXukai Wang
778*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ls_i2c0_rate,
779*a7b7c7c6SXukai Wang K230_LS_I2C0_RATE,
780*a7b7c7c6SXukai Wang 1, 1, 0, 0,
781*a7b7c7c6SXukai Wang 1, 8, 15, 0x7,
782*a7b7c7c6SXukai Wang 0x2C, 31, div, 0x0,
783*a7b7c7c6SXukai Wang false, 0,
784*a7b7c7c6SXukai Wang &ls_i2c0_gate.clk.hw);
785*a7b7c7c6SXukai Wang
786*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_i2c1_gate,
787*a7b7c7c6SXukai Wang K230_LS_I2C1_GATE,
788*a7b7c7c6SXukai Wang 0x24, 22, 0, 0,
789*a7b7c7c6SXukai Wang &pll0_div4.hw);
790*a7b7c7c6SXukai Wang
791*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ls_i2c1_rate,
792*a7b7c7c6SXukai Wang K230_LS_I2C1_RATE,
793*a7b7c7c6SXukai Wang 1, 1, 0, 0,
794*a7b7c7c6SXukai Wang 1, 8, 18, 0x7,
795*a7b7c7c6SXukai Wang 0x2C, 31, div, 0x0,
796*a7b7c7c6SXukai Wang false, 0,
797*a7b7c7c6SXukai Wang &ls_i2c1_gate.clk.hw);
798*a7b7c7c6SXukai Wang
799*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_i2c2_gate,
800*a7b7c7c6SXukai Wang K230_LS_I2C2_GATE,
801*a7b7c7c6SXukai Wang 0x24, 23, 0, 0,
802*a7b7c7c6SXukai Wang &pll0_div4.hw);
803*a7b7c7c6SXukai Wang
804*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ls_i2c2_rate,
805*a7b7c7c6SXukai Wang K230_LS_I2C2_RATE,
806*a7b7c7c6SXukai Wang 1, 1, 0, 0,
807*a7b7c7c6SXukai Wang 1, 8, 21, 0x7,
808*a7b7c7c6SXukai Wang 0x2C, 31, div, 0x0,
809*a7b7c7c6SXukai Wang false, 0,
810*a7b7c7c6SXukai Wang &ls_i2c2_gate.clk.hw);
811*a7b7c7c6SXukai Wang
812*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_i2c3_gate,
813*a7b7c7c6SXukai Wang K230_LS_I2C3_GATE,
814*a7b7c7c6SXukai Wang 0x24, 24, 0, 0,
815*a7b7c7c6SXukai Wang &pll0_div4.hw);
816*a7b7c7c6SXukai Wang
817*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ls_i2c3_rate,
818*a7b7c7c6SXukai Wang K230_LS_I2C3_RATE,
819*a7b7c7c6SXukai Wang 1, 1, 0, 0,
820*a7b7c7c6SXukai Wang 1, 8, 24, 0x7,
821*a7b7c7c6SXukai Wang 0x2C, 31, div, 0x0,
822*a7b7c7c6SXukai Wang false, 0,
823*a7b7c7c6SXukai Wang &ls_i2c3_gate.clk.hw);
824*a7b7c7c6SXukai Wang
825*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_i2c4_gate,
826*a7b7c7c6SXukai Wang K230_LS_I2C4_GATE,
827*a7b7c7c6SXukai Wang 0x24, 25, 0, 0,
828*a7b7c7c6SXukai Wang &pll0_div4.hw);
829*a7b7c7c6SXukai Wang
830*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ls_i2c4_rate,
831*a7b7c7c6SXukai Wang K230_LS_I2C4_RATE,
832*a7b7c7c6SXukai Wang 1, 1, 0, 0,
833*a7b7c7c6SXukai Wang 1, 8, 27, 0x7,
834*a7b7c7c6SXukai Wang 0x2C, 31, div, 0x0,
835*a7b7c7c6SXukai Wang false, 0,
836*a7b7c7c6SXukai Wang &ls_i2c4_gate.clk.hw);
837*a7b7c7c6SXukai Wang
838*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_codec_adc_gate,
839*a7b7c7c6SXukai Wang K230_LS_CODEC_ADC_GATE,
840*a7b7c7c6SXukai Wang 0x24, 29, 0, 0,
841*a7b7c7c6SXukai Wang &pll0_div4.hw);
842*a7b7c7c6SXukai Wang
843*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ls_codec_adc_rate,
844*a7b7c7c6SXukai Wang K230_LS_CODEC_ADC_RATE,
845*a7b7c7c6SXukai Wang 0x10, 0x1B9, 14, 0x1FFF,
846*a7b7c7c6SXukai Wang 0xC35, 0x3D09, 0, 0x3FFF,
847*a7b7c7c6SXukai Wang 0x38, 31, mul_div, 0x38,
848*a7b7c7c6SXukai Wang false, 0,
849*a7b7c7c6SXukai Wang &ls_codec_adc_gate.clk.hw);
850*a7b7c7c6SXukai Wang
851*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_codec_dac_gate,
852*a7b7c7c6SXukai Wang K230_LS_CODEC_DAC_GATE,
853*a7b7c7c6SXukai Wang 0x24, 30, 0, 0,
854*a7b7c7c6SXukai Wang &pll0_div4.hw);
855*a7b7c7c6SXukai Wang
856*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ls_codec_dac_rate,
857*a7b7c7c6SXukai Wang K230_LS_CODEC_DAC_RATE,
858*a7b7c7c6SXukai Wang 0x10, 0x1B9, 14, 0x1FFF,
859*a7b7c7c6SXukai Wang 0xC35, 0x3D09, 0, 0x3FFF,
860*a7b7c7c6SXukai Wang 0x3C, 31, mul_div, 0x3C,
861*a7b7c7c6SXukai Wang false, 0,
862*a7b7c7c6SXukai Wang &ls_codec_dac_gate.clk.hw);
863*a7b7c7c6SXukai Wang
864*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_audio_dev_gate,
865*a7b7c7c6SXukai Wang K230_LS_AUDIO_DEV_GATE,
866*a7b7c7c6SXukai Wang 0x24, 28, 0, 0,
867*a7b7c7c6SXukai Wang &pll0_div4.hw);
868*a7b7c7c6SXukai Wang
869*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ls_audio_dev_rate,
870*a7b7c7c6SXukai Wang K230_LS_AUDIO_DEV_RATE,
871*a7b7c7c6SXukai Wang 0x4, 0x1B9, 16, 0x7FFF,
872*a7b7c7c6SXukai Wang 0xC35, 0xF424, 0, 0xFFFF,
873*a7b7c7c6SXukai Wang 0x34, 31, mul_div, 0x34,
874*a7b7c7c6SXukai Wang false, 0,
875*a7b7c7c6SXukai Wang &ls_audio_dev_gate.clk.hw);
876*a7b7c7c6SXukai Wang
877*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_pdm_gate,
878*a7b7c7c6SXukai Wang K230_LS_PDM_GATE,
879*a7b7c7c6SXukai Wang 0x24, 31, 0, 0,
880*a7b7c7c6SXukai Wang &pll0_div4.hw);
881*a7b7c7c6SXukai Wang
882*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ls_pdm_rate,
883*a7b7c7c6SXukai Wang K230_LS_PDM_RATE,
884*a7b7c7c6SXukai Wang 0x2, 0x1B9, 0, 0xFFFF,
885*a7b7c7c6SXukai Wang 0xC35, 0x1E848, 0, 0x1FFFF,
886*a7b7c7c6SXukai Wang 0x40, 0, mul_div, 0x44,
887*a7b7c7c6SXukai Wang false, 0,
888*a7b7c7c6SXukai Wang &ls_pdm_gate.clk.hw);
889*a7b7c7c6SXukai Wang
890*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_adc_gate,
891*a7b7c7c6SXukai Wang K230_LS_ADC_GATE,
892*a7b7c7c6SXukai Wang 0x24, 26, 0, 0,
893*a7b7c7c6SXukai Wang &pll0_div4.hw);
894*a7b7c7c6SXukai Wang
895*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ls_adc_rate,
896*a7b7c7c6SXukai Wang K230_LS_ADC_RATE,
897*a7b7c7c6SXukai Wang 1, 1, 0, 0,
898*a7b7c7c6SXukai Wang 1, 1024, 3, 0x3FF,
899*a7b7c7c6SXukai Wang 0x30, 31, div, 0x0,
900*a7b7c7c6SXukai Wang false, 0,
901*a7b7c7c6SXukai Wang &ls_adc_gate.clk.hw);
902*a7b7c7c6SXukai Wang
903*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_uart0_gate,
904*a7b7c7c6SXukai Wang K230_LS_UART0_GATE,
905*a7b7c7c6SXukai Wang 0x24, 16, CLK_IS_CRITICAL, 0,
906*a7b7c7c6SXukai Wang &pll0_div16.hw);
907*a7b7c7c6SXukai Wang
908*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ls_uart0_rate,
909*a7b7c7c6SXukai Wang K230_LS_UART0_RATE,
910*a7b7c7c6SXukai Wang 1, 1, 0, 0,
911*a7b7c7c6SXukai Wang 1, 8, 0, 0x7,
912*a7b7c7c6SXukai Wang 0x2C, 31, div, 0x0,
913*a7b7c7c6SXukai Wang false, 0,
914*a7b7c7c6SXukai Wang &ls_uart0_gate.clk.hw);
915*a7b7c7c6SXukai Wang
916*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_uart1_gate,
917*a7b7c7c6SXukai Wang K230_LS_UART1_GATE,
918*a7b7c7c6SXukai Wang 0x24, 17, CLK_IS_CRITICAL, 0,
919*a7b7c7c6SXukai Wang &pll0_div16.hw);
920*a7b7c7c6SXukai Wang
921*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ls_uart1_rate,
922*a7b7c7c6SXukai Wang K230_LS_UART1_RATE,
923*a7b7c7c6SXukai Wang 1, 1, 0, 0,
924*a7b7c7c6SXukai Wang 1, 8, 3, 0x7,
925*a7b7c7c6SXukai Wang 0x2C, 31, div, 0x0,
926*a7b7c7c6SXukai Wang false, 0,
927*a7b7c7c6SXukai Wang &ls_uart1_gate.clk.hw);
928*a7b7c7c6SXukai Wang
929*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_uart2_gate,
930*a7b7c7c6SXukai Wang K230_LS_UART2_GATE,
931*a7b7c7c6SXukai Wang 0x24, 18, CLK_IS_CRITICAL, 0,
932*a7b7c7c6SXukai Wang &pll0_div16.hw);
933*a7b7c7c6SXukai Wang
934*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ls_uart2_rate,
935*a7b7c7c6SXukai Wang K230_LS_UART2_RATE,
936*a7b7c7c6SXukai Wang 1, 1, 0, 0,
937*a7b7c7c6SXukai Wang 1, 8, 6, 0x7,
938*a7b7c7c6SXukai Wang 0x2C, 31, div, 0x0,
939*a7b7c7c6SXukai Wang false, 0,
940*a7b7c7c6SXukai Wang &ls_uart2_gate.clk.hw);
941*a7b7c7c6SXukai Wang
942*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_uart3_gate,
943*a7b7c7c6SXukai Wang K230_LS_UART3_GATE,
944*a7b7c7c6SXukai Wang 0x24, 19, CLK_IS_CRITICAL, 0,
945*a7b7c7c6SXukai Wang &pll0_div16.hw);
946*a7b7c7c6SXukai Wang
947*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ls_uart3_rate,
948*a7b7c7c6SXukai Wang K230_LS_UART3_RATE,
949*a7b7c7c6SXukai Wang 1, 1, 0, 0,
950*a7b7c7c6SXukai Wang 1, 8, 9, 0x7,
951*a7b7c7c6SXukai Wang 0x2C, 31, div, 0x0,
952*a7b7c7c6SXukai Wang false, 0,
953*a7b7c7c6SXukai Wang &ls_uart3_gate.clk.hw);
954*a7b7c7c6SXukai Wang
955*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_uart4_gate,
956*a7b7c7c6SXukai Wang K230_LS_UART4_GATE,
957*a7b7c7c6SXukai Wang 0x24, 20, CLK_IS_CRITICAL, 0,
958*a7b7c7c6SXukai Wang &pll0_div16.hw);
959*a7b7c7c6SXukai Wang
960*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ls_uart4_rate,
961*a7b7c7c6SXukai Wang K230_LS_UART4_RATE,
962*a7b7c7c6SXukai Wang 1, 1, 0, 0,
963*a7b7c7c6SXukai Wang 1, 8, 12, 0x7,
964*a7b7c7c6SXukai Wang 0x2C, 31, div, 0x0,
965*a7b7c7c6SXukai Wang false, 0,
966*a7b7c7c6SXukai Wang &ls_uart4_gate.clk.hw);
967*a7b7c7c6SXukai Wang
968*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ls_jamlinkco_src_rate,
969*a7b7c7c6SXukai Wang K230_LS_JAMLINKCO_SRC_RATE,
970*a7b7c7c6SXukai Wang 1, 1, 0, 0,
971*a7b7c7c6SXukai Wang 2, 512, 23, 0xFF,
972*a7b7c7c6SXukai Wang 0x30, 31, div, 0x0,
973*a7b7c7c6SXukai Wang false, 0,
974*a7b7c7c6SXukai Wang &pll0_div16.hw);
975*a7b7c7c6SXukai Wang
976*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_jamlink0co_gate,
977*a7b7c7c6SXukai Wang K230_LS_JAMLINK0CO_GATE,
978*a7b7c7c6SXukai Wang 0x28, 0, 0, 0,
979*a7b7c7c6SXukai Wang &ls_jamlinkco_src_rate.clk.hw);
980*a7b7c7c6SXukai Wang
981*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_jamlink1co_gate,
982*a7b7c7c6SXukai Wang K230_LS_JAMLINK1CO_GATE,
983*a7b7c7c6SXukai Wang 0x28, 1, 0, 0,
984*a7b7c7c6SXukai Wang &ls_jamlinkco_src_rate.clk.hw);
985*a7b7c7c6SXukai Wang
986*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_jamlink2co_gate,
987*a7b7c7c6SXukai Wang K230_LS_JAMLINK2CO_GATE,
988*a7b7c7c6SXukai Wang 0x28, 2, 0, 0,
989*a7b7c7c6SXukai Wang &ls_jamlinkco_src_rate.clk.hw);
990*a7b7c7c6SXukai Wang
991*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ls_jamlink3co_gate,
992*a7b7c7c6SXukai Wang K230_LS_JAMLINK3CO_GATE,
993*a7b7c7c6SXukai Wang 0x28, 3, 0, 0,
994*a7b7c7c6SXukai Wang &ls_jamlinkco_src_rate.clk.hw);
995*a7b7c7c6SXukai Wang
996*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT_PNAME(ls_gpio_debounce_gate,
997*a7b7c7c6SXukai Wang K230_LS_GPIO_DEBOUNCE_GATE,
998*a7b7c7c6SXukai Wang 0x24, 27, 0, 0,
999*a7b7c7c6SXukai Wang "osc24m");
1000*a7b7c7c6SXukai Wang
1001*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ls_gpio_debounce_rate,
1002*a7b7c7c6SXukai Wang K230_LS_GPIO_DEBOUNCE_RATE,
1003*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1004*a7b7c7c6SXukai Wang 1, 1024, 13, 0x3FF,
1005*a7b7c7c6SXukai Wang 0x30, 31, div, 0x0,
1006*a7b7c7c6SXukai Wang false, 0,
1007*a7b7c7c6SXukai Wang &ls_gpio_debounce_gate.clk.hw);
1008*a7b7c7c6SXukai Wang
1009*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(sysctl_wdt0_apb_gate,
1010*a7b7c7c6SXukai Wang K230_SYSCTL_WDT0_APB_GATE,
1011*a7b7c7c6SXukai Wang 0x50, 1, 0, 0,
1012*a7b7c7c6SXukai Wang &pll0_div16.hw);
1013*a7b7c7c6SXukai Wang
1014*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(sysctl_wdt1_apb_gate,
1015*a7b7c7c6SXukai Wang K230_SYSCTL_WDT1_APB_GATE,
1016*a7b7c7c6SXukai Wang 0x50, 2, 0, 0,
1017*a7b7c7c6SXukai Wang &pll0_div16.hw);
1018*a7b7c7c6SXukai Wang
1019*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(sysctl_timer_apb_gate,
1020*a7b7c7c6SXukai Wang K230_SYSCTL_TIMER_APB_GATE,
1021*a7b7c7c6SXukai Wang 0x50, 3, 0, 0,
1022*a7b7c7c6SXukai Wang &pll0_div16.hw);
1023*a7b7c7c6SXukai Wang
1024*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(sysctl_iomux_apb_gate,
1025*a7b7c7c6SXukai Wang K230_SYSCTL_IOMUX_APB_GATE,
1026*a7b7c7c6SXukai Wang 0x50, 20, 0, 0,
1027*a7b7c7c6SXukai Wang &pll0_div16.hw);
1028*a7b7c7c6SXukai Wang
1029*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(sysctl_mailbox_apb_gate,
1030*a7b7c7c6SXukai Wang K230_SYSCTL_MAILBOX_APB_GATE,
1031*a7b7c7c6SXukai Wang 0x50, 4, 0, 0,
1032*a7b7c7c6SXukai Wang &pll0_div16.hw);
1033*a7b7c7c6SXukai Wang
1034*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(sysctl_hdi_gate,
1035*a7b7c7c6SXukai Wang K230_SYSCTL_HDI_GATE,
1036*a7b7c7c6SXukai Wang 0x50, 21, 0, 0,
1037*a7b7c7c6SXukai Wang &pll0_div4.hw);
1038*a7b7c7c6SXukai Wang
1039*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(sysctl_hdi_rate,
1040*a7b7c7c6SXukai Wang K230_SYSCTL_HDI_RATE,
1041*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1042*a7b7c7c6SXukai Wang 1, 8, 28, 0x7,
1043*a7b7c7c6SXukai Wang 0x58, 31, div, 0x0,
1044*a7b7c7c6SXukai Wang false, 0,
1045*a7b7c7c6SXukai Wang &sysctl_hdi_gate.clk.hw);
1046*a7b7c7c6SXukai Wang
1047*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(sysctl_time_stamp_gate,
1048*a7b7c7c6SXukai Wang K230_SYSCTL_TIME_STAMP_GATE,
1049*a7b7c7c6SXukai Wang 0x50, 19, CLK_IS_CRITICAL, 0,
1050*a7b7c7c6SXukai Wang &pll1_div4.hw);
1051*a7b7c7c6SXukai Wang
1052*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(sysctl_time_stamp_rate,
1053*a7b7c7c6SXukai Wang K230_SYSCTL_TIME_STAMP_RATE,
1054*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1055*a7b7c7c6SXukai Wang 1, 32, 15, 0x1F,
1056*a7b7c7c6SXukai Wang 0x58, 31, div, 0x0,
1057*a7b7c7c6SXukai Wang false, 0,
1058*a7b7c7c6SXukai Wang &sysctl_time_stamp_gate.clk.hw);
1059*a7b7c7c6SXukai Wang
1060*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT_PNAME(sysctl_temp_sensor_rate,
1061*a7b7c7c6SXukai Wang K230_SYSCTL_TEMP_SENSOR_RATE,
1062*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1063*a7b7c7c6SXukai Wang 1, 256, 20, 0xFF,
1064*a7b7c7c6SXukai Wang 0x58, 31, div, 0x0,
1065*a7b7c7c6SXukai Wang false, 0,
1066*a7b7c7c6SXukai Wang "osc24m");
1067*a7b7c7c6SXukai Wang
1068*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT_PNAME(sysctl_wdt0_gate,
1069*a7b7c7c6SXukai Wang K230_SYSCTL_WDT0_GATE,
1070*a7b7c7c6SXukai Wang 0x50, 5, 0, 0,
1071*a7b7c7c6SXukai Wang "osc24m");
1072*a7b7c7c6SXukai Wang
1073*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(sysctl_wdt0_rate,
1074*a7b7c7c6SXukai Wang K230_SYSCTL_WDT0_RATE,
1075*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1076*a7b7c7c6SXukai Wang 1, 64, 3, 0x3F,
1077*a7b7c7c6SXukai Wang 0x58, 31, div, 0x0,
1078*a7b7c7c6SXukai Wang false, 0,
1079*a7b7c7c6SXukai Wang &sysctl_wdt0_gate.clk.hw);
1080*a7b7c7c6SXukai Wang
1081*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT_PNAME(sysctl_wdt1_gate,
1082*a7b7c7c6SXukai Wang K230_SYSCTL_WDT1_GATE,
1083*a7b7c7c6SXukai Wang 0x50, 6, 0, 0,
1084*a7b7c7c6SXukai Wang "osc24m");
1085*a7b7c7c6SXukai Wang
1086*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(sysctl_wdt1_rate,
1087*a7b7c7c6SXukai Wang K230_SYSCTL_WDT1_RATE,
1088*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1089*a7b7c7c6SXukai Wang 1, 64, 9, 0x3F,
1090*a7b7c7c6SXukai Wang 0x58, 31, div, 0x0,
1091*a7b7c7c6SXukai Wang false, 0,
1092*a7b7c7c6SXukai Wang &sysctl_wdt1_gate.clk.hw);
1093*a7b7c7c6SXukai Wang
1094*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(timer0_src_rate,
1095*a7b7c7c6SXukai Wang K230_TIMER0_SRC_RATE,
1096*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1097*a7b7c7c6SXukai Wang 1, 8, 0, 0x7,
1098*a7b7c7c6SXukai Wang 0x54, 31, div, 0x0,
1099*a7b7c7c6SXukai Wang false, 0,
1100*a7b7c7c6SXukai Wang &pll0_div16.hw);
1101*a7b7c7c6SXukai Wang
1102*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(timer1_src_rate,
1103*a7b7c7c6SXukai Wang K230_TIMER1_SRC_RATE,
1104*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1105*a7b7c7c6SXukai Wang 1, 8, 3, 0x7,
1106*a7b7c7c6SXukai Wang 0x54, 31, div, 0x0,
1107*a7b7c7c6SXukai Wang false, 0,
1108*a7b7c7c6SXukai Wang &pll0_div16.hw);
1109*a7b7c7c6SXukai Wang
1110*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(timer2_src_rate,
1111*a7b7c7c6SXukai Wang K230_TIMER2_SRC_RATE,
1112*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1113*a7b7c7c6SXukai Wang 1, 8, 6, 0x7,
1114*a7b7c7c6SXukai Wang 0x54, 31, div, 0x0,
1115*a7b7c7c6SXukai Wang false, 0,
1116*a7b7c7c6SXukai Wang &pll0_div16.hw);
1117*a7b7c7c6SXukai Wang
1118*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(timer3_src_rate,
1119*a7b7c7c6SXukai Wang K230_TIMER3_SRC_RATE,
1120*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1121*a7b7c7c6SXukai Wang 1, 8, 9, 0x7,
1122*a7b7c7c6SXukai Wang 0x54, 31, div, 0x0,
1123*a7b7c7c6SXukai Wang false, 0,
1124*a7b7c7c6SXukai Wang &pll0_div16.hw);
1125*a7b7c7c6SXukai Wang
1126*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(timer4_src_rate,
1127*a7b7c7c6SXukai Wang K230_TIMER4_SRC_RATE,
1128*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1129*a7b7c7c6SXukai Wang 1, 8, 12, 0x7,
1130*a7b7c7c6SXukai Wang 0x54, 31, div, 0x0,
1131*a7b7c7c6SXukai Wang false, 0,
1132*a7b7c7c6SXukai Wang &pll0_div16.hw);
1133*a7b7c7c6SXukai Wang
1134*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(timer5_src_rate,
1135*a7b7c7c6SXukai Wang K230_TIMER5_SRC_RATE,
1136*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1137*a7b7c7c6SXukai Wang 1, 8, 15, 0x7,
1138*a7b7c7c6SXukai Wang 0x54, 31, div, 0x0,
1139*a7b7c7c6SXukai Wang false, 0,
1140*a7b7c7c6SXukai Wang &pll0_div16.hw);
1141*a7b7c7c6SXukai Wang
1142*a7b7c7c6SXukai Wang static const struct clk_parent_data k230_timer0_mux_pdata[] = {
1143*a7b7c7c6SXukai Wang { .fw_name = "timer-pulse-in", },
1144*a7b7c7c6SXukai Wang { .hw = &timer0_src_rate.clk.hw, },
1145*a7b7c7c6SXukai Wang };
1146*a7b7c7c6SXukai Wang
1147*a7b7c7c6SXukai Wang K230_CLK_MUX_FORMAT(timer0_mux,
1148*a7b7c7c6SXukai Wang K230_TIMER0_MUX,
1149*a7b7c7c6SXukai Wang 0x50, 7, 0x1,
1150*a7b7c7c6SXukai Wang 0, 0,
1151*a7b7c7c6SXukai Wang k230_timer0_mux_pdata);
1152*a7b7c7c6SXukai Wang
1153*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(timer0_gate,
1154*a7b7c7c6SXukai Wang K230_TIMER0_GATE,
1155*a7b7c7c6SXukai Wang 0x50, 13, CLK_IGNORE_UNUSED, 0,
1156*a7b7c7c6SXukai Wang &timer0_mux.clk.hw);
1157*a7b7c7c6SXukai Wang
1158*a7b7c7c6SXukai Wang static const struct clk_parent_data k230_timer1_mux_pdata[] = {
1159*a7b7c7c6SXukai Wang { .fw_name = "timer-pulse-in", },
1160*a7b7c7c6SXukai Wang { .hw = &timer1_src_rate.clk.hw, },
1161*a7b7c7c6SXukai Wang };
1162*a7b7c7c6SXukai Wang
1163*a7b7c7c6SXukai Wang K230_CLK_MUX_FORMAT(timer1_mux,
1164*a7b7c7c6SXukai Wang K230_TIMER1_MUX,
1165*a7b7c7c6SXukai Wang 0x50, 8, 0x1,
1166*a7b7c7c6SXukai Wang 0, 0,
1167*a7b7c7c6SXukai Wang k230_timer1_mux_pdata);
1168*a7b7c7c6SXukai Wang
1169*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(timer1_gate,
1170*a7b7c7c6SXukai Wang K230_TIMER1_GATE,
1171*a7b7c7c6SXukai Wang 0x50, 14, CLK_IGNORE_UNUSED, 0,
1172*a7b7c7c6SXukai Wang &timer1_mux.clk.hw);
1173*a7b7c7c6SXukai Wang
1174*a7b7c7c6SXukai Wang static const struct clk_parent_data k230_timer2_mux_pdata[] = {
1175*a7b7c7c6SXukai Wang { .fw_name = "timer-pulse-in", },
1176*a7b7c7c6SXukai Wang { .hw = &timer2_src_rate.clk.hw, },
1177*a7b7c7c6SXukai Wang };
1178*a7b7c7c6SXukai Wang
1179*a7b7c7c6SXukai Wang K230_CLK_MUX_FORMAT(timer2_mux,
1180*a7b7c7c6SXukai Wang K230_TIMER2_MUX,
1181*a7b7c7c6SXukai Wang 0x50, 9, 0x1,
1182*a7b7c7c6SXukai Wang 0, 0,
1183*a7b7c7c6SXukai Wang k230_timer2_mux_pdata);
1184*a7b7c7c6SXukai Wang
1185*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(timer2_gate,
1186*a7b7c7c6SXukai Wang K230_TIMER2_GATE,
1187*a7b7c7c6SXukai Wang 0x50, 15, CLK_IGNORE_UNUSED, 0,
1188*a7b7c7c6SXukai Wang &timer2_mux.clk.hw);
1189*a7b7c7c6SXukai Wang
1190*a7b7c7c6SXukai Wang static const struct clk_parent_data k230_timer3_mux_pdata[] = {
1191*a7b7c7c6SXukai Wang { .fw_name = "timer-pulse-in", },
1192*a7b7c7c6SXukai Wang { .hw = &timer3_src_rate.clk.hw, },
1193*a7b7c7c6SXukai Wang };
1194*a7b7c7c6SXukai Wang
1195*a7b7c7c6SXukai Wang K230_CLK_MUX_FORMAT(timer3_mux,
1196*a7b7c7c6SXukai Wang K230_TIMER3_MUX,
1197*a7b7c7c6SXukai Wang 0x50, 10, 0x1,
1198*a7b7c7c6SXukai Wang 0, 0,
1199*a7b7c7c6SXukai Wang k230_timer3_mux_pdata);
1200*a7b7c7c6SXukai Wang
1201*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(timer3_gate,
1202*a7b7c7c6SXukai Wang K230_TIMER3_GATE,
1203*a7b7c7c6SXukai Wang 0x50, 16, CLK_IGNORE_UNUSED, 0,
1204*a7b7c7c6SXukai Wang &timer3_mux.clk.hw);
1205*a7b7c7c6SXukai Wang
1206*a7b7c7c6SXukai Wang static const struct clk_parent_data k230_timer4_mux_pdata[] = {
1207*a7b7c7c6SXukai Wang { .fw_name = "timer-pulse-in", },
1208*a7b7c7c6SXukai Wang { .hw = &timer4_src_rate.clk.hw, },
1209*a7b7c7c6SXukai Wang };
1210*a7b7c7c6SXukai Wang
1211*a7b7c7c6SXukai Wang K230_CLK_MUX_FORMAT(timer4_mux,
1212*a7b7c7c6SXukai Wang K230_TIMER4_MUX,
1213*a7b7c7c6SXukai Wang 0x50, 11, 0x1,
1214*a7b7c7c6SXukai Wang 0, 0,
1215*a7b7c7c6SXukai Wang k230_timer4_mux_pdata);
1216*a7b7c7c6SXukai Wang
1217*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(timer4_gate,
1218*a7b7c7c6SXukai Wang K230_TIMER4_GATE,
1219*a7b7c7c6SXukai Wang 0x50, 17, CLK_IGNORE_UNUSED, 0,
1220*a7b7c7c6SXukai Wang &timer4_mux.clk.hw);
1221*a7b7c7c6SXukai Wang
1222*a7b7c7c6SXukai Wang static const struct clk_parent_data k230_timer5_mux_pdata[] = {
1223*a7b7c7c6SXukai Wang { .fw_name = "timer-pulse-in", },
1224*a7b7c7c6SXukai Wang { .hw = &timer5_src_rate.clk.hw, },
1225*a7b7c7c6SXukai Wang };
1226*a7b7c7c6SXukai Wang
1227*a7b7c7c6SXukai Wang K230_CLK_MUX_FORMAT(timer5_mux,
1228*a7b7c7c6SXukai Wang K230_TIMER5_MUX,
1229*a7b7c7c6SXukai Wang 0x50, 12, 0x1,
1230*a7b7c7c6SXukai Wang 0, 0,
1231*a7b7c7c6SXukai Wang k230_timer5_mux_pdata);
1232*a7b7c7c6SXukai Wang
1233*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(timer5_gate,
1234*a7b7c7c6SXukai Wang K230_TIMER5_GATE,
1235*a7b7c7c6SXukai Wang 0x50, 18, CLK_IGNORE_UNUSED, 0,
1236*a7b7c7c6SXukai Wang &timer5_mux.clk.hw);
1237*a7b7c7c6SXukai Wang
1238*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(shrm_apb_gate,
1239*a7b7c7c6SXukai Wang K230_SHRM_APB_GATE,
1240*a7b7c7c6SXukai Wang 0x5C, 0, 0, 0,
1241*a7b7c7c6SXukai Wang &pll0_div4.hw);
1242*a7b7c7c6SXukai Wang
1243*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(shrm_apb_rate,
1244*a7b7c7c6SXukai Wang K230_SHRM_APB_RATE,
1245*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1246*a7b7c7c6SXukai Wang 1, 8, 18, 0x7,
1247*a7b7c7c6SXukai Wang 0x5C, 31, div, 0x0,
1248*a7b7c7c6SXukai Wang false, 0,
1249*a7b7c7c6SXukai Wang &shrm_apb_gate.clk.hw);
1250*a7b7c7c6SXukai Wang
1251*a7b7c7c6SXukai Wang static const struct clk_parent_data k230_shrm_sram_mux_pdata[] = {
1252*a7b7c7c6SXukai Wang { .hw = &pll3_div2.hw, },
1253*a7b7c7c6SXukai Wang { .hw = &pll0_div2.hw, },
1254*a7b7c7c6SXukai Wang };
1255*a7b7c7c6SXukai Wang
1256*a7b7c7c6SXukai Wang K230_CLK_MUX_FORMAT(shrm_sram_mux,
1257*a7b7c7c6SXukai Wang K230_SHRM_SRAM_MUX,
1258*a7b7c7c6SXukai Wang 0x50, 14, 0x1,
1259*a7b7c7c6SXukai Wang 0, 0,
1260*a7b7c7c6SXukai Wang k230_shrm_sram_mux_pdata);
1261*a7b7c7c6SXukai Wang
1262*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(shrm_sram_gate,
1263*a7b7c7c6SXukai Wang K230_SHRM_SRAM_GATE,
1264*a7b7c7c6SXukai Wang 0x5c, 10, CLK_IGNORE_UNUSED, 0,
1265*a7b7c7c6SXukai Wang &shrm_sram_mux.clk.hw);
1266*a7b7c7c6SXukai Wang
1267*a7b7c7c6SXukai Wang K230_CLK_FIXED_FACTOR_FORMAT(shrm_sram_div2,
1268*a7b7c7c6SXukai Wang 1, 2, 0,
1269*a7b7c7c6SXukai Wang &shrm_sram_gate.clk.hw);
1270*a7b7c7c6SXukai Wang
1271*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(shrm_axi_slave_gate,
1272*a7b7c7c6SXukai Wang K230_SHRM_AXI_SLAVE_GATE,
1273*a7b7c7c6SXukai Wang 0x5C, 11, CLK_IGNORE_UNUSED, 0,
1274*a7b7c7c6SXukai Wang &shrm_sram_div2.hw);
1275*a7b7c7c6SXukai Wang
1276*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(shrm_axi_gate,
1277*a7b7c7c6SXukai Wang K230_SHRM_AXI_GATE,
1278*a7b7c7c6SXukai Wang 0x5C, 12, 0, 0,
1279*a7b7c7c6SXukai Wang &pll0_div4.hw);
1280*a7b7c7c6SXukai Wang
1281*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(shrm_nonai2d_axi_gate,
1282*a7b7c7c6SXukai Wang K230_SHRM_NONAI2D_AXI_GATE,
1283*a7b7c7c6SXukai Wang 0x5C, 9, 0, 0,
1284*a7b7c7c6SXukai Wang &shrm_axi_gate.clk.hw);
1285*a7b7c7c6SXukai Wang
1286*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(shrm_decompress_axi_gate,
1287*a7b7c7c6SXukai Wang K230_SHRM_DECOMPRESS_AXI_GATE,
1288*a7b7c7c6SXukai Wang 0x5C, 7, CLK_IGNORE_UNUSED, 0,
1289*a7b7c7c6SXukai Wang &shrm_sram_gate.clk.hw);
1290*a7b7c7c6SXukai Wang
1291*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(shrm_sdma_axi_gate,
1292*a7b7c7c6SXukai Wang K230_SHRM_SDMA_AXI_GATE,
1293*a7b7c7c6SXukai Wang 0x5C, 5, 0, 0,
1294*a7b7c7c6SXukai Wang &shrm_axi_gate.clk.hw);
1295*a7b7c7c6SXukai Wang
1296*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(shrm_pdma_axi_gate,
1297*a7b7c7c6SXukai Wang K230_SHRM_PDMA_AXI_GATE,
1298*a7b7c7c6SXukai Wang 0x5C, 3, 0, 0,
1299*a7b7c7c6SXukai Wang &shrm_axi_gate.clk.hw);
1300*a7b7c7c6SXukai Wang
1301*a7b7c7c6SXukai Wang static const struct clk_parent_data k230_ddrc_src_mux_pdata[] = {
1302*a7b7c7c6SXukai Wang { .hw = &pll0_div2.hw, },
1303*a7b7c7c6SXukai Wang { .hw = &pll0_div3.hw, },
1304*a7b7c7c6SXukai Wang { .hw = &pll2_div4.hw, },
1305*a7b7c7c6SXukai Wang };
1306*a7b7c7c6SXukai Wang
1307*a7b7c7c6SXukai Wang K230_CLK_MUX_FORMAT(ddrc_src_mux,
1308*a7b7c7c6SXukai Wang K230_DDRC_SRC_MUX,
1309*a7b7c7c6SXukai Wang 0x60, 0, 0x3,
1310*a7b7c7c6SXukai Wang 0, 0,
1311*a7b7c7c6SXukai Wang k230_ddrc_src_mux_pdata);
1312*a7b7c7c6SXukai Wang
1313*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ddrc_src_gate,
1314*a7b7c7c6SXukai Wang K230_DDRC_SRC_GATE,
1315*a7b7c7c6SXukai Wang 0x60, 2, CLK_IGNORE_UNUSED, 0,
1316*a7b7c7c6SXukai Wang &ddrc_src_mux.clk.hw);
1317*a7b7c7c6SXukai Wang
1318*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ddrc_src_rate,
1319*a7b7c7c6SXukai Wang K230_DDRC_SRC_RATE,
1320*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1321*a7b7c7c6SXukai Wang 1, 16, 10, 0xF,
1322*a7b7c7c6SXukai Wang 0x60, 31, div, 0x0,
1323*a7b7c7c6SXukai Wang false, 0,
1324*a7b7c7c6SXukai Wang &ddrc_src_gate.clk.hw);
1325*a7b7c7c6SXukai Wang
1326*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ddrc_bypass_gate,
1327*a7b7c7c6SXukai Wang K230_DDRC_BYPASS_GATE,
1328*a7b7c7c6SXukai Wang 0x60, 8, 0, 0,
1329*a7b7c7c6SXukai Wang &pll2_div4.hw);
1330*a7b7c7c6SXukai Wang
1331*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ddrc_apb_gate,
1332*a7b7c7c6SXukai Wang K230_DDRC_APB_GATE,
1333*a7b7c7c6SXukai Wang 0x60, 9, 0, 0,
1334*a7b7c7c6SXukai Wang &pll0_div4.hw);
1335*a7b7c7c6SXukai Wang
1336*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ddrc_apb_rate,
1337*a7b7c7c6SXukai Wang K230_DDRC_APB_RATE,
1338*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1339*a7b7c7c6SXukai Wang 1, 16, 14, 0xF,
1340*a7b7c7c6SXukai Wang 0x60, 31, div, 0x0,
1341*a7b7c7c6SXukai Wang false, 0,
1342*a7b7c7c6SXukai Wang &ddrc_apb_gate.clk.hw);
1343*a7b7c7c6SXukai Wang
1344*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(display_ahb_gate,
1345*a7b7c7c6SXukai Wang K230_DISPLAY_AHB_GATE,
1346*a7b7c7c6SXukai Wang 0x74, 0, 0, 0,
1347*a7b7c7c6SXukai Wang &pll0_div4.hw);
1348*a7b7c7c6SXukai Wang
1349*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(display_ahb_rate,
1350*a7b7c7c6SXukai Wang K230_DISPLAY_AHB_RATE,
1351*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1352*a7b7c7c6SXukai Wang 1, 8, 0, 0x7,
1353*a7b7c7c6SXukai Wang 0x78, 31, div, 0x0,
1354*a7b7c7c6SXukai Wang false, 0,
1355*a7b7c7c6SXukai Wang &display_ahb_gate.clk.hw);
1356*a7b7c7c6SXukai Wang
1357*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(display_axi_gate,
1358*a7b7c7c6SXukai Wang K230_DISPLAY_AXI_GATE,
1359*a7b7c7c6SXukai Wang 0x74, 1, 0, 0,
1360*a7b7c7c6SXukai Wang &pll0_div4.hw);
1361*a7b7c7c6SXukai Wang
1362*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(display_clkext_rate,
1363*a7b7c7c6SXukai Wang K230_DISPLAY_CLKEXT_RATE,
1364*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1365*a7b7c7c6SXukai Wang 1, 16, 16, 0xF,
1366*a7b7c7c6SXukai Wang 0x78, 31, div, 0x0,
1367*a7b7c7c6SXukai Wang false, 0,
1368*a7b7c7c6SXukai Wang &pll0_div3.hw);
1369*a7b7c7c6SXukai Wang
1370*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(display_gpu_gate,
1371*a7b7c7c6SXukai Wang K230_DISPLAY_GPU_GATE,
1372*a7b7c7c6SXukai Wang 0x74, 6, 0, 0,
1373*a7b7c7c6SXukai Wang &pll0_div3.hw);
1374*a7b7c7c6SXukai Wang
1375*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(display_gpu_rate,
1376*a7b7c7c6SXukai Wang K230_DISPLAY_GPU_RATE,
1377*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1378*a7b7c7c6SXukai Wang 1, 16, 20, 0xF,
1379*a7b7c7c6SXukai Wang 0x78, 31, div, 0x0,
1380*a7b7c7c6SXukai Wang false, 0,
1381*a7b7c7c6SXukai Wang &display_gpu_gate.clk.hw);
1382*a7b7c7c6SXukai Wang
1383*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(display_dpip_gate,
1384*a7b7c7c6SXukai Wang K230_DISPLAY_DPIP_GATE,
1385*a7b7c7c6SXukai Wang 0x74, 2, 0, 0,
1386*a7b7c7c6SXukai Wang &pll1_div4.hw);
1387*a7b7c7c6SXukai Wang
1388*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(display_dpip_rate,
1389*a7b7c7c6SXukai Wang K230_DISPLAY_DPIP_RATE,
1390*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1391*a7b7c7c6SXukai Wang 1, 256, 3, 0xFF,
1392*a7b7c7c6SXukai Wang 0x78, 31, div, 0x0,
1393*a7b7c7c6SXukai Wang false, 0,
1394*a7b7c7c6SXukai Wang &display_dpip_gate.clk.hw);
1395*a7b7c7c6SXukai Wang
1396*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(display_cfg_gate,
1397*a7b7c7c6SXukai Wang K230_DISPLAY_CFG_GATE,
1398*a7b7c7c6SXukai Wang 0x74, 4, 0, 0,
1399*a7b7c7c6SXukai Wang &pll1_div4.hw);
1400*a7b7c7c6SXukai Wang
1401*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(display_cfg_rate,
1402*a7b7c7c6SXukai Wang K230_DISPLAY_CFG_RATE,
1403*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1404*a7b7c7c6SXukai Wang 1, 32, 11, 0x1F,
1405*a7b7c7c6SXukai Wang 0x78, 31, div, 0x0,
1406*a7b7c7c6SXukai Wang false, 0,
1407*a7b7c7c6SXukai Wang &display_cfg_gate.clk.hw);
1408*a7b7c7c6SXukai Wang
1409*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT_PNAME(display_ref_gate,
1410*a7b7c7c6SXukai Wang K230_DISPLAY_REF_GATE,
1411*a7b7c7c6SXukai Wang 0x74, 3, 0, 0,
1412*a7b7c7c6SXukai Wang "osc24m");
1413*a7b7c7c6SXukai Wang
1414*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(vpu_src_gate,
1415*a7b7c7c6SXukai Wang K230_VPU_SRC_GATE,
1416*a7b7c7c6SXukai Wang 0xC, 0, 0, 0,
1417*a7b7c7c6SXukai Wang &pll0_div2.hw);
1418*a7b7c7c6SXukai Wang
1419*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(vpu_src_rate,
1420*a7b7c7c6SXukai Wang K230_VPU_SRC_RATE,
1421*a7b7c7c6SXukai Wang 1, 16, 1, 0xF,
1422*a7b7c7c6SXukai Wang 16, 16, 0, 0,
1423*a7b7c7c6SXukai Wang 0x0, 31, mul, 0xC,
1424*a7b7c7c6SXukai Wang false, 0,
1425*a7b7c7c6SXukai Wang &vpu_src_gate.clk.hw);
1426*a7b7c7c6SXukai Wang
1427*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(vpu_axi_src_rate,
1428*a7b7c7c6SXukai Wang K230_VPU_AXI_SRC_RATE,
1429*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1430*a7b7c7c6SXukai Wang 1, 16, 6, 0xF,
1431*a7b7c7c6SXukai Wang 0xC, 31, div, 0x0,
1432*a7b7c7c6SXukai Wang false, 0,
1433*a7b7c7c6SXukai Wang &vpu_src_rate.clk.hw);
1434*a7b7c7c6SXukai Wang
1435*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(vpu_axi_gate,
1436*a7b7c7c6SXukai Wang K230_VPU_AXI_GATE,
1437*a7b7c7c6SXukai Wang 0xC, 5, 0, 0,
1438*a7b7c7c6SXukai Wang &vpu_axi_src_rate.clk.hw);
1439*a7b7c7c6SXukai Wang
1440*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(vpu_ddrcp2_gate,
1441*a7b7c7c6SXukai Wang K230_VPU_DDRCP2_GATE,
1442*a7b7c7c6SXukai Wang 0x60, 5, 0, 0,
1443*a7b7c7c6SXukai Wang &vpu_axi_src_rate.clk.hw);
1444*a7b7c7c6SXukai Wang
1445*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(vpu_cfg_gate,
1446*a7b7c7c6SXukai Wang K230_VPU_CFG_GATE,
1447*a7b7c7c6SXukai Wang 0xC, 10, 0, 0,
1448*a7b7c7c6SXukai Wang &pll0_div4.hw);
1449*a7b7c7c6SXukai Wang
1450*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(vpu_cfg_rate,
1451*a7b7c7c6SXukai Wang K230_VPU_CFG_RATE,
1452*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1453*a7b7c7c6SXukai Wang 1, 16, 11, 0xF,
1454*a7b7c7c6SXukai Wang 0xC, 31, div, 0x0,
1455*a7b7c7c6SXukai Wang false, 0,
1456*a7b7c7c6SXukai Wang &vpu_cfg_gate.clk.hw);
1457*a7b7c7c6SXukai Wang
1458*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(sec_apb_gate,
1459*a7b7c7c6SXukai Wang K230_SEC_APB_GATE,
1460*a7b7c7c6SXukai Wang 0x80, 0, 0, 0,
1461*a7b7c7c6SXukai Wang &pll1_div4.hw);
1462*a7b7c7c6SXukai Wang
1463*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(sec_apb_rate,
1464*a7b7c7c6SXukai Wang K230_SEC_APB_RATE,
1465*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1466*a7b7c7c6SXukai Wang 1, 8, 1, 0x7,
1467*a7b7c7c6SXukai Wang 0x80, 31, div, 0x0,
1468*a7b7c7c6SXukai Wang false, 0,
1469*a7b7c7c6SXukai Wang &sec_apb_gate.clk.hw);
1470*a7b7c7c6SXukai Wang
1471*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(sec_fix_gate,
1472*a7b7c7c6SXukai Wang K230_SEC_FIX_GATE,
1473*a7b7c7c6SXukai Wang 0x80, 5, 0, 0,
1474*a7b7c7c6SXukai Wang &pll1_div4.hw);
1475*a7b7c7c6SXukai Wang
1476*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(sec_fix_rate,
1477*a7b7c7c6SXukai Wang K230_SEC_FIX_RATE,
1478*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1479*a7b7c7c6SXukai Wang 1, 32, 6, 0x1F,
1480*a7b7c7c6SXukai Wang 0x80, 31, div, 0x0,
1481*a7b7c7c6SXukai Wang false, 0,
1482*a7b7c7c6SXukai Wang &sec_fix_gate.clk.hw);
1483*a7b7c7c6SXukai Wang
1484*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(sec_axi_gate,
1485*a7b7c7c6SXukai Wang K230_SEC_AXI_GATE,
1486*a7b7c7c6SXukai Wang 0x80, 4, 0, 0,
1487*a7b7c7c6SXukai Wang &pll1_div4.hw);
1488*a7b7c7c6SXukai Wang
1489*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(sec_axi_rate,
1490*a7b7c7c6SXukai Wang K230_SEC_AXI_RATE,
1491*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1492*a7b7c7c6SXukai Wang 1, 8, 11, 0x3,
1493*a7b7c7c6SXukai Wang 0x80, 31, div, 0,
1494*a7b7c7c6SXukai Wang false, 0,
1495*a7b7c7c6SXukai Wang &sec_axi_gate.clk.hw);
1496*a7b7c7c6SXukai Wang
1497*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(usb_480m_gate,
1498*a7b7c7c6SXukai Wang K230_USB_480M_GATE,
1499*a7b7c7c6SXukai Wang 0x100, 0, 0, 0,
1500*a7b7c7c6SXukai Wang &pll1.hw);
1501*a7b7c7c6SXukai Wang
1502*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(usb_480m_rate,
1503*a7b7c7c6SXukai Wang K230_USB_480M_RATE,
1504*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1505*a7b7c7c6SXukai Wang 1, 8, 1, 0x7,
1506*a7b7c7c6SXukai Wang 0x100, 31, div, 0,
1507*a7b7c7c6SXukai Wang false, 0,
1508*a7b7c7c6SXukai Wang &usb_480m_gate.clk.hw);
1509*a7b7c7c6SXukai Wang
1510*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(usb_100m_gate,
1511*a7b7c7c6SXukai Wang K230_USB_100M_GATE,
1512*a7b7c7c6SXukai Wang 0x100, 0, 0, 0,
1513*a7b7c7c6SXukai Wang &pll0_div4.hw);
1514*a7b7c7c6SXukai Wang
1515*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(usb_100m_rate,
1516*a7b7c7c6SXukai Wang K230_USB_100M_RATE,
1517*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1518*a7b7c7c6SXukai Wang 1, 8, 4, 0x7,
1519*a7b7c7c6SXukai Wang 0x100, 31, div, 0,
1520*a7b7c7c6SXukai Wang false, 0,
1521*a7b7c7c6SXukai Wang &usb_100m_gate.clk.hw);
1522*a7b7c7c6SXukai Wang
1523*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(dphy_dft_gate,
1524*a7b7c7c6SXukai Wang K230_DPHY_DFT_GATE,
1525*a7b7c7c6SXukai Wang 0x100, 0, 0, 0,
1526*a7b7c7c6SXukai Wang &pll0.hw);
1527*a7b7c7c6SXukai Wang
1528*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(dphy_dft_rate,
1529*a7b7c7c6SXukai Wang K230_DPHY_DFT_RATE,
1530*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1531*a7b7c7c6SXukai Wang 1, 16, 1, 0xF,
1532*a7b7c7c6SXukai Wang 0x104, 31, div, 0,
1533*a7b7c7c6SXukai Wang false, 0,
1534*a7b7c7c6SXukai Wang &dphy_dft_gate.clk.hw);
1535*a7b7c7c6SXukai Wang
1536*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(spi2axi_gate,
1537*a7b7c7c6SXukai Wang K230_SPI2AXI_GATE,
1538*a7b7c7c6SXukai Wang 0x108, 0, 0, 0,
1539*a7b7c7c6SXukai Wang &pll0_div4.hw);
1540*a7b7c7c6SXukai Wang
1541*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(spi2axi_rate,
1542*a7b7c7c6SXukai Wang K230_SPI2AXI_RATE,
1543*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1544*a7b7c7c6SXukai Wang 1, 8, 1, 0x7,
1545*a7b7c7c6SXukai Wang 0x108, 31, div, 0x0,
1546*a7b7c7c6SXukai Wang false, 0,
1547*a7b7c7c6SXukai Wang &spi2axi_gate.clk.hw);
1548*a7b7c7c6SXukai Wang
1549*a7b7c7c6SXukai Wang static const struct clk_parent_data k230_ai_src_mux_pdata[] = {
1550*a7b7c7c6SXukai Wang { .hw = &pll0_div2.hw, },
1551*a7b7c7c6SXukai Wang { .hw = &pll3_div2.hw, },
1552*a7b7c7c6SXukai Wang };
1553*a7b7c7c6SXukai Wang
1554*a7b7c7c6SXukai Wang K230_CLK_MUX_FORMAT(ai_src_mux,
1555*a7b7c7c6SXukai Wang K230_AI_SRC_MUX,
1556*a7b7c7c6SXukai Wang 0x8, 2, 0x1,
1557*a7b7c7c6SXukai Wang 0, 0,
1558*a7b7c7c6SXukai Wang k230_ai_src_mux_pdata);
1559*a7b7c7c6SXukai Wang
1560*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ai_src_gate,
1561*a7b7c7c6SXukai Wang K230_AI_SRC_GATE,
1562*a7b7c7c6SXukai Wang 0x8, 0, CLK_IGNORE_UNUSED, 0,
1563*a7b7c7c6SXukai Wang &ai_src_mux.clk.hw);
1564*a7b7c7c6SXukai Wang
1565*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(ai_src_rate,
1566*a7b7c7c6SXukai Wang K230_AI_SRC_RATE,
1567*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1568*a7b7c7c6SXukai Wang 1, 8, 3, 0x7,
1569*a7b7c7c6SXukai Wang 0x8, 31, div, 0x0,
1570*a7b7c7c6SXukai Wang false, 0,
1571*a7b7c7c6SXukai Wang &ai_src_gate.clk.hw);
1572*a7b7c7c6SXukai Wang
1573*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(ai_axi_gate,
1574*a7b7c7c6SXukai Wang K230_AI_AXI_GATE,
1575*a7b7c7c6SXukai Wang 0x8, 10, 0, 0,
1576*a7b7c7c6SXukai Wang &pll0_div4.hw);
1577*a7b7c7c6SXukai Wang
1578*a7b7c7c6SXukai Wang static const struct clk_parent_data k230_camera0_mux_pdata[] = {
1579*a7b7c7c6SXukai Wang { .hw = &pll1_div3.hw, },
1580*a7b7c7c6SXukai Wang { .hw = &pll1_div4.hw, },
1581*a7b7c7c6SXukai Wang { .hw = &pll0_div4.hw, },
1582*a7b7c7c6SXukai Wang };
1583*a7b7c7c6SXukai Wang
1584*a7b7c7c6SXukai Wang K230_CLK_MUX_FORMAT(camera0_mux,
1585*a7b7c7c6SXukai Wang K230_CAMERA0_MUX,
1586*a7b7c7c6SXukai Wang 0x6C, 3, 0x3,
1587*a7b7c7c6SXukai Wang 0, 0,
1588*a7b7c7c6SXukai Wang k230_camera0_mux_pdata);
1589*a7b7c7c6SXukai Wang
1590*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(camera0_gate,
1591*a7b7c7c6SXukai Wang K230_CAMERA0_GATE,
1592*a7b7c7c6SXukai Wang 0x6C, 0, CLK_IGNORE_UNUSED, 0,
1593*a7b7c7c6SXukai Wang &camera0_mux.clk.hw);
1594*a7b7c7c6SXukai Wang
1595*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(camera0_rate,
1596*a7b7c7c6SXukai Wang K230_CAMERA0_RATE,
1597*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1598*a7b7c7c6SXukai Wang 1, 32, 5, 0x1f,
1599*a7b7c7c6SXukai Wang 0x6C, 31, div, 0x0,
1600*a7b7c7c6SXukai Wang false, 0,
1601*a7b7c7c6SXukai Wang &camera0_gate.clk.hw);
1602*a7b7c7c6SXukai Wang
1603*a7b7c7c6SXukai Wang static const struct clk_parent_data k230_camera1_mux_pdata[] = {
1604*a7b7c7c6SXukai Wang { .hw = &pll1_div3.hw, },
1605*a7b7c7c6SXukai Wang { .hw = &pll1_div4.hw, },
1606*a7b7c7c6SXukai Wang { .hw = &pll0_div4.hw, },
1607*a7b7c7c6SXukai Wang };
1608*a7b7c7c6SXukai Wang
1609*a7b7c7c6SXukai Wang K230_CLK_MUX_FORMAT(camera1_mux,
1610*a7b7c7c6SXukai Wang K230_CAMERA1_MUX,
1611*a7b7c7c6SXukai Wang 0x6C, 10, 0x3,
1612*a7b7c7c6SXukai Wang 0, 0,
1613*a7b7c7c6SXukai Wang k230_camera1_mux_pdata);
1614*a7b7c7c6SXukai Wang
1615*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(camera1_gate,
1616*a7b7c7c6SXukai Wang K230_CAMERA1_GATE,
1617*a7b7c7c6SXukai Wang 0x6C, 1, CLK_IGNORE_UNUSED, 0,
1618*a7b7c7c6SXukai Wang &camera1_mux.clk.hw);
1619*a7b7c7c6SXukai Wang
1620*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(camera1_rate,
1621*a7b7c7c6SXukai Wang K230_CAMERA1_RATE,
1622*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1623*a7b7c7c6SXukai Wang 1, 32, 12, 0x1f,
1624*a7b7c7c6SXukai Wang 0x6C, 31, div, 0x0,
1625*a7b7c7c6SXukai Wang false, 0,
1626*a7b7c7c6SXukai Wang &camera1_gate.clk.hw);
1627*a7b7c7c6SXukai Wang
1628*a7b7c7c6SXukai Wang static const struct clk_parent_data k230_camera2_mux_pdata[] = {
1629*a7b7c7c6SXukai Wang { .hw = &pll1_div3.hw, },
1630*a7b7c7c6SXukai Wang { .hw = &pll1_div4.hw, },
1631*a7b7c7c6SXukai Wang { .hw = &pll0_div4.hw, },
1632*a7b7c7c6SXukai Wang };
1633*a7b7c7c6SXukai Wang
1634*a7b7c7c6SXukai Wang K230_CLK_MUX_FORMAT(camera2_mux,
1635*a7b7c7c6SXukai Wang K230_CAMERA2_MUX,
1636*a7b7c7c6SXukai Wang 0x6C, 17, 0x3,
1637*a7b7c7c6SXukai Wang 0, 0,
1638*a7b7c7c6SXukai Wang k230_camera2_mux_pdata);
1639*a7b7c7c6SXukai Wang
1640*a7b7c7c6SXukai Wang K230_CLK_GATE_FORMAT(camera2_gate,
1641*a7b7c7c6SXukai Wang K230_CAMERA2_GATE,
1642*a7b7c7c6SXukai Wang 0x6C, 2, CLK_IGNORE_UNUSED, 0,
1643*a7b7c7c6SXukai Wang &camera2_mux.clk.hw);
1644*a7b7c7c6SXukai Wang
1645*a7b7c7c6SXukai Wang K230_CLK_RATE_FORMAT(camera2_rate,
1646*a7b7c7c6SXukai Wang K230_CAMERA2_RATE,
1647*a7b7c7c6SXukai Wang 1, 1, 0, 0,
1648*a7b7c7c6SXukai Wang 1, 32, 19, 0x1f,
1649*a7b7c7c6SXukai Wang 0x6C, 31, div, 0x0,
1650*a7b7c7c6SXukai Wang false, 0,
1651*a7b7c7c6SXukai Wang &camera2_gate.clk.hw);
1652*a7b7c7c6SXukai Wang
1653*a7b7c7c6SXukai Wang static struct k230_clk_mux *k230_clk_muxs[] = {
1654*a7b7c7c6SXukai Wang &hs_ssi0_mux,
1655*a7b7c7c6SXukai Wang &hs_usb_ref_mux,
1656*a7b7c7c6SXukai Wang &cpu1_src_mux,
1657*a7b7c7c6SXukai Wang &timer0_mux,
1658*a7b7c7c6SXukai Wang &timer1_mux,
1659*a7b7c7c6SXukai Wang &timer2_mux,
1660*a7b7c7c6SXukai Wang &timer3_mux,
1661*a7b7c7c6SXukai Wang &timer4_mux,
1662*a7b7c7c6SXukai Wang &timer5_mux,
1663*a7b7c7c6SXukai Wang &shrm_sram_mux,
1664*a7b7c7c6SXukai Wang &ddrc_src_mux,
1665*a7b7c7c6SXukai Wang &ai_src_mux,
1666*a7b7c7c6SXukai Wang &camera0_mux,
1667*a7b7c7c6SXukai Wang &camera1_mux,
1668*a7b7c7c6SXukai Wang &camera2_mux,
1669*a7b7c7c6SXukai Wang };
1670*a7b7c7c6SXukai Wang
1671*a7b7c7c6SXukai Wang #define K230_CLK_MUX_NUM ARRAY_SIZE(k230_clk_muxs)
1672*a7b7c7c6SXukai Wang
1673*a7b7c7c6SXukai Wang static struct k230_clk_gate *k230_clk_gates[] = {
1674*a7b7c7c6SXukai Wang &cpu0_src_gate,
1675*a7b7c7c6SXukai Wang &cpu0_plic_gate,
1676*a7b7c7c6SXukai Wang &cpu0_noc_ddrcp4_gate,
1677*a7b7c7c6SXukai Wang &cpu0_apb_gate,
1678*a7b7c7c6SXukai Wang &cpu1_src_gate,
1679*a7b7c7c6SXukai Wang &cpu1_plic_gate,
1680*a7b7c7c6SXukai Wang &cpu1_apb_gate,
1681*a7b7c7c6SXukai Wang &pmu_apb_gate,
1682*a7b7c7c6SXukai Wang &hs_hclk_high_gate,
1683*a7b7c7c6SXukai Wang &hs_hclk_gate,
1684*a7b7c7c6SXukai Wang &hs_sd0_ahb_gate,
1685*a7b7c7c6SXukai Wang &hs_sd1_ahb_gate,
1686*a7b7c7c6SXukai Wang &hs_ssi1_ahb_gate,
1687*a7b7c7c6SXukai Wang &hs_ssi2_ahb_gate,
1688*a7b7c7c6SXukai Wang &hs_usb0_ahb_gate,
1689*a7b7c7c6SXukai Wang &hs_usb1_ahb_gate,
1690*a7b7c7c6SXukai Wang &hs_ssi0_axi_gate,
1691*a7b7c7c6SXukai Wang &hs_ssi1_gate,
1692*a7b7c7c6SXukai Wang &hs_ssi2_gate,
1693*a7b7c7c6SXukai Wang &hs_qspi_axi_src_gate,
1694*a7b7c7c6SXukai Wang &hs_ssi1_axi_gate,
1695*a7b7c7c6SXukai Wang &hs_ssi2_axi_gate,
1696*a7b7c7c6SXukai Wang &hs_sd_card_src_gate,
1697*a7b7c7c6SXukai Wang &hs_sd0_card_gate,
1698*a7b7c7c6SXukai Wang &hs_sd1_card_gate,
1699*a7b7c7c6SXukai Wang &hs_sd_axi_src_gate,
1700*a7b7c7c6SXukai Wang &hs_sd0_axi_gate,
1701*a7b7c7c6SXukai Wang &hs_sd1_axi_gate,
1702*a7b7c7c6SXukai Wang &hs_sd0_base_gate,
1703*a7b7c7c6SXukai Wang &hs_sd1_base_gate,
1704*a7b7c7c6SXukai Wang &hs_ssi0_gate,
1705*a7b7c7c6SXukai Wang &hs_sd_timer_src_gate,
1706*a7b7c7c6SXukai Wang &hs_sd0_timer_gate,
1707*a7b7c7c6SXukai Wang &hs_sd1_timer_gate,
1708*a7b7c7c6SXukai Wang &hs_usb0_ref_gate,
1709*a7b7c7c6SXukai Wang &hs_usb1_ref_gate,
1710*a7b7c7c6SXukai Wang &ls_apb_src_gate,
1711*a7b7c7c6SXukai Wang &ls_uart0_apb_gate,
1712*a7b7c7c6SXukai Wang &ls_uart1_apb_gate,
1713*a7b7c7c6SXukai Wang &ls_uart2_apb_gate,
1714*a7b7c7c6SXukai Wang &ls_uart3_apb_gate,
1715*a7b7c7c6SXukai Wang &ls_uart4_apb_gate,
1716*a7b7c7c6SXukai Wang &ls_i2c0_apb_gate,
1717*a7b7c7c6SXukai Wang &ls_i2c1_apb_gate,
1718*a7b7c7c6SXukai Wang &ls_i2c2_apb_gate,
1719*a7b7c7c6SXukai Wang &ls_i2c3_apb_gate,
1720*a7b7c7c6SXukai Wang &ls_i2c4_apb_gate,
1721*a7b7c7c6SXukai Wang &ls_gpio_apb_gate,
1722*a7b7c7c6SXukai Wang &ls_pwm_apb_gate,
1723*a7b7c7c6SXukai Wang &ls_jamlink0_apb_gate,
1724*a7b7c7c6SXukai Wang &ls_jamlink1_apb_gate,
1725*a7b7c7c6SXukai Wang &ls_jamlink2_apb_gate,
1726*a7b7c7c6SXukai Wang &ls_jamlink3_apb_gate,
1727*a7b7c7c6SXukai Wang &ls_audio_apb_gate,
1728*a7b7c7c6SXukai Wang &ls_adc_apb_gate,
1729*a7b7c7c6SXukai Wang &ls_codec_apb_gate,
1730*a7b7c7c6SXukai Wang &ls_i2c0_gate,
1731*a7b7c7c6SXukai Wang &ls_i2c1_gate,
1732*a7b7c7c6SXukai Wang &ls_i2c2_gate,
1733*a7b7c7c6SXukai Wang &ls_i2c3_gate,
1734*a7b7c7c6SXukai Wang &ls_i2c4_gate,
1735*a7b7c7c6SXukai Wang &ls_codec_adc_gate,
1736*a7b7c7c6SXukai Wang &ls_codec_dac_gate,
1737*a7b7c7c6SXukai Wang &ls_audio_dev_gate,
1738*a7b7c7c6SXukai Wang &ls_pdm_gate,
1739*a7b7c7c6SXukai Wang &ls_adc_gate,
1740*a7b7c7c6SXukai Wang &ls_uart0_gate,
1741*a7b7c7c6SXukai Wang &ls_uart1_gate,
1742*a7b7c7c6SXukai Wang &ls_uart2_gate,
1743*a7b7c7c6SXukai Wang &ls_uart3_gate,
1744*a7b7c7c6SXukai Wang &ls_uart4_gate,
1745*a7b7c7c6SXukai Wang &ls_jamlink0co_gate,
1746*a7b7c7c6SXukai Wang &ls_jamlink1co_gate,
1747*a7b7c7c6SXukai Wang &ls_jamlink2co_gate,
1748*a7b7c7c6SXukai Wang &ls_jamlink3co_gate,
1749*a7b7c7c6SXukai Wang &ls_gpio_debounce_gate,
1750*a7b7c7c6SXukai Wang &sysctl_wdt0_apb_gate,
1751*a7b7c7c6SXukai Wang &sysctl_wdt1_apb_gate,
1752*a7b7c7c6SXukai Wang &sysctl_timer_apb_gate,
1753*a7b7c7c6SXukai Wang &sysctl_iomux_apb_gate,
1754*a7b7c7c6SXukai Wang &sysctl_mailbox_apb_gate,
1755*a7b7c7c6SXukai Wang &sysctl_hdi_gate,
1756*a7b7c7c6SXukai Wang &sysctl_time_stamp_gate,
1757*a7b7c7c6SXukai Wang &sysctl_wdt0_gate,
1758*a7b7c7c6SXukai Wang &sysctl_wdt1_gate,
1759*a7b7c7c6SXukai Wang &timer0_gate,
1760*a7b7c7c6SXukai Wang &timer1_gate,
1761*a7b7c7c6SXukai Wang &timer2_gate,
1762*a7b7c7c6SXukai Wang &timer3_gate,
1763*a7b7c7c6SXukai Wang &timer4_gate,
1764*a7b7c7c6SXukai Wang &timer5_gate,
1765*a7b7c7c6SXukai Wang &shrm_apb_gate,
1766*a7b7c7c6SXukai Wang &shrm_sram_gate,
1767*a7b7c7c6SXukai Wang &shrm_axi_gate,
1768*a7b7c7c6SXukai Wang &shrm_axi_slave_gate,
1769*a7b7c7c6SXukai Wang &shrm_nonai2d_axi_gate,
1770*a7b7c7c6SXukai Wang &shrm_decompress_axi_gate,
1771*a7b7c7c6SXukai Wang &shrm_sdma_axi_gate,
1772*a7b7c7c6SXukai Wang &shrm_pdma_axi_gate,
1773*a7b7c7c6SXukai Wang &ddrc_src_gate,
1774*a7b7c7c6SXukai Wang &ddrc_bypass_gate,
1775*a7b7c7c6SXukai Wang &ddrc_apb_gate,
1776*a7b7c7c6SXukai Wang &display_ahb_gate,
1777*a7b7c7c6SXukai Wang &display_axi_gate,
1778*a7b7c7c6SXukai Wang &display_gpu_gate,
1779*a7b7c7c6SXukai Wang &display_dpip_gate,
1780*a7b7c7c6SXukai Wang &display_cfg_gate,
1781*a7b7c7c6SXukai Wang &display_ref_gate,
1782*a7b7c7c6SXukai Wang &vpu_src_gate,
1783*a7b7c7c6SXukai Wang &vpu_axi_gate,
1784*a7b7c7c6SXukai Wang &vpu_ddrcp2_gate,
1785*a7b7c7c6SXukai Wang &vpu_cfg_gate,
1786*a7b7c7c6SXukai Wang &sec_apb_gate,
1787*a7b7c7c6SXukai Wang &sec_fix_gate,
1788*a7b7c7c6SXukai Wang &sec_axi_gate,
1789*a7b7c7c6SXukai Wang &usb_480m_gate,
1790*a7b7c7c6SXukai Wang &usb_100m_gate,
1791*a7b7c7c6SXukai Wang &dphy_dft_gate,
1792*a7b7c7c6SXukai Wang &spi2axi_gate,
1793*a7b7c7c6SXukai Wang &ai_src_gate,
1794*a7b7c7c6SXukai Wang &ai_axi_gate,
1795*a7b7c7c6SXukai Wang &camera0_gate,
1796*a7b7c7c6SXukai Wang &camera1_gate,
1797*a7b7c7c6SXukai Wang &camera2_gate,
1798*a7b7c7c6SXukai Wang };
1799*a7b7c7c6SXukai Wang
1800*a7b7c7c6SXukai Wang #define K230_CLK_GATE_NUM ARRAY_SIZE(k230_clk_gates)
1801*a7b7c7c6SXukai Wang
1802*a7b7c7c6SXukai Wang static struct k230_clk_rate *k230_clk_rates[] = {
1803*a7b7c7c6SXukai Wang &cpu0_src_rate,
1804*a7b7c7c6SXukai Wang &cpu0_axi_rate,
1805*a7b7c7c6SXukai Wang &cpu0_plic_rate,
1806*a7b7c7c6SXukai Wang &cpu0_apb_rate,
1807*a7b7c7c6SXukai Wang &cpu1_src_rate,
1808*a7b7c7c6SXukai Wang &cpu1_axi_rate,
1809*a7b7c7c6SXukai Wang &cpu1_plic_rate,
1810*a7b7c7c6SXukai Wang &hs_hclk_high_rate,
1811*a7b7c7c6SXukai Wang &hs_hclk_rate,
1812*a7b7c7c6SXukai Wang &hs_ssi0_axi_rate,
1813*a7b7c7c6SXukai Wang &hs_ssi1_rate,
1814*a7b7c7c6SXukai Wang &hs_ssi2_rate,
1815*a7b7c7c6SXukai Wang &hs_qspi_axi_src_rate,
1816*a7b7c7c6SXukai Wang &hs_sd_card_src_rate,
1817*a7b7c7c6SXukai Wang &hs_sd_axi_src_rate,
1818*a7b7c7c6SXukai Wang &hs_usb_ref_50m_rate,
1819*a7b7c7c6SXukai Wang &hs_sd_timer_src_rate,
1820*a7b7c7c6SXukai Wang &ls_apb_src_rate,
1821*a7b7c7c6SXukai Wang &ls_gpio_debounce_rate,
1822*a7b7c7c6SXukai Wang &ls_i2c0_rate,
1823*a7b7c7c6SXukai Wang &ls_i2c1_rate,
1824*a7b7c7c6SXukai Wang &ls_i2c2_rate,
1825*a7b7c7c6SXukai Wang &ls_i2c3_rate,
1826*a7b7c7c6SXukai Wang &ls_i2c4_rate,
1827*a7b7c7c6SXukai Wang &ls_codec_adc_rate,
1828*a7b7c7c6SXukai Wang &ls_codec_dac_rate,
1829*a7b7c7c6SXukai Wang &ls_audio_dev_rate,
1830*a7b7c7c6SXukai Wang &ls_pdm_rate,
1831*a7b7c7c6SXukai Wang &ls_adc_rate,
1832*a7b7c7c6SXukai Wang &ls_uart0_rate,
1833*a7b7c7c6SXukai Wang &ls_uart1_rate,
1834*a7b7c7c6SXukai Wang &ls_uart2_rate,
1835*a7b7c7c6SXukai Wang &ls_uart3_rate,
1836*a7b7c7c6SXukai Wang &ls_uart4_rate,
1837*a7b7c7c6SXukai Wang &ls_jamlinkco_src_rate,
1838*a7b7c7c6SXukai Wang &sysctl_hdi_rate,
1839*a7b7c7c6SXukai Wang &sysctl_time_stamp_rate,
1840*a7b7c7c6SXukai Wang &sysctl_temp_sensor_rate,
1841*a7b7c7c6SXukai Wang &sysctl_wdt0_rate,
1842*a7b7c7c6SXukai Wang &sysctl_wdt1_rate,
1843*a7b7c7c6SXukai Wang &timer0_src_rate,
1844*a7b7c7c6SXukai Wang &timer1_src_rate,
1845*a7b7c7c6SXukai Wang &timer2_src_rate,
1846*a7b7c7c6SXukai Wang &timer3_src_rate,
1847*a7b7c7c6SXukai Wang &timer4_src_rate,
1848*a7b7c7c6SXukai Wang &timer5_src_rate,
1849*a7b7c7c6SXukai Wang &shrm_apb_rate,
1850*a7b7c7c6SXukai Wang &ddrc_src_rate,
1851*a7b7c7c6SXukai Wang &ddrc_apb_rate,
1852*a7b7c7c6SXukai Wang &display_ahb_rate,
1853*a7b7c7c6SXukai Wang &display_clkext_rate,
1854*a7b7c7c6SXukai Wang &display_gpu_rate,
1855*a7b7c7c6SXukai Wang &display_dpip_rate,
1856*a7b7c7c6SXukai Wang &display_cfg_rate,
1857*a7b7c7c6SXukai Wang &vpu_src_rate,
1858*a7b7c7c6SXukai Wang &vpu_axi_src_rate,
1859*a7b7c7c6SXukai Wang &vpu_cfg_rate,
1860*a7b7c7c6SXukai Wang &sec_apb_rate,
1861*a7b7c7c6SXukai Wang &sec_fix_rate,
1862*a7b7c7c6SXukai Wang &sec_axi_rate,
1863*a7b7c7c6SXukai Wang &usb_480m_rate,
1864*a7b7c7c6SXukai Wang &usb_100m_rate,
1865*a7b7c7c6SXukai Wang &dphy_dft_rate,
1866*a7b7c7c6SXukai Wang &spi2axi_rate,
1867*a7b7c7c6SXukai Wang &ai_src_rate,
1868*a7b7c7c6SXukai Wang &camera0_rate,
1869*a7b7c7c6SXukai Wang &camera1_rate,
1870*a7b7c7c6SXukai Wang &camera2_rate,
1871*a7b7c7c6SXukai Wang };
1872*a7b7c7c6SXukai Wang
1873*a7b7c7c6SXukai Wang #define K230_CLK_RATE_NUM ARRAY_SIZE(k230_clk_rates)
1874*a7b7c7c6SXukai Wang
1875*a7b7c7c6SXukai Wang #define K230_CLK_NUM (K230_CLK_MUX_NUM + K230_CLK_GATE_NUM + K230_CLK_RATE_NUM + 1)
1876*a7b7c7c6SXukai Wang
k230_pll_prepare(struct clk_hw * hw)1877*a7b7c7c6SXukai Wang static int k230_pll_prepare(struct clk_hw *hw)
1878*a7b7c7c6SXukai Wang {
1879*a7b7c7c6SXukai Wang struct k230_pll *pll = hw_to_k230_pll(hw);
1880*a7b7c7c6SXukai Wang u32 reg;
1881*a7b7c7c6SXukai Wang
1882*a7b7c7c6SXukai Wang /* wait for PLL lock until it reaches lock status */
1883*a7b7c7c6SXukai Wang return readl_poll_timeout(K230_PLLX_LOCK_ADDR(pll->reg, pll->id), reg,
1884*a7b7c7c6SXukai Wang reg & K230_PLL_LOCK_STATUS_MASK,
1885*a7b7c7c6SXukai Wang K230_PLL_LOCK_TIME_DELAY, K230_PLL_LOCK_TIMEOUT);
1886*a7b7c7c6SXukai Wang }
1887*a7b7c7c6SXukai Wang
k230_pll_hw_is_enabled(struct k230_pll * pll)1888*a7b7c7c6SXukai Wang static inline bool k230_pll_hw_is_enabled(struct k230_pll *pll)
1889*a7b7c7c6SXukai Wang {
1890*a7b7c7c6SXukai Wang return readl(K230_PLLX_GATE_ADDR(pll->reg, pll->id)) & K230_PLL_GATE_ENABLE;
1891*a7b7c7c6SXukai Wang }
1892*a7b7c7c6SXukai Wang
k230_pll_enable_hw(struct k230_pll * pll)1893*a7b7c7c6SXukai Wang static void k230_pll_enable_hw(struct k230_pll *pll)
1894*a7b7c7c6SXukai Wang {
1895*a7b7c7c6SXukai Wang u32 reg;
1896*a7b7c7c6SXukai Wang
1897*a7b7c7c6SXukai Wang if (k230_pll_hw_is_enabled(pll))
1898*a7b7c7c6SXukai Wang return;
1899*a7b7c7c6SXukai Wang
1900*a7b7c7c6SXukai Wang reg = readl(K230_PLLX_GATE_ADDR(pll->reg, pll->id));
1901*a7b7c7c6SXukai Wang reg |= K230_PLL_GATE_ENABLE | K230_PLL_GATE_WRITE_ENABLE;
1902*a7b7c7c6SXukai Wang writel(reg, K230_PLLX_GATE_ADDR(pll->reg, pll->id));
1903*a7b7c7c6SXukai Wang }
1904*a7b7c7c6SXukai Wang
k230_pll_enable(struct clk_hw * hw)1905*a7b7c7c6SXukai Wang static int k230_pll_enable(struct clk_hw *hw)
1906*a7b7c7c6SXukai Wang {
1907*a7b7c7c6SXukai Wang struct k230_pll *pll = hw_to_k230_pll(hw);
1908*a7b7c7c6SXukai Wang
1909*a7b7c7c6SXukai Wang guard(spinlock)(pll->lock);
1910*a7b7c7c6SXukai Wang
1911*a7b7c7c6SXukai Wang k230_pll_enable_hw(pll);
1912*a7b7c7c6SXukai Wang
1913*a7b7c7c6SXukai Wang return 0;
1914*a7b7c7c6SXukai Wang }
1915*a7b7c7c6SXukai Wang
k230_pll_disable(struct clk_hw * hw)1916*a7b7c7c6SXukai Wang static void k230_pll_disable(struct clk_hw *hw)
1917*a7b7c7c6SXukai Wang {
1918*a7b7c7c6SXukai Wang struct k230_pll *pll = hw_to_k230_pll(hw);
1919*a7b7c7c6SXukai Wang u32 reg;
1920*a7b7c7c6SXukai Wang
1921*a7b7c7c6SXukai Wang guard(spinlock)(pll->lock);
1922*a7b7c7c6SXukai Wang
1923*a7b7c7c6SXukai Wang reg = readl(K230_PLLX_GATE_ADDR(pll->reg, pll->id));
1924*a7b7c7c6SXukai Wang reg &= ~(K230_PLL_GATE_ENABLE);
1925*a7b7c7c6SXukai Wang reg |= (K230_PLL_GATE_WRITE_ENABLE);
1926*a7b7c7c6SXukai Wang writel(reg, K230_PLLX_GATE_ADDR(pll->reg, pll->id));
1927*a7b7c7c6SXukai Wang }
1928*a7b7c7c6SXukai Wang
k230_pll_is_enabled(struct clk_hw * hw)1929*a7b7c7c6SXukai Wang static int k230_pll_is_enabled(struct clk_hw *hw)
1930*a7b7c7c6SXukai Wang {
1931*a7b7c7c6SXukai Wang return k230_pll_hw_is_enabled(hw_to_k230_pll(hw));
1932*a7b7c7c6SXukai Wang }
1933*a7b7c7c6SXukai Wang
k230_pll_get_rate(struct clk_hw * hw,unsigned long parent_rate)1934*a7b7c7c6SXukai Wang static unsigned long k230_pll_get_rate(struct clk_hw *hw, unsigned long parent_rate)
1935*a7b7c7c6SXukai Wang {
1936*a7b7c7c6SXukai Wang struct k230_pll *pll = hw_to_k230_pll(hw);
1937*a7b7c7c6SXukai Wang u32 reg;
1938*a7b7c7c6SXukai Wang u32 r, f, od;
1939*a7b7c7c6SXukai Wang
1940*a7b7c7c6SXukai Wang guard(spinlock)(pll->lock);
1941*a7b7c7c6SXukai Wang
1942*a7b7c7c6SXukai Wang reg = readl(K230_PLLX_BYPASS_ADDR(pll->reg, pll->id));
1943*a7b7c7c6SXukai Wang if (reg & K230_PLL_BYPASS_ENABLE)
1944*a7b7c7c6SXukai Wang return parent_rate;
1945*a7b7c7c6SXukai Wang
1946*a7b7c7c6SXukai Wang reg = readl(K230_PLLX_LOCK_ADDR(pll->reg, pll->id));
1947*a7b7c7c6SXukai Wang if (!(reg & (K230_PLL_LOCK_STATUS_MASK)))
1948*a7b7c7c6SXukai Wang return 0;
1949*a7b7c7c6SXukai Wang
1950*a7b7c7c6SXukai Wang reg = readl(K230_PLLX_DIV_ADDR(pll->reg, pll->id));
1951*a7b7c7c6SXukai Wang r = FIELD_GET(K230_PLL_R_MASK, reg) + 1;
1952*a7b7c7c6SXukai Wang f = FIELD_GET(K230_PLL_F_MASK, reg) + 1;
1953*a7b7c7c6SXukai Wang od = FIELD_GET(K230_PLL_OD_MASK, reg) + 1;
1954*a7b7c7c6SXukai Wang
1955*a7b7c7c6SXukai Wang return mul_u64_u32_div(parent_rate, f, r * od);
1956*a7b7c7c6SXukai Wang }
1957*a7b7c7c6SXukai Wang
k230_register_plls(struct platform_device * pdev,spinlock_t * lock,void __iomem * reg)1958*a7b7c7c6SXukai Wang static int k230_register_plls(struct platform_device *pdev, spinlock_t *lock,
1959*a7b7c7c6SXukai Wang void __iomem *reg)
1960*a7b7c7c6SXukai Wang {
1961*a7b7c7c6SXukai Wang int i, ret;
1962*a7b7c7c6SXukai Wang struct k230_pll *pll;
1963*a7b7c7c6SXukai Wang
1964*a7b7c7c6SXukai Wang for (i = 0; i < ARRAY_SIZE(k230_plls); i++) {
1965*a7b7c7c6SXukai Wang const char *name;
1966*a7b7c7c6SXukai Wang
1967*a7b7c7c6SXukai Wang pll = k230_plls[i];
1968*a7b7c7c6SXukai Wang
1969*a7b7c7c6SXukai Wang name = pll->hw.init->name;
1970*a7b7c7c6SXukai Wang pll->lock = lock;
1971*a7b7c7c6SXukai Wang pll->reg = reg;
1972*a7b7c7c6SXukai Wang
1973*a7b7c7c6SXukai Wang ret = devm_clk_hw_register(&pdev->dev, &pll->hw);
1974*a7b7c7c6SXukai Wang if (ret)
1975*a7b7c7c6SXukai Wang return ret;
1976*a7b7c7c6SXukai Wang
1977*a7b7c7c6SXukai Wang ret = devm_clk_hw_register_clkdev(&pdev->dev, &pll->hw, name, NULL);
1978*a7b7c7c6SXukai Wang if (ret)
1979*a7b7c7c6SXukai Wang return ret;
1980*a7b7c7c6SXukai Wang }
1981*a7b7c7c6SXukai Wang
1982*a7b7c7c6SXukai Wang return 0;
1983*a7b7c7c6SXukai Wang }
1984*a7b7c7c6SXukai Wang
k230_register_pll_divs(struct platform_device * pdev)1985*a7b7c7c6SXukai Wang static int k230_register_pll_divs(struct platform_device *pdev)
1986*a7b7c7c6SXukai Wang {
1987*a7b7c7c6SXukai Wang struct clk_fixed_factor *pll_div;
1988*a7b7c7c6SXukai Wang int ret;
1989*a7b7c7c6SXukai Wang
1990*a7b7c7c6SXukai Wang for (int i = 0; i < ARRAY_SIZE(k230_pll_divs); i++) {
1991*a7b7c7c6SXukai Wang const char *name;
1992*a7b7c7c6SXukai Wang
1993*a7b7c7c6SXukai Wang pll_div = k230_pll_divs[i];
1994*a7b7c7c6SXukai Wang
1995*a7b7c7c6SXukai Wang name = pll_div->hw.init->name;
1996*a7b7c7c6SXukai Wang
1997*a7b7c7c6SXukai Wang ret = devm_clk_hw_register(&pdev->dev, &pll_div->hw);
1998*a7b7c7c6SXukai Wang if (ret)
1999*a7b7c7c6SXukai Wang return ret;
2000*a7b7c7c6SXukai Wang
2001*a7b7c7c6SXukai Wang ret = devm_clk_hw_register_clkdev(&pdev->dev, &pll_div->hw,
2002*a7b7c7c6SXukai Wang name, NULL);
2003*a7b7c7c6SXukai Wang if (ret)
2004*a7b7c7c6SXukai Wang return ret;
2005*a7b7c7c6SXukai Wang }
2006*a7b7c7c6SXukai Wang
2007*a7b7c7c6SXukai Wang return 0;
2008*a7b7c7c6SXukai Wang }
2009*a7b7c7c6SXukai Wang
k230_clk_get_rate_mul(struct clk_hw * hw,unsigned long parent_rate)2010*a7b7c7c6SXukai Wang static unsigned long k230_clk_get_rate_mul(struct clk_hw *hw,
2011*a7b7c7c6SXukai Wang unsigned long parent_rate)
2012*a7b7c7c6SXukai Wang {
2013*a7b7c7c6SXukai Wang struct k230_clk_rate *clk = hw_to_k230_clk_rate(hw);
2014*a7b7c7c6SXukai Wang struct k230_clk_rate_self *rate_self = &clk->clk;
2015*a7b7c7c6SXukai Wang u32 mul, div;
2016*a7b7c7c6SXukai Wang
2017*a7b7c7c6SXukai Wang guard(spinlock)(rate_self->lock);
2018*a7b7c7c6SXukai Wang
2019*a7b7c7c6SXukai Wang div = rate_self->div_max;
2020*a7b7c7c6SXukai Wang mul = (readl(rate_self->reg + clk->mul_reg_off) >> rate_self->mul_shift)
2021*a7b7c7c6SXukai Wang & rate_self->mul_mask;
2022*a7b7c7c6SXukai Wang
2023*a7b7c7c6SXukai Wang return mul_u64_u32_div(parent_rate, mul + 1, div);
2024*a7b7c7c6SXukai Wang }
2025*a7b7c7c6SXukai Wang
k230_clk_get_rate_div(struct clk_hw * hw,unsigned long parent_rate)2026*a7b7c7c6SXukai Wang static unsigned long k230_clk_get_rate_div(struct clk_hw *hw,
2027*a7b7c7c6SXukai Wang unsigned long parent_rate)
2028*a7b7c7c6SXukai Wang {
2029*a7b7c7c6SXukai Wang struct k230_clk_rate *clk = hw_to_k230_clk_rate(hw);
2030*a7b7c7c6SXukai Wang struct k230_clk_rate_self *rate_self = &clk->clk;
2031*a7b7c7c6SXukai Wang u32 mul, div;
2032*a7b7c7c6SXukai Wang
2033*a7b7c7c6SXukai Wang guard(spinlock)(rate_self->lock);
2034*a7b7c7c6SXukai Wang
2035*a7b7c7c6SXukai Wang mul = rate_self->mul_max;
2036*a7b7c7c6SXukai Wang div = (readl(rate_self->reg + clk->div_reg_off) >> rate_self->div_shift)
2037*a7b7c7c6SXukai Wang & rate_self->div_mask;
2038*a7b7c7c6SXukai Wang
2039*a7b7c7c6SXukai Wang return mul_u64_u32_div(parent_rate, mul, div + 1);
2040*a7b7c7c6SXukai Wang }
2041*a7b7c7c6SXukai Wang
k230_clk_get_rate_mul_div(struct clk_hw * hw,unsigned long parent_rate)2042*a7b7c7c6SXukai Wang static unsigned long k230_clk_get_rate_mul_div(struct clk_hw *hw,
2043*a7b7c7c6SXukai Wang unsigned long parent_rate)
2044*a7b7c7c6SXukai Wang {
2045*a7b7c7c6SXukai Wang struct k230_clk_rate *clk = hw_to_k230_clk_rate(hw);
2046*a7b7c7c6SXukai Wang struct k230_clk_rate_self *rate_self = &clk->clk;
2047*a7b7c7c6SXukai Wang u32 mul, div;
2048*a7b7c7c6SXukai Wang
2049*a7b7c7c6SXukai Wang guard(spinlock)(rate_self->lock);
2050*a7b7c7c6SXukai Wang
2051*a7b7c7c6SXukai Wang div = (readl(rate_self->reg + clk->div_reg_off) >> rate_self->div_shift)
2052*a7b7c7c6SXukai Wang & rate_self->div_mask;
2053*a7b7c7c6SXukai Wang mul = (readl(rate_self->reg + clk->mul_reg_off) >> rate_self->mul_shift)
2054*a7b7c7c6SXukai Wang & rate_self->mul_mask;
2055*a7b7c7c6SXukai Wang
2056*a7b7c7c6SXukai Wang return mul_u64_u32_div(parent_rate, mul, div);
2057*a7b7c7c6SXukai Wang }
2058*a7b7c7c6SXukai Wang
k230_clk_find_approximate_mul(u32 mul_min,u32 mul_max,u32 div_min,u32 div_max,unsigned long rate,unsigned long parent_rate,u32 * div,u32 * mul)2059*a7b7c7c6SXukai Wang static int k230_clk_find_approximate_mul(u32 mul_min, u32 mul_max,
2060*a7b7c7c6SXukai Wang u32 div_min, u32 div_max,
2061*a7b7c7c6SXukai Wang unsigned long rate, unsigned long parent_rate,
2062*a7b7c7c6SXukai Wang u32 *div, u32 *mul)
2063*a7b7c7c6SXukai Wang {
2064*a7b7c7c6SXukai Wang long abs_min;
2065*a7b7c7c6SXukai Wang long abs_current;
2066*a7b7c7c6SXukai Wang long perfect_divide;
2067*a7b7c7c6SXukai Wang
2068*a7b7c7c6SXukai Wang if (!rate || !parent_rate || !mul_min)
2069*a7b7c7c6SXukai Wang return -EINVAL;
2070*a7b7c7c6SXukai Wang
2071*a7b7c7c6SXukai Wang perfect_divide = (long)((parent_rate * 1000) / rate);
2072*a7b7c7c6SXukai Wang abs_min = abs(perfect_divide -
2073*a7b7c7c6SXukai Wang (long)(((long)div_max * 1000) / (long)mul_min));
2074*a7b7c7c6SXukai Wang *mul = mul_min;
2075*a7b7c7c6SXukai Wang
2076*a7b7c7c6SXukai Wang for (u32 i = mul_min + 1; i <= mul_max; i++) {
2077*a7b7c7c6SXukai Wang abs_current = abs(perfect_divide -
2078*a7b7c7c6SXukai Wang (long)(((long)div_max * 1000) / (long)i));
2079*a7b7c7c6SXukai Wang
2080*a7b7c7c6SXukai Wang if (abs_min > abs_current) {
2081*a7b7c7c6SXukai Wang abs_min = abs_current;
2082*a7b7c7c6SXukai Wang *mul = i;
2083*a7b7c7c6SXukai Wang }
2084*a7b7c7c6SXukai Wang }
2085*a7b7c7c6SXukai Wang
2086*a7b7c7c6SXukai Wang *div = div_max;
2087*a7b7c7c6SXukai Wang
2088*a7b7c7c6SXukai Wang return 0;
2089*a7b7c7c6SXukai Wang }
2090*a7b7c7c6SXukai Wang
k230_clk_find_approximate_div(u32 mul_min,u32 mul_max,u32 div_min,u32 div_max,unsigned long rate,unsigned long parent_rate,u32 * div,u32 * mul)2091*a7b7c7c6SXukai Wang static int k230_clk_find_approximate_div(u32 mul_min, u32 mul_max,
2092*a7b7c7c6SXukai Wang u32 div_min, u32 div_max,
2093*a7b7c7c6SXukai Wang unsigned long rate, unsigned long parent_rate,
2094*a7b7c7c6SXukai Wang u32 *div, u32 *mul)
2095*a7b7c7c6SXukai Wang {
2096*a7b7c7c6SXukai Wang long abs_min;
2097*a7b7c7c6SXukai Wang long abs_current;
2098*a7b7c7c6SXukai Wang long perfect_divide;
2099*a7b7c7c6SXukai Wang
2100*a7b7c7c6SXukai Wang if (!rate || !parent_rate || !mul_max)
2101*a7b7c7c6SXukai Wang return -EINVAL;
2102*a7b7c7c6SXukai Wang
2103*a7b7c7c6SXukai Wang perfect_divide = (long)((parent_rate * 1000) / rate);
2104*a7b7c7c6SXukai Wang abs_min = abs(perfect_divide -
2105*a7b7c7c6SXukai Wang (long)(((long)div_min * 1000) / (long)mul_max));
2106*a7b7c7c6SXukai Wang *div = div_min;
2107*a7b7c7c6SXukai Wang
2108*a7b7c7c6SXukai Wang for (u32 i = div_min + 1; i <= div_max; i++) {
2109*a7b7c7c6SXukai Wang abs_current = abs(perfect_divide -
2110*a7b7c7c6SXukai Wang (long)(((long)i * 1000) / (long)mul_max));
2111*a7b7c7c6SXukai Wang
2112*a7b7c7c6SXukai Wang if (abs_min > abs_current) {
2113*a7b7c7c6SXukai Wang abs_min = abs_current;
2114*a7b7c7c6SXukai Wang *div = i;
2115*a7b7c7c6SXukai Wang }
2116*a7b7c7c6SXukai Wang }
2117*a7b7c7c6SXukai Wang
2118*a7b7c7c6SXukai Wang *mul = mul_max;
2119*a7b7c7c6SXukai Wang
2120*a7b7c7c6SXukai Wang return 0;
2121*a7b7c7c6SXukai Wang }
2122*a7b7c7c6SXukai Wang
k230_clk_find_approximate_mul_div(u32 mul_min,u32 mul_max,u32 div_min,u32 div_max,unsigned long rate,unsigned long parent_rate,u32 * div,u32 * mul)2123*a7b7c7c6SXukai Wang static int k230_clk_find_approximate_mul_div(u32 mul_min, u32 mul_max,
2124*a7b7c7c6SXukai Wang u32 div_min, u32 div_max,
2125*a7b7c7c6SXukai Wang unsigned long rate,
2126*a7b7c7c6SXukai Wang unsigned long parent_rate,
2127*a7b7c7c6SXukai Wang u32 *div, u32 *mul)
2128*a7b7c7c6SXukai Wang {
2129*a7b7c7c6SXukai Wang unsigned long best_mul, best_div;
2130*a7b7c7c6SXukai Wang
2131*a7b7c7c6SXukai Wang if (!rate || !parent_rate || !mul_min)
2132*a7b7c7c6SXukai Wang return -EINVAL;
2133*a7b7c7c6SXukai Wang
2134*a7b7c7c6SXukai Wang rational_best_approximation(rate, parent_rate,
2135*a7b7c7c6SXukai Wang (unsigned long)mul_max, (unsigned long)div_max,
2136*a7b7c7c6SXukai Wang &best_mul, &best_div);
2137*a7b7c7c6SXukai Wang
2138*a7b7c7c6SXukai Wang if (best_mul < mul_min)
2139*a7b7c7c6SXukai Wang best_mul = mul_min;
2140*a7b7c7c6SXukai Wang
2141*a7b7c7c6SXukai Wang if (best_div < div_min)
2142*a7b7c7c6SXukai Wang best_div = div_min;
2143*a7b7c7c6SXukai Wang
2144*a7b7c7c6SXukai Wang *mul = (u32)best_mul;
2145*a7b7c7c6SXukai Wang *div = (u32)best_div;
2146*a7b7c7c6SXukai Wang
2147*a7b7c7c6SXukai Wang return 0;
2148*a7b7c7c6SXukai Wang }
2149*a7b7c7c6SXukai Wang
k230_clk_determine_rate_mul(struct clk_hw * hw,struct clk_rate_request * req)2150*a7b7c7c6SXukai Wang static int k230_clk_determine_rate_mul(struct clk_hw *hw, struct clk_rate_request *req)
2151*a7b7c7c6SXukai Wang {
2152*a7b7c7c6SXukai Wang int ret;
2153*a7b7c7c6SXukai Wang struct k230_clk_rate_self *rate_self = hw_to_k230_clk_rate_self(hw);
2154*a7b7c7c6SXukai Wang unsigned long rate = req->rate;
2155*a7b7c7c6SXukai Wang unsigned long parent_rate = req->best_parent_rate;
2156*a7b7c7c6SXukai Wang u32 div, mul;
2157*a7b7c7c6SXukai Wang
2158*a7b7c7c6SXukai Wang ret = k230_clk_find_approximate_mul(rate_self->mul_min, rate_self->mul_max,
2159*a7b7c7c6SXukai Wang rate_self->div_min, rate_self->div_max,
2160*a7b7c7c6SXukai Wang rate, parent_rate, &div, &mul);
2161*a7b7c7c6SXukai Wang if (ret)
2162*a7b7c7c6SXukai Wang return ret;
2163*a7b7c7c6SXukai Wang
2164*a7b7c7c6SXukai Wang req->rate = mul_u64_u32_div(parent_rate, mul, div);
2165*a7b7c7c6SXukai Wang
2166*a7b7c7c6SXukai Wang return 0;
2167*a7b7c7c6SXukai Wang }
2168*a7b7c7c6SXukai Wang
k230_clk_determine_rate_div(struct clk_hw * hw,struct clk_rate_request * req)2169*a7b7c7c6SXukai Wang static int k230_clk_determine_rate_div(struct clk_hw *hw, struct clk_rate_request *req)
2170*a7b7c7c6SXukai Wang {
2171*a7b7c7c6SXukai Wang int ret;
2172*a7b7c7c6SXukai Wang struct k230_clk_rate_self *rate_self = hw_to_k230_clk_rate_self(hw);
2173*a7b7c7c6SXukai Wang unsigned long rate = req->rate;
2174*a7b7c7c6SXukai Wang unsigned long parent_rate = req->best_parent_rate;
2175*a7b7c7c6SXukai Wang u32 div, mul;
2176*a7b7c7c6SXukai Wang
2177*a7b7c7c6SXukai Wang ret = k230_clk_find_approximate_div(rate_self->mul_min, rate_self->mul_max,
2178*a7b7c7c6SXukai Wang rate_self->div_min, rate_self->div_max,
2179*a7b7c7c6SXukai Wang rate, parent_rate, &div, &mul);
2180*a7b7c7c6SXukai Wang if (ret)
2181*a7b7c7c6SXukai Wang return ret;
2182*a7b7c7c6SXukai Wang
2183*a7b7c7c6SXukai Wang req->rate = mul_u64_u32_div(parent_rate, mul, div);
2184*a7b7c7c6SXukai Wang
2185*a7b7c7c6SXukai Wang return 0;
2186*a7b7c7c6SXukai Wang }
2187*a7b7c7c6SXukai Wang
k230_clk_determine_rate_mul_div(struct clk_hw * hw,struct clk_rate_request * req)2188*a7b7c7c6SXukai Wang static int k230_clk_determine_rate_mul_div(struct clk_hw *hw, struct clk_rate_request *req)
2189*a7b7c7c6SXukai Wang {
2190*a7b7c7c6SXukai Wang int ret;
2191*a7b7c7c6SXukai Wang struct k230_clk_rate_self *rate_self = hw_to_k230_clk_rate_self(hw);
2192*a7b7c7c6SXukai Wang unsigned long rate = req->rate;
2193*a7b7c7c6SXukai Wang unsigned long parent_rate = req->best_parent_rate;
2194*a7b7c7c6SXukai Wang u32 div, mul;
2195*a7b7c7c6SXukai Wang
2196*a7b7c7c6SXukai Wang ret = k230_clk_find_approximate_mul_div(rate_self->mul_min, rate_self->mul_max,
2197*a7b7c7c6SXukai Wang rate_self->div_min, rate_self->div_max,
2198*a7b7c7c6SXukai Wang rate, parent_rate, &div, &mul);
2199*a7b7c7c6SXukai Wang if (ret)
2200*a7b7c7c6SXukai Wang return ret;
2201*a7b7c7c6SXukai Wang
2202*a7b7c7c6SXukai Wang req->rate = mul_u64_u32_div(parent_rate, mul, div);
2203*a7b7c7c6SXukai Wang
2204*a7b7c7c6SXukai Wang return 0;
2205*a7b7c7c6SXukai Wang }
2206*a7b7c7c6SXukai Wang
k230_clk_set_rate_mul(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)2207*a7b7c7c6SXukai Wang static int k230_clk_set_rate_mul(struct clk_hw *hw, unsigned long rate,
2208*a7b7c7c6SXukai Wang unsigned long parent_rate)
2209*a7b7c7c6SXukai Wang {
2210*a7b7c7c6SXukai Wang int ret;
2211*a7b7c7c6SXukai Wang struct k230_clk_rate *clk = hw_to_k230_clk_rate(hw);
2212*a7b7c7c6SXukai Wang struct k230_clk_rate_self *rate_self = &clk->clk;
2213*a7b7c7c6SXukai Wang u32 div, mul, mul_reg;
2214*a7b7c7c6SXukai Wang
2215*a7b7c7c6SXukai Wang if (rate > parent_rate)
2216*a7b7c7c6SXukai Wang return -EINVAL;
2217*a7b7c7c6SXukai Wang
2218*a7b7c7c6SXukai Wang if (rate_self->read_only)
2219*a7b7c7c6SXukai Wang return 0;
2220*a7b7c7c6SXukai Wang
2221*a7b7c7c6SXukai Wang ret = k230_clk_find_approximate_mul(rate_self->mul_min, rate_self->mul_max,
2222*a7b7c7c6SXukai Wang rate_self->div_min, rate_self->div_max,
2223*a7b7c7c6SXukai Wang rate, parent_rate, &div, &mul);
2224*a7b7c7c6SXukai Wang if (ret)
2225*a7b7c7c6SXukai Wang return ret;
2226*a7b7c7c6SXukai Wang
2227*a7b7c7c6SXukai Wang guard(spinlock)(rate_self->lock);
2228*a7b7c7c6SXukai Wang
2229*a7b7c7c6SXukai Wang mul_reg = readl(rate_self->reg + clk->mul_reg_off);
2230*a7b7c7c6SXukai Wang mul_reg |= ((mul - 1) & rate_self->mul_mask) << (rate_self->mul_shift);
2231*a7b7c7c6SXukai Wang mul_reg |= BIT(rate_self->write_enable_bit);
2232*a7b7c7c6SXukai Wang writel(mul_reg, rate_self->reg + clk->mul_reg_off);
2233*a7b7c7c6SXukai Wang
2234*a7b7c7c6SXukai Wang return 0;
2235*a7b7c7c6SXukai Wang }
2236*a7b7c7c6SXukai Wang
k230_clk_set_rate_div(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)2237*a7b7c7c6SXukai Wang static int k230_clk_set_rate_div(struct clk_hw *hw, unsigned long rate,
2238*a7b7c7c6SXukai Wang unsigned long parent_rate)
2239*a7b7c7c6SXukai Wang {
2240*a7b7c7c6SXukai Wang int ret;
2241*a7b7c7c6SXukai Wang struct k230_clk_rate *clk = hw_to_k230_clk_rate(hw);
2242*a7b7c7c6SXukai Wang struct k230_clk_rate_self *rate_self = &clk->clk;
2243*a7b7c7c6SXukai Wang u32 div, mul, div_reg;
2244*a7b7c7c6SXukai Wang
2245*a7b7c7c6SXukai Wang if (rate > parent_rate)
2246*a7b7c7c6SXukai Wang return -EINVAL;
2247*a7b7c7c6SXukai Wang
2248*a7b7c7c6SXukai Wang if (rate_self->read_only)
2249*a7b7c7c6SXukai Wang return 0;
2250*a7b7c7c6SXukai Wang
2251*a7b7c7c6SXukai Wang ret = k230_clk_find_approximate_div(rate_self->mul_min, rate_self->mul_max,
2252*a7b7c7c6SXukai Wang rate_self->div_min, rate_self->div_max,
2253*a7b7c7c6SXukai Wang rate, parent_rate, &div, &mul);
2254*a7b7c7c6SXukai Wang if (ret)
2255*a7b7c7c6SXukai Wang return ret;
2256*a7b7c7c6SXukai Wang
2257*a7b7c7c6SXukai Wang guard(spinlock)(rate_self->lock);
2258*a7b7c7c6SXukai Wang
2259*a7b7c7c6SXukai Wang div_reg = readl(rate_self->reg + clk->div_reg_off);
2260*a7b7c7c6SXukai Wang div_reg |= ((div - 1) & rate_self->div_mask) << (rate_self->div_shift);
2261*a7b7c7c6SXukai Wang div_reg |= BIT(rate_self->write_enable_bit);
2262*a7b7c7c6SXukai Wang writel(div_reg, rate_self->reg + clk->div_reg_off);
2263*a7b7c7c6SXukai Wang
2264*a7b7c7c6SXukai Wang return 0;
2265*a7b7c7c6SXukai Wang }
2266*a7b7c7c6SXukai Wang
k230_clk_set_rate_mul_div(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)2267*a7b7c7c6SXukai Wang static int k230_clk_set_rate_mul_div(struct clk_hw *hw, unsigned long rate,
2268*a7b7c7c6SXukai Wang unsigned long parent_rate)
2269*a7b7c7c6SXukai Wang {
2270*a7b7c7c6SXukai Wang int ret;
2271*a7b7c7c6SXukai Wang struct k230_clk_rate *clk = hw_to_k230_clk_rate(hw);
2272*a7b7c7c6SXukai Wang struct k230_clk_rate_self *rate_self = &clk->clk;
2273*a7b7c7c6SXukai Wang u32 div, mul, div_reg, mul_reg;
2274*a7b7c7c6SXukai Wang
2275*a7b7c7c6SXukai Wang if (rate > parent_rate)
2276*a7b7c7c6SXukai Wang return -EINVAL;
2277*a7b7c7c6SXukai Wang
2278*a7b7c7c6SXukai Wang if (rate_self->read_only)
2279*a7b7c7c6SXukai Wang return 0;
2280*a7b7c7c6SXukai Wang
2281*a7b7c7c6SXukai Wang ret = k230_clk_find_approximate_mul_div(rate_self->mul_min, rate_self->mul_max,
2282*a7b7c7c6SXukai Wang rate_self->div_min, rate_self->div_max,
2283*a7b7c7c6SXukai Wang rate, parent_rate, &div, &mul);
2284*a7b7c7c6SXukai Wang if (ret)
2285*a7b7c7c6SXukai Wang return ret;
2286*a7b7c7c6SXukai Wang
2287*a7b7c7c6SXukai Wang guard(spinlock)(rate_self->lock);
2288*a7b7c7c6SXukai Wang
2289*a7b7c7c6SXukai Wang div_reg = readl(rate_self->reg + clk->div_reg_off);
2290*a7b7c7c6SXukai Wang div_reg |= ((div - 1) & rate_self->div_mask) << (rate_self->div_shift);
2291*a7b7c7c6SXukai Wang div_reg |= BIT(rate_self->write_enable_bit);
2292*a7b7c7c6SXukai Wang writel(div_reg, rate_self->reg + clk->div_reg_off);
2293*a7b7c7c6SXukai Wang
2294*a7b7c7c6SXukai Wang mul_reg = readl(rate_self->reg + clk->mul_reg_off);
2295*a7b7c7c6SXukai Wang mul_reg |= ((mul - 1) & rate_self->mul_mask) << (rate_self->mul_shift);
2296*a7b7c7c6SXukai Wang mul_reg |= BIT(rate_self->write_enable_bit);
2297*a7b7c7c6SXukai Wang writel(mul_reg, rate_self->reg + clk->mul_reg_off);
2298*a7b7c7c6SXukai Wang
2299*a7b7c7c6SXukai Wang return 0;
2300*a7b7c7c6SXukai Wang }
2301*a7b7c7c6SXukai Wang
k230_register_clk(int id,struct clk_hw * hw,struct device * dev,struct clk_hw_onecell_data * hw_data)2302*a7b7c7c6SXukai Wang static int k230_register_clk(int id, struct clk_hw *hw, struct device *dev,
2303*a7b7c7c6SXukai Wang struct clk_hw_onecell_data *hw_data)
2304*a7b7c7c6SXukai Wang {
2305*a7b7c7c6SXukai Wang int ret;
2306*a7b7c7c6SXukai Wang
2307*a7b7c7c6SXukai Wang ret = devm_clk_hw_register(dev, hw);
2308*a7b7c7c6SXukai Wang if (ret)
2309*a7b7c7c6SXukai Wang return ret;
2310*a7b7c7c6SXukai Wang
2311*a7b7c7c6SXukai Wang hw_data->hws[id] = hw;
2312*a7b7c7c6SXukai Wang
2313*a7b7c7c6SXukai Wang return 0;
2314*a7b7c7c6SXukai Wang }
2315*a7b7c7c6SXukai Wang
k230_register_clks(struct platform_device * pdev,struct clk_hw_onecell_data * hw_data,spinlock_t * lock,void __iomem * reg)2316*a7b7c7c6SXukai Wang static int k230_register_clks(struct platform_device *pdev,
2317*a7b7c7c6SXukai Wang struct clk_hw_onecell_data *hw_data,
2318*a7b7c7c6SXukai Wang spinlock_t *lock, void __iomem *reg)
2319*a7b7c7c6SXukai Wang {
2320*a7b7c7c6SXukai Wang int i, ret;
2321*a7b7c7c6SXukai Wang struct device *dev = &pdev->dev;
2322*a7b7c7c6SXukai Wang struct clk_fixed_factor *fixed_factor = &shrm_sram_div2;
2323*a7b7c7c6SXukai Wang struct k230_clk_mux *mux;
2324*a7b7c7c6SXukai Wang struct k230_clk_gate *gate;
2325*a7b7c7c6SXukai Wang struct k230_clk_rate *rate;
2326*a7b7c7c6SXukai Wang
2327*a7b7c7c6SXukai Wang for (i = 0; i < K230_CLK_MUX_NUM; i++) {
2328*a7b7c7c6SXukai Wang mux = k230_clk_muxs[i];
2329*a7b7c7c6SXukai Wang mux->clk.lock = lock;
2330*a7b7c7c6SXukai Wang mux->clk.reg = reg + mux->reg_off;
2331*a7b7c7c6SXukai Wang
2332*a7b7c7c6SXukai Wang ret = k230_register_clk(mux->id, &mux->clk.hw, dev, hw_data);
2333*a7b7c7c6SXukai Wang if (ret)
2334*a7b7c7c6SXukai Wang return ret;
2335*a7b7c7c6SXukai Wang }
2336*a7b7c7c6SXukai Wang
2337*a7b7c7c6SXukai Wang for (i = 0; i < K230_CLK_GATE_NUM; i++) {
2338*a7b7c7c6SXukai Wang gate = k230_clk_gates[i];
2339*a7b7c7c6SXukai Wang gate->clk.lock = lock;
2340*a7b7c7c6SXukai Wang gate->clk.reg = reg + gate->reg_off;
2341*a7b7c7c6SXukai Wang
2342*a7b7c7c6SXukai Wang ret = k230_register_clk(gate->id, &gate->clk.hw, dev, hw_data);
2343*a7b7c7c6SXukai Wang if (ret)
2344*a7b7c7c6SXukai Wang return ret;
2345*a7b7c7c6SXukai Wang }
2346*a7b7c7c6SXukai Wang
2347*a7b7c7c6SXukai Wang for (i = 0; i < K230_CLK_RATE_NUM; i++) {
2348*a7b7c7c6SXukai Wang rate = k230_clk_rates[i];
2349*a7b7c7c6SXukai Wang rate->clk.lock = lock;
2350*a7b7c7c6SXukai Wang rate->clk.reg = reg;
2351*a7b7c7c6SXukai Wang
2352*a7b7c7c6SXukai Wang ret = k230_register_clk(rate->id, &rate->clk.hw, dev, hw_data);
2353*a7b7c7c6SXukai Wang if (ret)
2354*a7b7c7c6SXukai Wang return ret;
2355*a7b7c7c6SXukai Wang }
2356*a7b7c7c6SXukai Wang
2357*a7b7c7c6SXukai Wang ret = k230_register_clk(K230_SHRM_SRAM_DIV2, &fixed_factor->hw, dev, hw_data);
2358*a7b7c7c6SXukai Wang if (ret)
2359*a7b7c7c6SXukai Wang return ret;
2360*a7b7c7c6SXukai Wang
2361*a7b7c7c6SXukai Wang return devm_of_clk_add_hw_provider(&pdev->dev, of_clk_hw_onecell_get, hw_data);
2362*a7b7c7c6SXukai Wang }
2363*a7b7c7c6SXukai Wang
k230_clk_init_plls(struct platform_device * pdev)2364*a7b7c7c6SXukai Wang static int k230_clk_init_plls(struct platform_device *pdev)
2365*a7b7c7c6SXukai Wang {
2366*a7b7c7c6SXukai Wang int ret;
2367*a7b7c7c6SXukai Wang void __iomem *reg;
2368*a7b7c7c6SXukai Wang /* used for all the plls */
2369*a7b7c7c6SXukai Wang spinlock_t *lock;
2370*a7b7c7c6SXukai Wang
2371*a7b7c7c6SXukai Wang lock = devm_kzalloc(&pdev->dev, sizeof(*lock), GFP_KERNEL);
2372*a7b7c7c6SXukai Wang if (!lock)
2373*a7b7c7c6SXukai Wang return -ENOMEM;
2374*a7b7c7c6SXukai Wang
2375*a7b7c7c6SXukai Wang spin_lock_init(lock);
2376*a7b7c7c6SXukai Wang
2377*a7b7c7c6SXukai Wang reg = devm_platform_ioremap_resource(pdev, 0);
2378*a7b7c7c6SXukai Wang if (IS_ERR(reg))
2379*a7b7c7c6SXukai Wang return PTR_ERR(reg);
2380*a7b7c7c6SXukai Wang
2381*a7b7c7c6SXukai Wang ret = k230_register_plls(pdev, lock, reg);
2382*a7b7c7c6SXukai Wang if (ret)
2383*a7b7c7c6SXukai Wang return ret;
2384*a7b7c7c6SXukai Wang
2385*a7b7c7c6SXukai Wang ret = k230_register_pll_divs(pdev);
2386*a7b7c7c6SXukai Wang if (ret)
2387*a7b7c7c6SXukai Wang return ret;
2388*a7b7c7c6SXukai Wang
2389*a7b7c7c6SXukai Wang return 0;
2390*a7b7c7c6SXukai Wang }
2391*a7b7c7c6SXukai Wang
k230_clk_init_clks(struct platform_device * pdev,struct clk_hw_onecell_data * hw_data)2392*a7b7c7c6SXukai Wang static int k230_clk_init_clks(struct platform_device *pdev,
2393*a7b7c7c6SXukai Wang struct clk_hw_onecell_data *hw_data)
2394*a7b7c7c6SXukai Wang {
2395*a7b7c7c6SXukai Wang int ret;
2396*a7b7c7c6SXukai Wang void __iomem *reg;
2397*a7b7c7c6SXukai Wang /* used for all the clocks */
2398*a7b7c7c6SXukai Wang spinlock_t *lock;
2399*a7b7c7c6SXukai Wang
2400*a7b7c7c6SXukai Wang lock = devm_kzalloc(&pdev->dev, sizeof(*lock), GFP_KERNEL);
2401*a7b7c7c6SXukai Wang if (!lock)
2402*a7b7c7c6SXukai Wang return -ENOMEM;
2403*a7b7c7c6SXukai Wang
2404*a7b7c7c6SXukai Wang spin_lock_init(lock);
2405*a7b7c7c6SXukai Wang
2406*a7b7c7c6SXukai Wang hw_data->num = K230_CLK_NUM;
2407*a7b7c7c6SXukai Wang
2408*a7b7c7c6SXukai Wang reg = devm_platform_ioremap_resource(pdev, 1);
2409*a7b7c7c6SXukai Wang if (IS_ERR(reg))
2410*a7b7c7c6SXukai Wang return PTR_ERR(reg);
2411*a7b7c7c6SXukai Wang
2412*a7b7c7c6SXukai Wang ret = k230_register_clks(pdev, hw_data, lock, reg);
2413*a7b7c7c6SXukai Wang if (ret)
2414*a7b7c7c6SXukai Wang return ret;
2415*a7b7c7c6SXukai Wang
2416*a7b7c7c6SXukai Wang return 0;
2417*a7b7c7c6SXukai Wang }
2418*a7b7c7c6SXukai Wang
k230_clk_probe(struct platform_device * pdev)2419*a7b7c7c6SXukai Wang static int k230_clk_probe(struct platform_device *pdev)
2420*a7b7c7c6SXukai Wang {
2421*a7b7c7c6SXukai Wang int ret;
2422*a7b7c7c6SXukai Wang struct clk_hw_onecell_data *hw_data;
2423*a7b7c7c6SXukai Wang
2424*a7b7c7c6SXukai Wang hw_data = devm_kzalloc(&pdev->dev, struct_size(hw_data, hws, K230_CLK_NUM),
2425*a7b7c7c6SXukai Wang GFP_KERNEL);
2426*a7b7c7c6SXukai Wang if (!hw_data)
2427*a7b7c7c6SXukai Wang return -ENOMEM;
2428*a7b7c7c6SXukai Wang
2429*a7b7c7c6SXukai Wang ret = k230_clk_init_plls(pdev);
2430*a7b7c7c6SXukai Wang if (ret)
2431*a7b7c7c6SXukai Wang return dev_err_probe(&pdev->dev, ret, "init plls failed\n");
2432*a7b7c7c6SXukai Wang
2433*a7b7c7c6SXukai Wang ret = k230_clk_init_clks(pdev, hw_data);
2434*a7b7c7c6SXukai Wang if (ret)
2435*a7b7c7c6SXukai Wang return dev_err_probe(&pdev->dev, ret, "init clks failed\n");
2436*a7b7c7c6SXukai Wang
2437*a7b7c7c6SXukai Wang return 0;
2438*a7b7c7c6SXukai Wang }
2439*a7b7c7c6SXukai Wang
2440*a7b7c7c6SXukai Wang static const struct of_device_id k230_clk_ids[] = {
2441*a7b7c7c6SXukai Wang { .compatible = "canaan,k230-clk" },
2442*a7b7c7c6SXukai Wang { /* Sentinel */ }
2443*a7b7c7c6SXukai Wang };
2444*a7b7c7c6SXukai Wang
2445*a7b7c7c6SXukai Wang static struct platform_driver k230_clk_driver = {
2446*a7b7c7c6SXukai Wang .driver = {
2447*a7b7c7c6SXukai Wang .name = "k230_clock_controller",
2448*a7b7c7c6SXukai Wang .of_match_table = k230_clk_ids,
2449*a7b7c7c6SXukai Wang },
2450*a7b7c7c6SXukai Wang .probe = k230_clk_probe,
2451*a7b7c7c6SXukai Wang };
2452*a7b7c7c6SXukai Wang builtin_platform_driver(k230_clk_driver);
2453