xref: /linux/drivers/clk/clk-stm32f4.c (revision 522ba450b56fff29f868b1552bdc2965f55de7ed)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Author: Daniel Thompson <daniel.thompson@linaro.org>
4  *
5  * Inspired by clk-asm9260.c .
6  */
7 
8 #include <linux/bitfield.h>
9 #include <linux/clk-provider.h>
10 #include <linux/err.h>
11 #include <linux/io.h>
12 #include <linux/iopoll.h>
13 #include <linux/ioport.h>
14 #include <linux/slab.h>
15 #include <linux/spinlock.h>
16 #include <linux/of.h>
17 #include <linux/of_address.h>
18 #include <linux/regmap.h>
19 #include <linux/mfd/syscon.h>
20 
21 /*
22  * Include list of clocks which are not derived from system clock (SYSCLOCK)
23  * The index of these clocks is the secondary index of DT bindings
24  *
25  */
26 #include <dt-bindings/clock/stm32fx-clock.h>
27 
28 #define STM32F4_RCC_CR			0x00
29 #define STM32F4_RCC_PLLCFGR		0x04
30 #define STM32F4_RCC_CFGR		0x08
31 #define STM32F4_RCC_AHB1ENR		0x30
32 #define STM32F4_RCC_AHB2ENR		0x34
33 #define STM32F4_RCC_AHB3ENR		0x38
34 #define STM32F4_RCC_APB1ENR		0x40
35 #define STM32F4_RCC_APB2ENR		0x44
36 #define STM32F4_RCC_BDCR		0x70
37 #define STM32F4_RCC_CSR			0x74
38 #define STM32F4_RCC_SSCGR		0x80
39 #define STM32F4_RCC_PLLI2SCFGR		0x84
40 #define STM32F4_RCC_PLLSAICFGR		0x88
41 #define STM32F4_RCC_DCKCFGR		0x8c
42 #define STM32F7_RCC_DCKCFGR2		0x90
43 
44 #define STM32F4_RCC_PLLCFGR_N_MASK	GENMASK(14, 6)
45 
46 #define STM32F4_RCC_SSCGR_SSCGEN	BIT(31)
47 #define STM32F4_RCC_SSCGR_SPREADSEL	BIT(30)
48 #define STM32F4_RCC_SSCGR_RESERVED_MASK	GENMASK(29, 28)
49 #define STM32F4_RCC_SSCGR_INCSTEP_MASK	GENMASK(27, 13)
50 #define STM32F4_RCC_SSCGR_MODPER_MASK	GENMASK(12, 0)
51 
52 #define NONE -1
53 #define NO_IDX  NONE
54 #define NO_MUX  NONE
55 #define NO_GATE NONE
56 
57 struct stm32f4_gate_data {
58 	u8	offset;
59 	u8	bit_idx;
60 	const char *name;
61 	const char *parent_name;
62 	unsigned long flags;
63 };
64 
65 static const struct stm32f4_gate_data stm32f429_gates[] __initconst = {
66 	{ STM32F4_RCC_AHB1ENR,  0,	"gpioa",	"ahb_div" },
67 	{ STM32F4_RCC_AHB1ENR,  1,	"gpiob",	"ahb_div" },
68 	{ STM32F4_RCC_AHB1ENR,  2,	"gpioc",	"ahb_div" },
69 	{ STM32F4_RCC_AHB1ENR,  3,	"gpiod",	"ahb_div" },
70 	{ STM32F4_RCC_AHB1ENR,  4,	"gpioe",	"ahb_div" },
71 	{ STM32F4_RCC_AHB1ENR,  5,	"gpiof",	"ahb_div" },
72 	{ STM32F4_RCC_AHB1ENR,  6,	"gpiog",	"ahb_div" },
73 	{ STM32F4_RCC_AHB1ENR,  7,	"gpioh",	"ahb_div" },
74 	{ STM32F4_RCC_AHB1ENR,  8,	"gpioi",	"ahb_div" },
75 	{ STM32F4_RCC_AHB1ENR,  9,	"gpioj",	"ahb_div" },
76 	{ STM32F4_RCC_AHB1ENR, 10,	"gpiok",	"ahb_div" },
77 	{ STM32F4_RCC_AHB1ENR, 12,	"crc",		"ahb_div" },
78 	{ STM32F4_RCC_AHB1ENR, 18,	"bkpsra",	"ahb_div" },
79 	{ STM32F4_RCC_AHB1ENR, 20,	"ccmdatam",	"ahb_div" },
80 	{ STM32F4_RCC_AHB1ENR, 21,	"dma1",		"ahb_div" },
81 	{ STM32F4_RCC_AHB1ENR, 22,	"dma2",		"ahb_div" },
82 	{ STM32F4_RCC_AHB1ENR, 23,	"dma2d",	"ahb_div" },
83 	{ STM32F4_RCC_AHB1ENR, 25,	"ethmac",	"ahb_div" },
84 	{ STM32F4_RCC_AHB1ENR, 26,	"ethmactx",	"ahb_div" },
85 	{ STM32F4_RCC_AHB1ENR, 27,	"ethmacrx",	"ahb_div" },
86 	{ STM32F4_RCC_AHB1ENR, 28,	"ethmacptp",	"ahb_div" },
87 	{ STM32F4_RCC_AHB1ENR, 29,	"otghs",	"ahb_div" },
88 	{ STM32F4_RCC_AHB1ENR, 30,	"otghsulpi",	"ahb_div" },
89 
90 	{ STM32F4_RCC_AHB2ENR,  0,	"dcmi",		"ahb_div" },
91 	{ STM32F4_RCC_AHB2ENR,  4,	"cryp",		"ahb_div" },
92 	{ STM32F4_RCC_AHB2ENR,  5,	"hash",		"ahb_div" },
93 	{ STM32F4_RCC_AHB2ENR,  6,	"rng",		"pll48" },
94 	{ STM32F4_RCC_AHB2ENR,  7,	"otgfs",	"pll48" },
95 
96 	{ STM32F4_RCC_AHB3ENR,  0,	"fmc",		"ahb_div",
97 		CLK_IGNORE_UNUSED },
98 
99 	{ STM32F4_RCC_APB1ENR,  0,	"tim2",		"apb1_mul" },
100 	{ STM32F4_RCC_APB1ENR,  1,	"tim3",		"apb1_mul" },
101 	{ STM32F4_RCC_APB1ENR,  2,	"tim4",		"apb1_mul" },
102 	{ STM32F4_RCC_APB1ENR,  3,	"tim5",		"apb1_mul" },
103 	{ STM32F4_RCC_APB1ENR,  4,	"tim6",		"apb1_mul" },
104 	{ STM32F4_RCC_APB1ENR,  5,	"tim7",		"apb1_mul" },
105 	{ STM32F4_RCC_APB1ENR,  6,	"tim12",	"apb1_mul" },
106 	{ STM32F4_RCC_APB1ENR,  7,	"tim13",	"apb1_mul" },
107 	{ STM32F4_RCC_APB1ENR,  8,	"tim14",	"apb1_mul" },
108 	{ STM32F4_RCC_APB1ENR, 11,	"wwdg",		"apb1_div" },
109 	{ STM32F4_RCC_APB1ENR, 14,	"spi2",		"apb1_div" },
110 	{ STM32F4_RCC_APB1ENR, 15,	"spi3",		"apb1_div" },
111 	{ STM32F4_RCC_APB1ENR, 17,	"uart2",	"apb1_div" },
112 	{ STM32F4_RCC_APB1ENR, 18,	"uart3",	"apb1_div" },
113 	{ STM32F4_RCC_APB1ENR, 19,	"uart4",	"apb1_div" },
114 	{ STM32F4_RCC_APB1ENR, 20,	"uart5",	"apb1_div" },
115 	{ STM32F4_RCC_APB1ENR, 21,	"i2c1",		"apb1_div" },
116 	{ STM32F4_RCC_APB1ENR, 22,	"i2c2",		"apb1_div" },
117 	{ STM32F4_RCC_APB1ENR, 23,	"i2c3",		"apb1_div" },
118 	{ STM32F4_RCC_APB1ENR, 25,	"can1",		"apb1_div" },
119 	{ STM32F4_RCC_APB1ENR, 26,	"can2",		"apb1_div" },
120 	{ STM32F4_RCC_APB1ENR, 28,	"pwr",		"apb1_div" },
121 	{ STM32F4_RCC_APB1ENR, 29,	"dac",		"apb1_div" },
122 	{ STM32F4_RCC_APB1ENR, 30,	"uart7",	"apb1_div" },
123 	{ STM32F4_RCC_APB1ENR, 31,	"uart8",	"apb1_div" },
124 
125 	{ STM32F4_RCC_APB2ENR,  0,	"tim1",		"apb2_mul" },
126 	{ STM32F4_RCC_APB2ENR,  1,	"tim8",		"apb2_mul" },
127 	{ STM32F4_RCC_APB2ENR,  4,	"usart1",	"apb2_div" },
128 	{ STM32F4_RCC_APB2ENR,  5,	"usart6",	"apb2_div" },
129 	{ STM32F4_RCC_APB2ENR,  8,	"adc1",		"apb2_div" },
130 	{ STM32F4_RCC_APB2ENR,  9,	"adc2",		"apb2_div" },
131 	{ STM32F4_RCC_APB2ENR, 10,	"adc3",		"apb2_div" },
132 	{ STM32F4_RCC_APB2ENR, 11,	"sdio",		"pll48" },
133 	{ STM32F4_RCC_APB2ENR, 12,	"spi1",		"apb2_div" },
134 	{ STM32F4_RCC_APB2ENR, 13,	"spi4",		"apb2_div" },
135 	{ STM32F4_RCC_APB2ENR, 14,	"syscfg",	"apb2_div" },
136 	{ STM32F4_RCC_APB2ENR, 16,	"tim9",		"apb2_mul" },
137 	{ STM32F4_RCC_APB2ENR, 17,	"tim10",	"apb2_mul" },
138 	{ STM32F4_RCC_APB2ENR, 18,	"tim11",	"apb2_mul" },
139 	{ STM32F4_RCC_APB2ENR, 20,	"spi5",		"apb2_div" },
140 	{ STM32F4_RCC_APB2ENR, 21,	"spi6",		"apb2_div" },
141 	{ STM32F4_RCC_APB2ENR, 22,	"sai1",		"apb2_div" },
142 };
143 
144 static const struct stm32f4_gate_data stm32f469_gates[] __initconst = {
145 	{ STM32F4_RCC_AHB1ENR,  0,	"gpioa",	"ahb_div" },
146 	{ STM32F4_RCC_AHB1ENR,  1,	"gpiob",	"ahb_div" },
147 	{ STM32F4_RCC_AHB1ENR,  2,	"gpioc",	"ahb_div" },
148 	{ STM32F4_RCC_AHB1ENR,  3,	"gpiod",	"ahb_div" },
149 	{ STM32F4_RCC_AHB1ENR,  4,	"gpioe",	"ahb_div" },
150 	{ STM32F4_RCC_AHB1ENR,  5,	"gpiof",	"ahb_div" },
151 	{ STM32F4_RCC_AHB1ENR,  6,	"gpiog",	"ahb_div" },
152 	{ STM32F4_RCC_AHB1ENR,  7,	"gpioh",	"ahb_div" },
153 	{ STM32F4_RCC_AHB1ENR,  8,	"gpioi",	"ahb_div" },
154 	{ STM32F4_RCC_AHB1ENR,  9,	"gpioj",	"ahb_div" },
155 	{ STM32F4_RCC_AHB1ENR, 10,	"gpiok",	"ahb_div" },
156 	{ STM32F4_RCC_AHB1ENR, 12,	"crc",		"ahb_div" },
157 	{ STM32F4_RCC_AHB1ENR, 18,	"bkpsra",	"ahb_div" },
158 	{ STM32F4_RCC_AHB1ENR, 20,	"ccmdatam",	"ahb_div" },
159 	{ STM32F4_RCC_AHB1ENR, 21,	"dma1",		"ahb_div" },
160 	{ STM32F4_RCC_AHB1ENR, 22,	"dma2",		"ahb_div" },
161 	{ STM32F4_RCC_AHB1ENR, 23,	"dma2d",	"ahb_div" },
162 	{ STM32F4_RCC_AHB1ENR, 25,	"ethmac",	"ahb_div" },
163 	{ STM32F4_RCC_AHB1ENR, 26,	"ethmactx",	"ahb_div" },
164 	{ STM32F4_RCC_AHB1ENR, 27,	"ethmacrx",	"ahb_div" },
165 	{ STM32F4_RCC_AHB1ENR, 28,	"ethmacptp",	"ahb_div" },
166 	{ STM32F4_RCC_AHB1ENR, 29,	"otghs",	"ahb_div" },
167 	{ STM32F4_RCC_AHB1ENR, 30,	"otghsulpi",	"ahb_div" },
168 
169 	{ STM32F4_RCC_AHB2ENR,  0,	"dcmi",		"ahb_div" },
170 	{ STM32F4_RCC_AHB2ENR,  4,	"cryp",		"ahb_div" },
171 	{ STM32F4_RCC_AHB2ENR,  5,	"hash",		"ahb_div" },
172 	{ STM32F4_RCC_AHB2ENR,  6,	"rng",		"pll48" },
173 	{ STM32F4_RCC_AHB2ENR,  7,	"otgfs",	"pll48" },
174 
175 	{ STM32F4_RCC_AHB3ENR,  0,	"fmc",		"ahb_div",
176 		CLK_IGNORE_UNUSED },
177 	{ STM32F4_RCC_AHB3ENR,  1,	"qspi",		"ahb_div",
178 		CLK_IGNORE_UNUSED },
179 
180 	{ STM32F4_RCC_APB1ENR,  0,	"tim2",		"apb1_mul" },
181 	{ STM32F4_RCC_APB1ENR,  1,	"tim3",		"apb1_mul" },
182 	{ STM32F4_RCC_APB1ENR,  2,	"tim4",		"apb1_mul" },
183 	{ STM32F4_RCC_APB1ENR,  3,	"tim5",		"apb1_mul" },
184 	{ STM32F4_RCC_APB1ENR,  4,	"tim6",		"apb1_mul" },
185 	{ STM32F4_RCC_APB1ENR,  5,	"tim7",		"apb1_mul" },
186 	{ STM32F4_RCC_APB1ENR,  6,	"tim12",	"apb1_mul" },
187 	{ STM32F4_RCC_APB1ENR,  7,	"tim13",	"apb1_mul" },
188 	{ STM32F4_RCC_APB1ENR,  8,	"tim14",	"apb1_mul" },
189 	{ STM32F4_RCC_APB1ENR, 11,	"wwdg",		"apb1_div" },
190 	{ STM32F4_RCC_APB1ENR, 14,	"spi2",		"apb1_div" },
191 	{ STM32F4_RCC_APB1ENR, 15,	"spi3",		"apb1_div" },
192 	{ STM32F4_RCC_APB1ENR, 17,	"uart2",	"apb1_div" },
193 	{ STM32F4_RCC_APB1ENR, 18,	"uart3",	"apb1_div" },
194 	{ STM32F4_RCC_APB1ENR, 19,	"uart4",	"apb1_div" },
195 	{ STM32F4_RCC_APB1ENR, 20,	"uart5",	"apb1_div" },
196 	{ STM32F4_RCC_APB1ENR, 21,	"i2c1",		"apb1_div" },
197 	{ STM32F4_RCC_APB1ENR, 22,	"i2c2",		"apb1_div" },
198 	{ STM32F4_RCC_APB1ENR, 23,	"i2c3",		"apb1_div" },
199 	{ STM32F4_RCC_APB1ENR, 25,	"can1",		"apb1_div" },
200 	{ STM32F4_RCC_APB1ENR, 26,	"can2",		"apb1_div" },
201 	{ STM32F4_RCC_APB1ENR, 28,	"pwr",		"apb1_div" },
202 	{ STM32F4_RCC_APB1ENR, 29,	"dac",		"apb1_div" },
203 	{ STM32F4_RCC_APB1ENR, 30,	"uart7",	"apb1_div" },
204 	{ STM32F4_RCC_APB1ENR, 31,	"uart8",	"apb1_div" },
205 
206 	{ STM32F4_RCC_APB2ENR,  0,	"tim1",		"apb2_mul" },
207 	{ STM32F4_RCC_APB2ENR,  1,	"tim8",		"apb2_mul" },
208 	{ STM32F4_RCC_APB2ENR,  4,	"usart1",	"apb2_div" },
209 	{ STM32F4_RCC_APB2ENR,  5,	"usart6",	"apb2_div" },
210 	{ STM32F4_RCC_APB2ENR,  8,	"adc1",		"apb2_div" },
211 	{ STM32F4_RCC_APB2ENR,  9,	"adc2",		"apb2_div" },
212 	{ STM32F4_RCC_APB2ENR, 10,	"adc3",		"apb2_div" },
213 	{ STM32F4_RCC_APB2ENR, 11,	"sdio",		"sdmux" },
214 	{ STM32F4_RCC_APB2ENR, 12,	"spi1",		"apb2_div" },
215 	{ STM32F4_RCC_APB2ENR, 13,	"spi4",		"apb2_div" },
216 	{ STM32F4_RCC_APB2ENR, 14,	"syscfg",	"apb2_div" },
217 	{ STM32F4_RCC_APB2ENR, 16,	"tim9",		"apb2_mul" },
218 	{ STM32F4_RCC_APB2ENR, 17,	"tim10",	"apb2_mul" },
219 	{ STM32F4_RCC_APB2ENR, 18,	"tim11",	"apb2_mul" },
220 	{ STM32F4_RCC_APB2ENR, 20,	"spi5",		"apb2_div" },
221 	{ STM32F4_RCC_APB2ENR, 21,	"spi6",		"apb2_div" },
222 	{ STM32F4_RCC_APB2ENR, 22,	"sai1",		"apb2_div" },
223 };
224 
225 static const struct stm32f4_gate_data stm32f746_gates[] __initconst = {
226 	{ STM32F4_RCC_AHB1ENR,  0,	"gpioa",	"ahb_div" },
227 	{ STM32F4_RCC_AHB1ENR,  1,	"gpiob",	"ahb_div" },
228 	{ STM32F4_RCC_AHB1ENR,  2,	"gpioc",	"ahb_div" },
229 	{ STM32F4_RCC_AHB1ENR,  3,	"gpiod",	"ahb_div" },
230 	{ STM32F4_RCC_AHB1ENR,  4,	"gpioe",	"ahb_div" },
231 	{ STM32F4_RCC_AHB1ENR,  5,	"gpiof",	"ahb_div" },
232 	{ STM32F4_RCC_AHB1ENR,  6,	"gpiog",	"ahb_div" },
233 	{ STM32F4_RCC_AHB1ENR,  7,	"gpioh",	"ahb_div" },
234 	{ STM32F4_RCC_AHB1ENR,  8,	"gpioi",	"ahb_div" },
235 	{ STM32F4_RCC_AHB1ENR,  9,	"gpioj",	"ahb_div" },
236 	{ STM32F4_RCC_AHB1ENR, 10,	"gpiok",	"ahb_div" },
237 	{ STM32F4_RCC_AHB1ENR, 12,	"crc",		"ahb_div" },
238 	{ STM32F4_RCC_AHB1ENR, 18,	"bkpsra",	"ahb_div" },
239 	{ STM32F4_RCC_AHB1ENR, 20,	"dtcmram",	"ahb_div" },
240 	{ STM32F4_RCC_AHB1ENR, 21,	"dma1",		"ahb_div" },
241 	{ STM32F4_RCC_AHB1ENR, 22,	"dma2",		"ahb_div" },
242 	{ STM32F4_RCC_AHB1ENR, 23,	"dma2d",	"ahb_div" },
243 	{ STM32F4_RCC_AHB1ENR, 25,	"ethmac",	"ahb_div" },
244 	{ STM32F4_RCC_AHB1ENR, 26,	"ethmactx",	"ahb_div" },
245 	{ STM32F4_RCC_AHB1ENR, 27,	"ethmacrx",	"ahb_div" },
246 	{ STM32F4_RCC_AHB1ENR, 28,	"ethmacptp",	"ahb_div" },
247 	{ STM32F4_RCC_AHB1ENR, 29,	"otghs",	"ahb_div" },
248 	{ STM32F4_RCC_AHB1ENR, 30,	"otghsulpi",	"ahb_div" },
249 
250 	{ STM32F4_RCC_AHB2ENR,  0,	"dcmi",		"ahb_div" },
251 	{ STM32F4_RCC_AHB2ENR,  4,	"cryp",		"ahb_div" },
252 	{ STM32F4_RCC_AHB2ENR,  5,	"hash",		"ahb_div" },
253 	{ STM32F4_RCC_AHB2ENR,  6,	"rng",		"pll48"   },
254 	{ STM32F4_RCC_AHB2ENR,  7,	"otgfs",	"pll48"   },
255 
256 	{ STM32F4_RCC_AHB3ENR,  0,	"fmc",		"ahb_div",
257 		CLK_IGNORE_UNUSED },
258 	{ STM32F4_RCC_AHB3ENR,  1,	"qspi",		"ahb_div",
259 		CLK_IGNORE_UNUSED },
260 
261 	{ STM32F4_RCC_APB1ENR,  0,	"tim2",		"apb1_mul" },
262 	{ STM32F4_RCC_APB1ENR,  1,	"tim3",		"apb1_mul" },
263 	{ STM32F4_RCC_APB1ENR,  2,	"tim4",		"apb1_mul" },
264 	{ STM32F4_RCC_APB1ENR,  3,	"tim5",		"apb1_mul" },
265 	{ STM32F4_RCC_APB1ENR,  4,	"tim6",		"apb1_mul" },
266 	{ STM32F4_RCC_APB1ENR,  5,	"tim7",		"apb1_mul" },
267 	{ STM32F4_RCC_APB1ENR,  6,	"tim12",	"apb1_mul" },
268 	{ STM32F4_RCC_APB1ENR,  7,	"tim13",	"apb1_mul" },
269 	{ STM32F4_RCC_APB1ENR,  8,	"tim14",	"apb1_mul" },
270 	{ STM32F4_RCC_APB1ENR, 11,	"wwdg",		"apb1_div" },
271 	{ STM32F4_RCC_APB1ENR, 14,	"spi2",		"apb1_div" },
272 	{ STM32F4_RCC_APB1ENR, 15,	"spi3",		"apb1_div" },
273 	{ STM32F4_RCC_APB1ENR, 16,	"spdifrx",	"apb1_div" },
274 	{ STM32F4_RCC_APB1ENR, 25,	"can1",		"apb1_div" },
275 	{ STM32F4_RCC_APB1ENR, 26,	"can2",		"apb1_div" },
276 	{ STM32F4_RCC_APB1ENR, 27,	"cec",		"apb1_div" },
277 	{ STM32F4_RCC_APB1ENR, 28,	"pwr",		"apb1_div" },
278 	{ STM32F4_RCC_APB1ENR, 29,	"dac",		"apb1_div" },
279 
280 	{ STM32F4_RCC_APB2ENR,  0,	"tim1",		"apb2_mul" },
281 	{ STM32F4_RCC_APB2ENR,  1,	"tim8",		"apb2_mul" },
282 	{ STM32F4_RCC_APB2ENR,  7,	"sdmmc2",	"sdmux"    },
283 	{ STM32F4_RCC_APB2ENR,  8,	"adc1",		"apb2_div" },
284 	{ STM32F4_RCC_APB2ENR,  9,	"adc2",		"apb2_div" },
285 	{ STM32F4_RCC_APB2ENR, 10,	"adc3",		"apb2_div" },
286 	{ STM32F4_RCC_APB2ENR, 11,	"sdmmc",	"sdmux"    },
287 	{ STM32F4_RCC_APB2ENR, 12,	"spi1",		"apb2_div" },
288 	{ STM32F4_RCC_APB2ENR, 13,	"spi4",		"apb2_div" },
289 	{ STM32F4_RCC_APB2ENR, 14,	"syscfg",	"apb2_div" },
290 	{ STM32F4_RCC_APB2ENR, 16,	"tim9",		"apb2_mul" },
291 	{ STM32F4_RCC_APB2ENR, 17,	"tim10",	"apb2_mul" },
292 	{ STM32F4_RCC_APB2ENR, 18,	"tim11",	"apb2_mul" },
293 	{ STM32F4_RCC_APB2ENR, 20,	"spi5",		"apb2_div" },
294 	{ STM32F4_RCC_APB2ENR, 21,	"spi6",		"apb2_div" },
295 	{ STM32F4_RCC_APB2ENR, 22,	"sai1",		"apb2_div" },
296 	{ STM32F4_RCC_APB2ENR, 23,	"sai2",		"apb2_div" },
297 };
298 
299 static const struct stm32f4_gate_data stm32f769_gates[] __initconst = {
300 	{ STM32F4_RCC_AHB1ENR,  0,	"gpioa",	"ahb_div" },
301 	{ STM32F4_RCC_AHB1ENR,  1,	"gpiob",	"ahb_div" },
302 	{ STM32F4_RCC_AHB1ENR,  2,	"gpioc",	"ahb_div" },
303 	{ STM32F4_RCC_AHB1ENR,  3,	"gpiod",	"ahb_div" },
304 	{ STM32F4_RCC_AHB1ENR,  4,	"gpioe",	"ahb_div" },
305 	{ STM32F4_RCC_AHB1ENR,  5,	"gpiof",	"ahb_div" },
306 	{ STM32F4_RCC_AHB1ENR,  6,	"gpiog",	"ahb_div" },
307 	{ STM32F4_RCC_AHB1ENR,  7,	"gpioh",	"ahb_div" },
308 	{ STM32F4_RCC_AHB1ENR,  8,	"gpioi",	"ahb_div" },
309 	{ STM32F4_RCC_AHB1ENR,  9,	"gpioj",	"ahb_div" },
310 	{ STM32F4_RCC_AHB1ENR, 10,	"gpiok",	"ahb_div" },
311 	{ STM32F4_RCC_AHB1ENR, 12,	"crc",		"ahb_div" },
312 	{ STM32F4_RCC_AHB1ENR, 18,	"bkpsra",	"ahb_div" },
313 	{ STM32F4_RCC_AHB1ENR, 20,	"dtcmram",	"ahb_div" },
314 	{ STM32F4_RCC_AHB1ENR, 21,	"dma1",		"ahb_div" },
315 	{ STM32F4_RCC_AHB1ENR, 22,	"dma2",		"ahb_div" },
316 	{ STM32F4_RCC_AHB1ENR, 23,	"dma2d",	"ahb_div" },
317 	{ STM32F4_RCC_AHB1ENR, 25,	"ethmac",	"ahb_div" },
318 	{ STM32F4_RCC_AHB1ENR, 26,	"ethmactx",	"ahb_div" },
319 	{ STM32F4_RCC_AHB1ENR, 27,	"ethmacrx",	"ahb_div" },
320 	{ STM32F4_RCC_AHB1ENR, 28,	"ethmacptp",	"ahb_div" },
321 	{ STM32F4_RCC_AHB1ENR, 29,	"otghs",	"ahb_div" },
322 	{ STM32F4_RCC_AHB1ENR, 30,	"otghsulpi",	"ahb_div" },
323 
324 	{ STM32F4_RCC_AHB2ENR,  0,	"dcmi",		"ahb_div" },
325 	{ STM32F4_RCC_AHB2ENR,  1,	"jpeg",		"ahb_div" },
326 	{ STM32F4_RCC_AHB2ENR,  4,	"cryp",		"ahb_div" },
327 	{ STM32F4_RCC_AHB2ENR,  5,	"hash",		"ahb_div" },
328 	{ STM32F4_RCC_AHB2ENR,  6,	"rng",		"pll48"   },
329 	{ STM32F4_RCC_AHB2ENR,  7,	"otgfs",	"pll48"   },
330 
331 	{ STM32F4_RCC_AHB3ENR,  0,	"fmc",		"ahb_div",
332 		CLK_IGNORE_UNUSED },
333 	{ STM32F4_RCC_AHB3ENR,  1,	"qspi",		"ahb_div",
334 		CLK_IGNORE_UNUSED },
335 
336 	{ STM32F4_RCC_APB1ENR,  0,	"tim2",		"apb1_mul" },
337 	{ STM32F4_RCC_APB1ENR,  1,	"tim3",		"apb1_mul" },
338 	{ STM32F4_RCC_APB1ENR,  2,	"tim4",		"apb1_mul" },
339 	{ STM32F4_RCC_APB1ENR,  3,	"tim5",		"apb1_mul" },
340 	{ STM32F4_RCC_APB1ENR,  4,	"tim6",		"apb1_mul" },
341 	{ STM32F4_RCC_APB1ENR,  5,	"tim7",		"apb1_mul" },
342 	{ STM32F4_RCC_APB1ENR,  6,	"tim12",	"apb1_mul" },
343 	{ STM32F4_RCC_APB1ENR,  7,	"tim13",	"apb1_mul" },
344 	{ STM32F4_RCC_APB1ENR,  8,	"tim14",	"apb1_mul" },
345 	{ STM32F4_RCC_APB1ENR, 10,	"rtcapb",	"apb1_mul" },
346 	{ STM32F4_RCC_APB1ENR, 11,	"wwdg",		"apb1_div" },
347 	{ STM32F4_RCC_APB1ENR, 13,	"can3",		"apb1_div" },
348 	{ STM32F4_RCC_APB1ENR, 14,	"spi2",		"apb1_div" },
349 	{ STM32F4_RCC_APB1ENR, 15,	"spi3",		"apb1_div" },
350 	{ STM32F4_RCC_APB1ENR, 16,	"spdifrx",	"apb1_div" },
351 	{ STM32F4_RCC_APB1ENR, 25,	"can1",		"apb1_div" },
352 	{ STM32F4_RCC_APB1ENR, 26,	"can2",		"apb1_div" },
353 	{ STM32F4_RCC_APB1ENR, 27,	"cec",		"apb1_div" },
354 	{ STM32F4_RCC_APB1ENR, 28,	"pwr",		"apb1_div" },
355 	{ STM32F4_RCC_APB1ENR, 29,	"dac",		"apb1_div" },
356 
357 	{ STM32F4_RCC_APB2ENR,  0,	"tim1",		"apb2_mul" },
358 	{ STM32F4_RCC_APB2ENR,  1,	"tim8",		"apb2_mul" },
359 	{ STM32F4_RCC_APB2ENR,  7,	"sdmmc2",	"sdmux2" },
360 	{ STM32F4_RCC_APB2ENR,  8,	"adc1",		"apb2_div" },
361 	{ STM32F4_RCC_APB2ENR,  9,	"adc2",		"apb2_div" },
362 	{ STM32F4_RCC_APB2ENR, 10,	"adc3",		"apb2_div" },
363 	{ STM32F4_RCC_APB2ENR, 11,	"sdmmc1",	"sdmux1" },
364 	{ STM32F4_RCC_APB2ENR, 12,	"spi1",		"apb2_div" },
365 	{ STM32F4_RCC_APB2ENR, 13,	"spi4",		"apb2_div" },
366 	{ STM32F4_RCC_APB2ENR, 14,	"syscfg",	"apb2_div" },
367 	{ STM32F4_RCC_APB2ENR, 16,	"tim9",		"apb2_mul" },
368 	{ STM32F4_RCC_APB2ENR, 17,	"tim10",	"apb2_mul" },
369 	{ STM32F4_RCC_APB2ENR, 18,	"tim11",	"apb2_mul" },
370 	{ STM32F4_RCC_APB2ENR, 20,	"spi5",		"apb2_div" },
371 	{ STM32F4_RCC_APB2ENR, 21,	"spi6",		"apb2_div" },
372 	{ STM32F4_RCC_APB2ENR, 22,	"sai1",		"apb2_div" },
373 	{ STM32F4_RCC_APB2ENR, 23,	"sai2",		"apb2_div" },
374 	{ STM32F4_RCC_APB2ENR, 30,	"mdio",		"apb2_div" },
375 };
376 
377 enum stm32f4_pll_ssc_mod_type {
378 	STM32F4_PLL_SSC_CENTER_SPREAD,
379 	STM32F4_PLL_SSC_DOWN_SPREAD,
380 };
381 
382 static const char * const stm32f4_ssc_mod_methods[] __initconst = {
383 	[STM32F4_PLL_SSC_DOWN_SPREAD] = "down-spread",
384 	[STM32F4_PLL_SSC_CENTER_SPREAD] = "center-spread",
385 };
386 
387 /*
388  * This bitmask tells us which bit offsets (0..192) on STM32F4[23]xxx
389  * have gate bits associated with them. Its combined hweight is 71.
390  */
391 #define MAX_GATE_MAP 3
392 
393 static const u64 stm32f42xx_gate_map[MAX_GATE_MAP] = { 0x000000f17ef417ffull,
394 						       0x0000000000000001ull,
395 						       0x04777f33f6fec9ffull };
396 
397 static const u64 stm32f46xx_gate_map[MAX_GATE_MAP] = { 0x000000f17ef417ffull,
398 						       0x0000000000000003ull,
399 						       0x0c777f33f6fec9ffull };
400 
401 static const u64 stm32f746_gate_map[MAX_GATE_MAP] = { 0x000000f17ef417ffull,
402 						      0x0000000000000003ull,
403 						      0x04f77f833e01c9ffull };
404 
405 static const u64 stm32f769_gate_map[MAX_GATE_MAP] = { 0x000000f37ef417ffull,
406 						      0x0000000000000003ull,
407 						      0x44F77F833E01EDFFull };
408 
409 static const u64 *stm32f4_gate_map;
410 
411 static struct clk_hw **clks;
412 
413 static DEFINE_SPINLOCK(stm32f4_clk_lock);
414 static void __iomem *base;
415 
416 static struct regmap *pdrm;
417 
418 static int stm32fx_end_primary_clk;
419 
420 /*
421  * "Multiplier" device for APBx clocks.
422  *
423  * The APBx dividers are power-of-two dividers and, if *not* running in 1:1
424  * mode, they also tap out the one of the low order state bits to run the
425  * timers. ST datasheets represent this feature as a (conditional) clock
426  * multiplier.
427  */
428 struct clk_apb_mul {
429 	struct clk_hw hw;
430 	u8 bit_idx;
431 };
432 
433 #define to_clk_apb_mul(_hw) container_of(_hw, struct clk_apb_mul, hw)
434 
clk_apb_mul_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)435 static unsigned long clk_apb_mul_recalc_rate(struct clk_hw *hw,
436 					     unsigned long parent_rate)
437 {
438 	struct clk_apb_mul *am = to_clk_apb_mul(hw);
439 
440 	if (readl(base + STM32F4_RCC_CFGR) & BIT(am->bit_idx))
441 		return parent_rate * 2;
442 
443 	return parent_rate;
444 }
445 
clk_apb_mul_determine_rate(struct clk_hw * hw,struct clk_rate_request * req)446 static int clk_apb_mul_determine_rate(struct clk_hw *hw,
447 				      struct clk_rate_request *req)
448 {
449 	struct clk_apb_mul *am = to_clk_apb_mul(hw);
450 	unsigned long mult = 1;
451 
452 	if (readl(base + STM32F4_RCC_CFGR) & BIT(am->bit_idx))
453 		mult = 2;
454 
455 	if (clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT) {
456 		unsigned long best_parent = req->rate / mult;
457 
458 		req->best_parent_rate = clk_hw_round_rate(clk_hw_get_parent(hw), best_parent);
459 	}
460 
461 	req->rate = req->best_parent_rate * mult;
462 
463 	return 0;
464 }
465 
clk_apb_mul_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)466 static int clk_apb_mul_set_rate(struct clk_hw *hw, unsigned long rate,
467 				unsigned long parent_rate)
468 {
469 	/*
470 	 * We must report success but we can do so unconditionally because
471 	 * clk_apb_mul_round_rate returns values that ensure this call is a
472 	 * nop.
473 	 */
474 
475 	return 0;
476 }
477 
478 static const struct clk_ops clk_apb_mul_factor_ops = {
479 	.determine_rate = clk_apb_mul_determine_rate,
480 	.set_rate = clk_apb_mul_set_rate,
481 	.recalc_rate = clk_apb_mul_recalc_rate,
482 };
483 
clk_register_apb_mul(struct device * dev,const char * name,const char * parent_name,unsigned long flags,u8 bit_idx)484 static struct clk *clk_register_apb_mul(struct device *dev, const char *name,
485 					const char *parent_name,
486 					unsigned long flags, u8 bit_idx)
487 {
488 	struct clk_apb_mul *am;
489 	struct clk_init_data init;
490 	struct clk *clk;
491 
492 	am = kzalloc(sizeof(*am), GFP_KERNEL);
493 	if (!am)
494 		return ERR_PTR(-ENOMEM);
495 
496 	am->bit_idx = bit_idx;
497 	am->hw.init = &init;
498 
499 	init.name = name;
500 	init.ops = &clk_apb_mul_factor_ops;
501 	init.flags = flags;
502 	init.parent_names = &parent_name;
503 	init.num_parents = 1;
504 
505 	clk = clk_register(dev, &am->hw);
506 
507 	if (IS_ERR(clk))
508 		kfree(am);
509 
510 	return clk;
511 }
512 
513 enum {
514 	PLL,
515 	PLL_I2S,
516 	PLL_SAI,
517 };
518 
519 static const struct clk_div_table pll_divp_table[] = {
520 	{ 0, 2 }, { 1, 4 }, { 2, 6 }, { 3, 8 }, { 0 }
521 };
522 
523 static const struct clk_div_table pll_divq_table[] = {
524 	{ 2, 2 }, { 3, 3 }, { 4, 4 }, { 5, 5 }, { 6, 6 }, { 7, 7 },
525 	{ 8, 8 }, { 9, 9 }, { 10, 10 }, { 11, 11 }, { 12, 12 }, { 13, 13 },
526 	{ 14, 14 }, { 15, 15 },
527 	{ 0 }
528 };
529 
530 static const struct clk_div_table pll_divr_table[] = {
531 	{ 2, 2 }, { 3, 3 }, { 4, 4 }, { 5, 5 }, { 6, 6 }, { 7, 7 }, { 0 }
532 };
533 
534 struct stm32f4_pll_ssc {
535 	unsigned int mod_freq;
536 	unsigned int mod_depth;
537 	enum stm32f4_pll_ssc_mod_type mod_type;
538 };
539 
540 struct stm32f4_pll {
541 	spinlock_t *lock;
542 	struct	clk_gate gate;
543 	u8 offset;
544 	u8 bit_rdy_idx;
545 	u8 status;
546 	u8 n_start;
547 	bool ssc_enable;
548 	struct stm32f4_pll_ssc ssc_conf;
549 };
550 
551 #define to_stm32f4_pll(_gate) container_of(_gate, struct stm32f4_pll, gate)
552 
553 struct stm32f4_pll_post_div_data {
554 	int idx;
555 	int pll_idx;
556 	const char *name;
557 	const char *parent;
558 	u8 flag;
559 	u8 offset;
560 	u8 shift;
561 	u8 width;
562 	u8 flag_div;
563 	const struct clk_div_table *div_table;
564 };
565 
566 struct stm32f4_vco_data {
567 	const char *vco_name;
568 	u8 offset;
569 	u8 bit_idx;
570 	u8 bit_rdy_idx;
571 	bool sscg;
572 };
573 
574 static const struct stm32f4_vco_data  vco_data[] = {
575 	{ "vco",     STM32F4_RCC_PLLCFGR,    24, 25 },
576 	{ "vco-i2s", STM32F4_RCC_PLLI2SCFGR, 26, 27 },
577 	{ "vco-sai", STM32F4_RCC_PLLSAICFGR, 28, 29 },
578 };
579 
580 
581 static const struct clk_div_table post_divr_table[] = {
582 	{ 0, 2 }, { 1, 4 }, { 2, 8 }, { 3, 16 }, { 0 }
583 };
584 
585 #define MAX_POST_DIV 3
586 static const struct stm32f4_pll_post_div_data  post_div_data[MAX_POST_DIV] = {
587 	{ CLK_I2SQ_PDIV, PLL_VCO_I2S, "plli2s-q-div", "plli2s-q",
588 		CLK_SET_RATE_PARENT, STM32F4_RCC_DCKCFGR, 0, 5, 0, NULL},
589 
590 	{ CLK_SAIQ_PDIV, PLL_VCO_SAI, "pllsai-q-div", "pllsai-q",
591 		CLK_SET_RATE_PARENT, STM32F4_RCC_DCKCFGR, 8, 5, 0, NULL },
592 
593 	{ NO_IDX, PLL_VCO_SAI, "pllsai-r-div", "pllsai-r", CLK_SET_RATE_PARENT,
594 		STM32F4_RCC_DCKCFGR, 16, 2, 0, post_divr_table },
595 };
596 
597 struct stm32f4_div_data {
598 	u8 shift;
599 	u8 width;
600 	u8 flag_div;
601 	const struct clk_div_table *div_table;
602 };
603 
604 #define MAX_PLL_DIV 3
605 static const struct stm32f4_div_data  div_data[MAX_PLL_DIV] = {
606 	{ 16, 2, 0, pll_divp_table },
607 	{ 24, 4, 0, pll_divq_table },
608 	{ 28, 3, 0, pll_divr_table },
609 };
610 
611 struct stm32f4_pll_data {
612 	u8 pll_num;
613 	u8 n_start;
614 	const char *div_name[MAX_PLL_DIV];
615 };
616 
617 static const struct stm32f4_pll_data stm32f429_pll[MAX_PLL_DIV] = {
618 	{ PLL,	   192, { "pll", "pll48",    NULL	} },
619 	{ PLL_I2S, 192, { NULL,  "plli2s-q", "plli2s-r" } },
620 	{ PLL_SAI,  49, { NULL,  "pllsai-q", "pllsai-r" } },
621 };
622 
623 static const struct stm32f4_pll_data stm32f469_pll[MAX_PLL_DIV] = {
624 	{ PLL,	   50, { "pll",	     "pll-q",    "pll-r"    } },
625 	{ PLL_I2S, 50, { "plli2s-p", "plli2s-q", "plli2s-r" } },
626 	{ PLL_SAI, 50, { "pllsai-p", "pllsai-q", "pllsai-r" } },
627 };
628 
stm32f4_pll_is_enabled(struct clk_hw * hw)629 static int stm32f4_pll_is_enabled(struct clk_hw *hw)
630 {
631 	return clk_gate_ops.is_enabled(hw);
632 }
633 
634 #define PLL_TIMEOUT 10000
635 
stm32f4_pll_enable(struct clk_hw * hw)636 static int stm32f4_pll_enable(struct clk_hw *hw)
637 {
638 	struct clk_gate *gate = to_clk_gate(hw);
639 	struct stm32f4_pll *pll = to_stm32f4_pll(gate);
640 	int bit_status;
641 	unsigned int timeout = PLL_TIMEOUT;
642 
643 	if (clk_gate_ops.is_enabled(hw))
644 		return 0;
645 
646 	clk_gate_ops.enable(hw);
647 
648 	do {
649 		bit_status = !(readl(gate->reg) & BIT(pll->bit_rdy_idx));
650 
651 	} while (bit_status && --timeout);
652 
653 	return bit_status;
654 }
655 
stm32f4_pll_disable(struct clk_hw * hw)656 static void stm32f4_pll_disable(struct clk_hw *hw)
657 {
658 	clk_gate_ops.disable(hw);
659 }
660 
stm32f4_pll_recalc(struct clk_hw * hw,unsigned long parent_rate)661 static unsigned long stm32f4_pll_recalc(struct clk_hw *hw,
662 		unsigned long parent_rate)
663 {
664 	struct clk_gate *gate = to_clk_gate(hw);
665 	struct stm32f4_pll *pll = to_stm32f4_pll(gate);
666 	unsigned long val;
667 	unsigned long n;
668 
669 	val = readl(base + pll->offset);
670 	n = FIELD_GET(STM32F4_RCC_PLLCFGR_N_MASK, val);
671 
672 	return parent_rate * n;
673 }
674 
stm32f4_pll_determine_rate(struct clk_hw * hw,struct clk_rate_request * req)675 static int stm32f4_pll_determine_rate(struct clk_hw *hw,
676 				      struct clk_rate_request *req)
677 {
678 	struct clk_gate *gate = to_clk_gate(hw);
679 	struct stm32f4_pll *pll = to_stm32f4_pll(gate);
680 	unsigned long n;
681 
682 	n = req->rate / req->best_parent_rate;
683 
684 	if (n < pll->n_start)
685 		n = pll->n_start;
686 	else if (n > 432)
687 		n = 432;
688 
689 	req->rate = req->best_parent_rate * n;
690 
691 	return 0;
692 }
693 
stm32f4_pll_set_ssc(struct clk_hw * hw,unsigned long parent_rate,unsigned int ndiv)694 static void stm32f4_pll_set_ssc(struct clk_hw *hw, unsigned long parent_rate,
695 				unsigned int ndiv)
696 {
697 	struct clk_gate *gate = to_clk_gate(hw);
698 	struct stm32f4_pll *pll = to_stm32f4_pll(gate);
699 	struct stm32f4_pll_ssc *ssc = &pll->ssc_conf;
700 	u32 modeper, incstep;
701 	u32 sscgr;
702 
703 	sscgr = readl(base + STM32F4_RCC_SSCGR);
704 	/* reserved field must be kept at reset value */
705 	sscgr &= STM32F4_RCC_SSCGR_RESERVED_MASK;
706 
707 	modeper = DIV_ROUND_CLOSEST(parent_rate, 4 * ssc->mod_freq);
708 	incstep = DIV_ROUND_CLOSEST(((1 << 15) - 1) * ssc->mod_depth * ndiv,
709 				    5 * 10000 * modeper);
710 	sscgr |= STM32F4_RCC_SSCGR_SSCGEN |
711 		FIELD_PREP(STM32F4_RCC_SSCGR_INCSTEP_MASK, incstep) |
712 		FIELD_PREP(STM32F4_RCC_SSCGR_MODPER_MASK, modeper);
713 
714 	if (ssc->mod_type)
715 		sscgr |= STM32F4_RCC_SSCGR_SPREADSEL;
716 
717 	writel(sscgr, base + STM32F4_RCC_SSCGR);
718 }
719 
stm32f4_pll_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)720 static int stm32f4_pll_set_rate(struct clk_hw *hw, unsigned long rate,
721 				unsigned long parent_rate)
722 {
723 	struct clk_gate *gate = to_clk_gate(hw);
724 	struct stm32f4_pll *pll = to_stm32f4_pll(gate);
725 
726 	unsigned long n;
727 	unsigned long val;
728 	int pll_state;
729 
730 	pll_state = stm32f4_pll_is_enabled(hw);
731 
732 	if (pll_state)
733 		stm32f4_pll_disable(hw);
734 
735 	n = rate  / parent_rate;
736 
737 	val = readl(base + pll->offset) & ~STM32F4_RCC_PLLCFGR_N_MASK;
738 	val |= FIELD_PREP(STM32F4_RCC_PLLCFGR_N_MASK, n);
739 
740 	writel(val, base + pll->offset);
741 
742 	if (pll->ssc_enable)
743 		stm32f4_pll_set_ssc(hw, parent_rate, n);
744 
745 	if (pll_state)
746 		stm32f4_pll_enable(hw);
747 
748 	return 0;
749 }
750 
751 static const struct clk_ops stm32f4_pll_gate_ops = {
752 	.enable		= stm32f4_pll_enable,
753 	.disable	= stm32f4_pll_disable,
754 	.is_enabled	= stm32f4_pll_is_enabled,
755 	.recalc_rate	= stm32f4_pll_recalc,
756 	.determine_rate = stm32f4_pll_determine_rate,
757 	.set_rate	= stm32f4_pll_set_rate,
758 };
759 
760 struct stm32f4_pll_div {
761 	struct clk_divider div;
762 	struct clk_hw *hw_pll;
763 };
764 
765 #define to_pll_div_clk(_div) container_of(_div, struct stm32f4_pll_div, div)
766 
stm32f4_pll_div_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)767 static unsigned long stm32f4_pll_div_recalc_rate(struct clk_hw *hw,
768 		unsigned long parent_rate)
769 {
770 	return clk_divider_ops.recalc_rate(hw, parent_rate);
771 }
772 
stm32f4_pll_div_determine_rate(struct clk_hw * hw,struct clk_rate_request * req)773 static int stm32f4_pll_div_determine_rate(struct clk_hw *hw,
774 					  struct clk_rate_request *req)
775 {
776 	return clk_divider_ops.determine_rate(hw, req);
777 }
778 
stm32f4_pll_div_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)779 static int stm32f4_pll_div_set_rate(struct clk_hw *hw, unsigned long rate,
780 				unsigned long parent_rate)
781 {
782 	int pll_state, ret;
783 
784 	struct clk_divider *div = to_clk_divider(hw);
785 	struct stm32f4_pll_div *pll_div = to_pll_div_clk(div);
786 
787 	pll_state = stm32f4_pll_is_enabled(pll_div->hw_pll);
788 
789 	if (pll_state)
790 		stm32f4_pll_disable(pll_div->hw_pll);
791 
792 	ret = clk_divider_ops.set_rate(hw, rate, parent_rate);
793 
794 	if (pll_state)
795 		stm32f4_pll_enable(pll_div->hw_pll);
796 
797 	return ret;
798 }
799 
800 static const struct clk_ops stm32f4_pll_div_ops = {
801 	.recalc_rate = stm32f4_pll_div_recalc_rate,
802 	.determine_rate = stm32f4_pll_div_determine_rate,
803 	.set_rate = stm32f4_pll_div_set_rate,
804 };
805 
clk_register_pll_div(const char * name,const char * parent_name,unsigned long flags,void __iomem * reg,u8 shift,u8 width,u8 clk_divider_flags,const struct clk_div_table * table,struct clk_hw * pll_hw,spinlock_t * lock)806 static struct clk_hw *clk_register_pll_div(const char *name,
807 		const char *parent_name, unsigned long flags,
808 		void __iomem *reg, u8 shift, u8 width,
809 		u8 clk_divider_flags, const struct clk_div_table *table,
810 		struct clk_hw *pll_hw, spinlock_t *lock)
811 {
812 	struct stm32f4_pll_div *pll_div;
813 	struct clk_hw *hw;
814 	struct clk_init_data init;
815 	int ret;
816 
817 	/* allocate the divider */
818 	pll_div = kzalloc(sizeof(*pll_div), GFP_KERNEL);
819 	if (!pll_div)
820 		return ERR_PTR(-ENOMEM);
821 
822 	init.name = name;
823 	init.ops = &stm32f4_pll_div_ops;
824 	init.flags = flags;
825 	init.parent_names = (parent_name ? &parent_name : NULL);
826 	init.num_parents = (parent_name ? 1 : 0);
827 
828 	/* struct clk_divider assignments */
829 	pll_div->div.reg = reg;
830 	pll_div->div.shift = shift;
831 	pll_div->div.width = width;
832 	pll_div->div.flags = clk_divider_flags;
833 	pll_div->div.lock = lock;
834 	pll_div->div.table = table;
835 	pll_div->div.hw.init = &init;
836 
837 	pll_div->hw_pll = pll_hw;
838 
839 	/* register the clock */
840 	hw = &pll_div->div.hw;
841 	ret = clk_hw_register(NULL, hw);
842 	if (ret) {
843 		kfree(pll_div);
844 		hw = ERR_PTR(ret);
845 	}
846 
847 	return hw;
848 }
849 
stm32f4_pll_init_ssc(struct clk_hw * hw,const struct stm32f4_pll_ssc * conf)850 static int __init stm32f4_pll_init_ssc(struct clk_hw *hw,
851 				       const struct stm32f4_pll_ssc *conf)
852 {
853 	struct clk_gate *gate = to_clk_gate(hw);
854 	struct stm32f4_pll *pll = to_stm32f4_pll(gate);
855 	struct clk_hw *parent;
856 	unsigned long parent_rate;
857 	int pll_state;
858 	unsigned long n, val;
859 
860 	parent = clk_hw_get_parent(hw);
861 	if (!parent) {
862 		pr_err("%s: failed to get clock parent\n", __func__);
863 		return -ENODEV;
864 	}
865 
866 	parent_rate = clk_hw_get_rate(parent);
867 
868 	pll->ssc_enable = true;
869 	memcpy(&pll->ssc_conf, conf, sizeof(pll->ssc_conf));
870 
871 	pll_state = stm32f4_pll_is_enabled(hw);
872 
873 	if (pll_state)
874 		stm32f4_pll_disable(hw);
875 
876 	val = readl(base + pll->offset);
877 	n = FIELD_GET(STM32F4_RCC_PLLCFGR_N_MASK, val);
878 
879 	pr_debug("%s: pll: %s, parent: %s, parent-rate: %lu, n: %lu\n",
880 		 __func__, clk_hw_get_name(hw), clk_hw_get_name(parent),
881 		 parent_rate, n);
882 
883 	stm32f4_pll_set_ssc(hw, parent_rate, n);
884 
885 	if (pll_state)
886 		stm32f4_pll_enable(hw);
887 
888 	return 0;
889 }
890 
stm32f4_pll_ssc_parse_dt(struct device_node * np,struct stm32f4_pll_ssc * conf)891 static int __init stm32f4_pll_ssc_parse_dt(struct device_node *np,
892 					   struct stm32f4_pll_ssc *conf)
893 {
894 	int ret;
895 
896 	if (!conf)
897 		return -EINVAL;
898 
899 	ret = of_property_read_u32(np, "st,ssc-modfreq-hz", &conf->mod_freq);
900 	if (ret)
901 		return ret;
902 
903 	ret = of_property_read_u32(np, "st,ssc-moddepth-permyriad",
904 				   &conf->mod_depth);
905 	if (ret) {
906 		pr_err("%pOF: missing st,ssc-moddepth-permyriad\n", np);
907 		return ret;
908 	}
909 
910 	ret = fwnode_property_match_property_string(of_fwnode_handle(np),
911 						    "st,ssc-modmethod",
912 						    stm32f4_ssc_mod_methods,
913 						    ARRAY_SIZE(stm32f4_ssc_mod_methods));
914 	if (ret < 0) {
915 		pr_err("%pOF: failed to get st,ssc-modmethod\n", np);
916 		return ret;
917 	}
918 
919 	conf->mod_type = ret;
920 
921 	pr_debug("%pOF: SSCG settings: mod_freq: %d, mod_depth: %d mod_method: %s [%d]\n",
922 		 np, conf->mod_freq, conf->mod_depth,
923 		 stm32f4_ssc_mod_methods[ret], conf->mod_type);
924 
925 	return 0;
926 }
927 
stm32f4_rcc_register_pll(const char * pllsrc,const struct stm32f4_pll_data * data,spinlock_t * lock)928 static struct clk_hw *stm32f4_rcc_register_pll(const char *pllsrc,
929 		const struct stm32f4_pll_data *data,  spinlock_t *lock)
930 {
931 	struct stm32f4_pll *pll;
932 	struct clk_init_data init = { NULL };
933 	void __iomem *reg;
934 	struct clk_hw *pll_hw;
935 	int ret;
936 	int i;
937 	const struct stm32f4_vco_data *vco;
938 
939 
940 	pll = kzalloc(sizeof(*pll), GFP_KERNEL);
941 	if (!pll)
942 		return ERR_PTR(-ENOMEM);
943 
944 	vco = &vco_data[data->pll_num];
945 
946 	init.name = vco->vco_name;
947 	init.ops = &stm32f4_pll_gate_ops;
948 	init.flags = CLK_SET_RATE_GATE;
949 	init.parent_names = &pllsrc;
950 	init.num_parents = 1;
951 
952 	pll->gate.lock = lock;
953 	pll->gate.reg = base + STM32F4_RCC_CR;
954 	pll->gate.bit_idx = vco->bit_idx;
955 	pll->gate.hw.init = &init;
956 
957 	pll->offset = vco->offset;
958 	pll->n_start = data->n_start;
959 	pll->bit_rdy_idx = vco->bit_rdy_idx;
960 	pll->status = (readl(base + STM32F4_RCC_CR) >> vco->bit_idx) & 0x1;
961 
962 	reg = base + pll->offset;
963 
964 	pll_hw = &pll->gate.hw;
965 	ret = clk_hw_register(NULL, pll_hw);
966 	if (ret) {
967 		kfree(pll);
968 		return ERR_PTR(ret);
969 	}
970 
971 	for (i = 0; i < MAX_PLL_DIV; i++)
972 		if (data->div_name[i])
973 			clk_register_pll_div(data->div_name[i],
974 					vco->vco_name,
975 					0,
976 					reg,
977 					div_data[i].shift,
978 					div_data[i].width,
979 					div_data[i].flag_div,
980 					div_data[i].div_table,
981 					pll_hw,
982 					lock);
983 	return pll_hw;
984 }
985 
986 /*
987  * Converts the primary and secondary indices (as they appear in DT) to an
988  * offset into our struct clock array.
989  */
stm32f4_rcc_lookup_clk_idx(u8 primary,u8 secondary)990 static int stm32f4_rcc_lookup_clk_idx(u8 primary, u8 secondary)
991 {
992 	u64 table[MAX_GATE_MAP];
993 
994 	if (primary == 1) {
995 		if (WARN_ON(secondary >= stm32fx_end_primary_clk))
996 			return -EINVAL;
997 		return secondary;
998 	}
999 
1000 	memcpy(table, stm32f4_gate_map, sizeof(table));
1001 
1002 	/* only bits set in table can be used as indices */
1003 	if (WARN_ON(secondary >= BITS_PER_BYTE * sizeof(table) ||
1004 		    0 == (table[BIT_ULL_WORD(secondary)] &
1005 			  BIT_ULL_MASK(secondary))))
1006 		return -EINVAL;
1007 
1008 	/* mask out bits above our current index */
1009 	table[BIT_ULL_WORD(secondary)] &=
1010 	    GENMASK_ULL(secondary % BITS_PER_LONG_LONG, 0);
1011 
1012 	return stm32fx_end_primary_clk - 1 + hweight64(table[0]) +
1013 	       (BIT_ULL_WORD(secondary) >= 1 ? hweight64(table[1]) : 0) +
1014 	       (BIT_ULL_WORD(secondary) >= 2 ? hweight64(table[2]) : 0);
1015 }
1016 
1017 static struct clk_hw *
stm32f4_rcc_lookup_clk(struct of_phandle_args * clkspec,void * data)1018 stm32f4_rcc_lookup_clk(struct of_phandle_args *clkspec, void *data)
1019 {
1020 	int i = stm32f4_rcc_lookup_clk_idx(clkspec->args[0], clkspec->args[1]);
1021 
1022 	if (i < 0)
1023 		return ERR_PTR(-EINVAL);
1024 
1025 	return clks[i];
1026 }
1027 
1028 #define to_rgclk(_rgate) container_of(_rgate, struct stm32_rgate, gate)
1029 
disable_power_domain_write_protection(void)1030 static inline void disable_power_domain_write_protection(void)
1031 {
1032 	if (pdrm)
1033 		regmap_update_bits(pdrm, 0x00, (1 << 8), (1 << 8));
1034 }
1035 
enable_power_domain_write_protection(void)1036 static inline void enable_power_domain_write_protection(void)
1037 {
1038 	if (pdrm)
1039 		regmap_update_bits(pdrm, 0x00, (1 << 8), (0 << 8));
1040 }
1041 
sofware_reset_backup_domain(void)1042 static inline void sofware_reset_backup_domain(void)
1043 {
1044 	unsigned long val;
1045 
1046 	val = readl(base + STM32F4_RCC_BDCR);
1047 	writel(val | BIT(16), base + STM32F4_RCC_BDCR);
1048 	writel(val & ~BIT(16), base + STM32F4_RCC_BDCR);
1049 }
1050 
1051 struct stm32_rgate {
1052 	struct	clk_gate gate;
1053 	u8	bit_rdy_idx;
1054 };
1055 
1056 #define RGATE_TIMEOUT 50000
1057 
rgclk_enable(struct clk_hw * hw)1058 static int rgclk_enable(struct clk_hw *hw)
1059 {
1060 	struct clk_gate *gate = to_clk_gate(hw);
1061 	struct stm32_rgate *rgate = to_rgclk(gate);
1062 	int bit_status;
1063 	unsigned int timeout = RGATE_TIMEOUT;
1064 
1065 	if (clk_gate_ops.is_enabled(hw))
1066 		return 0;
1067 
1068 	disable_power_domain_write_protection();
1069 
1070 	clk_gate_ops.enable(hw);
1071 
1072 	do {
1073 		bit_status = !(readl(gate->reg) & BIT(rgate->bit_rdy_idx));
1074 		if (bit_status)
1075 			udelay(100);
1076 
1077 	} while (bit_status && --timeout);
1078 
1079 	enable_power_domain_write_protection();
1080 
1081 	return bit_status;
1082 }
1083 
rgclk_disable(struct clk_hw * hw)1084 static void rgclk_disable(struct clk_hw *hw)
1085 {
1086 	clk_gate_ops.disable(hw);
1087 }
1088 
rgclk_is_enabled(struct clk_hw * hw)1089 static int rgclk_is_enabled(struct clk_hw *hw)
1090 {
1091 	return clk_gate_ops.is_enabled(hw);
1092 }
1093 
1094 static const struct clk_ops rgclk_ops = {
1095 	.enable = rgclk_enable,
1096 	.disable = rgclk_disable,
1097 	.is_enabled = rgclk_is_enabled,
1098 };
1099 
clk_register_rgate(struct device * dev,const char * name,const char * parent_name,unsigned long flags,void __iomem * reg,u8 bit_idx,u8 bit_rdy_idx,u8 clk_gate_flags,spinlock_t * lock)1100 static struct clk_hw *clk_register_rgate(struct device *dev, const char *name,
1101 		const char *parent_name, unsigned long flags,
1102 		void __iomem *reg, u8 bit_idx, u8 bit_rdy_idx,
1103 		u8 clk_gate_flags, spinlock_t *lock)
1104 {
1105 	struct stm32_rgate *rgate;
1106 	struct clk_init_data init = { NULL };
1107 	struct clk_hw *hw;
1108 	int ret;
1109 
1110 	rgate = kzalloc(sizeof(*rgate), GFP_KERNEL);
1111 	if (!rgate)
1112 		return ERR_PTR(-ENOMEM);
1113 
1114 	init.name = name;
1115 	init.ops = &rgclk_ops;
1116 	init.flags = flags;
1117 	init.parent_names = &parent_name;
1118 	init.num_parents = 1;
1119 
1120 	rgate->bit_rdy_idx = bit_rdy_idx;
1121 
1122 	rgate->gate.lock = lock;
1123 	rgate->gate.reg = reg;
1124 	rgate->gate.bit_idx = bit_idx;
1125 	rgate->gate.hw.init = &init;
1126 
1127 	hw = &rgate->gate.hw;
1128 	ret = clk_hw_register(dev, hw);
1129 	if (ret) {
1130 		kfree(rgate);
1131 		hw = ERR_PTR(ret);
1132 	}
1133 
1134 	return hw;
1135 }
1136 
cclk_gate_enable(struct clk_hw * hw)1137 static int cclk_gate_enable(struct clk_hw *hw)
1138 {
1139 	int ret;
1140 
1141 	disable_power_domain_write_protection();
1142 
1143 	ret = clk_gate_ops.enable(hw);
1144 
1145 	enable_power_domain_write_protection();
1146 
1147 	return ret;
1148 }
1149 
cclk_gate_disable(struct clk_hw * hw)1150 static void cclk_gate_disable(struct clk_hw *hw)
1151 {
1152 	disable_power_domain_write_protection();
1153 
1154 	clk_gate_ops.disable(hw);
1155 
1156 	enable_power_domain_write_protection();
1157 }
1158 
cclk_gate_is_enabled(struct clk_hw * hw)1159 static int cclk_gate_is_enabled(struct clk_hw *hw)
1160 {
1161 	return clk_gate_ops.is_enabled(hw);
1162 }
1163 
1164 static const struct clk_ops cclk_gate_ops = {
1165 	.enable		= cclk_gate_enable,
1166 	.disable	= cclk_gate_disable,
1167 	.is_enabled	= cclk_gate_is_enabled,
1168 };
1169 
cclk_mux_get_parent(struct clk_hw * hw)1170 static u8 cclk_mux_get_parent(struct clk_hw *hw)
1171 {
1172 	return clk_mux_ops.get_parent(hw);
1173 }
1174 
cclk_mux_set_parent(struct clk_hw * hw,u8 index)1175 static int cclk_mux_set_parent(struct clk_hw *hw, u8 index)
1176 {
1177 	int ret;
1178 
1179 	disable_power_domain_write_protection();
1180 
1181 	sofware_reset_backup_domain();
1182 
1183 	ret = clk_mux_ops.set_parent(hw, index);
1184 
1185 	enable_power_domain_write_protection();
1186 
1187 	return ret;
1188 }
1189 
1190 static const struct clk_ops cclk_mux_ops = {
1191 	.determine_rate = clk_hw_determine_rate_no_reparent,
1192 	.get_parent = cclk_mux_get_parent,
1193 	.set_parent = cclk_mux_set_parent,
1194 };
1195 
stm32_register_cclk(struct device * dev,const char * name,const char * const * parent_names,int num_parents,void __iomem * reg,u8 bit_idx,u8 shift,unsigned long flags,spinlock_t * lock)1196 static struct clk_hw *stm32_register_cclk(struct device *dev, const char *name,
1197 		const char * const *parent_names, int num_parents,
1198 		void __iomem *reg, u8 bit_idx, u8 shift, unsigned long flags,
1199 		spinlock_t *lock)
1200 {
1201 	struct clk_hw *hw;
1202 	struct clk_gate *gate;
1203 	struct clk_mux *mux;
1204 
1205 	gate = kzalloc(sizeof(*gate), GFP_KERNEL);
1206 	if (!gate) {
1207 		hw = ERR_PTR(-EINVAL);
1208 		goto fail;
1209 	}
1210 
1211 	mux = kzalloc(sizeof(*mux), GFP_KERNEL);
1212 	if (!mux) {
1213 		kfree(gate);
1214 		hw = ERR_PTR(-EINVAL);
1215 		goto fail;
1216 	}
1217 
1218 	gate->reg = reg;
1219 	gate->bit_idx = bit_idx;
1220 	gate->flags = 0;
1221 	gate->lock = lock;
1222 
1223 	mux->reg = reg;
1224 	mux->shift = shift;
1225 	mux->mask = 3;
1226 	mux->flags = 0;
1227 
1228 	hw = clk_hw_register_composite(dev, name, parent_names, num_parents,
1229 			&mux->hw, &cclk_mux_ops,
1230 			NULL, NULL,
1231 			&gate->hw, &cclk_gate_ops,
1232 			flags);
1233 
1234 	if (IS_ERR(hw)) {
1235 		kfree(gate);
1236 		kfree(mux);
1237 	}
1238 
1239 fail:
1240 	return hw;
1241 }
1242 
1243 static const char *sys_parents[] __initdata =   { "hsi", NULL, "pll" };
1244 
1245 static const struct clk_div_table ahb_div_table[] = {
1246 	{ 0x0,   1 }, { 0x1,   1 }, { 0x2,   1 }, { 0x3,   1 },
1247 	{ 0x4,   1 }, { 0x5,   1 }, { 0x6,   1 }, { 0x7,   1 },
1248 	{ 0x8,   2 }, { 0x9,   4 }, { 0xa,   8 }, { 0xb,  16 },
1249 	{ 0xc,  64 }, { 0xd, 128 }, { 0xe, 256 }, { 0xf, 512 },
1250 	{ 0 },
1251 };
1252 
1253 static const struct clk_div_table apb_div_table[] = {
1254 	{ 0,  1 }, { 0,  1 }, { 0,  1 }, { 0,  1 },
1255 	{ 4,  2 }, { 5,  4 }, { 6,  8 }, { 7, 16 },
1256 	{ 0 },
1257 };
1258 
1259 static const char *rtc_parents[4] = {
1260 	"no-clock", "lse", "lsi", "hse-rtc"
1261 };
1262 
1263 static const char *pll_src = "pll-src";
1264 
1265 static const char *pllsrc_parent[2] = { "hsi", NULL };
1266 
1267 static const char *dsi_parent[2] = { NULL, "pll-r" };
1268 
1269 static const char *lcd_parent[1] = { "pllsai-r-div" };
1270 
1271 static const char *i2s_parents[2] = { "plli2s-r", NULL };
1272 
1273 static const char *sai_parents[4] = { "pllsai-q-div", "plli2s-q-div", NULL,
1274 	"no-clock" };
1275 
1276 static const char *pll48_parents[2] = { "pll-q", "pllsai-p" };
1277 
1278 static const char *sdmux_parents[2] = { "pll48", "sys" };
1279 
1280 static const char *hdmi_parents[2] = { "lse", "hsi_div488" };
1281 
1282 static const char *spdif_parent[1] = { "plli2s-p" };
1283 
1284 static const char *lptim_parent[4] = { "apb1_mul", "lsi", "hsi", "lse" };
1285 
1286 static const char *uart_parents1[4] = { "apb2_div", "sys", "hsi", "lse" };
1287 static const char *uart_parents2[4] = { "apb1_div", "sys", "hsi", "lse" };
1288 
1289 static const char *i2c_parents[4] = { "apb1_div", "sys", "hsi", "no-clock" };
1290 
1291 static const char * const dfsdm1_src[] = { "apb2_div", "sys" };
1292 static const char * const adsfdm1_parent[] = { "sai1_clk", "sai2_clk" };
1293 
1294 struct stm32_aux_clk {
1295 	int idx;
1296 	const char *name;
1297 	const char * const *parent_names;
1298 	int num_parents;
1299 	int offset_mux;
1300 	u8 shift;
1301 	u8 mask;
1302 	int offset_gate;
1303 	u8 bit_idx;
1304 	unsigned long flags;
1305 };
1306 
1307 struct stm32f4_clk_data {
1308 	const struct stm32f4_gate_data *gates_data;
1309 	const u64 *gates_map;
1310 	int gates_num;
1311 	const struct stm32f4_pll_data *pll_data;
1312 	const struct stm32_aux_clk *aux_clk;
1313 	int aux_clk_num;
1314 	int end_primary;
1315 };
1316 
1317 static const struct stm32_aux_clk stm32f429_aux_clk[] = {
1318 	{
1319 		CLK_LCD, "lcd-tft", lcd_parent, ARRAY_SIZE(lcd_parent),
1320 		NO_MUX, 0, 0,
1321 		STM32F4_RCC_APB2ENR, 26,
1322 		CLK_SET_RATE_PARENT
1323 	},
1324 	{
1325 		CLK_I2S, "i2s", i2s_parents, ARRAY_SIZE(i2s_parents),
1326 		STM32F4_RCC_CFGR, 23, 1,
1327 		NO_GATE, 0,
1328 		CLK_SET_RATE_PARENT
1329 	},
1330 	{
1331 		CLK_SAI1, "sai1-a", sai_parents, ARRAY_SIZE(sai_parents),
1332 		STM32F4_RCC_DCKCFGR, 20, 3,
1333 		STM32F4_RCC_APB2ENR, 22,
1334 		CLK_SET_RATE_PARENT
1335 	},
1336 	{
1337 		CLK_SAI2, "sai1-b", sai_parents, ARRAY_SIZE(sai_parents),
1338 		STM32F4_RCC_DCKCFGR, 22, 3,
1339 		STM32F4_RCC_APB2ENR, 22,
1340 		CLK_SET_RATE_PARENT
1341 	},
1342 };
1343 
1344 static const struct stm32_aux_clk stm32f469_aux_clk[] = {
1345 	{
1346 		CLK_LCD, "lcd-tft", lcd_parent, ARRAY_SIZE(lcd_parent),
1347 		NO_MUX, 0, 0,
1348 		STM32F4_RCC_APB2ENR, 26,
1349 		CLK_SET_RATE_PARENT
1350 	},
1351 	{
1352 		CLK_I2S, "i2s", i2s_parents, ARRAY_SIZE(i2s_parents),
1353 		STM32F4_RCC_CFGR, 23, 1,
1354 		NO_GATE, 0,
1355 		CLK_SET_RATE_PARENT
1356 	},
1357 	{
1358 		CLK_SAI1, "sai1-a", sai_parents, ARRAY_SIZE(sai_parents),
1359 		STM32F4_RCC_DCKCFGR, 20, 3,
1360 		STM32F4_RCC_APB2ENR, 22,
1361 		CLK_SET_RATE_PARENT
1362 	},
1363 	{
1364 		CLK_SAI2, "sai1-b", sai_parents, ARRAY_SIZE(sai_parents),
1365 		STM32F4_RCC_DCKCFGR, 22, 3,
1366 		STM32F4_RCC_APB2ENR, 22,
1367 		CLK_SET_RATE_PARENT
1368 	},
1369 	{
1370 		NO_IDX, "pll48", pll48_parents, ARRAY_SIZE(pll48_parents),
1371 		STM32F4_RCC_DCKCFGR, 27, 1,
1372 		NO_GATE, 0,
1373 		0
1374 	},
1375 	{
1376 		NO_IDX, "sdmux", sdmux_parents, ARRAY_SIZE(sdmux_parents),
1377 		STM32F4_RCC_DCKCFGR, 28, 1,
1378 		NO_GATE, 0,
1379 		0
1380 	},
1381 	{
1382 		CLK_F469_DSI, "dsi", dsi_parent, ARRAY_SIZE(dsi_parent),
1383 		STM32F4_RCC_DCKCFGR, 29, 1,
1384 		STM32F4_RCC_APB2ENR, 27,
1385 		CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT
1386 	},
1387 };
1388 
1389 static const struct stm32_aux_clk stm32f746_aux_clk[] = {
1390 	{
1391 		CLK_LCD, "lcd-tft", lcd_parent, ARRAY_SIZE(lcd_parent),
1392 		NO_MUX, 0, 0,
1393 		STM32F4_RCC_APB2ENR, 26,
1394 		CLK_SET_RATE_PARENT
1395 	},
1396 	{
1397 		CLK_I2S, "i2s", i2s_parents, ARRAY_SIZE(i2s_parents),
1398 		STM32F4_RCC_CFGR, 23, 1,
1399 		NO_GATE, 0,
1400 		CLK_SET_RATE_PARENT
1401 	},
1402 	{
1403 		CLK_SAI1, "sai1_clk", sai_parents, ARRAY_SIZE(sai_parents),
1404 		STM32F4_RCC_DCKCFGR, 20, 3,
1405 		STM32F4_RCC_APB2ENR, 22,
1406 		CLK_SET_RATE_PARENT
1407 	},
1408 	{
1409 		CLK_SAI2, "sai2_clk", sai_parents, ARRAY_SIZE(sai_parents),
1410 		STM32F4_RCC_DCKCFGR, 22, 3,
1411 		STM32F4_RCC_APB2ENR, 23,
1412 		CLK_SET_RATE_PARENT
1413 	},
1414 	{
1415 		NO_IDX, "pll48", pll48_parents, ARRAY_SIZE(pll48_parents),
1416 		STM32F7_RCC_DCKCFGR2, 27, 1,
1417 		NO_GATE, 0,
1418 		0
1419 	},
1420 	{
1421 		NO_IDX, "sdmux", sdmux_parents, ARRAY_SIZE(sdmux_parents),
1422 		STM32F7_RCC_DCKCFGR2, 28, 1,
1423 		NO_GATE, 0,
1424 		0
1425 	},
1426 	{
1427 		CLK_HDMI_CEC, "hdmi-cec",
1428 		hdmi_parents, ARRAY_SIZE(hdmi_parents),
1429 		STM32F7_RCC_DCKCFGR2, 26, 1,
1430 		NO_GATE, 0,
1431 		0
1432 	},
1433 	{
1434 		CLK_SPDIF, "spdif-rx",
1435 		spdif_parent, ARRAY_SIZE(spdif_parent),
1436 		STM32F7_RCC_DCKCFGR2, 22, 3,
1437 		STM32F4_RCC_APB2ENR, 23,
1438 		CLK_SET_RATE_PARENT
1439 	},
1440 	{
1441 		CLK_USART1, "usart1",
1442 		uart_parents1, ARRAY_SIZE(uart_parents1),
1443 		STM32F7_RCC_DCKCFGR2, 0, 3,
1444 		STM32F4_RCC_APB2ENR, 4,
1445 		CLK_SET_RATE_PARENT,
1446 	},
1447 	{
1448 		CLK_USART2, "usart2",
1449 		uart_parents2, ARRAY_SIZE(uart_parents1),
1450 		STM32F7_RCC_DCKCFGR2, 2, 3,
1451 		STM32F4_RCC_APB1ENR, 17,
1452 		CLK_SET_RATE_PARENT,
1453 	},
1454 	{
1455 		CLK_USART3, "usart3",
1456 		uart_parents2, ARRAY_SIZE(uart_parents1),
1457 		STM32F7_RCC_DCKCFGR2, 4, 3,
1458 		STM32F4_RCC_APB1ENR, 18,
1459 		CLK_SET_RATE_PARENT,
1460 	},
1461 	{
1462 		CLK_UART4, "uart4",
1463 		uart_parents2, ARRAY_SIZE(uart_parents1),
1464 		STM32F7_RCC_DCKCFGR2, 6, 3,
1465 		STM32F4_RCC_APB1ENR, 19,
1466 		CLK_SET_RATE_PARENT,
1467 	},
1468 	{
1469 		CLK_UART5, "uart5",
1470 		uart_parents2, ARRAY_SIZE(uart_parents1),
1471 		STM32F7_RCC_DCKCFGR2, 8, 3,
1472 		STM32F4_RCC_APB1ENR, 20,
1473 		CLK_SET_RATE_PARENT,
1474 	},
1475 	{
1476 		CLK_USART6, "usart6",
1477 		uart_parents1, ARRAY_SIZE(uart_parents1),
1478 		STM32F7_RCC_DCKCFGR2, 10, 3,
1479 		STM32F4_RCC_APB2ENR, 5,
1480 		CLK_SET_RATE_PARENT,
1481 	},
1482 
1483 	{
1484 		CLK_UART7, "uart7",
1485 		uart_parents2, ARRAY_SIZE(uart_parents1),
1486 		STM32F7_RCC_DCKCFGR2, 12, 3,
1487 		STM32F4_RCC_APB1ENR, 30,
1488 		CLK_SET_RATE_PARENT,
1489 	},
1490 	{
1491 		CLK_UART8, "uart8",
1492 		uart_parents2, ARRAY_SIZE(uart_parents1),
1493 		STM32F7_RCC_DCKCFGR2, 14, 3,
1494 		STM32F4_RCC_APB1ENR, 31,
1495 		CLK_SET_RATE_PARENT,
1496 	},
1497 	{
1498 		CLK_I2C1, "i2c1",
1499 		i2c_parents, ARRAY_SIZE(i2c_parents),
1500 		STM32F7_RCC_DCKCFGR2, 16, 3,
1501 		STM32F4_RCC_APB1ENR, 21,
1502 		CLK_SET_RATE_PARENT,
1503 	},
1504 	{
1505 		CLK_I2C2, "i2c2",
1506 		i2c_parents, ARRAY_SIZE(i2c_parents),
1507 		STM32F7_RCC_DCKCFGR2, 18, 3,
1508 		STM32F4_RCC_APB1ENR, 22,
1509 		CLK_SET_RATE_PARENT,
1510 	},
1511 	{
1512 		CLK_I2C3, "i2c3",
1513 		i2c_parents, ARRAY_SIZE(i2c_parents),
1514 		STM32F7_RCC_DCKCFGR2, 20, 3,
1515 		STM32F4_RCC_APB1ENR, 23,
1516 		CLK_SET_RATE_PARENT,
1517 	},
1518 	{
1519 		CLK_I2C4, "i2c4",
1520 		i2c_parents, ARRAY_SIZE(i2c_parents),
1521 		STM32F7_RCC_DCKCFGR2, 22, 3,
1522 		STM32F4_RCC_APB1ENR, 24,
1523 		CLK_SET_RATE_PARENT,
1524 	},
1525 
1526 	{
1527 		CLK_LPTIMER, "lptim1",
1528 		lptim_parent, ARRAY_SIZE(lptim_parent),
1529 		STM32F7_RCC_DCKCFGR2, 24, 3,
1530 		STM32F4_RCC_APB1ENR, 9,
1531 		CLK_SET_RATE_PARENT
1532 	},
1533 };
1534 
1535 static const struct stm32_aux_clk stm32f769_aux_clk[] = {
1536 	{
1537 		CLK_LCD, "lcd-tft", lcd_parent, ARRAY_SIZE(lcd_parent),
1538 		NO_MUX, 0, 0,
1539 		STM32F4_RCC_APB2ENR, 26,
1540 		CLK_SET_RATE_PARENT
1541 	},
1542 	{
1543 		CLK_I2S, "i2s", i2s_parents, ARRAY_SIZE(i2s_parents),
1544 		STM32F4_RCC_CFGR, 23, 1,
1545 		NO_GATE, 0,
1546 		CLK_SET_RATE_PARENT
1547 	},
1548 	{
1549 		CLK_SAI1, "sai1_clk", sai_parents, ARRAY_SIZE(sai_parents),
1550 		STM32F4_RCC_DCKCFGR, 20, 3,
1551 		STM32F4_RCC_APB2ENR, 22,
1552 		CLK_SET_RATE_PARENT
1553 	},
1554 	{
1555 		CLK_SAI2, "sai2_clk", sai_parents, ARRAY_SIZE(sai_parents),
1556 		STM32F4_RCC_DCKCFGR, 22, 3,
1557 		STM32F4_RCC_APB2ENR, 23,
1558 		CLK_SET_RATE_PARENT
1559 	},
1560 	{
1561 		NO_IDX, "pll48", pll48_parents, ARRAY_SIZE(pll48_parents),
1562 		STM32F7_RCC_DCKCFGR2, 27, 1,
1563 		NO_GATE, 0,
1564 		0
1565 	},
1566 	{
1567 		NO_IDX, "sdmux1", sdmux_parents, ARRAY_SIZE(sdmux_parents),
1568 		STM32F7_RCC_DCKCFGR2, 28, 1,
1569 		NO_GATE, 0,
1570 		0
1571 	},
1572 	{
1573 		NO_IDX, "sdmux2", sdmux_parents, ARRAY_SIZE(sdmux_parents),
1574 		STM32F7_RCC_DCKCFGR2, 29, 1,
1575 		NO_GATE, 0,
1576 		0
1577 	},
1578 	{
1579 		CLK_HDMI_CEC, "hdmi-cec",
1580 		hdmi_parents, ARRAY_SIZE(hdmi_parents),
1581 		STM32F7_RCC_DCKCFGR2, 26, 1,
1582 		NO_GATE, 0,
1583 		0
1584 	},
1585 	{
1586 		CLK_SPDIF, "spdif-rx",
1587 		spdif_parent, ARRAY_SIZE(spdif_parent),
1588 		STM32F7_RCC_DCKCFGR2, 22, 3,
1589 		STM32F4_RCC_APB2ENR, 23,
1590 		CLK_SET_RATE_PARENT
1591 	},
1592 	{
1593 		CLK_USART1, "usart1",
1594 		uart_parents1, ARRAY_SIZE(uart_parents1),
1595 		STM32F7_RCC_DCKCFGR2, 0, 3,
1596 		STM32F4_RCC_APB2ENR, 4,
1597 		CLK_SET_RATE_PARENT,
1598 	},
1599 	{
1600 		CLK_USART2, "usart2",
1601 		uart_parents2, ARRAY_SIZE(uart_parents1),
1602 		STM32F7_RCC_DCKCFGR2, 2, 3,
1603 		STM32F4_RCC_APB1ENR, 17,
1604 		CLK_SET_RATE_PARENT,
1605 	},
1606 	{
1607 		CLK_USART3, "usart3",
1608 		uart_parents2, ARRAY_SIZE(uart_parents1),
1609 		STM32F7_RCC_DCKCFGR2, 4, 3,
1610 		STM32F4_RCC_APB1ENR, 18,
1611 		CLK_SET_RATE_PARENT,
1612 	},
1613 	{
1614 		CLK_UART4, "uart4",
1615 		uart_parents2, ARRAY_SIZE(uart_parents1),
1616 		STM32F7_RCC_DCKCFGR2, 6, 3,
1617 		STM32F4_RCC_APB1ENR, 19,
1618 		CLK_SET_RATE_PARENT,
1619 	},
1620 	{
1621 		CLK_UART5, "uart5",
1622 		uart_parents2, ARRAY_SIZE(uart_parents1),
1623 		STM32F7_RCC_DCKCFGR2, 8, 3,
1624 		STM32F4_RCC_APB1ENR, 20,
1625 		CLK_SET_RATE_PARENT,
1626 	},
1627 	{
1628 		CLK_USART6, "usart6",
1629 		uart_parents1, ARRAY_SIZE(uart_parents1),
1630 		STM32F7_RCC_DCKCFGR2, 10, 3,
1631 		STM32F4_RCC_APB2ENR, 5,
1632 		CLK_SET_RATE_PARENT,
1633 	},
1634 	{
1635 		CLK_UART7, "uart7",
1636 		uart_parents2, ARRAY_SIZE(uart_parents1),
1637 		STM32F7_RCC_DCKCFGR2, 12, 3,
1638 		STM32F4_RCC_APB1ENR, 30,
1639 		CLK_SET_RATE_PARENT,
1640 	},
1641 	{
1642 		CLK_UART8, "uart8",
1643 		uart_parents2, ARRAY_SIZE(uart_parents1),
1644 		STM32F7_RCC_DCKCFGR2, 14, 3,
1645 		STM32F4_RCC_APB1ENR, 31,
1646 		CLK_SET_RATE_PARENT,
1647 	},
1648 	{
1649 		CLK_I2C1, "i2c1",
1650 		i2c_parents, ARRAY_SIZE(i2c_parents),
1651 		STM32F7_RCC_DCKCFGR2, 16, 3,
1652 		STM32F4_RCC_APB1ENR, 21,
1653 		CLK_SET_RATE_PARENT,
1654 	},
1655 	{
1656 		CLK_I2C2, "i2c2",
1657 		i2c_parents, ARRAY_SIZE(i2c_parents),
1658 		STM32F7_RCC_DCKCFGR2, 18, 3,
1659 		STM32F4_RCC_APB1ENR, 22,
1660 		CLK_SET_RATE_PARENT,
1661 	},
1662 	{
1663 		CLK_I2C3, "i2c3",
1664 		i2c_parents, ARRAY_SIZE(i2c_parents),
1665 		STM32F7_RCC_DCKCFGR2, 20, 3,
1666 		STM32F4_RCC_APB1ENR, 23,
1667 		CLK_SET_RATE_PARENT,
1668 	},
1669 	{
1670 		CLK_I2C4, "i2c4",
1671 		i2c_parents, ARRAY_SIZE(i2c_parents),
1672 		STM32F7_RCC_DCKCFGR2, 22, 3,
1673 		STM32F4_RCC_APB1ENR, 24,
1674 		CLK_SET_RATE_PARENT,
1675 	},
1676 	{
1677 		CLK_LPTIMER, "lptim1",
1678 		lptim_parent, ARRAY_SIZE(lptim_parent),
1679 		STM32F7_RCC_DCKCFGR2, 24, 3,
1680 		STM32F4_RCC_APB1ENR, 9,
1681 		CLK_SET_RATE_PARENT
1682 	},
1683 	{
1684 		CLK_F769_DSI, "dsi",
1685 		dsi_parent, ARRAY_SIZE(dsi_parent),
1686 		STM32F7_RCC_DCKCFGR2, 0, 1,
1687 		STM32F4_RCC_APB2ENR, 27,
1688 		CLK_SET_RATE_PARENT
1689 	},
1690 	{
1691 		CLK_DFSDM1, "dfsdm1",
1692 		dfsdm1_src, ARRAY_SIZE(dfsdm1_src),
1693 		STM32F4_RCC_DCKCFGR, 25, 1,
1694 		STM32F4_RCC_APB2ENR, 29,
1695 		CLK_SET_RATE_PARENT
1696 	},
1697 	{
1698 		CLK_ADFSDM1, "adfsdm1",
1699 		adsfdm1_parent, ARRAY_SIZE(adsfdm1_parent),
1700 		STM32F4_RCC_DCKCFGR, 26, 1,
1701 		STM32F4_RCC_APB2ENR, 29,
1702 		CLK_SET_RATE_PARENT
1703 	},
1704 };
1705 
1706 static const struct stm32f4_clk_data stm32f429_clk_data = {
1707 	.end_primary	= END_PRIMARY_CLK,
1708 	.gates_data	= stm32f429_gates,
1709 	.gates_map	= stm32f42xx_gate_map,
1710 	.gates_num	= ARRAY_SIZE(stm32f429_gates),
1711 	.pll_data	= stm32f429_pll,
1712 	.aux_clk	= stm32f429_aux_clk,
1713 	.aux_clk_num	= ARRAY_SIZE(stm32f429_aux_clk),
1714 };
1715 
1716 static const struct stm32f4_clk_data stm32f469_clk_data = {
1717 	.end_primary	= END_PRIMARY_CLK,
1718 	.gates_data	= stm32f469_gates,
1719 	.gates_map	= stm32f46xx_gate_map,
1720 	.gates_num	= ARRAY_SIZE(stm32f469_gates),
1721 	.pll_data	= stm32f469_pll,
1722 	.aux_clk	= stm32f469_aux_clk,
1723 	.aux_clk_num	= ARRAY_SIZE(stm32f469_aux_clk),
1724 };
1725 
1726 static const struct stm32f4_clk_data stm32f746_clk_data = {
1727 	.end_primary	= END_PRIMARY_CLK_F7,
1728 	.gates_data	= stm32f746_gates,
1729 	.gates_map	= stm32f746_gate_map,
1730 	.gates_num	= ARRAY_SIZE(stm32f746_gates),
1731 	.pll_data	= stm32f469_pll,
1732 	.aux_clk	= stm32f746_aux_clk,
1733 	.aux_clk_num	= ARRAY_SIZE(stm32f746_aux_clk),
1734 };
1735 
1736 static const struct stm32f4_clk_data stm32f769_clk_data = {
1737 	.end_primary	= END_PRIMARY_CLK_F7,
1738 	.gates_data	= stm32f769_gates,
1739 	.gates_map	= stm32f769_gate_map,
1740 	.gates_num	= ARRAY_SIZE(stm32f769_gates),
1741 	.pll_data	= stm32f469_pll,
1742 	.aux_clk	= stm32f769_aux_clk,
1743 	.aux_clk_num	= ARRAY_SIZE(stm32f769_aux_clk),
1744 };
1745 
1746 static const struct of_device_id stm32f4_of_match[] = {
1747 	{
1748 		.compatible = "st,stm32f42xx-rcc",
1749 		.data = &stm32f429_clk_data
1750 	},
1751 	{
1752 		.compatible = "st,stm32f469-rcc",
1753 		.data = &stm32f469_clk_data
1754 	},
1755 	{
1756 		.compatible = "st,stm32f746-rcc",
1757 		.data = &stm32f746_clk_data
1758 	},
1759 	{
1760 		.compatible = "st,stm32f769-rcc",
1761 		.data = &stm32f769_clk_data
1762 	},
1763 	{}
1764 };
1765 
stm32_register_aux_clk(const char * name,const char * const * parent_names,int num_parents,int offset_mux,u8 shift,u8 mask,int offset_gate,u8 bit_idx,unsigned long flags,spinlock_t * lock)1766 static struct clk_hw *stm32_register_aux_clk(const char *name,
1767 		const char * const *parent_names, int num_parents,
1768 		int offset_mux, u8 shift, u8 mask,
1769 		int offset_gate, u8 bit_idx,
1770 		unsigned long flags, spinlock_t *lock)
1771 {
1772 	struct clk_hw *hw;
1773 	struct clk_gate *gate = NULL;
1774 	struct clk_mux *mux = NULL;
1775 	struct clk_hw *mux_hw = NULL, *gate_hw = NULL;
1776 	const struct clk_ops *mux_ops = NULL, *gate_ops = NULL;
1777 
1778 	if (offset_gate != NO_GATE) {
1779 		gate = kzalloc(sizeof(*gate), GFP_KERNEL);
1780 		if (!gate) {
1781 			hw = ERR_PTR(-EINVAL);
1782 			goto fail;
1783 		}
1784 
1785 		gate->reg = base + offset_gate;
1786 		gate->bit_idx = bit_idx;
1787 		gate->flags = 0;
1788 		gate->lock = lock;
1789 		gate_hw = &gate->hw;
1790 		gate_ops = &clk_gate_ops;
1791 	}
1792 
1793 	if (offset_mux != NO_MUX) {
1794 		mux = kzalloc(sizeof(*mux), GFP_KERNEL);
1795 		if (!mux) {
1796 			hw = ERR_PTR(-EINVAL);
1797 			goto fail;
1798 		}
1799 
1800 		mux->reg = base + offset_mux;
1801 		mux->shift = shift;
1802 		mux->mask = mask;
1803 		mux->flags = 0;
1804 		mux_hw = &mux->hw;
1805 		mux_ops = &clk_mux_ops;
1806 	}
1807 
1808 	if (mux_hw == NULL && gate_hw == NULL) {
1809 		hw = ERR_PTR(-EINVAL);
1810 		goto fail;
1811 	}
1812 
1813 	hw = clk_hw_register_composite(NULL, name, parent_names, num_parents,
1814 			mux_hw, mux_ops,
1815 			NULL, NULL,
1816 			gate_hw, gate_ops,
1817 			flags);
1818 
1819 fail:
1820 	if (IS_ERR(hw)) {
1821 		kfree(gate);
1822 		kfree(mux);
1823 	}
1824 
1825 	return hw;
1826 }
1827 
stm32f4_rcc_init(struct device_node * np)1828 static void __init stm32f4_rcc_init(struct device_node *np)
1829 {
1830 	const char *hse_clk, *i2s_in_clk;
1831 	int n;
1832 	const struct of_device_id *match;
1833 	const struct stm32f4_clk_data *data;
1834 	unsigned long pllm;
1835 	struct clk_hw *pll_src_hw, *pll_vco_hw;
1836 	struct stm32f4_pll_ssc ssc_conf;
1837 
1838 	base = of_iomap(np, 0);
1839 	if (!base) {
1840 		pr_err("%pOFn: unable to map resource\n", np);
1841 		return;
1842 	}
1843 
1844 	pdrm = syscon_regmap_lookup_by_phandle(np, "st,syscfg");
1845 	if (IS_ERR(pdrm)) {
1846 		pdrm = NULL;
1847 		pr_warn("%s: Unable to get syscfg\n", __func__);
1848 	}
1849 
1850 	match = of_match_node(stm32f4_of_match, np);
1851 	if (WARN_ON(!match))
1852 		return;
1853 
1854 	data = match->data;
1855 
1856 	stm32fx_end_primary_clk = data->end_primary;
1857 
1858 	clks = kmalloc_array(data->gates_num + stm32fx_end_primary_clk,
1859 			sizeof(*clks), GFP_KERNEL);
1860 	if (!clks)
1861 		goto fail;
1862 
1863 	stm32f4_gate_map = data->gates_map;
1864 
1865 	hse_clk = of_clk_get_parent_name(np, 0);
1866 	dsi_parent[0] = hse_clk;
1867 	pllsrc_parent[1] = hse_clk;
1868 
1869 	i2s_in_clk = of_clk_get_parent_name(np, 1);
1870 
1871 	i2s_parents[1] = i2s_in_clk;
1872 	sai_parents[2] = i2s_in_clk;
1873 
1874 	if (of_device_is_compatible(np, "st,stm32f769-rcc")) {
1875 		clk_hw_register_gate(NULL, "dfsdm1_apb", "apb2_div", 0,
1876 				     base + STM32F4_RCC_APB2ENR, 29,
1877 				     CLK_IGNORE_UNUSED, &stm32f4_clk_lock);
1878 		dsi_parent[0] = pll_src;
1879 		sai_parents[3] = pll_src;
1880 	}
1881 
1882 	clks[CLK_HSI] = clk_hw_register_fixed_rate_with_accuracy(NULL, "hsi",
1883 			NULL, 0, 16000000, 160000);
1884 
1885 	pll_src_hw = clk_hw_register_mux(NULL, pll_src, pllsrc_parent,
1886 					 ARRAY_SIZE(pllsrc_parent), 0,
1887 					 base + STM32F4_RCC_PLLCFGR, 22, 1, 0,
1888 					 &stm32f4_clk_lock);
1889 
1890 	pllm = readl(base + STM32F4_RCC_PLLCFGR) & 0x3f;
1891 
1892 	clk_hw_register_fixed_factor(NULL, "vco_in", pll_src,
1893 				     0, 1, pllm);
1894 
1895 	pll_vco_hw = stm32f4_rcc_register_pll("vco_in", &data->pll_data[0],
1896 					      &stm32f4_clk_lock);
1897 
1898 	clks[PLL_VCO_I2S] = stm32f4_rcc_register_pll("vco_in",
1899 			&data->pll_data[1], &stm32f4_clk_lock);
1900 
1901 	clks[PLL_VCO_SAI] = stm32f4_rcc_register_pll("vco_in",
1902 			&data->pll_data[2], &stm32f4_clk_lock);
1903 
1904 	for (n = 0; n < MAX_POST_DIV; n++) {
1905 		const struct stm32f4_pll_post_div_data *post_div;
1906 		struct clk_hw *hw;
1907 
1908 		post_div = &post_div_data[n];
1909 
1910 		hw = clk_register_pll_div(post_div->name,
1911 				post_div->parent,
1912 				post_div->flag,
1913 				base + post_div->offset,
1914 				post_div->shift,
1915 				post_div->width,
1916 				post_div->flag_div,
1917 				post_div->div_table,
1918 				clks[post_div->pll_idx],
1919 				&stm32f4_clk_lock);
1920 
1921 		if (post_div->idx != NO_IDX)
1922 			clks[post_div->idx] = hw;
1923 	}
1924 
1925 	sys_parents[1] = hse_clk;
1926 
1927 	clks[CLK_SYSCLK] = clk_hw_register_mux_table(
1928 	    NULL, "sys", sys_parents, ARRAY_SIZE(sys_parents), 0,
1929 	    base + STM32F4_RCC_CFGR, 0, 3, 0, NULL, &stm32f4_clk_lock);
1930 
1931 	clk_register_divider_table(NULL, "ahb_div", "sys",
1932 				   CLK_SET_RATE_PARENT, base + STM32F4_RCC_CFGR,
1933 				   4, 4, 0, ahb_div_table, &stm32f4_clk_lock);
1934 
1935 	clk_register_divider_table(NULL, "apb1_div", "ahb_div",
1936 				   CLK_SET_RATE_PARENT, base + STM32F4_RCC_CFGR,
1937 				   10, 3, 0, apb_div_table, &stm32f4_clk_lock);
1938 	clk_register_apb_mul(NULL, "apb1_mul", "apb1_div",
1939 			     CLK_SET_RATE_PARENT, 12);
1940 
1941 	clk_register_divider_table(NULL, "apb2_div", "ahb_div",
1942 				   CLK_SET_RATE_PARENT, base + STM32F4_RCC_CFGR,
1943 				   13, 3, 0, apb_div_table, &stm32f4_clk_lock);
1944 	clk_register_apb_mul(NULL, "apb2_mul", "apb2_div",
1945 			     CLK_SET_RATE_PARENT, 15);
1946 
1947 	clks[SYSTICK] = clk_hw_register_fixed_factor(NULL, "systick", "ahb_div",
1948 						  0, 1, 8);
1949 	clks[FCLK] = clk_hw_register_fixed_factor(NULL, "fclk", "ahb_div",
1950 					       0, 1, 1);
1951 
1952 	for (n = 0; n < data->gates_num; n++) {
1953 		const struct stm32f4_gate_data *gd;
1954 		unsigned int secondary;
1955 		int idx;
1956 
1957 		gd = &data->gates_data[n];
1958 		secondary = 8 * (gd->offset - STM32F4_RCC_AHB1ENR) +
1959 			gd->bit_idx;
1960 		idx = stm32f4_rcc_lookup_clk_idx(0, secondary);
1961 
1962 		if (idx < 0)
1963 			goto fail;
1964 
1965 		clks[idx] = clk_hw_register_gate(
1966 		    NULL, gd->name, gd->parent_name, gd->flags,
1967 		    base + gd->offset, gd->bit_idx, 0, &stm32f4_clk_lock);
1968 
1969 		if (IS_ERR(clks[idx])) {
1970 			pr_err("%pOF: Unable to register leaf clock %s\n",
1971 			       np, gd->name);
1972 			goto fail;
1973 		}
1974 	}
1975 
1976 	clks[CLK_LSI] = clk_register_rgate(NULL, "lsi", "clk-lsi", 0,
1977 			base + STM32F4_RCC_CSR, 0, 1, 0, &stm32f4_clk_lock);
1978 
1979 	if (IS_ERR(clks[CLK_LSI])) {
1980 		pr_err("Unable to register lsi clock\n");
1981 		goto fail;
1982 	}
1983 
1984 	clks[CLK_LSE] = clk_register_rgate(NULL, "lse", "clk-lse", 0,
1985 			base + STM32F4_RCC_BDCR, 0, 1, 0, &stm32f4_clk_lock);
1986 
1987 	if (IS_ERR(clks[CLK_LSE])) {
1988 		pr_err("Unable to register lse clock\n");
1989 		goto fail;
1990 	}
1991 
1992 	clks[CLK_HSE_RTC] = clk_hw_register_divider(NULL, "hse-rtc", "clk-hse",
1993 			0, base + STM32F4_RCC_CFGR, 16, 5, 0,
1994 			&stm32f4_clk_lock);
1995 
1996 	if (IS_ERR(clks[CLK_HSE_RTC])) {
1997 		pr_err("Unable to register hse-rtc clock\n");
1998 		goto fail;
1999 	}
2000 
2001 	clks[CLK_RTC] = stm32_register_cclk(NULL, "rtc", rtc_parents, 4,
2002 			base + STM32F4_RCC_BDCR, 15, 8, 0, &stm32f4_clk_lock);
2003 
2004 	if (IS_ERR(clks[CLK_RTC])) {
2005 		pr_err("Unable to register rtc clock\n");
2006 		goto fail;
2007 	}
2008 
2009 	for (n = 0; n < data->aux_clk_num; n++) {
2010 		const struct stm32_aux_clk *aux_clk;
2011 		struct clk_hw *hw;
2012 
2013 		aux_clk = &data->aux_clk[n];
2014 
2015 		hw = stm32_register_aux_clk(aux_clk->name,
2016 				aux_clk->parent_names, aux_clk->num_parents,
2017 				aux_clk->offset_mux, aux_clk->shift,
2018 				aux_clk->mask, aux_clk->offset_gate,
2019 				aux_clk->bit_idx, aux_clk->flags,
2020 				&stm32f4_clk_lock);
2021 
2022 		if (IS_ERR(hw)) {
2023 			pr_warn("Unable to register %s clk\n", aux_clk->name);
2024 			continue;
2025 		}
2026 
2027 		if (aux_clk->idx != NO_IDX)
2028 			clks[aux_clk->idx] = hw;
2029 	}
2030 
2031 	if (of_device_is_compatible(np, "st,stm32f746-rcc")) {
2032 
2033 		clk_hw_register_fixed_factor(NULL, "hsi_div488", "hsi", 0,
2034 				1, 488);
2035 
2036 		clks[CLK_PLL_SRC] = pll_src_hw;
2037 	}
2038 
2039 	of_clk_add_hw_provider(np, stm32f4_rcc_lookup_clk, NULL);
2040 
2041 	if (!stm32f4_pll_ssc_parse_dt(np, &ssc_conf))
2042 		stm32f4_pll_init_ssc(pll_vco_hw, &ssc_conf);
2043 
2044 	return;
2045 fail:
2046 	kfree(clks);
2047 	iounmap(base);
2048 }
2049 CLK_OF_DECLARE_DRIVER(stm32f42xx_rcc, "st,stm32f42xx-rcc", stm32f4_rcc_init);
2050 CLK_OF_DECLARE_DRIVER(stm32f46xx_rcc, "st,stm32f469-rcc", stm32f4_rcc_init);
2051 CLK_OF_DECLARE_DRIVER(stm32f746_rcc, "st,stm32f746-rcc", stm32f4_rcc_init);
2052 CLK_OF_DECLARE_DRIVER(stm32f769_rcc, "st,stm32f769-rcc", stm32f4_rcc_init);
2053