blob: 7d14dbc395fbfc043a0bae477fc430e89fa3665a [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
Marek Vasutbc0b9372025-03-23 16:58:53 +0100134static inline struct clk *
135imx_clk_fixed_factor(struct udevice *dev, const char *name, const char *parent,
136 unsigned int mult, unsigned int div)
Lukasz Majewski4de44bb2019-06-24 15:50:45 +0200137{
Marek Vasutbc0b9372025-03-23 16:58:53 +0100138 return clk_register_fixed_factor(dev, name, parent,
Lukasz Majewski4de44bb2019-06-24 15:50:45 +0200139 CLK_SET_RATE_PARENT, mult, div);
140}
141
Marek Vasut40e7edf2025-03-23 16:58:49 +0100142static inline struct clk *imx_clk_divider(struct udevice *dev, const char *name,
143 const char *parent, void __iomem *reg,
144 u8 shift, u8 width)
Lukasz Majewski4de44bb2019-06-24 15:50:45 +0200145{
Marek Vasut40e7edf2025-03-23 16:58:49 +0100146 return clk_register_divider(dev, name, parent, CLK_SET_RATE_PARENT,
Lukasz Majewski4de44bb2019-06-24 15:50:45 +0200147 reg, shift, width, 0);
148}
149
Lukasz Majewski2f665412019-10-15 12:44:57 +0200150static inline struct clk *
Marek Vasut40e7edf2025-03-23 16:58:49 +0100151imx_clk_busy_divider(struct udevice *dev, const char *name,
152 const char *parent, void __iomem *reg, u8 shift, u8 width,
153 void __iomem *busy_reg, u8 busy_shift)
Lukasz Majewski2f665412019-10-15 12:44:57 +0200154{
Marek Vasut40e7edf2025-03-23 16:58:49 +0100155 return clk_register_divider(dev, name, parent, CLK_SET_RATE_PARENT,
Lukasz Majewski2f665412019-10-15 12:44:57 +0200156 reg, shift, width, 0);
157}
158
Marek Vasut40e7edf2025-03-23 16:58:49 +0100159static inline struct clk *imx_clk_divider2(struct udevice *dev, const char *name,
160 const char *parent, void __iomem *reg,
161 u8 shift, u8 width)
Peng Fanf8c3ca12019-07-31 07:01:42 +0000162{
Marek Vasut40e7edf2025-03-23 16:58:49 +0100163 return clk_register_divider(dev, name, parent,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000164 CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
165 reg, shift, width, 0);
166}
167
Lukasz Majewski4de44bb2019-06-24 15:50:45 +0200168struct clk *imx_clk_pfd(const char *name, const char *parent_name,
169 void __iomem *reg, u8 idx);
170
171struct clk *imx_clk_fixup_mux(const char *name, void __iomem *reg,
172 u8 shift, u8 width, const char * const *parents,
173 int num_parents, void (*fixup)(u32 *val));
174
Marek Vasut33480a92025-03-23 16:58:34 +0100175static inline struct clk *imx_clk_mux_flags(struct udevice *dev, const char *name,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000176 void __iomem *reg, u8 shift, u8 width,
177 const char * const *parents, int num_parents,
178 unsigned long flags)
179{
Marek Vasut3f474bc2025-03-23 16:58:35 +0100180 return clk_register_mux(dev, name, parents, num_parents,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000181 flags | CLK_SET_RATE_NO_REPARENT, reg, shift,
182 width, 0);
183}
184
Marek Vasut33480a92025-03-23 16:58:34 +0100185static inline struct clk *imx_clk_mux2_flags(struct udevice *dev, const char *name,
Peng Fan1333f5e2019-12-30 16:56:25 +0800186 void __iomem *reg, u8 shift, u8 width,
187 const char * const *parents,
188 int num_parents, unsigned long flags)
189{
Marek Vasut3f474bc2025-03-23 16:58:35 +0100190 return clk_register_mux(dev, name, parents, num_parents,
Peng Fan1333f5e2019-12-30 16:56:25 +0800191 flags | CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE,
192 reg, shift, width, 0);
193}
194
Marek Vasut33480a92025-03-23 16:58:34 +0100195static inline struct clk *imx_clk_mux(struct udevice *dev, const char *name,
196 void __iomem *reg, u8 shift, u8 width, const char * const *parents,
Lukasz Majewski4de44bb2019-06-24 15:50:45 +0200197 int num_parents)
198{
Marek Vasut3f474bc2025-03-23 16:58:35 +0100199 return clk_register_mux(dev, name, parents, num_parents,
Lukasz Majewski4de44bb2019-06-24 15:50:45 +0200200 CLK_SET_RATE_NO_REPARENT, reg, shift,
201 width, 0);
202}
203
Lukasz Majewski2f665412019-10-15 12:44:57 +0200204static inline struct clk *
Marek Vasut33480a92025-03-23 16:58:34 +0100205imx_clk_busy_mux(struct udevice *dev, const char *name, void __iomem *reg, u8 shift, u8 width,
Lukasz Majewski2f665412019-10-15 12:44:57 +0200206 void __iomem *busy_reg, u8 busy_shift,
207 const char * const *parents, int num_parents)
208{
Marek Vasut3f474bc2025-03-23 16:58:35 +0100209 return clk_register_mux(dev, name, parents, num_parents,
Lukasz Majewski2f665412019-10-15 12:44:57 +0200210 CLK_SET_RATE_NO_REPARENT, reg, shift,
211 width, 0);
212}
213
Marek Vasut33480a92025-03-23 16:58:34 +0100214static inline struct clk *imx_clk_mux2(struct udevice *dev, const char *name, void __iomem *reg,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000215 u8 shift, u8 width, const char * const *parents,
216 int num_parents)
217{
Marek Vasut3f474bc2025-03-23 16:58:35 +0100218 return clk_register_mux(dev, name, parents, num_parents,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000219 CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE,
220 reg, shift, width, 0);
221}
222
Marek Vasut69220472025-03-23 16:58:40 +0100223static inline struct clk *imx_clk_gate(struct udevice *dev, const char *name,
224 const char *parent, void __iomem *reg,
225 u8 shift)
Peng Fanf8c3ca12019-07-31 07:01:42 +0000226{
Marek Vasut610db3b2025-03-23 16:58:41 +0100227 return clk_register_gate(dev, name, parent, CLK_SET_RATE_PARENT, reg,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000228 shift, 0, NULL);
229}
230
Marek Vasut69220472025-03-23 16:58:40 +0100231static inline struct clk *imx_clk_gate_flags(struct udevice *dev, const char *name,
232 const char *parent, void __iomem *reg,
233 u8 shift, unsigned long flags)
Peng Fanf8c3ca12019-07-31 07:01:42 +0000234{
Marek Vasut610db3b2025-03-23 16:58:41 +0100235 return clk_register_gate(dev, name, parent, flags | CLK_SET_RATE_PARENT, reg,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000236 shift, 0, NULL);
237}
238
Marek Vasut69220472025-03-23 16:58:40 +0100239static inline struct clk *imx_clk_gate3(struct udevice *dev, const char *name,
240 const char *parent, void __iomem *reg,
241 u8 shift)
Peng Fanf8c3ca12019-07-31 07:01:42 +0000242{
Marek Vasut610db3b2025-03-23 16:58:41 +0100243 return clk_register_gate(dev, name, parent,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000244 CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
245 reg, shift, 0, NULL);
246}
247
Marek Vasut3668ec72025-03-23 16:58:44 +0100248struct clk *imx8m_clk_composite_flags(struct udevice *dev, const char *name,
Peng Fanf8c3ca12019-07-31 07:01:42 +0000249 const char * const *parent_names,
250 int num_parents, void __iomem *reg, unsigned long flags);
251
Marek Vasut3668ec72025-03-23 16:58:44 +0100252#define __imx8m_clk_composite(dev, name, parent_names, reg, flags) \
253 imx8m_clk_composite_flags(dev, name, parent_names, \
Peng Fanf8c3ca12019-07-31 07:01:42 +0000254 ARRAY_SIZE(parent_names), reg, \
255 flags | CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
256
Marek Vasut3668ec72025-03-23 16:58:44 +0100257#define imx8m_clk_composite(dev, name, parent_names, reg) \
258 __imx8m_clk_composite(dev, name, parent_names, reg, 0)
Peng Fanf8c3ca12019-07-31 07:01:42 +0000259
Marek Vasut3668ec72025-03-23 16:58:44 +0100260#define imx8m_clk_composite_critical(dev, name, parent_names, reg) \
261 __imx8m_clk_composite(dev, name, parent_names, reg, CLK_IS_CRITICAL)
Peng Fanf8c3ca12019-07-31 07:01:42 +0000262
Sébastien Szymanski8d163f52023-07-25 10:08:53 +0200263struct clk *imx93_clk_composite_flags(const char *name,
264 const char * const *parent_names,
265 int num_parents,
266 void __iomem *reg,
267 u32 domain_id,
268 unsigned long flags);
269#define imx93_clk_composite(name, parent_names, num_parents, reg, domain_id) \
270 imx93_clk_composite_flags(name, parent_names, num_parents, reg, domain_id \
271 CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE)
272
273struct clk *imx93_clk_gate(struct device *dev, const char *name, const char *parent_name,
274 unsigned long flags, void __iomem *reg, u32 bit_idx, u32 val,
275 u32 mask, u32 domain_id, unsigned int *share_count);
276
Lukasz Majewski4de44bb2019-06-24 15:50:45 +0200277#endif /* __MACH_IMX_CLK_H */