blob: 32fa832f85609fc01a980dab5e6080dc61faf2b7 [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
Marek Vasut8dd06762025-03-23 16:58:46 +010086struct clk *imx_clk_pllv3(struct udevice *dev, enum imx_pllv3_type type,
87 const char *name, const char *parent_name,
88 void __iomem *base, u32 div_mask);
Lukasz Majewski4de44bb2019-06-24 15:50:45 +020089
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{
Marek Vasut610db3b2025-03-23 16:58:41 +010094 return clk_register_gate2(dev, 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{
Marek Vasut610db3b2025-03-23 16:58:41 +0100103 return clk_register_gate2(dev, name, parent, CLK_SET_RATE_PARENT, reg,
Michael Trimarchi29c56cf2022-08-30 16:41:38 +0200104 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{
Marek Vasut610db3b2025-03-23 16:58:41 +0100112 return clk_register_gate2(dev, name, parent, CLK_SET_RATE_PARENT |
Michael Trimarchi29c56cf2022-08-30 16:41:38 +0200113 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{
Marek Vasut610db3b2025-03-23 16:58:41 +0100120 return clk_register_gate2(dev, name, parent,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000121 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{
Marek Vasut610db3b2025-03-23 16:58:41 +0100129 return clk_register_gate2(dev, name, parent,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000130 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
Marek Vasut40e7edf2025-03-23 16:58:49 +0100141static inline struct clk *imx_clk_divider(struct udevice *dev, const char *name,
142 const char *parent, void __iomem *reg,
143 u8 shift, u8 width)
Lukasz Majewski4de44bb2019-06-24 15:50:45 +0200144{
Marek Vasut40e7edf2025-03-23 16:58:49 +0100145 return clk_register_divider(dev, name, parent, CLK_SET_RATE_PARENT,
Lukasz Majewski4de44bb2019-06-24 15:50:45 +0200146 reg, shift, width, 0);
147}
148
Lukasz Majewski2f665412019-10-15 12:44:57 +0200149static inline struct clk *
Marek Vasut40e7edf2025-03-23 16:58:49 +0100150imx_clk_busy_divider(struct udevice *dev, const char *name,
151 const char *parent, void __iomem *reg, u8 shift, u8 width,
152 void __iomem *busy_reg, u8 busy_shift)
Lukasz Majewski2f665412019-10-15 12:44:57 +0200153{
Marek Vasut40e7edf2025-03-23 16:58:49 +0100154 return clk_register_divider(dev, name, parent, CLK_SET_RATE_PARENT,
Lukasz Majewski2f665412019-10-15 12:44:57 +0200155 reg, shift, width, 0);
156}
157
Marek Vasut40e7edf2025-03-23 16:58:49 +0100158static inline struct clk *imx_clk_divider2(struct udevice *dev, const char *name,
159 const char *parent, void __iomem *reg,
160 u8 shift, u8 width)
Peng Fanf8c3ca12019-07-31 07:01:42 +0000161{
Marek Vasut40e7edf2025-03-23 16:58:49 +0100162 return clk_register_divider(dev, name, parent,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000163 CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
164 reg, shift, width, 0);
165}
166
Lukasz Majewski4de44bb2019-06-24 15:50:45 +0200167struct clk *imx_clk_pfd(const char *name, const char *parent_name,
168 void __iomem *reg, u8 idx);
169
170struct clk *imx_clk_fixup_mux(const char *name, void __iomem *reg,
171 u8 shift, u8 width, const char * const *parents,
172 int num_parents, void (*fixup)(u32 *val));
173
Marek Vasut33480a92025-03-23 16:58:34 +0100174static inline struct clk *imx_clk_mux_flags(struct udevice *dev, const char *name,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000175 void __iomem *reg, u8 shift, u8 width,
176 const char * const *parents, int num_parents,
177 unsigned long flags)
178{
Marek Vasut3f474bc2025-03-23 16:58:35 +0100179 return clk_register_mux(dev, name, parents, num_parents,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000180 flags | CLK_SET_RATE_NO_REPARENT, reg, shift,
181 width, 0);
182}
183
Marek Vasut33480a92025-03-23 16:58:34 +0100184static inline struct clk *imx_clk_mux2_flags(struct udevice *dev, const char *name,
Peng Fan1333f5e2019-12-30 16:56:25 +0800185 void __iomem *reg, u8 shift, u8 width,
186 const char * const *parents,
187 int num_parents, unsigned long flags)
188{
Marek Vasut3f474bc2025-03-23 16:58:35 +0100189 return clk_register_mux(dev, name, parents, num_parents,
Peng Fan1333f5e2019-12-30 16:56:25 +0800190 flags | CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE,
191 reg, shift, width, 0);
192}
193
Marek Vasut33480a92025-03-23 16:58:34 +0100194static inline struct clk *imx_clk_mux(struct udevice *dev, const char *name,
195 void __iomem *reg, u8 shift, u8 width, const char * const *parents,
Lukasz Majewski4de44bb2019-06-24 15:50:45 +0200196 int num_parents)
197{
Marek Vasut3f474bc2025-03-23 16:58:35 +0100198 return clk_register_mux(dev, name, parents, num_parents,
Lukasz Majewski4de44bb2019-06-24 15:50:45 +0200199 CLK_SET_RATE_NO_REPARENT, reg, shift,
200 width, 0);
201}
202
Lukasz Majewski2f665412019-10-15 12:44:57 +0200203static inline struct clk *
Marek Vasut33480a92025-03-23 16:58:34 +0100204imx_clk_busy_mux(struct udevice *dev, const char *name, void __iomem *reg, u8 shift, u8 width,
Lukasz Majewski2f665412019-10-15 12:44:57 +0200205 void __iomem *busy_reg, u8 busy_shift,
206 const char * const *parents, int num_parents)
207{
Marek Vasut3f474bc2025-03-23 16:58:35 +0100208 return clk_register_mux(dev, name, parents, num_parents,
Lukasz Majewski2f665412019-10-15 12:44:57 +0200209 CLK_SET_RATE_NO_REPARENT, reg, shift,
210 width, 0);
211}
212
Marek Vasut33480a92025-03-23 16:58:34 +0100213static inline struct clk *imx_clk_mux2(struct udevice *dev, const char *name, void __iomem *reg,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000214 u8 shift, u8 width, const char * const *parents,
215 int num_parents)
216{
Marek Vasut3f474bc2025-03-23 16:58:35 +0100217 return clk_register_mux(dev, name, parents, num_parents,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000218 CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE,
219 reg, shift, width, 0);
220}
221
Marek Vasut69220472025-03-23 16:58:40 +0100222static inline struct clk *imx_clk_gate(struct udevice *dev, const char *name,
223 const char *parent, void __iomem *reg,
224 u8 shift)
Peng Fanf8c3ca12019-07-31 07:01:42 +0000225{
Marek Vasut610db3b2025-03-23 16:58:41 +0100226 return clk_register_gate(dev, name, parent, CLK_SET_RATE_PARENT, reg,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000227 shift, 0, NULL);
228}
229
Marek Vasut69220472025-03-23 16:58:40 +0100230static inline struct clk *imx_clk_gate_flags(struct udevice *dev, const char *name,
231 const char *parent, void __iomem *reg,
232 u8 shift, unsigned long flags)
Peng Fanf8c3ca12019-07-31 07:01:42 +0000233{
Marek Vasut610db3b2025-03-23 16:58:41 +0100234 return clk_register_gate(dev, name, parent, flags | CLK_SET_RATE_PARENT, reg,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000235 shift, 0, NULL);
236}
237
Marek Vasut69220472025-03-23 16:58:40 +0100238static inline struct clk *imx_clk_gate3(struct udevice *dev, const char *name,
239 const char *parent, void __iomem *reg,
240 u8 shift)
Peng Fanf8c3ca12019-07-31 07:01:42 +0000241{
Marek Vasut610db3b2025-03-23 16:58:41 +0100242 return clk_register_gate(dev, name, parent,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000243 CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
244 reg, shift, 0, NULL);
245}
246
Marek Vasut3668ec72025-03-23 16:58:44 +0100247struct clk *imx8m_clk_composite_flags(struct udevice *dev, const char *name,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000248 const char * const *parent_names,
249 int num_parents, void __iomem *reg, unsigned long flags);
250
Marek Vasut3668ec72025-03-23 16:58:44 +0100251#define __imx8m_clk_composite(dev, name, parent_names, reg, flags) \
252 imx8m_clk_composite_flags(dev, name, parent_names, \
Peng Fanf8c3ca12019-07-31 07:01:42 +0000253 ARRAY_SIZE(parent_names), reg, \
254 flags | CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
255
Marek Vasut3668ec72025-03-23 16:58:44 +0100256#define imx8m_clk_composite(dev, name, parent_names, reg) \
257 __imx8m_clk_composite(dev, name, parent_names, reg, 0)
Peng Fanf8c3ca12019-07-31 07:01:42 +0000258
Marek Vasut3668ec72025-03-23 16:58:44 +0100259#define imx8m_clk_composite_critical(dev, name, parent_names, reg) \
260 __imx8m_clk_composite(dev, name, parent_names, reg, CLK_IS_CRITICAL)
Peng Fanf8c3ca12019-07-31 07:01:42 +0000261
Sébastien Szymanski8d163f52023-07-25 10:08:53 +0200262struct clk *imx93_clk_composite_flags(const char *name,
263 const char * const *parent_names,
264 int num_parents,
265 void __iomem *reg,
266 u32 domain_id,
267 unsigned long flags);
268#define imx93_clk_composite(name, parent_names, num_parents, reg, domain_id) \
269 imx93_clk_composite_flags(name, parent_names, num_parents, reg, domain_id \
270 CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
271
272struct clk *imx93_clk_gate(struct device *dev, const char *name, const char *parent_name,
273 unsigned long flags, void __iomem *reg, u32 bit_idx, u32 val,
274 u32 mask, u32 domain_id, unsigned int *share_count);
275
Lukasz Majewski4de44bb2019-06-24 15:50:45 +0200276#endif /* __MACH_IMX_CLK_H */