blob: d2122977e4716f4d440ce07d9db65e241c16b87f [file] [log] [blame]
Lukasz Majewski4de44bb2019-06-24 15:50:45 +02001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Copyright (C) 2019 DENX Software Engineering
4 * Lukasz Majewski, DENX Software Engineering, lukma@denx.de
5 */
6#ifndef __MACH_IMX_CLK_H
7#define __MACH_IMX_CLK_H
8
9#include <linux/clk-provider.h>
10
11enum imx_pllv3_type {
12 IMX_PLLV3_GENERIC,
Jesse Taube4303cd12022-07-26 01:43:42 -040013 IMX_PLLV3_GENERICV2,
Lukasz Majewski4de44bb2019-06-24 15:50:45 +020014 IMX_PLLV3_SYS,
15 IMX_PLLV3_USB,
16 IMX_PLLV3_USB_VF610,
17 IMX_PLLV3_AV,
18 IMX_PLLV3_ENET,
19 IMX_PLLV3_ENET_IMX7,
20 IMX_PLLV3_SYS_VF610,
21 IMX_PLLV3_DDR_IMX7,
22};
23
Peng Fan134cf092019-08-19 07:53:58 +000024enum imx_pll14xx_type {
25 PLL_1416X,
26 PLL_1443X,
27};
28
29/* NOTE: Rate table should be kept sorted in descending order. */
30struct imx_pll14xx_rate_table {
31 unsigned int rate;
32 unsigned int pdiv;
33 unsigned int mdiv;
34 unsigned int sdiv;
35 unsigned int kdiv;
36};
37
38struct imx_pll14xx_clk {
39 enum imx_pll14xx_type type;
40 const struct imx_pll14xx_rate_table *rate_table;
41 int rate_count;
42 int flags;
43};
44
Angus Ainslie73d75ec2022-03-29 07:02:40 -070045extern struct imx_pll14xx_clk imx_1416x_pll;
46extern struct imx_pll14xx_clk imx_1443x_pll;
47extern struct imx_pll14xx_clk imx_1443x_dram_pll;
48
Sébastien Szymanski8d163f52023-07-25 10:08:53 +020049#define CLK_FRACN_GPPLL_INTEGER BIT(0)
50#define CLK_FRACN_GPPLL_FRACN BIT(1)
51
52/* NOTE: Rate table should be kept sorted in descending order. */
53struct imx_fracn_gppll_rate_table {
54 unsigned int rate;
55 unsigned int mfi;
56 unsigned int mfn;
57 unsigned int mfd;
58 unsigned int rdiv;
59 unsigned int odiv;
60};
61
62struct imx_fracn_gppll_clk {
63 const struct imx_fracn_gppll_rate_table *rate_table;
64 int rate_count;
65 int flags;
66};
67
68struct clk *imx_clk_fracn_gppll(const char *name, const char *parent_name, void __iomem *base,
69 const struct imx_fracn_gppll_clk *pll_clk);
70struct clk *imx_clk_fracn_gppll_integer(const char *name, const char *parent_name,
71 void __iomem *base,
72 const struct imx_fracn_gppll_clk *pll_clk);
73
74extern struct imx_fracn_gppll_clk imx_fracn_gppll;
75extern struct imx_fracn_gppll_clk imx_fracn_gppll_integer;
76
Peng Fan134cf092019-08-19 07:53:58 +000077struct clk *imx_clk_pll14xx(const char *name, const char *parent_name,
78 void __iomem *base,
79 const struct imx_pll14xx_clk *pll_clk);
80
Marek Vasut04e5fba2025-03-23 16:58:38 +010081struct clk *clk_register_gate2(struct udevice *dev, const char *name,
Lukasz Majewski4de44bb2019-06-24 15:50:45 +020082 const char *parent_name, unsigned long flags,
83 void __iomem *reg, u8 bit_idx, u8 cgr_val,
Michael Trimarchi29c56cf2022-08-30 16:41:38 +020084 u8 clk_gate_flags, unsigned int *share_count);
Lukasz Majewski4de44bb2019-06-24 15:50:45 +020085
86struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name,
87 const char *parent_name, void __iomem *base,
88 u32 div_mask);
89
Marek Vasut69220472025-03-23 16:58:40 +010090static inline struct clk *imx_clk_gate2(struct udevice *dev, const char *name,
91 const char *parent, void __iomem *reg,
92 u8 shift)
Lukasz Majewski4de44bb2019-06-24 15:50:45 +020093{
94 return clk_register_gate2(NULL, name, parent, CLK_SET_RATE_PARENT, reg,
Michael Trimarchi29c56cf2022-08-30 16:41:38 +020095 shift, 0x3, 0, NULL);
Lukasz Majewski4de44bb2019-06-24 15:50:45 +020096}
97
Marek Vasut69220472025-03-23 16:58:40 +010098static inline struct clk *imx_clk_gate2_shared(struct udevice *dev, const char *name,
Michael Trimarchi29c56cf2022-08-30 16:41:38 +020099 const char *parent,
100 void __iomem *reg, u8 shift,
101 unsigned int *share_count)
102{
103 return clk_register_gate2(NULL, name, parent, CLK_SET_RATE_PARENT, reg,
104 shift, 0x3, 0, share_count);
105}
106
Marek Vasut69220472025-03-23 16:58:40 +0100107static inline struct clk *imx_clk_gate2_shared2(struct udevice *dev, const char *name,
Michael Trimarchi29c56cf2022-08-30 16:41:38 +0200108 const char *parent,
109 void __iomem *reg, u8 shift,
110 unsigned int *share_count)
111{
112 return clk_register_gate2(NULL, name, parent, CLK_SET_RATE_PARENT |
113 CLK_OPS_PARENT_ENABLE, reg, shift, 0x3, 0,
114 share_count);
115}
116
Marek Vasut69220472025-03-23 16:58:40 +0100117static inline struct clk *imx_clk_gate4(struct udevice *dev, const char *name, const char *parent,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000118 void __iomem *reg, u8 shift)
119{
120 return clk_register_gate2(NULL, name, parent,
121 CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
Michael Trimarchi29c56cf2022-08-30 16:41:38 +0200122 reg, shift, 0x3, 0, NULL);
Peng Fanf8c3ca12019-07-31 07:01:42 +0000123}
124
Marek Vasut69220472025-03-23 16:58:40 +0100125static inline struct clk *imx_clk_gate4_flags(struct udevice *dev, const char *name,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000126 const char *parent, void __iomem *reg, u8 shift,
127 unsigned long flags)
128{
129 return clk_register_gate2(NULL, name, parent,
130 flags | CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
Michael Trimarchi29c56cf2022-08-30 16:41:38 +0200131 reg, shift, 0x3, 0, NULL);
Peng Fanf8c3ca12019-07-31 07:01:42 +0000132}
133
Lukasz Majewski4de44bb2019-06-24 15:50:45 +0200134static inline struct clk *imx_clk_fixed_factor(const char *name,
135 const char *parent, unsigned int mult, unsigned int div)
136{
137 return clk_register_fixed_factor(NULL, name, parent,
138 CLK_SET_RATE_PARENT, mult, div);
139}
140
141static inline struct clk *imx_clk_divider(const char *name, const char *parent,
142 void __iomem *reg, u8 shift, u8 width)
143{
144 return clk_register_divider(NULL, name, parent, CLK_SET_RATE_PARENT,
145 reg, shift, width, 0);
146}
147
Lukasz Majewski2f665412019-10-15 12:44:57 +0200148static inline struct clk *
149imx_clk_busy_divider(const char *name, const char *parent, void __iomem *reg,
150 u8 shift, u8 width, void __iomem *busy_reg, u8 busy_shift)
151{
152 return clk_register_divider(NULL, name, parent, CLK_SET_RATE_PARENT,
153 reg, shift, width, 0);
154}
155
Peng Fanf8c3ca12019-07-31 07:01:42 +0000156static inline struct clk *imx_clk_divider2(const char *name, const char *parent,
157 void __iomem *reg, u8 shift, u8 width)
158{
159 return clk_register_divider(NULL, name, parent,
160 CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
161 reg, shift, width, 0);
162}
163
Lukasz Majewski4de44bb2019-06-24 15:50:45 +0200164struct clk *imx_clk_pfd(const char *name, const char *parent_name,
165 void __iomem *reg, u8 idx);
166
167struct clk *imx_clk_fixup_mux(const char *name, void __iomem *reg,
168 u8 shift, u8 width, const char * const *parents,
169 int num_parents, void (*fixup)(u32 *val));
170
Marek Vasut33480a92025-03-23 16:58:34 +0100171static inline struct clk *imx_clk_mux_flags(struct udevice *dev, const char *name,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000172 void __iomem *reg, u8 shift, u8 width,
173 const char * const *parents, int num_parents,
174 unsigned long flags)
175{
Marek Vasut3f474bc2025-03-23 16:58:35 +0100176 return clk_register_mux(dev, name, parents, num_parents,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000177 flags | CLK_SET_RATE_NO_REPARENT, reg, shift,
178 width, 0);
179}
180
Marek Vasut33480a92025-03-23 16:58:34 +0100181static inline struct clk *imx_clk_mux2_flags(struct udevice *dev, const char *name,
Peng Fan1333f5e2019-12-30 16:56:25 +0800182 void __iomem *reg, u8 shift, u8 width,
183 const char * const *parents,
184 int num_parents, unsigned long flags)
185{
Marek Vasut3f474bc2025-03-23 16:58:35 +0100186 return clk_register_mux(dev, name, parents, num_parents,
Peng Fan1333f5e2019-12-30 16:56:25 +0800187 flags | CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE,
188 reg, shift, width, 0);
189}
190
Marek Vasut33480a92025-03-23 16:58:34 +0100191static inline struct clk *imx_clk_mux(struct udevice *dev, const char *name,
192 void __iomem *reg, u8 shift, u8 width, const char * const *parents,
Lukasz Majewski4de44bb2019-06-24 15:50:45 +0200193 int num_parents)
194{
Marek Vasut3f474bc2025-03-23 16:58:35 +0100195 return clk_register_mux(dev, name, parents, num_parents,
Lukasz Majewski4de44bb2019-06-24 15:50:45 +0200196 CLK_SET_RATE_NO_REPARENT, reg, shift,
197 width, 0);
198}
199
Lukasz Majewski2f665412019-10-15 12:44:57 +0200200static inline struct clk *
Marek Vasut33480a92025-03-23 16:58:34 +0100201imx_clk_busy_mux(struct udevice *dev, const char *name, void __iomem *reg, u8 shift, u8 width,
Lukasz Majewski2f665412019-10-15 12:44:57 +0200202 void __iomem *busy_reg, u8 busy_shift,
203 const char * const *parents, int num_parents)
204{
Marek Vasut3f474bc2025-03-23 16:58:35 +0100205 return clk_register_mux(dev, name, parents, num_parents,
Lukasz Majewski2f665412019-10-15 12:44:57 +0200206 CLK_SET_RATE_NO_REPARENT, reg, shift,
207 width, 0);
208}
209
Marek Vasut33480a92025-03-23 16:58:34 +0100210static inline struct clk *imx_clk_mux2(struct udevice *dev, const char *name, void __iomem *reg,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000211 u8 shift, u8 width, const char * const *parents,
212 int num_parents)
213{
Marek Vasut3f474bc2025-03-23 16:58:35 +0100214 return clk_register_mux(dev, name, parents, num_parents,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000215 CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE,
216 reg, shift, width, 0);
217}
218
Marek Vasut69220472025-03-23 16:58:40 +0100219static inline struct clk *imx_clk_gate(struct udevice *dev, const char *name,
220 const char *parent, void __iomem *reg,
221 u8 shift)
Peng Fanf8c3ca12019-07-31 07:01:42 +0000222{
223 return clk_register_gate(NULL, name, parent, CLK_SET_RATE_PARENT, reg,
224 shift, 0, NULL);
225}
226
Marek Vasut69220472025-03-23 16:58:40 +0100227static inline struct clk *imx_clk_gate_flags(struct udevice *dev, const char *name,
228 const char *parent, void __iomem *reg,
229 u8 shift, unsigned long flags)
Peng Fanf8c3ca12019-07-31 07:01:42 +0000230{
231 return clk_register_gate(NULL, name, parent, flags | CLK_SET_RATE_PARENT, reg,
232 shift, 0, NULL);
233}
234
Marek Vasut69220472025-03-23 16:58:40 +0100235static inline struct clk *imx_clk_gate3(struct udevice *dev, const char *name,
236 const char *parent, void __iomem *reg,
237 u8 shift)
Peng Fanf8c3ca12019-07-31 07:01:42 +0000238{
239 return clk_register_gate(NULL, name, parent,
240 CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
241 reg, shift, 0, NULL);
242}
243
244struct clk *imx8m_clk_composite_flags(const char *name,
245 const char * const *parent_names,
246 int num_parents, void __iomem *reg, unsigned long flags);
247
248#define __imx8m_clk_composite(name, parent_names, reg, flags) \
249 imx8m_clk_composite_flags(name, parent_names, \
250 ARRAY_SIZE(parent_names), reg, \
251 flags | CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
252
253#define imx8m_clk_composite(name, parent_names, reg) \
254 __imx8m_clk_composite(name, parent_names, reg, 0)
255
256#define imx8m_clk_composite_critical(name, parent_names, reg) \
257 __imx8m_clk_composite(name, parent_names, reg, CLK_IS_CRITICAL)
258
Sébastien Szymanski8d163f52023-07-25 10:08:53 +0200259struct clk *imx93_clk_composite_flags(const char *name,
260 const char * const *parent_names,
261 int num_parents,
262 void __iomem *reg,
263 u32 domain_id,
264 unsigned long flags);
265#define imx93_clk_composite(name, parent_names, num_parents, reg, domain_id) \
266 imx93_clk_composite_flags(name, parent_names, num_parents, reg, domain_id \
267 CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
268
269struct clk *imx93_clk_gate(struct device *dev, const char *name, const char *parent_name,
270 unsigned long flags, void __iomem *reg, u32 bit_idx, u32 val,
271 u32 mask, u32 domain_id, unsigned int *share_count);
272
Lukasz Majewski4de44bb2019-06-24 15:50:45 +0200273#endif /* __MACH_IMX_CLK_H */