1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef __MACH_IMX_CLK_H
3*4882a593Smuzhiyun #define __MACH_IMX_CLK_H
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun #include <linux/bits.h>
6*4882a593Smuzhiyun #include <linux/spinlock.h>
7*4882a593Smuzhiyun #include <linux/clk-provider.h>
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #define IMX_CLK_GATE2_SINGLE_BIT 1
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun extern spinlock_t imx_ccm_lock;
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun void imx_check_clocks(struct clk *clks[], unsigned int count);
14*4882a593Smuzhiyun void imx_check_clk_hws(struct clk_hw *clks[], unsigned int count);
15*4882a593Smuzhiyun #ifndef MODULE
16*4882a593Smuzhiyun void imx_register_uart_clocks(unsigned int clk_count);
17*4882a593Smuzhiyun #else
imx_register_uart_clocks(unsigned int clk_count)18*4882a593Smuzhiyun static inline void imx_register_uart_clocks(unsigned int clk_count)
19*4882a593Smuzhiyun {
20*4882a593Smuzhiyun }
21*4882a593Smuzhiyun #endif
22*4882a593Smuzhiyun void imx_mmdc_mask_handshake(void __iomem *ccm_base, unsigned int chn);
23*4882a593Smuzhiyun void imx_unregister_clocks(struct clk *clks[], unsigned int count);
24*4882a593Smuzhiyun void imx_unregister_hw_clocks(struct clk_hw *hws[], unsigned int count);
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun extern void imx_cscmr1_fixup(u32 *val);
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun enum imx_pllv1_type {
29*4882a593Smuzhiyun IMX_PLLV1_IMX1,
30*4882a593Smuzhiyun IMX_PLLV1_IMX21,
31*4882a593Smuzhiyun IMX_PLLV1_IMX25,
32*4882a593Smuzhiyun IMX_PLLV1_IMX27,
33*4882a593Smuzhiyun IMX_PLLV1_IMX31,
34*4882a593Smuzhiyun IMX_PLLV1_IMX35,
35*4882a593Smuzhiyun };
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun enum imx_sscg_pll_type {
38*4882a593Smuzhiyun SCCG_PLL1,
39*4882a593Smuzhiyun SCCG_PLL2,
40*4882a593Smuzhiyun };
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun enum imx_pll14xx_type {
43*4882a593Smuzhiyun PLL_1416X,
44*4882a593Smuzhiyun PLL_1443X,
45*4882a593Smuzhiyun };
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun /* NOTE: Rate table should be kept sorted in descending order. */
48*4882a593Smuzhiyun struct imx_pll14xx_rate_table {
49*4882a593Smuzhiyun unsigned int rate;
50*4882a593Smuzhiyun unsigned int pdiv;
51*4882a593Smuzhiyun unsigned int mdiv;
52*4882a593Smuzhiyun unsigned int sdiv;
53*4882a593Smuzhiyun unsigned int kdiv;
54*4882a593Smuzhiyun };
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun struct imx_pll14xx_clk {
57*4882a593Smuzhiyun enum imx_pll14xx_type type;
58*4882a593Smuzhiyun const struct imx_pll14xx_rate_table *rate_table;
59*4882a593Smuzhiyun int rate_count;
60*4882a593Smuzhiyun int flags;
61*4882a593Smuzhiyun };
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun extern struct imx_pll14xx_clk imx_1416x_pll;
64*4882a593Smuzhiyun extern struct imx_pll14xx_clk imx_1443x_pll;
65*4882a593Smuzhiyun extern struct imx_pll14xx_clk imx_1443x_dram_pll;
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun #define imx_clk_cpu(name, parent_name, div, mux, pll, step) \
68*4882a593Smuzhiyun to_clk(imx_clk_hw_cpu(name, parent_name, div, mux, pll, step))
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun #define clk_register_gate2(dev, name, parent_name, flags, reg, bit_idx, \
71*4882a593Smuzhiyun cgr_val, clk_gate_flags, lock, share_count) \
72*4882a593Smuzhiyun to_clk(clk_hw_register_gate2(dev, name, parent_name, flags, reg, bit_idx, \
73*4882a593Smuzhiyun cgr_val, clk_gate_flags, lock, share_count))
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun #define imx_clk_pllv3(type, name, parent_name, base, div_mask) \
76*4882a593Smuzhiyun to_clk(imx_clk_hw_pllv3(type, name, parent_name, base, div_mask))
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun #define imx_clk_pfd(name, parent_name, reg, idx) \
79*4882a593Smuzhiyun to_clk(imx_clk_hw_pfd(name, parent_name, reg, idx))
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun #define imx_clk_gate_exclusive(name, parent, reg, shift, exclusive_mask) \
82*4882a593Smuzhiyun to_clk(imx_clk_hw_gate_exclusive(name, parent, reg, shift, exclusive_mask))
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun #define imx_clk_fixed(name, rate) \
85*4882a593Smuzhiyun to_clk(imx_clk_hw_fixed(name, rate))
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun #define imx_clk_fixed_factor(name, parent, mult, div) \
88*4882a593Smuzhiyun to_clk(imx_clk_hw_fixed_factor(name, parent, mult, div))
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun #define imx_clk_divider(name, parent, reg, shift, width) \
91*4882a593Smuzhiyun to_clk(imx_clk_hw_divider(name, parent, reg, shift, width))
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun #define imx_clk_divider2(name, parent, reg, shift, width) \
94*4882a593Smuzhiyun to_clk(imx_clk_hw_divider2(name, parent, reg, shift, width))
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun #define imx_clk_divider_flags(name, parent, reg, shift, width, flags) \
97*4882a593Smuzhiyun to_clk(imx_clk_hw_divider_flags(name, parent, reg, shift, width, flags))
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun #define imx_clk_gate(name, parent, reg, shift) \
100*4882a593Smuzhiyun to_clk(imx_clk_hw_gate(name, parent, reg, shift))
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun #define imx_clk_gate_dis(name, parent, reg, shift) \
103*4882a593Smuzhiyun to_clk(imx_clk_hw_gate_dis(name, parent, reg, shift))
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun #define imx_clk_gate2(name, parent, reg, shift) \
106*4882a593Smuzhiyun to_clk(imx_clk_hw_gate2(name, parent, reg, shift))
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun #define imx_clk_gate2_flags(name, parent, reg, shift, flags) \
109*4882a593Smuzhiyun to_clk(imx_clk_hw_gate2_flags(name, parent, reg, shift, flags))
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun #define imx_clk_gate2_shared2(name, parent, reg, shift, share_count) \
112*4882a593Smuzhiyun to_clk(imx_clk_hw_gate2_shared2(name, parent, reg, shift, share_count))
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun #define imx_clk_gate3(name, parent, reg, shift) \
115*4882a593Smuzhiyun to_clk(imx_clk_hw_gate3(name, parent, reg, shift))
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun #define imx_clk_gate4(name, parent, reg, shift) \
118*4882a593Smuzhiyun to_clk(imx_clk_hw_gate4(name, parent, reg, shift))
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun #define imx_clk_mux(name, reg, shift, width, parents, num_parents) \
121*4882a593Smuzhiyun to_clk(imx_clk_hw_mux(name, reg, shift, width, parents, num_parents))
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun #define imx_clk_pllv1(type, name, parent, base) \
124*4882a593Smuzhiyun to_clk(imx_clk_hw_pllv1(type, name, parent, base))
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun #define imx_clk_pllv2(name, parent, base) \
127*4882a593Smuzhiyun to_clk(imx_clk_hw_pllv2(name, parent, base))
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun #define imx_clk_frac_pll(name, parent_name, base) \
130*4882a593Smuzhiyun to_clk(imx_clk_hw_frac_pll(name, parent_name, base))
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun #define imx_clk_sscg_pll(name, parent_names, num_parents, parent,\
133*4882a593Smuzhiyun bypass1, bypass2, base, flags) \
134*4882a593Smuzhiyun to_clk(imx_clk_hw_sscg_pll(name, parent_names, num_parents, parent,\
135*4882a593Smuzhiyun bypass1, bypass2, base, flags))
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun struct clk *imx_clk_pll14xx(const char *name, const char *parent_name,
138*4882a593Smuzhiyun void __iomem *base, const struct imx_pll14xx_clk *pll_clk);
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun #define imx_clk_pll14xx(name, parent_name, base, pll_clk) \
141*4882a593Smuzhiyun to_clk(imx_clk_hw_pll14xx(name, parent_name, base, pll_clk))
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun struct clk_hw *imx_dev_clk_hw_pll14xx(struct device *dev, const char *name,
144*4882a593Smuzhiyun const char *parent_name, void __iomem *base,
145*4882a593Smuzhiyun const struct imx_pll14xx_clk *pll_clk);
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun struct clk_hw *imx_clk_hw_pllv1(enum imx_pllv1_type type, const char *name,
148*4882a593Smuzhiyun const char *parent, void __iomem *base);
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun struct clk_hw *imx_clk_hw_pllv2(const char *name, const char *parent,
151*4882a593Smuzhiyun void __iomem *base);
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun struct clk_hw *imx_clk_hw_frac_pll(const char *name, const char *parent_name,
154*4882a593Smuzhiyun void __iomem *base);
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun struct clk_hw *imx_clk_hw_sscg_pll(const char *name,
157*4882a593Smuzhiyun const char * const *parent_names,
158*4882a593Smuzhiyun u8 num_parents,
159*4882a593Smuzhiyun u8 parent, u8 bypass1, u8 bypass2,
160*4882a593Smuzhiyun void __iomem *base,
161*4882a593Smuzhiyun unsigned long flags);
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun enum imx_pllv3_type {
164*4882a593Smuzhiyun IMX_PLLV3_GENERIC,
165*4882a593Smuzhiyun IMX_PLLV3_SYS,
166*4882a593Smuzhiyun IMX_PLLV3_USB,
167*4882a593Smuzhiyun IMX_PLLV3_USB_VF610,
168*4882a593Smuzhiyun IMX_PLLV3_AV,
169*4882a593Smuzhiyun IMX_PLLV3_ENET,
170*4882a593Smuzhiyun IMX_PLLV3_ENET_IMX7,
171*4882a593Smuzhiyun IMX_PLLV3_SYS_VF610,
172*4882a593Smuzhiyun IMX_PLLV3_DDR_IMX7,
173*4882a593Smuzhiyun IMX_PLLV3_AV_IMX7,
174*4882a593Smuzhiyun };
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun struct clk_hw *imx_clk_hw_pllv3(enum imx_pllv3_type type, const char *name,
177*4882a593Smuzhiyun const char *parent_name, void __iomem *base, u32 div_mask);
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun #define PLL_1416X_RATE(_rate, _m, _p, _s) \
180*4882a593Smuzhiyun { \
181*4882a593Smuzhiyun .rate = (_rate), \
182*4882a593Smuzhiyun .mdiv = (_m), \
183*4882a593Smuzhiyun .pdiv = (_p), \
184*4882a593Smuzhiyun .sdiv = (_s), \
185*4882a593Smuzhiyun }
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun #define PLL_1443X_RATE(_rate, _m, _p, _s, _k) \
188*4882a593Smuzhiyun { \
189*4882a593Smuzhiyun .rate = (_rate), \
190*4882a593Smuzhiyun .mdiv = (_m), \
191*4882a593Smuzhiyun .pdiv = (_p), \
192*4882a593Smuzhiyun .sdiv = (_s), \
193*4882a593Smuzhiyun .kdiv = (_k), \
194*4882a593Smuzhiyun }
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun struct clk_hw *imx_clk_hw_pllv4(const char *name, const char *parent_name,
197*4882a593Smuzhiyun void __iomem *base);
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun struct clk_hw *clk_hw_register_gate2(struct device *dev, const char *name,
200*4882a593Smuzhiyun const char *parent_name, unsigned long flags,
201*4882a593Smuzhiyun void __iomem *reg, u8 bit_idx, u8 cgr_val,
202*4882a593Smuzhiyun u8 clk_gate_flags, spinlock_t *lock,
203*4882a593Smuzhiyun unsigned int *share_count);
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun struct clk * imx_obtain_fixed_clock(
206*4882a593Smuzhiyun const char *name, unsigned long rate);
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun struct clk_hw *imx_obtain_fixed_clock_hw(
209*4882a593Smuzhiyun const char *name, unsigned long rate);
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun struct clk_hw *imx_obtain_fixed_clk_hw(struct device_node *np,
212*4882a593Smuzhiyun const char *name);
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun struct clk_hw *imx_clk_hw_gate_exclusive(const char *name, const char *parent,
215*4882a593Smuzhiyun void __iomem *reg, u8 shift, u32 exclusive_mask);
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun struct clk_hw *imx_clk_hw_pfd(const char *name, const char *parent_name,
218*4882a593Smuzhiyun void __iomem *reg, u8 idx);
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun struct clk_hw *imx_clk_hw_pfdv2(const char *name, const char *parent_name,
221*4882a593Smuzhiyun void __iomem *reg, u8 idx);
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun struct clk_hw *imx_clk_hw_busy_divider(const char *name, const char *parent_name,
224*4882a593Smuzhiyun void __iomem *reg, u8 shift, u8 width,
225*4882a593Smuzhiyun void __iomem *busy_reg, u8 busy_shift);
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun struct clk_hw *imx_clk_hw_busy_mux(const char *name, void __iomem *reg, u8 shift,
228*4882a593Smuzhiyun u8 width, void __iomem *busy_reg, u8 busy_shift,
229*4882a593Smuzhiyun const char * const *parent_names, int num_parents);
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun struct clk_hw *imx7ulp_clk_hw_composite(const char *name,
232*4882a593Smuzhiyun const char * const *parent_names,
233*4882a593Smuzhiyun int num_parents, bool mux_present,
234*4882a593Smuzhiyun bool rate_present, bool gate_present,
235*4882a593Smuzhiyun void __iomem *reg);
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun struct clk_hw *imx_clk_hw_fixup_divider(const char *name, const char *parent,
238*4882a593Smuzhiyun void __iomem *reg, u8 shift, u8 width,
239*4882a593Smuzhiyun void (*fixup)(u32 *val));
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun struct clk_hw *imx_clk_hw_fixup_mux(const char *name, void __iomem *reg,
242*4882a593Smuzhiyun u8 shift, u8 width, const char * const *parents,
243*4882a593Smuzhiyun int num_parents, void (*fixup)(u32 *val));
244*4882a593Smuzhiyun
to_clk(struct clk_hw * hw)245*4882a593Smuzhiyun static inline struct clk *to_clk(struct clk_hw *hw)
246*4882a593Smuzhiyun {
247*4882a593Smuzhiyun if (IS_ERR_OR_NULL(hw))
248*4882a593Smuzhiyun return ERR_CAST(hw);
249*4882a593Smuzhiyun return hw->clk;
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun
imx_clk_hw_pll14xx(const char * name,const char * parent_name,void __iomem * base,const struct imx_pll14xx_clk * pll_clk)252*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_pll14xx(const char *name, const char *parent_name,
253*4882a593Smuzhiyun void __iomem *base,
254*4882a593Smuzhiyun const struct imx_pll14xx_clk *pll_clk)
255*4882a593Smuzhiyun {
256*4882a593Smuzhiyun return imx_dev_clk_hw_pll14xx(NULL, name, parent_name, base, pll_clk);
257*4882a593Smuzhiyun }
258*4882a593Smuzhiyun
imx_clk_hw_fixed(const char * name,int rate)259*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_fixed(const char *name, int rate)
260*4882a593Smuzhiyun {
261*4882a593Smuzhiyun return clk_hw_register_fixed_rate(NULL, name, NULL, 0, rate);
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun
imx_clk_hw_mux_ldb(const char * name,void __iomem * reg,u8 shift,u8 width,const char * const * parents,int num_parents)264*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_mux_ldb(const char *name, void __iomem *reg,
265*4882a593Smuzhiyun u8 shift, u8 width, const char * const *parents,
266*4882a593Smuzhiyun int num_parents)
267*4882a593Smuzhiyun {
268*4882a593Smuzhiyun return clk_hw_register_mux(NULL, name, parents, num_parents,
269*4882a593Smuzhiyun CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT, reg,
270*4882a593Smuzhiyun shift, width, CLK_MUX_READ_ONLY, &imx_ccm_lock);
271*4882a593Smuzhiyun }
272*4882a593Smuzhiyun
imx_clk_hw_fixed_factor(const char * name,const char * parent,unsigned int mult,unsigned int div)273*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_fixed_factor(const char *name,
274*4882a593Smuzhiyun const char *parent, unsigned int mult, unsigned int div)
275*4882a593Smuzhiyun {
276*4882a593Smuzhiyun return clk_hw_register_fixed_factor(NULL, name, parent,
277*4882a593Smuzhiyun CLK_SET_RATE_PARENT, mult, div);
278*4882a593Smuzhiyun }
279*4882a593Smuzhiyun
imx_clk_hw_divider(const char * name,const char * parent,void __iomem * reg,u8 shift,u8 width)280*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_divider(const char *name,
281*4882a593Smuzhiyun const char *parent,
282*4882a593Smuzhiyun void __iomem *reg, u8 shift,
283*4882a593Smuzhiyun u8 width)
284*4882a593Smuzhiyun {
285*4882a593Smuzhiyun return clk_hw_register_divider(NULL, name, parent, CLK_SET_RATE_PARENT,
286*4882a593Smuzhiyun reg, shift, width, 0, &imx_ccm_lock);
287*4882a593Smuzhiyun }
288*4882a593Smuzhiyun
imx_clk_hw_divider_flags(const char * name,const char * parent,void __iomem * reg,u8 shift,u8 width,unsigned long flags)289*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_divider_flags(const char *name,
290*4882a593Smuzhiyun const char *parent,
291*4882a593Smuzhiyun void __iomem *reg, u8 shift,
292*4882a593Smuzhiyun u8 width, unsigned long flags)
293*4882a593Smuzhiyun {
294*4882a593Smuzhiyun return clk_hw_register_divider(NULL, name, parent, flags,
295*4882a593Smuzhiyun reg, shift, width, 0, &imx_ccm_lock);
296*4882a593Smuzhiyun }
297*4882a593Smuzhiyun
imx_clk_hw_divider2(const char * name,const char * parent,void __iomem * reg,u8 shift,u8 width)298*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_divider2(const char *name, const char *parent,
299*4882a593Smuzhiyun void __iomem *reg, u8 shift, u8 width)
300*4882a593Smuzhiyun {
301*4882a593Smuzhiyun return clk_hw_register_divider(NULL, name, parent,
302*4882a593Smuzhiyun CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
303*4882a593Smuzhiyun reg, shift, width, 0, &imx_ccm_lock);
304*4882a593Smuzhiyun }
305*4882a593Smuzhiyun
imx_clk_divider2_flags(const char * name,const char * parent,void __iomem * reg,u8 shift,u8 width,unsigned long flags)306*4882a593Smuzhiyun static inline struct clk *imx_clk_divider2_flags(const char *name,
307*4882a593Smuzhiyun const char *parent, void __iomem *reg, u8 shift, u8 width,
308*4882a593Smuzhiyun unsigned long flags)
309*4882a593Smuzhiyun {
310*4882a593Smuzhiyun return clk_register_divider(NULL, name, parent,
311*4882a593Smuzhiyun flags | CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
312*4882a593Smuzhiyun reg, shift, width, 0, &imx_ccm_lock);
313*4882a593Smuzhiyun }
314*4882a593Smuzhiyun
imx_clk_hw_gate_flags(const char * name,const char * parent,void __iomem * reg,u8 shift,unsigned long flags)315*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_gate_flags(const char *name, const char *parent,
316*4882a593Smuzhiyun void __iomem *reg, u8 shift, unsigned long flags)
317*4882a593Smuzhiyun {
318*4882a593Smuzhiyun return clk_hw_register_gate(NULL, name, parent, flags | CLK_SET_RATE_PARENT, reg,
319*4882a593Smuzhiyun shift, 0, &imx_ccm_lock);
320*4882a593Smuzhiyun }
321*4882a593Smuzhiyun
imx_clk_hw_gate(const char * name,const char * parent,void __iomem * reg,u8 shift)322*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_gate(const char *name, const char *parent,
323*4882a593Smuzhiyun void __iomem *reg, u8 shift)
324*4882a593Smuzhiyun {
325*4882a593Smuzhiyun return clk_hw_register_gate(NULL, name, parent, CLK_SET_RATE_PARENT, reg,
326*4882a593Smuzhiyun shift, 0, &imx_ccm_lock);
327*4882a593Smuzhiyun }
328*4882a593Smuzhiyun
imx_dev_clk_hw_gate(struct device * dev,const char * name,const char * parent,void __iomem * reg,u8 shift)329*4882a593Smuzhiyun static inline struct clk_hw *imx_dev_clk_hw_gate(struct device *dev, const char *name,
330*4882a593Smuzhiyun const char *parent, void __iomem *reg, u8 shift)
331*4882a593Smuzhiyun {
332*4882a593Smuzhiyun return clk_hw_register_gate(dev, name, parent, CLK_SET_RATE_PARENT, reg,
333*4882a593Smuzhiyun shift, 0, &imx_ccm_lock);
334*4882a593Smuzhiyun }
335*4882a593Smuzhiyun
imx_clk_hw_gate_dis(const char * name,const char * parent,void __iomem * reg,u8 shift)336*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_gate_dis(const char *name, const char *parent,
337*4882a593Smuzhiyun void __iomem *reg, u8 shift)
338*4882a593Smuzhiyun {
339*4882a593Smuzhiyun return clk_hw_register_gate(NULL, name, parent, CLK_SET_RATE_PARENT, reg,
340*4882a593Smuzhiyun shift, CLK_GATE_SET_TO_DISABLE, &imx_ccm_lock);
341*4882a593Smuzhiyun }
342*4882a593Smuzhiyun
imx_clk_hw_gate_dis_flags(const char * name,const char * parent,void __iomem * reg,u8 shift,unsigned long flags)343*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_gate_dis_flags(const char *name, const char *parent,
344*4882a593Smuzhiyun void __iomem *reg, u8 shift, unsigned long flags)
345*4882a593Smuzhiyun {
346*4882a593Smuzhiyun return clk_hw_register_gate(NULL, name, parent, flags | CLK_SET_RATE_PARENT, reg,
347*4882a593Smuzhiyun shift, CLK_GATE_SET_TO_DISABLE, &imx_ccm_lock);
348*4882a593Smuzhiyun }
349*4882a593Smuzhiyun
imx_clk_hw_gate2(const char * name,const char * parent,void __iomem * reg,u8 shift)350*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_gate2(const char *name, const char *parent,
351*4882a593Smuzhiyun void __iomem *reg, u8 shift)
352*4882a593Smuzhiyun {
353*4882a593Smuzhiyun return clk_hw_register_gate2(NULL, name, parent, CLK_SET_RATE_PARENT, reg,
354*4882a593Smuzhiyun shift, 0x3, 0, &imx_ccm_lock, NULL);
355*4882a593Smuzhiyun }
356*4882a593Smuzhiyun
imx_clk_hw_gate2_flags(const char * name,const char * parent,void __iomem * reg,u8 shift,unsigned long flags)357*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_gate2_flags(const char *name, const char *parent,
358*4882a593Smuzhiyun void __iomem *reg, u8 shift, unsigned long flags)
359*4882a593Smuzhiyun {
360*4882a593Smuzhiyun return clk_hw_register_gate2(NULL, name, parent, flags | CLK_SET_RATE_PARENT, reg,
361*4882a593Smuzhiyun shift, 0x3, 0, &imx_ccm_lock, NULL);
362*4882a593Smuzhiyun }
363*4882a593Smuzhiyun
imx_clk_hw_gate2_shared(const char * name,const char * parent,void __iomem * reg,u8 shift,unsigned int * share_count)364*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_gate2_shared(const char *name,
365*4882a593Smuzhiyun const char *parent, void __iomem *reg, u8 shift,
366*4882a593Smuzhiyun unsigned int *share_count)
367*4882a593Smuzhiyun {
368*4882a593Smuzhiyun return clk_hw_register_gate2(NULL, name, parent, CLK_SET_RATE_PARENT, reg,
369*4882a593Smuzhiyun shift, 0x3, 0, &imx_ccm_lock, share_count);
370*4882a593Smuzhiyun }
371*4882a593Smuzhiyun
imx_clk_hw_gate2_shared2(const char * name,const char * parent,void __iomem * reg,u8 shift,unsigned int * share_count)372*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_gate2_shared2(const char *name,
373*4882a593Smuzhiyun const char *parent, void __iomem *reg, u8 shift,
374*4882a593Smuzhiyun unsigned int *share_count)
375*4882a593Smuzhiyun {
376*4882a593Smuzhiyun return clk_hw_register_gate2(NULL, name, parent, CLK_SET_RATE_PARENT |
377*4882a593Smuzhiyun CLK_OPS_PARENT_ENABLE, reg, shift, 0x3, 0,
378*4882a593Smuzhiyun &imx_ccm_lock, share_count);
379*4882a593Smuzhiyun }
380*4882a593Smuzhiyun
imx_dev_clk_hw_gate_shared(struct device * dev,const char * name,const char * parent,void __iomem * reg,u8 shift,unsigned int * share_count)381*4882a593Smuzhiyun static inline struct clk_hw *imx_dev_clk_hw_gate_shared(struct device *dev,
382*4882a593Smuzhiyun const char *name, const char *parent,
383*4882a593Smuzhiyun void __iomem *reg, u8 shift,
384*4882a593Smuzhiyun unsigned int *share_count)
385*4882a593Smuzhiyun {
386*4882a593Smuzhiyun return clk_hw_register_gate2(NULL, name, parent, CLK_SET_RATE_PARENT |
387*4882a593Smuzhiyun CLK_OPS_PARENT_ENABLE, reg, shift, 0x3,
388*4882a593Smuzhiyun IMX_CLK_GATE2_SINGLE_BIT,
389*4882a593Smuzhiyun &imx_ccm_lock, share_count);
390*4882a593Smuzhiyun }
391*4882a593Smuzhiyun
imx_clk_gate2_cgr(const char * name,const char * parent,void __iomem * reg,u8 shift,u8 cgr_val)392*4882a593Smuzhiyun static inline struct clk *imx_clk_gate2_cgr(const char *name,
393*4882a593Smuzhiyun const char *parent, void __iomem *reg, u8 shift, u8 cgr_val)
394*4882a593Smuzhiyun {
395*4882a593Smuzhiyun return clk_register_gate2(NULL, name, parent, CLK_SET_RATE_PARENT, reg,
396*4882a593Smuzhiyun shift, cgr_val, 0, &imx_ccm_lock, NULL);
397*4882a593Smuzhiyun }
398*4882a593Smuzhiyun
imx_clk_hw_gate3(const char * name,const char * parent,void __iomem * reg,u8 shift)399*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_gate3(const char *name, const char *parent,
400*4882a593Smuzhiyun void __iomem *reg, u8 shift)
401*4882a593Smuzhiyun {
402*4882a593Smuzhiyun return clk_hw_register_gate(NULL, name, parent,
403*4882a593Smuzhiyun CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
404*4882a593Smuzhiyun reg, shift, 0, &imx_ccm_lock);
405*4882a593Smuzhiyun }
406*4882a593Smuzhiyun
imx_clk_hw_gate3_flags(const char * name,const char * parent,void __iomem * reg,u8 shift,unsigned long flags)407*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_gate3_flags(const char *name,
408*4882a593Smuzhiyun const char *parent, void __iomem *reg, u8 shift,
409*4882a593Smuzhiyun unsigned long flags)
410*4882a593Smuzhiyun {
411*4882a593Smuzhiyun return clk_hw_register_gate(NULL, name, parent,
412*4882a593Smuzhiyun flags | CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
413*4882a593Smuzhiyun reg, shift, 0, &imx_ccm_lock);
414*4882a593Smuzhiyun }
415*4882a593Smuzhiyun
416*4882a593Smuzhiyun #define imx_clk_gate3_flags(name, parent, reg, shift, flags) \
417*4882a593Smuzhiyun to_clk(imx_clk_hw_gate3_flags(name, parent, reg, shift, flags))
418*4882a593Smuzhiyun
imx_clk_hw_gate4(const char * name,const char * parent,void __iomem * reg,u8 shift)419*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_gate4(const char *name, const char *parent,
420*4882a593Smuzhiyun void __iomem *reg, u8 shift)
421*4882a593Smuzhiyun {
422*4882a593Smuzhiyun return clk_hw_register_gate2(NULL, name, parent,
423*4882a593Smuzhiyun CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
424*4882a593Smuzhiyun reg, shift, 0x3, 0, &imx_ccm_lock, NULL);
425*4882a593Smuzhiyun }
426*4882a593Smuzhiyun
imx_clk_hw_gate4_flags(const char * name,const char * parent,void __iomem * reg,u8 shift,unsigned long flags)427*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_gate4_flags(const char *name,
428*4882a593Smuzhiyun const char *parent, void __iomem *reg, u8 shift,
429*4882a593Smuzhiyun unsigned long flags)
430*4882a593Smuzhiyun {
431*4882a593Smuzhiyun return clk_hw_register_gate2(NULL, name, parent,
432*4882a593Smuzhiyun flags | CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
433*4882a593Smuzhiyun reg, shift, 0x3, 0, &imx_ccm_lock, NULL);
434*4882a593Smuzhiyun }
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun #define imx_clk_gate4_flags(name, parent, reg, shift, flags) \
437*4882a593Smuzhiyun to_clk(imx_clk_hw_gate4_flags(name, parent, reg, shift, flags))
438*4882a593Smuzhiyun
imx_clk_hw_mux(const char * name,void __iomem * reg,u8 shift,u8 width,const char * const * parents,int num_parents)439*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_mux(const char *name, void __iomem *reg,
440*4882a593Smuzhiyun u8 shift, u8 width, const char * const *parents,
441*4882a593Smuzhiyun int num_parents)
442*4882a593Smuzhiyun {
443*4882a593Smuzhiyun return clk_hw_register_mux(NULL, name, parents, num_parents,
444*4882a593Smuzhiyun CLK_SET_RATE_NO_REPARENT, reg, shift,
445*4882a593Smuzhiyun width, 0, &imx_ccm_lock);
446*4882a593Smuzhiyun }
447*4882a593Smuzhiyun
imx_dev_clk_hw_mux(struct device * dev,const char * name,void __iomem * reg,u8 shift,u8 width,const char * const * parents,int num_parents)448*4882a593Smuzhiyun static inline struct clk_hw *imx_dev_clk_hw_mux(struct device *dev,
449*4882a593Smuzhiyun const char *name, void __iomem *reg, u8 shift,
450*4882a593Smuzhiyun u8 width, const char * const *parents, int num_parents)
451*4882a593Smuzhiyun {
452*4882a593Smuzhiyun return clk_hw_register_mux(dev, name, parents, num_parents,
453*4882a593Smuzhiyun CLK_SET_RATE_NO_REPARENT | CLK_SET_PARENT_GATE,
454*4882a593Smuzhiyun reg, shift, width, 0, &imx_ccm_lock);
455*4882a593Smuzhiyun }
456*4882a593Smuzhiyun
imx_clk_mux2(const char * name,void __iomem * reg,u8 shift,u8 width,const char * const * parents,int num_parents)457*4882a593Smuzhiyun static inline struct clk *imx_clk_mux2(const char *name, void __iomem *reg,
458*4882a593Smuzhiyun u8 shift, u8 width, const char * const *parents,
459*4882a593Smuzhiyun int num_parents)
460*4882a593Smuzhiyun {
461*4882a593Smuzhiyun return clk_register_mux(NULL, name, parents, num_parents,
462*4882a593Smuzhiyun CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE,
463*4882a593Smuzhiyun reg, shift, width, 0, &imx_ccm_lock);
464*4882a593Smuzhiyun }
465*4882a593Smuzhiyun
imx_clk_hw_mux2(const char * name,void __iomem * reg,u8 shift,u8 width,const char * const * parents,int num_parents)466*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_mux2(const char *name, void __iomem *reg,
467*4882a593Smuzhiyun u8 shift, u8 width,
468*4882a593Smuzhiyun const char * const *parents,
469*4882a593Smuzhiyun int num_parents)
470*4882a593Smuzhiyun {
471*4882a593Smuzhiyun return clk_hw_register_mux(NULL, name, parents, num_parents,
472*4882a593Smuzhiyun CLK_SET_RATE_NO_REPARENT |
473*4882a593Smuzhiyun CLK_OPS_PARENT_ENABLE,
474*4882a593Smuzhiyun reg, shift, width, 0, &imx_ccm_lock);
475*4882a593Smuzhiyun }
476*4882a593Smuzhiyun
imx_clk_mux_flags(const char * name,void __iomem * reg,u8 shift,u8 width,const char * const * parents,int num_parents,unsigned long flags)477*4882a593Smuzhiyun static inline struct clk *imx_clk_mux_flags(const char *name,
478*4882a593Smuzhiyun void __iomem *reg, u8 shift, u8 width,
479*4882a593Smuzhiyun const char * const *parents, int num_parents,
480*4882a593Smuzhiyun unsigned long flags)
481*4882a593Smuzhiyun {
482*4882a593Smuzhiyun return clk_register_mux(NULL, name, parents, num_parents,
483*4882a593Smuzhiyun flags | CLK_SET_RATE_NO_REPARENT, reg, shift, width, 0,
484*4882a593Smuzhiyun &imx_ccm_lock);
485*4882a593Smuzhiyun }
486*4882a593Smuzhiyun
imx_clk_hw_mux2_flags(const char * name,void __iomem * reg,u8 shift,u8 width,const char * const * parents,int num_parents,unsigned long flags)487*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_mux2_flags(const char *name,
488*4882a593Smuzhiyun void __iomem *reg, u8 shift, u8 width,
489*4882a593Smuzhiyun const char * const *parents,
490*4882a593Smuzhiyun int num_parents, unsigned long flags)
491*4882a593Smuzhiyun {
492*4882a593Smuzhiyun return clk_hw_register_mux(NULL, name, parents, num_parents,
493*4882a593Smuzhiyun flags | CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE,
494*4882a593Smuzhiyun reg, shift, width, 0, &imx_ccm_lock);
495*4882a593Smuzhiyun }
496*4882a593Smuzhiyun
imx_clk_mux2_flags(const char * name,void __iomem * reg,u8 shift,u8 width,const char * const * parents,int num_parents,unsigned long flags)497*4882a593Smuzhiyun static inline struct clk *imx_clk_mux2_flags(const char *name,
498*4882a593Smuzhiyun void __iomem *reg, u8 shift, u8 width,
499*4882a593Smuzhiyun const char * const *parents,
500*4882a593Smuzhiyun int num_parents, unsigned long flags)
501*4882a593Smuzhiyun {
502*4882a593Smuzhiyun return clk_register_mux(NULL, name, parents, num_parents,
503*4882a593Smuzhiyun flags | CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE,
504*4882a593Smuzhiyun reg, shift, width, 0, &imx_ccm_lock);
505*4882a593Smuzhiyun }
506*4882a593Smuzhiyun
imx_clk_hw_mux_flags(const char * name,void __iomem * reg,u8 shift,u8 width,const char * const * parents,int num_parents,unsigned long flags)507*4882a593Smuzhiyun static inline struct clk_hw *imx_clk_hw_mux_flags(const char *name,
508*4882a593Smuzhiyun void __iomem *reg, u8 shift,
509*4882a593Smuzhiyun u8 width,
510*4882a593Smuzhiyun const char * const *parents,
511*4882a593Smuzhiyun int num_parents,
512*4882a593Smuzhiyun unsigned long flags)
513*4882a593Smuzhiyun {
514*4882a593Smuzhiyun return clk_hw_register_mux(NULL, name, parents, num_parents,
515*4882a593Smuzhiyun flags | CLK_SET_RATE_NO_REPARENT,
516*4882a593Smuzhiyun reg, shift, width, 0, &imx_ccm_lock);
517*4882a593Smuzhiyun }
518*4882a593Smuzhiyun
imx_dev_clk_hw_mux_flags(struct device * dev,const char * name,void __iomem * reg,u8 shift,u8 width,const char * const * parents,int num_parents,unsigned long flags)519*4882a593Smuzhiyun static inline struct clk_hw *imx_dev_clk_hw_mux_flags(struct device *dev,
520*4882a593Smuzhiyun const char *name,
521*4882a593Smuzhiyun void __iomem *reg, u8 shift,
522*4882a593Smuzhiyun u8 width,
523*4882a593Smuzhiyun const char * const *parents,
524*4882a593Smuzhiyun int num_parents,
525*4882a593Smuzhiyun unsigned long flags)
526*4882a593Smuzhiyun {
527*4882a593Smuzhiyun return clk_hw_register_mux(dev, name, parents, num_parents,
528*4882a593Smuzhiyun flags | CLK_SET_RATE_NO_REPARENT,
529*4882a593Smuzhiyun reg, shift, width, 0, &imx_ccm_lock);
530*4882a593Smuzhiyun }
531*4882a593Smuzhiyun
532*4882a593Smuzhiyun struct clk_hw *imx_clk_hw_cpu(const char *name, const char *parent_name,
533*4882a593Smuzhiyun struct clk *div, struct clk *mux, struct clk *pll,
534*4882a593Smuzhiyun struct clk *step);
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun #define IMX_COMPOSITE_CORE BIT(0)
537*4882a593Smuzhiyun #define IMX_COMPOSITE_BUS BIT(1)
538*4882a593Smuzhiyun #define IMX_COMPOSITE_FW_MANAGED BIT(2)
539*4882a593Smuzhiyun
540*4882a593Smuzhiyun struct clk_hw *imx8m_clk_hw_composite_flags(const char *name,
541*4882a593Smuzhiyun const char * const *parent_names,
542*4882a593Smuzhiyun int num_parents,
543*4882a593Smuzhiyun void __iomem *reg,
544*4882a593Smuzhiyun u32 composite_flags,
545*4882a593Smuzhiyun unsigned long flags);
546*4882a593Smuzhiyun
547*4882a593Smuzhiyun #define imx8m_clk_hw_composite_bus(name, parent_names, reg) \
548*4882a593Smuzhiyun imx8m_clk_hw_composite_flags(name, parent_names, \
549*4882a593Smuzhiyun ARRAY_SIZE(parent_names), reg, \
550*4882a593Smuzhiyun IMX_COMPOSITE_BUS, \
551*4882a593Smuzhiyun CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
552*4882a593Smuzhiyun
553*4882a593Smuzhiyun #define imx8m_clk_hw_composite_bus_critical(name, parent_names, reg) \
554*4882a593Smuzhiyun imx8m_clk_hw_composite_flags(name, parent_names, ARRAY_SIZE(parent_names), reg, \
555*4882a593Smuzhiyun IMX_COMPOSITE_BUS, \
556*4882a593Smuzhiyun CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE | CLK_IS_CRITICAL)
557*4882a593Smuzhiyun
558*4882a593Smuzhiyun #define imx8m_clk_hw_composite_core(name, parent_names, reg) \
559*4882a593Smuzhiyun imx8m_clk_hw_composite_flags(name, parent_names, \
560*4882a593Smuzhiyun ARRAY_SIZE(parent_names), reg, \
561*4882a593Smuzhiyun IMX_COMPOSITE_CORE, \
562*4882a593Smuzhiyun CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
563*4882a593Smuzhiyun
564*4882a593Smuzhiyun #define imx8m_clk_composite_flags(name, parent_names, num_parents, reg, \
565*4882a593Smuzhiyun flags) \
566*4882a593Smuzhiyun to_clk(imx8m_clk_hw_composite_flags(name, parent_names, \
567*4882a593Smuzhiyun num_parents, reg, 0, flags))
568*4882a593Smuzhiyun
569*4882a593Smuzhiyun #define __imx8m_clk_hw_composite(name, parent_names, reg, flags) \
570*4882a593Smuzhiyun imx8m_clk_hw_composite_flags(name, parent_names, \
571*4882a593Smuzhiyun ARRAY_SIZE(parent_names), reg, 0, \
572*4882a593Smuzhiyun flags | CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
573*4882a593Smuzhiyun
574*4882a593Smuzhiyun #define __imx8m_clk_hw_fw_managed_composite(name, parent_names, reg, flags) \
575*4882a593Smuzhiyun imx8m_clk_hw_composite_flags(name, parent_names, \
576*4882a593Smuzhiyun ARRAY_SIZE(parent_names), reg, IMX_COMPOSITE_FW_MANAGED, \
577*4882a593Smuzhiyun flags | CLK_GET_RATE_NOCACHE | CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
578*4882a593Smuzhiyun
579*4882a593Smuzhiyun #define imx8m_clk_hw_fw_managed_composite(name, parent_names, reg) \
580*4882a593Smuzhiyun __imx8m_clk_hw_fw_managed_composite(name, parent_names, reg, 0)
581*4882a593Smuzhiyun
582*4882a593Smuzhiyun #define imx8m_clk_hw_fw_managed_composite_critical(name, parent_names, reg) \
583*4882a593Smuzhiyun __imx8m_clk_hw_fw_managed_composite(name, parent_names, reg, CLK_IS_CRITICAL)
584*4882a593Smuzhiyun
585*4882a593Smuzhiyun #define __imx8m_clk_composite(name, parent_names, reg, flags) \
586*4882a593Smuzhiyun to_clk(__imx8m_clk_hw_composite(name, parent_names, reg, flags))
587*4882a593Smuzhiyun
588*4882a593Smuzhiyun #define imx8m_clk_hw_composite(name, parent_names, reg) \
589*4882a593Smuzhiyun __imx8m_clk_hw_composite(name, parent_names, reg, 0)
590*4882a593Smuzhiyun
591*4882a593Smuzhiyun #define imx8m_clk_composite(name, parent_names, reg) \
592*4882a593Smuzhiyun __imx8m_clk_composite(name, parent_names, reg, 0)
593*4882a593Smuzhiyun
594*4882a593Smuzhiyun #define imx8m_clk_hw_composite_critical(name, parent_names, reg) \
595*4882a593Smuzhiyun __imx8m_clk_hw_composite(name, parent_names, reg, CLK_IS_CRITICAL)
596*4882a593Smuzhiyun
597*4882a593Smuzhiyun #define imx8m_clk_composite_critical(name, parent_names, reg) \
598*4882a593Smuzhiyun __imx8m_clk_composite(name, parent_names, reg, CLK_IS_CRITICAL)
599*4882a593Smuzhiyun
600*4882a593Smuzhiyun struct clk_hw *imx_clk_hw_divider_gate(const char *name, const char *parent_name,
601*4882a593Smuzhiyun unsigned long flags, void __iomem *reg, u8 shift, u8 width,
602*4882a593Smuzhiyun u8 clk_divider_flags, const struct clk_div_table *table,
603*4882a593Smuzhiyun spinlock_t *lock);
604*4882a593Smuzhiyun #endif
605