xref: /linux/drivers/clk/clk-qoriq.c (revision fd7d598270724cc787982ea48bbe17ad383a8b7f)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright 2013 Freescale Semiconductor, Inc.
4  * Copyright 2021 NXP
5  *
6  * clock driver for Freescale QorIQ SoCs.
7  */
8 
9 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
10 
11 #include <dt-bindings/clock/fsl,qoriq-clockgen.h>
12 #include <linux/clk.h>
13 #include <linux/clk-provider.h>
14 #include <linux/clkdev.h>
15 #include <linux/fsl/guts.h>
16 #include <linux/io.h>
17 #include <linux/kernel.h>
18 #include <linux/module.h>
19 #include <linux/of_address.h>
20 #include <linux/of.h>
21 #include <linux/platform_device.h>
22 #include <linux/slab.h>
23 
24 #define PLL_DIV1	0
25 #define PLL_DIV2	1
26 #define PLL_DIV3	2
27 #define PLL_DIV4	3
28 
29 #define PLATFORM_PLL	0
30 #define CGA_PLL1	1
31 #define CGA_PLL2	2
32 #define CGA_PLL3	3
33 #define CGA_PLL4	4	/* only on clockgen-1.0, which lacks CGB */
34 #define CGB_PLL1	4
35 #define CGB_PLL2	5
36 #define MAX_PLL_DIV	32
37 
38 struct clockgen_pll_div {
39 	struct clk *clk;
40 	char name[32];
41 };
42 
43 struct clockgen_pll {
44 	struct clockgen_pll_div div[MAX_PLL_DIV];
45 };
46 
47 #define CLKSEL_VALID	1
48 #define CLKSEL_80PCT	2	/* Only allowed if PLL <= 80% of max cpu freq */
49 
50 struct clockgen_sourceinfo {
51 	u32 flags;	/* CLKSEL_xxx */
52 	int pll;	/* CGx_PLLn */
53 	int div;	/* PLL_DIVn */
54 };
55 
56 #define NUM_MUX_PARENTS	16
57 
58 struct clockgen_muxinfo {
59 	struct clockgen_sourceinfo clksel[NUM_MUX_PARENTS];
60 };
61 
62 #define NUM_HWACCEL	5
63 #define NUM_CMUX	8
64 
65 struct clockgen;
66 
67 /*
68  * cmux freq must be >= platform pll.
69  * If not set, cmux freq must be >= platform pll/2
70  */
71 #define CG_CMUX_GE_PLAT		1
72 
73 #define CG_PLL_8BIT		2	/* PLLCnGSR[CFG] is 8 bits, not 6 */
74 #define CG_VER3			4	/* version 3 cg: reg layout different */
75 #define CG_LITTLE_ENDIAN	8
76 
77 struct clockgen_chipinfo {
78 	const char *compat, *guts_compat;
79 	const struct clockgen_muxinfo *cmux_groups[2];
80 	const struct clockgen_muxinfo *hwaccel[NUM_HWACCEL];
81 	void (*init_periph)(struct clockgen *cg);
82 	int cmux_to_group[NUM_CMUX + 1]; /* array should be -1 terminated */
83 	u32 pll_mask;	/* 1 << n bit set if PLL n is valid */
84 	u32 flags;	/* CG_xxx */
85 };
86 
87 struct clockgen {
88 	struct device_node *node;
89 	void __iomem *regs;
90 	struct clockgen_chipinfo info; /* mutable copy */
91 	struct clk *sysclk, *coreclk;
92 	struct clockgen_pll pll[6];
93 	struct clk *cmux[NUM_CMUX];
94 	struct clk *hwaccel[NUM_HWACCEL];
95 	struct clk *fman[2];
96 	struct ccsr_guts __iomem *guts;
97 };
98 
99 static struct clockgen clockgen;
100 static bool add_cpufreq_dev __initdata;
101 
102 static void cg_out(struct clockgen *cg, u32 val, u32 __iomem *reg)
103 {
104 	if (cg->info.flags & CG_LITTLE_ENDIAN)
105 		iowrite32(val, reg);
106 	else
107 		iowrite32be(val, reg);
108 }
109 
110 static u32 cg_in(struct clockgen *cg, u32 __iomem *reg)
111 {
112 	u32 val;
113 
114 	if (cg->info.flags & CG_LITTLE_ENDIAN)
115 		val = ioread32(reg);
116 	else
117 		val = ioread32be(reg);
118 
119 	return val;
120 }
121 
122 static const struct clockgen_muxinfo p2041_cmux_grp1 = {
123 	{
124 		[0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
125 		[1] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
126 		[4] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
127 	}
128 };
129 
130 static const struct clockgen_muxinfo p2041_cmux_grp2 = {
131 	{
132 		[0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
133 		[4] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
134 		[5] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
135 	}
136 };
137 
138 static const struct clockgen_muxinfo p5020_cmux_grp1 = {
139 	{
140 		[0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
141 		[1] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
142 		[4] = { CLKSEL_VALID | CLKSEL_80PCT, CGA_PLL2, PLL_DIV1 },
143 	}
144 };
145 
146 static const struct clockgen_muxinfo p5020_cmux_grp2 = {
147 	{
148 		[0] = { CLKSEL_VALID | CLKSEL_80PCT, CGA_PLL1, PLL_DIV1 },
149 		[4] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
150 		[5] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
151 	}
152 };
153 
154 static const struct clockgen_muxinfo p5040_cmux_grp1 = {
155 	{
156 		[0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
157 		[1] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
158 		[4] = { CLKSEL_VALID | CLKSEL_80PCT, CGA_PLL2, PLL_DIV1 },
159 		[5] = { CLKSEL_VALID | CLKSEL_80PCT, CGA_PLL2, PLL_DIV2 },
160 	}
161 };
162 
163 static const struct clockgen_muxinfo p5040_cmux_grp2 = {
164 	{
165 		[0] = { CLKSEL_VALID | CLKSEL_80PCT, CGA_PLL1, PLL_DIV1 },
166 		[1] = { CLKSEL_VALID | CLKSEL_80PCT, CGA_PLL1, PLL_DIV2 },
167 		[4] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
168 		[5] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
169 	}
170 };
171 
172 static const struct clockgen_muxinfo p4080_cmux_grp1 = {
173 	{
174 		[0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
175 		[1] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
176 		[4] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
177 		[5] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
178 		[8] = { CLKSEL_VALID | CLKSEL_80PCT, CGA_PLL3, PLL_DIV1 },
179 	}
180 };
181 
182 static const struct clockgen_muxinfo p4080_cmux_grp2 = {
183 	{
184 		[0] = { CLKSEL_VALID | CLKSEL_80PCT, CGA_PLL1, PLL_DIV1 },
185 		[8] = { CLKSEL_VALID, CGA_PLL3, PLL_DIV1 },
186 		[9] = { CLKSEL_VALID, CGA_PLL3, PLL_DIV2 },
187 		[12] = { CLKSEL_VALID, CGA_PLL4, PLL_DIV1 },
188 		[13] = { CLKSEL_VALID, CGA_PLL4, PLL_DIV2 },
189 	}
190 };
191 
192 static const struct clockgen_muxinfo t1023_cmux = {
193 	{
194 		[0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
195 		[1] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
196 	}
197 };
198 
199 static const struct clockgen_muxinfo t1040_cmux = {
200 	{
201 		[0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
202 		[1] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
203 		[4] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
204 		[5] = { CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
205 	}
206 };
207 
208 
209 static const struct clockgen_muxinfo clockgen2_cmux_cga = {
210 	{
211 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
212 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
213 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV4 },
214 		{},
215 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
216 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
217 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV4 },
218 		{},
219 		{ CLKSEL_VALID, CGA_PLL3, PLL_DIV1 },
220 		{ CLKSEL_VALID, CGA_PLL3, PLL_DIV2 },
221 		{ CLKSEL_VALID, CGA_PLL3, PLL_DIV4 },
222 	},
223 };
224 
225 static const struct clockgen_muxinfo clockgen2_cmux_cga12 = {
226 	{
227 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
228 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
229 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV4 },
230 		{},
231 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
232 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
233 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV4 },
234 	},
235 };
236 
237 static const struct clockgen_muxinfo clockgen2_cmux_cgb = {
238 	{
239 		{ CLKSEL_VALID, CGB_PLL1, PLL_DIV1 },
240 		{ CLKSEL_VALID, CGB_PLL1, PLL_DIV2 },
241 		{ CLKSEL_VALID, CGB_PLL1, PLL_DIV4 },
242 		{},
243 		{ CLKSEL_VALID, CGB_PLL2, PLL_DIV1 },
244 		{ CLKSEL_VALID, CGB_PLL2, PLL_DIV2 },
245 		{ CLKSEL_VALID, CGB_PLL2, PLL_DIV4 },
246 	},
247 };
248 
249 static const struct clockgen_muxinfo ls1021a_cmux = {
250 	{
251 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
252 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
253 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV4 },
254 	}
255 };
256 
257 static const struct clockgen_muxinfo ls1028a_hwa1 = {
258 	{
259 		{ CLKSEL_VALID, PLATFORM_PLL, PLL_DIV1 },
260 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
261 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
262 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
263 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV4 },
264 		{},
265 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
266 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
267 	},
268 };
269 
270 static const struct clockgen_muxinfo ls1028a_hwa2 = {
271 	{
272 		{ CLKSEL_VALID, PLATFORM_PLL, PLL_DIV1 },
273 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
274 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
275 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
276 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV4 },
277 		{},
278 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
279 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
280 	},
281 };
282 
283 static const struct clockgen_muxinfo ls1028a_hwa3 = {
284 	{
285 		{ CLKSEL_VALID, PLATFORM_PLL, PLL_DIV1 },
286 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
287 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
288 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
289 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV4 },
290 		{},
291 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
292 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
293 	},
294 };
295 
296 static const struct clockgen_muxinfo ls1028a_hwa4 = {
297 	{
298 		{ CLKSEL_VALID, PLATFORM_PLL, PLL_DIV1 },
299 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
300 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
301 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
302 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV4 },
303 		{},
304 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
305 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
306 	},
307 };
308 
309 static const struct clockgen_muxinfo ls1043a_hwa1 = {
310 	{
311 		{},
312 		{},
313 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
314 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
315 		{},
316 		{},
317 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
318 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
319 	},
320 };
321 
322 static const struct clockgen_muxinfo ls1043a_hwa2 = {
323 	{
324 		{},
325 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
326 		{},
327 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
328 	},
329 };
330 
331 static const struct clockgen_muxinfo ls1046a_hwa1 = {
332 	{
333 		{},
334 		{},
335 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
336 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
337 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV4 },
338 		{ CLKSEL_VALID, PLATFORM_PLL, PLL_DIV1 },
339 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
340 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
341 	},
342 };
343 
344 static const struct clockgen_muxinfo ls1046a_hwa2 = {
345 	{
346 		{},
347 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
348 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
349 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
350 		{},
351 		{},
352 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
353 	},
354 };
355 
356 static const struct clockgen_muxinfo ls1088a_hwa1 = {
357 	{
358 		{},
359 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
360 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
361 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
362 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV4 },
363 		{},
364 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
365 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
366 	},
367 };
368 
369 static const struct clockgen_muxinfo ls1088a_hwa2 = {
370 	{
371 		{},
372 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
373 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
374 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
375 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV4 },
376 		{},
377 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
378 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
379 	},
380 };
381 
382 static const struct clockgen_muxinfo ls1012a_cmux = {
383 	{
384 		[0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
385 		{},
386 		[2] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
387 	}
388 };
389 
390 static const struct clockgen_muxinfo t1023_hwa1 = {
391 	{
392 		{},
393 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
394 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
395 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
396 	},
397 };
398 
399 static const struct clockgen_muxinfo t1023_hwa2 = {
400 	{
401 		[6] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
402 	},
403 };
404 
405 static const struct clockgen_muxinfo t2080_hwa1 = {
406 	{
407 		{},
408 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
409 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
410 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
411 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV4 },
412 		{ CLKSEL_VALID, PLATFORM_PLL, PLL_DIV1 },
413 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
414 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
415 	},
416 };
417 
418 static const struct clockgen_muxinfo t2080_hwa2 = {
419 	{
420 		{},
421 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV1 },
422 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
423 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
424 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV4 },
425 		{ CLKSEL_VALID, PLATFORM_PLL, PLL_DIV1 },
426 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
427 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
428 	},
429 };
430 
431 static const struct clockgen_muxinfo t4240_hwa1 = {
432 	{
433 		{ CLKSEL_VALID, PLATFORM_PLL, PLL_DIV2 },
434 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
435 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV2 },
436 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV3 },
437 		{ CLKSEL_VALID, CGA_PLL1, PLL_DIV4 },
438 		{},
439 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV2 },
440 		{ CLKSEL_VALID, CGA_PLL2, PLL_DIV3 },
441 	},
442 };
443 
444 static const struct clockgen_muxinfo t4240_hwa4 = {
445 	{
446 		[2] = { CLKSEL_VALID, CGB_PLL1, PLL_DIV2 },
447 		[3] = { CLKSEL_VALID, CGB_PLL1, PLL_DIV3 },
448 		[4] = { CLKSEL_VALID, CGB_PLL1, PLL_DIV4 },
449 		[5] = { CLKSEL_VALID, PLATFORM_PLL, PLL_DIV1 },
450 		[6] = { CLKSEL_VALID, CGB_PLL2, PLL_DIV2 },
451 	},
452 };
453 
454 static const struct clockgen_muxinfo t4240_hwa5 = {
455 	{
456 		[2] = { CLKSEL_VALID, CGB_PLL2, PLL_DIV2 },
457 		[3] = { CLKSEL_VALID, CGB_PLL2, PLL_DIV3 },
458 		[4] = { CLKSEL_VALID, CGB_PLL2, PLL_DIV4 },
459 		[5] = { CLKSEL_VALID, PLATFORM_PLL, PLL_DIV1 },
460 		[6] = { CLKSEL_VALID, CGB_PLL1, PLL_DIV2 },
461 		[7] = { CLKSEL_VALID, CGB_PLL1, PLL_DIV3 },
462 	},
463 };
464 
465 #define RCWSR7_FM1_CLK_SEL	0x40000000
466 #define RCWSR7_FM2_CLK_SEL	0x20000000
467 #define RCWSR7_HWA_ASYNC_DIV	0x04000000
468 
469 static void __init p2041_init_periph(struct clockgen *cg)
470 {
471 	u32 reg;
472 
473 	reg = ioread32be(&cg->guts->rcwsr[7]);
474 
475 	if (reg & RCWSR7_FM1_CLK_SEL)
476 		cg->fman[0] = cg->pll[CGA_PLL2].div[PLL_DIV2].clk;
477 	else
478 		cg->fman[0] = cg->pll[PLATFORM_PLL].div[PLL_DIV2].clk;
479 }
480 
481 static void __init p4080_init_periph(struct clockgen *cg)
482 {
483 	u32 reg;
484 
485 	reg = ioread32be(&cg->guts->rcwsr[7]);
486 
487 	if (reg & RCWSR7_FM1_CLK_SEL)
488 		cg->fman[0] = cg->pll[CGA_PLL3].div[PLL_DIV2].clk;
489 	else
490 		cg->fman[0] = cg->pll[PLATFORM_PLL].div[PLL_DIV2].clk;
491 
492 	if (reg & RCWSR7_FM2_CLK_SEL)
493 		cg->fman[1] = cg->pll[CGA_PLL3].div[PLL_DIV2].clk;
494 	else
495 		cg->fman[1] = cg->pll[PLATFORM_PLL].div[PLL_DIV2].clk;
496 }
497 
498 static void __init p5020_init_periph(struct clockgen *cg)
499 {
500 	u32 reg;
501 	int div = PLL_DIV2;
502 
503 	reg = ioread32be(&cg->guts->rcwsr[7]);
504 	if (reg & RCWSR7_HWA_ASYNC_DIV)
505 		div = PLL_DIV4;
506 
507 	if (reg & RCWSR7_FM1_CLK_SEL)
508 		cg->fman[0] = cg->pll[CGA_PLL2].div[div].clk;
509 	else
510 		cg->fman[0] = cg->pll[PLATFORM_PLL].div[PLL_DIV2].clk;
511 }
512 
513 static void __init p5040_init_periph(struct clockgen *cg)
514 {
515 	u32 reg;
516 	int div = PLL_DIV2;
517 
518 	reg = ioread32be(&cg->guts->rcwsr[7]);
519 	if (reg & RCWSR7_HWA_ASYNC_DIV)
520 		div = PLL_DIV4;
521 
522 	if (reg & RCWSR7_FM1_CLK_SEL)
523 		cg->fman[0] = cg->pll[CGA_PLL3].div[div].clk;
524 	else
525 		cg->fman[0] = cg->pll[PLATFORM_PLL].div[PLL_DIV2].clk;
526 
527 	if (reg & RCWSR7_FM2_CLK_SEL)
528 		cg->fman[1] = cg->pll[CGA_PLL3].div[div].clk;
529 	else
530 		cg->fman[1] = cg->pll[PLATFORM_PLL].div[PLL_DIV2].clk;
531 }
532 
533 static void __init t1023_init_periph(struct clockgen *cg)
534 {
535 	cg->fman[0] = cg->hwaccel[1];
536 }
537 
538 static void __init t1040_init_periph(struct clockgen *cg)
539 {
540 	cg->fman[0] = cg->pll[PLATFORM_PLL].div[PLL_DIV1].clk;
541 }
542 
543 static void __init t2080_init_periph(struct clockgen *cg)
544 {
545 	cg->fman[0] = cg->hwaccel[0];
546 }
547 
548 static void __init t4240_init_periph(struct clockgen *cg)
549 {
550 	cg->fman[0] = cg->hwaccel[3];
551 	cg->fman[1] = cg->hwaccel[4];
552 }
553 
554 static const struct clockgen_chipinfo chipinfo[] = {
555 	{
556 		.compat = "fsl,b4420-clockgen",
557 		.guts_compat = "fsl,b4860-device-config",
558 		.init_periph = t2080_init_periph,
559 		.cmux_groups = {
560 			&clockgen2_cmux_cga12, &clockgen2_cmux_cgb
561 		},
562 		.hwaccel = {
563 			&t2080_hwa1
564 		},
565 		.cmux_to_group = {
566 			0, 1, 1, 1, -1
567 		},
568 		.pll_mask = BIT(PLATFORM_PLL) |
569 			    BIT(CGA_PLL1) | BIT(CGA_PLL2) | BIT(CGA_PLL3) |
570 			    BIT(CGB_PLL1) | BIT(CGB_PLL2),
571 		.flags = CG_PLL_8BIT,
572 	},
573 	{
574 		.compat = "fsl,b4860-clockgen",
575 		.guts_compat = "fsl,b4860-device-config",
576 		.init_periph = t2080_init_periph,
577 		.cmux_groups = {
578 			&clockgen2_cmux_cga12, &clockgen2_cmux_cgb
579 		},
580 		.hwaccel = {
581 			&t2080_hwa1
582 		},
583 		.cmux_to_group = {
584 			0, 1, 1, 1, -1
585 		},
586 		.pll_mask = BIT(PLATFORM_PLL) |
587 			    BIT(CGA_PLL1) | BIT(CGA_PLL2) | BIT(CGA_PLL3) |
588 			    BIT(CGB_PLL1) | BIT(CGB_PLL2),
589 		.flags = CG_PLL_8BIT,
590 	},
591 	{
592 		.compat = "fsl,ls1021a-clockgen",
593 		.cmux_groups = {
594 			&ls1021a_cmux
595 		},
596 		.cmux_to_group = {
597 			0, -1
598 		},
599 		.pll_mask = BIT(PLATFORM_PLL) |
600 			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
601 	},
602 	{
603 		.compat = "fsl,ls1028a-clockgen",
604 		.cmux_groups = {
605 			&clockgen2_cmux_cga12
606 		},
607 		.hwaccel = {
608 			&ls1028a_hwa1, &ls1028a_hwa2,
609 			&ls1028a_hwa3, &ls1028a_hwa4
610 		},
611 		.cmux_to_group = {
612 			0, 0, 0, 0, -1
613 		},
614 		.pll_mask = BIT(PLATFORM_PLL) |
615 			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
616 		.flags = CG_VER3 | CG_LITTLE_ENDIAN,
617 	},
618 	{
619 		.compat = "fsl,ls1043a-clockgen",
620 		.init_periph = t2080_init_periph,
621 		.cmux_groups = {
622 			&t1040_cmux
623 		},
624 		.hwaccel = {
625 			&ls1043a_hwa1, &ls1043a_hwa2
626 		},
627 		.cmux_to_group = {
628 			0, -1
629 		},
630 		.pll_mask = BIT(PLATFORM_PLL) |
631 			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
632 		.flags = CG_PLL_8BIT,
633 	},
634 	{
635 		.compat = "fsl,ls1046a-clockgen",
636 		.init_periph = t2080_init_periph,
637 		.cmux_groups = {
638 			&t1040_cmux
639 		},
640 		.hwaccel = {
641 			&ls1046a_hwa1, &ls1046a_hwa2
642 		},
643 		.cmux_to_group = {
644 			0, -1
645 		},
646 		.pll_mask = BIT(PLATFORM_PLL) |
647 			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
648 		.flags = CG_PLL_8BIT,
649 	},
650 	{
651 		.compat = "fsl,ls1088a-clockgen",
652 		.cmux_groups = {
653 			&clockgen2_cmux_cga12
654 		},
655 		.hwaccel = {
656 			&ls1088a_hwa1, &ls1088a_hwa2
657 		},
658 		.cmux_to_group = {
659 			0, 0, -1
660 		},
661 		.pll_mask = BIT(PLATFORM_PLL) |
662 			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
663 		.flags = CG_VER3 | CG_LITTLE_ENDIAN,
664 	},
665 	{
666 		.compat = "fsl,ls1012a-clockgen",
667 		.cmux_groups = {
668 			&ls1012a_cmux
669 		},
670 		.cmux_to_group = {
671 			0, -1
672 		},
673 		.pll_mask = BIT(PLATFORM_PLL) | BIT(CGA_PLL1),
674 	},
675 	{
676 		.compat = "fsl,ls2080a-clockgen",
677 		.cmux_groups = {
678 			&clockgen2_cmux_cga12, &clockgen2_cmux_cgb
679 		},
680 		.cmux_to_group = {
681 			0, 0, 1, 1, -1
682 		},
683 		.pll_mask = BIT(PLATFORM_PLL) |
684 			    BIT(CGA_PLL1) | BIT(CGA_PLL2) |
685 			    BIT(CGB_PLL1) | BIT(CGB_PLL2),
686 		.flags = CG_VER3 | CG_LITTLE_ENDIAN,
687 	},
688 	{
689 		.compat = "fsl,lx2160a-clockgen",
690 		.cmux_groups = {
691 			&clockgen2_cmux_cga12, &clockgen2_cmux_cgb
692 		},
693 		.cmux_to_group = {
694 			0, 0, 0, 0, 1, 1, 1, 1, -1
695 		},
696 		.pll_mask = BIT(PLATFORM_PLL) |
697 			    BIT(CGA_PLL1) | BIT(CGA_PLL2) |
698 			    BIT(CGB_PLL1) | BIT(CGB_PLL2),
699 		.flags = CG_VER3 | CG_LITTLE_ENDIAN,
700 	},
701 	{
702 		.compat = "fsl,p2041-clockgen",
703 		.guts_compat = "fsl,qoriq-device-config-1.0",
704 		.init_periph = p2041_init_periph,
705 		.cmux_groups = {
706 			&p2041_cmux_grp1, &p2041_cmux_grp2
707 		},
708 		.cmux_to_group = {
709 			0, 0, 1, 1, -1
710 		},
711 		.pll_mask = BIT(PLATFORM_PLL) |
712 			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
713 	},
714 	{
715 		.compat = "fsl,p3041-clockgen",
716 		.guts_compat = "fsl,qoriq-device-config-1.0",
717 		.init_periph = p2041_init_periph,
718 		.cmux_groups = {
719 			&p2041_cmux_grp1, &p2041_cmux_grp2
720 		},
721 		.cmux_to_group = {
722 			0, 0, 1, 1, -1
723 		},
724 		.pll_mask = BIT(PLATFORM_PLL) |
725 			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
726 	},
727 	{
728 		.compat = "fsl,p4080-clockgen",
729 		.guts_compat = "fsl,qoriq-device-config-1.0",
730 		.init_periph = p4080_init_periph,
731 		.cmux_groups = {
732 			&p4080_cmux_grp1, &p4080_cmux_grp2
733 		},
734 		.cmux_to_group = {
735 			0, 0, 0, 0, 1, 1, 1, 1, -1
736 		},
737 		.pll_mask = BIT(PLATFORM_PLL) |
738 			    BIT(CGA_PLL1) | BIT(CGA_PLL2) |
739 			    BIT(CGA_PLL3) | BIT(CGA_PLL4),
740 	},
741 	{
742 		.compat = "fsl,p5020-clockgen",
743 		.guts_compat = "fsl,qoriq-device-config-1.0",
744 		.init_periph = p5020_init_periph,
745 		.cmux_groups = {
746 			&p5020_cmux_grp1, &p5020_cmux_grp2
747 		},
748 		.cmux_to_group = {
749 			0, 1, -1
750 		},
751 		.pll_mask = BIT(PLATFORM_PLL) |
752 			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
753 	},
754 	{
755 		.compat = "fsl,p5040-clockgen",
756 		.guts_compat = "fsl,p5040-device-config",
757 		.init_periph = p5040_init_periph,
758 		.cmux_groups = {
759 			&p5040_cmux_grp1, &p5040_cmux_grp2
760 		},
761 		.cmux_to_group = {
762 			0, 0, 1, 1, -1
763 		},
764 		.pll_mask = BIT(PLATFORM_PLL) |
765 			    BIT(CGA_PLL1) | BIT(CGA_PLL2) | BIT(CGA_PLL3),
766 	},
767 	{
768 		.compat = "fsl,t1023-clockgen",
769 		.guts_compat = "fsl,t1023-device-config",
770 		.init_periph = t1023_init_periph,
771 		.cmux_groups = {
772 			&t1023_cmux
773 		},
774 		.hwaccel = {
775 			&t1023_hwa1, &t1023_hwa2
776 		},
777 		.cmux_to_group = {
778 			0, 0, -1
779 		},
780 		.pll_mask = BIT(PLATFORM_PLL) | BIT(CGA_PLL1),
781 		.flags = CG_PLL_8BIT,
782 	},
783 	{
784 		.compat = "fsl,t1040-clockgen",
785 		.guts_compat = "fsl,t1040-device-config",
786 		.init_periph = t1040_init_periph,
787 		.cmux_groups = {
788 			&t1040_cmux
789 		},
790 		.cmux_to_group = {
791 			0, 0, 0, 0, -1
792 		},
793 		.pll_mask = BIT(PLATFORM_PLL) |
794 			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
795 		.flags = CG_PLL_8BIT,
796 	},
797 	{
798 		.compat = "fsl,t2080-clockgen",
799 		.guts_compat = "fsl,t2080-device-config",
800 		.init_periph = t2080_init_periph,
801 		.cmux_groups = {
802 			&clockgen2_cmux_cga12
803 		},
804 		.hwaccel = {
805 			&t2080_hwa1, &t2080_hwa2
806 		},
807 		.cmux_to_group = {
808 			0, -1
809 		},
810 		.pll_mask = BIT(PLATFORM_PLL) |
811 			    BIT(CGA_PLL1) | BIT(CGA_PLL2),
812 		.flags = CG_PLL_8BIT,
813 	},
814 	{
815 		.compat = "fsl,t4240-clockgen",
816 		.guts_compat = "fsl,t4240-device-config",
817 		.init_periph = t4240_init_periph,
818 		.cmux_groups = {
819 			&clockgen2_cmux_cga, &clockgen2_cmux_cgb
820 		},
821 		.hwaccel = {
822 			&t4240_hwa1, NULL, NULL, &t4240_hwa4, &t4240_hwa5
823 		},
824 		.cmux_to_group = {
825 			0, 0, 1, -1
826 		},
827 		.pll_mask = BIT(PLATFORM_PLL) |
828 			    BIT(CGA_PLL1) | BIT(CGA_PLL2) | BIT(CGA_PLL3) |
829 			    BIT(CGB_PLL1) | BIT(CGB_PLL2),
830 		.flags = CG_PLL_8BIT,
831 	},
832 	{},
833 };
834 
835 struct mux_hwclock {
836 	struct clk_hw hw;
837 	struct clockgen *cg;
838 	const struct clockgen_muxinfo *info;
839 	u32 __iomem *reg;
840 	u8 parent_to_clksel[NUM_MUX_PARENTS];
841 	s8 clksel_to_parent[NUM_MUX_PARENTS];
842 	int num_parents;
843 };
844 
845 #define to_mux_hwclock(p)	container_of(p, struct mux_hwclock, hw)
846 #define CLKSEL_MASK		0x78000000
847 #define	CLKSEL_SHIFT		27
848 
849 static int mux_set_parent(struct clk_hw *hw, u8 idx)
850 {
851 	struct mux_hwclock *hwc = to_mux_hwclock(hw);
852 	u32 clksel;
853 
854 	if (idx >= hwc->num_parents)
855 		return -EINVAL;
856 
857 	clksel = hwc->parent_to_clksel[idx];
858 	cg_out(hwc->cg, (clksel << CLKSEL_SHIFT) & CLKSEL_MASK, hwc->reg);
859 
860 	return 0;
861 }
862 
863 static u8 mux_get_parent(struct clk_hw *hw)
864 {
865 	struct mux_hwclock *hwc = to_mux_hwclock(hw);
866 	u32 clksel;
867 	s8 ret;
868 
869 	clksel = (cg_in(hwc->cg, hwc->reg) & CLKSEL_MASK) >> CLKSEL_SHIFT;
870 
871 	ret = hwc->clksel_to_parent[clksel];
872 	if (ret < 0) {
873 		pr_err("%s: mux at %p has bad clksel\n", __func__, hwc->reg);
874 		return 0;
875 	}
876 
877 	return ret;
878 }
879 
880 static const struct clk_ops cmux_ops = {
881 	.determine_rate = clk_hw_determine_rate_no_reparent,
882 	.get_parent = mux_get_parent,
883 	.set_parent = mux_set_parent,
884 };
885 
886 /*
887  * Don't allow setting for now, as the clock options haven't been
888  * sanitized for additional restrictions.
889  */
890 static const struct clk_ops hwaccel_ops = {
891 	.get_parent = mux_get_parent,
892 };
893 
894 static const struct clockgen_pll_div *get_pll_div(struct clockgen *cg,
895 						  struct mux_hwclock *hwc,
896 						  int idx)
897 {
898 	int pll, div;
899 
900 	if (!(hwc->info->clksel[idx].flags & CLKSEL_VALID))
901 		return NULL;
902 
903 	pll = hwc->info->clksel[idx].pll;
904 	div = hwc->info->clksel[idx].div;
905 
906 	return &cg->pll[pll].div[div];
907 }
908 
909 static struct clk * __init create_mux_common(struct clockgen *cg,
910 					     struct mux_hwclock *hwc,
911 					     const struct clk_ops *ops,
912 					     unsigned long min_rate,
913 					     unsigned long max_rate,
914 					     unsigned long pct80_rate,
915 					     const char *fmt, int idx)
916 {
917 	struct clk_init_data init = {};
918 	struct clk *clk;
919 	const struct clockgen_pll_div *div;
920 	const char *parent_names[NUM_MUX_PARENTS];
921 	char name[32];
922 	int i, j;
923 
924 	snprintf(name, sizeof(name), fmt, idx);
925 
926 	for (i = 0, j = 0; i < NUM_MUX_PARENTS; i++) {
927 		unsigned long rate;
928 
929 		hwc->clksel_to_parent[i] = -1;
930 
931 		div = get_pll_div(cg, hwc, i);
932 		if (!div)
933 			continue;
934 
935 		rate = clk_get_rate(div->clk);
936 
937 		if (hwc->info->clksel[i].flags & CLKSEL_80PCT &&
938 		    rate > pct80_rate)
939 			continue;
940 		if (rate < min_rate)
941 			continue;
942 		if (rate > max_rate)
943 			continue;
944 
945 		parent_names[j] = div->name;
946 		hwc->parent_to_clksel[j] = i;
947 		hwc->clksel_to_parent[i] = j;
948 		j++;
949 	}
950 
951 	init.name = name;
952 	init.ops = ops;
953 	init.parent_names = parent_names;
954 	init.num_parents = hwc->num_parents = j;
955 	init.flags = 0;
956 	hwc->hw.init = &init;
957 	hwc->cg = cg;
958 
959 	clk = clk_register(NULL, &hwc->hw);
960 	if (IS_ERR(clk)) {
961 		pr_err("%s: Couldn't register %s: %ld\n", __func__, name,
962 		       PTR_ERR(clk));
963 		kfree(hwc);
964 		return NULL;
965 	}
966 
967 	return clk;
968 }
969 
970 static struct clk * __init create_one_cmux(struct clockgen *cg, int idx)
971 {
972 	struct mux_hwclock *hwc;
973 	const struct clockgen_pll_div *div;
974 	unsigned long plat_rate, min_rate;
975 	u64 max_rate, pct80_rate;
976 	u32 clksel;
977 
978 	hwc = kzalloc(sizeof(*hwc), GFP_KERNEL);
979 	if (!hwc)
980 		return NULL;
981 
982 	if (cg->info.flags & CG_VER3)
983 		hwc->reg = cg->regs + 0x70000 + 0x20 * idx;
984 	else
985 		hwc->reg = cg->regs + 0x20 * idx;
986 
987 	hwc->info = cg->info.cmux_groups[cg->info.cmux_to_group[idx]];
988 
989 	/*
990 	 * Find the rate for the default clksel, and treat it as the
991 	 * maximum rated core frequency.  If this is an incorrect
992 	 * assumption, certain clock options (possibly including the
993 	 * default clksel) may be inappropriately excluded on certain
994 	 * chips.
995 	 */
996 	clksel = (cg_in(cg, hwc->reg) & CLKSEL_MASK) >> CLKSEL_SHIFT;
997 	div = get_pll_div(cg, hwc, clksel);
998 	if (!div) {
999 		kfree(hwc);
1000 		return NULL;
1001 	}
1002 
1003 	max_rate = clk_get_rate(div->clk);
1004 	pct80_rate = max_rate * 8;
1005 	do_div(pct80_rate, 10);
1006 
1007 	plat_rate = clk_get_rate(cg->pll[PLATFORM_PLL].div[PLL_DIV1].clk);
1008 
1009 	if (cg->info.flags & CG_CMUX_GE_PLAT)
1010 		min_rate = plat_rate;
1011 	else
1012 		min_rate = plat_rate / 2;
1013 
1014 	return create_mux_common(cg, hwc, &cmux_ops, min_rate, max_rate,
1015 				 pct80_rate, "cg-cmux%d", idx);
1016 }
1017 
1018 static struct clk * __init create_one_hwaccel(struct clockgen *cg, int idx)
1019 {
1020 	struct mux_hwclock *hwc;
1021 
1022 	hwc = kzalloc(sizeof(*hwc), GFP_KERNEL);
1023 	if (!hwc)
1024 		return NULL;
1025 
1026 	hwc->reg = cg->regs + 0x20 * idx + 0x10;
1027 	hwc->info = cg->info.hwaccel[idx];
1028 
1029 	return create_mux_common(cg, hwc, &hwaccel_ops, 0, ULONG_MAX, 0,
1030 				 "cg-hwaccel%d", idx);
1031 }
1032 
1033 static void __init create_muxes(struct clockgen *cg)
1034 {
1035 	int i;
1036 
1037 	for (i = 0; i < ARRAY_SIZE(cg->cmux); i++) {
1038 		if (cg->info.cmux_to_group[i] < 0)
1039 			break;
1040 		if (cg->info.cmux_to_group[i] >=
1041 		    ARRAY_SIZE(cg->info.cmux_groups)) {
1042 			WARN_ON_ONCE(1);
1043 			continue;
1044 		}
1045 
1046 		cg->cmux[i] = create_one_cmux(cg, i);
1047 	}
1048 
1049 	for (i = 0; i < ARRAY_SIZE(cg->hwaccel); i++) {
1050 		if (!cg->info.hwaccel[i])
1051 			continue;
1052 
1053 		cg->hwaccel[i] = create_one_hwaccel(cg, i);
1054 	}
1055 }
1056 
1057 static void __init _clockgen_init(struct device_node *np, bool legacy);
1058 
1059 /*
1060  * Legacy nodes may get probed before the parent clockgen node.
1061  * It is assumed that device trees with legacy nodes will not
1062  * contain a "clocks" property -- otherwise the input clocks may
1063  * not be initialized at this point.
1064  */
1065 static void __init legacy_init_clockgen(struct device_node *np)
1066 {
1067 	if (!clockgen.node) {
1068 		struct device_node *parent_np;
1069 
1070 		parent_np = of_get_parent(np);
1071 		_clockgen_init(parent_np, true);
1072 		of_node_put(parent_np);
1073 	}
1074 }
1075 
1076 /* Legacy node */
1077 static void __init core_mux_init(struct device_node *np)
1078 {
1079 	struct clk *clk;
1080 	struct resource res;
1081 	int idx, rc;
1082 
1083 	legacy_init_clockgen(np);
1084 
1085 	if (of_address_to_resource(np, 0, &res))
1086 		return;
1087 
1088 	idx = (res.start & 0xf0) >> 5;
1089 	clk = clockgen.cmux[idx];
1090 
1091 	rc = of_clk_add_provider(np, of_clk_src_simple_get, clk);
1092 	if (rc) {
1093 		pr_err("%s: Couldn't register clk provider for node %pOFn: %d\n",
1094 		       __func__, np, rc);
1095 		return;
1096 	}
1097 }
1098 
1099 static struct clk __init
1100 *sysclk_from_fixed(struct device_node *node, const char *name)
1101 {
1102 	u32 rate;
1103 
1104 	if (of_property_read_u32(node, "clock-frequency", &rate))
1105 		return ERR_PTR(-ENODEV);
1106 
1107 	return clk_register_fixed_rate(NULL, name, NULL, 0, rate);
1108 }
1109 
1110 static struct clk __init *input_clock(const char *name, struct clk *clk)
1111 {
1112 	const char *input_name;
1113 
1114 	/* Register the input clock under the desired name. */
1115 	input_name = __clk_get_name(clk);
1116 	clk = clk_register_fixed_factor(NULL, name, input_name,
1117 					0, 1, 1);
1118 	if (IS_ERR(clk))
1119 		pr_err("%s: Couldn't register %s: %ld\n", __func__, name,
1120 		       PTR_ERR(clk));
1121 
1122 	return clk;
1123 }
1124 
1125 static struct clk __init *input_clock_by_name(const char *name,
1126 					      const char *dtname)
1127 {
1128 	struct clk *clk;
1129 
1130 	clk = of_clk_get_by_name(clockgen.node, dtname);
1131 	if (IS_ERR(clk))
1132 		return clk;
1133 
1134 	return input_clock(name, clk);
1135 }
1136 
1137 static struct clk __init *input_clock_by_index(const char *name, int idx)
1138 {
1139 	struct clk *clk;
1140 
1141 	clk = of_clk_get(clockgen.node, 0);
1142 	if (IS_ERR(clk))
1143 		return clk;
1144 
1145 	return input_clock(name, clk);
1146 }
1147 
1148 static struct clk * __init create_sysclk(const char *name)
1149 {
1150 	struct device_node *sysclk;
1151 	struct clk *clk;
1152 
1153 	clk = sysclk_from_fixed(clockgen.node, name);
1154 	if (!IS_ERR(clk))
1155 		return clk;
1156 
1157 	clk = input_clock_by_name(name, "sysclk");
1158 	if (!IS_ERR(clk))
1159 		return clk;
1160 
1161 	clk = input_clock_by_index(name, 0);
1162 	if (!IS_ERR(clk))
1163 		return clk;
1164 
1165 	sysclk = of_get_child_by_name(clockgen.node, "sysclk");
1166 	if (sysclk) {
1167 		clk = sysclk_from_fixed(sysclk, name);
1168 		of_node_put(sysclk);
1169 		if (!IS_ERR(clk))
1170 			return clk;
1171 	}
1172 
1173 	pr_err("%s: No input sysclk\n", __func__);
1174 	return NULL;
1175 }
1176 
1177 static struct clk * __init create_coreclk(const char *name)
1178 {
1179 	struct clk *clk;
1180 
1181 	clk = input_clock_by_name(name, "coreclk");
1182 	if (!IS_ERR(clk))
1183 		return clk;
1184 
1185 	/*
1186 	 * This indicates a mix of legacy nodes with the new coreclk
1187 	 * mechanism, which should never happen.  If this error occurs,
1188 	 * don't use the wrong input clock just because coreclk isn't
1189 	 * ready yet.
1190 	 */
1191 	if (WARN_ON(PTR_ERR(clk) == -EPROBE_DEFER))
1192 		return clk;
1193 
1194 	return NULL;
1195 }
1196 
1197 /* Legacy node */
1198 static void __init sysclk_init(struct device_node *node)
1199 {
1200 	struct clk *clk;
1201 
1202 	legacy_init_clockgen(node);
1203 
1204 	clk = clockgen.sysclk;
1205 	if (clk)
1206 		of_clk_add_provider(node, of_clk_src_simple_get, clk);
1207 }
1208 
1209 #define PLL_KILL BIT(31)
1210 
1211 static void __init create_one_pll(struct clockgen *cg, int idx)
1212 {
1213 	u32 __iomem *reg;
1214 	u32 mult;
1215 	struct clockgen_pll *pll = &cg->pll[idx];
1216 	const char *input = "cg-sysclk";
1217 	int i;
1218 
1219 	if (!(cg->info.pll_mask & (1 << idx)))
1220 		return;
1221 
1222 	if (cg->coreclk && idx != PLATFORM_PLL) {
1223 		if (IS_ERR(cg->coreclk))
1224 			return;
1225 
1226 		input = "cg-coreclk";
1227 	}
1228 
1229 	if (cg->info.flags & CG_VER3) {
1230 		switch (idx) {
1231 		case PLATFORM_PLL:
1232 			reg = cg->regs + 0x60080;
1233 			break;
1234 		case CGA_PLL1:
1235 			reg = cg->regs + 0x80;
1236 			break;
1237 		case CGA_PLL2:
1238 			reg = cg->regs + 0xa0;
1239 			break;
1240 		case CGB_PLL1:
1241 			reg = cg->regs + 0x10080;
1242 			break;
1243 		case CGB_PLL2:
1244 			reg = cg->regs + 0x100a0;
1245 			break;
1246 		default:
1247 			WARN_ONCE(1, "index %d\n", idx);
1248 			return;
1249 		}
1250 	} else {
1251 		if (idx == PLATFORM_PLL)
1252 			reg = cg->regs + 0xc00;
1253 		else
1254 			reg = cg->regs + 0x800 + 0x20 * (idx - 1);
1255 	}
1256 
1257 	/* Get the multiple of PLL */
1258 	mult = cg_in(cg, reg);
1259 
1260 	/* Check if this PLL is disabled */
1261 	if (mult & PLL_KILL) {
1262 		pr_debug("%s(): pll %p disabled\n", __func__, reg);
1263 		return;
1264 	}
1265 
1266 	if ((cg->info.flags & CG_VER3) ||
1267 	    ((cg->info.flags & CG_PLL_8BIT) && idx != PLATFORM_PLL))
1268 		mult = (mult & GENMASK(8, 1)) >> 1;
1269 	else
1270 		mult = (mult & GENMASK(6, 1)) >> 1;
1271 
1272 	for (i = 0; i < ARRAY_SIZE(pll->div); i++) {
1273 		struct clk *clk;
1274 		int ret;
1275 
1276 		/*
1277 		 * For platform PLL, there are MAX_PLL_DIV divider clocks.
1278 		 * For core PLL, there are 4 divider clocks at most.
1279 		 */
1280 		if (idx != PLATFORM_PLL && i >= 4)
1281 			break;
1282 
1283 		snprintf(pll->div[i].name, sizeof(pll->div[i].name),
1284 			 "cg-pll%d-div%d", idx, i + 1);
1285 
1286 		clk = clk_register_fixed_factor(NULL,
1287 				pll->div[i].name, input, 0, mult, i + 1);
1288 		if (IS_ERR(clk)) {
1289 			pr_err("%s: %s: register failed %ld\n",
1290 			       __func__, pll->div[i].name, PTR_ERR(clk));
1291 			continue;
1292 		}
1293 
1294 		pll->div[i].clk = clk;
1295 		ret = clk_register_clkdev(clk, pll->div[i].name, NULL);
1296 		if (ret != 0)
1297 			pr_err("%s: %s: register to lookup table failed %d\n",
1298 			       __func__, pll->div[i].name, ret);
1299 
1300 	}
1301 }
1302 
1303 static void __init create_plls(struct clockgen *cg)
1304 {
1305 	int i;
1306 
1307 	for (i = 0; i < ARRAY_SIZE(cg->pll); i++)
1308 		create_one_pll(cg, i);
1309 }
1310 
1311 static void __init legacy_pll_init(struct device_node *np, int idx)
1312 {
1313 	struct clockgen_pll *pll;
1314 	struct clk_onecell_data *onecell_data;
1315 	struct clk **subclks;
1316 	int count, rc;
1317 
1318 	legacy_init_clockgen(np);
1319 
1320 	pll = &clockgen.pll[idx];
1321 	count = of_property_count_strings(np, "clock-output-names");
1322 
1323 	BUILD_BUG_ON(ARRAY_SIZE(pll->div) < 4);
1324 	subclks = kcalloc(4, sizeof(struct clk *), GFP_KERNEL);
1325 	if (!subclks)
1326 		return;
1327 
1328 	onecell_data = kmalloc(sizeof(*onecell_data), GFP_KERNEL);
1329 	if (!onecell_data)
1330 		goto err_clks;
1331 
1332 	if (count <= 3) {
1333 		subclks[0] = pll->div[0].clk;
1334 		subclks[1] = pll->div[1].clk;
1335 		subclks[2] = pll->div[3].clk;
1336 	} else {
1337 		subclks[0] = pll->div[0].clk;
1338 		subclks[1] = pll->div[1].clk;
1339 		subclks[2] = pll->div[2].clk;
1340 		subclks[3] = pll->div[3].clk;
1341 	}
1342 
1343 	onecell_data->clks = subclks;
1344 	onecell_data->clk_num = count;
1345 
1346 	rc = of_clk_add_provider(np, of_clk_src_onecell_get, onecell_data);
1347 	if (rc) {
1348 		pr_err("%s: Couldn't register clk provider for node %pOFn: %d\n",
1349 		       __func__, np, rc);
1350 		goto err_cell;
1351 	}
1352 
1353 	return;
1354 err_cell:
1355 	kfree(onecell_data);
1356 err_clks:
1357 	kfree(subclks);
1358 }
1359 
1360 /* Legacy node */
1361 static void __init pltfrm_pll_init(struct device_node *np)
1362 {
1363 	legacy_pll_init(np, PLATFORM_PLL);
1364 }
1365 
1366 /* Legacy node */
1367 static void __init core_pll_init(struct device_node *np)
1368 {
1369 	struct resource res;
1370 	int idx;
1371 
1372 	if (of_address_to_resource(np, 0, &res))
1373 		return;
1374 
1375 	if ((res.start & 0xfff) == 0xc00) {
1376 		/*
1377 		 * ls1021a devtree labels the platform PLL
1378 		 * with the core PLL compatible
1379 		 */
1380 		pltfrm_pll_init(np);
1381 	} else {
1382 		idx = (res.start & 0xf0) >> 5;
1383 		legacy_pll_init(np, CGA_PLL1 + idx);
1384 	}
1385 }
1386 
1387 static struct clk *clockgen_clk_get(struct of_phandle_args *clkspec, void *data)
1388 {
1389 	struct clockgen *cg = data;
1390 	struct clk *clk;
1391 	struct clockgen_pll *pll;
1392 	u32 type, idx;
1393 
1394 	if (clkspec->args_count < 2) {
1395 		pr_err("%s: insufficient phandle args\n", __func__);
1396 		return ERR_PTR(-EINVAL);
1397 	}
1398 
1399 	type = clkspec->args[0];
1400 	idx = clkspec->args[1];
1401 
1402 	switch (type) {
1403 	case QORIQ_CLK_SYSCLK:
1404 		if (idx != 0)
1405 			goto bad_args;
1406 		clk = cg->sysclk;
1407 		break;
1408 	case QORIQ_CLK_CMUX:
1409 		if (idx >= ARRAY_SIZE(cg->cmux))
1410 			goto bad_args;
1411 		clk = cg->cmux[idx];
1412 		break;
1413 	case QORIQ_CLK_HWACCEL:
1414 		if (idx >= ARRAY_SIZE(cg->hwaccel))
1415 			goto bad_args;
1416 		clk = cg->hwaccel[idx];
1417 		break;
1418 	case QORIQ_CLK_FMAN:
1419 		if (idx >= ARRAY_SIZE(cg->fman))
1420 			goto bad_args;
1421 		clk = cg->fman[idx];
1422 		break;
1423 	case QORIQ_CLK_PLATFORM_PLL:
1424 		pll = &cg->pll[PLATFORM_PLL];
1425 		if (idx >= ARRAY_SIZE(pll->div))
1426 			goto bad_args;
1427 		clk = pll->div[idx].clk;
1428 		break;
1429 	case QORIQ_CLK_CORECLK:
1430 		if (idx != 0)
1431 			goto bad_args;
1432 		clk = cg->coreclk;
1433 		if (IS_ERR(clk))
1434 			clk = NULL;
1435 		break;
1436 	default:
1437 		goto bad_args;
1438 	}
1439 
1440 	if (!clk)
1441 		return ERR_PTR(-ENOENT);
1442 	return clk;
1443 
1444 bad_args:
1445 	pr_err("%s: Bad phandle args %u %u\n", __func__, type, idx);
1446 	return ERR_PTR(-EINVAL);
1447 }
1448 
1449 #ifdef CONFIG_PPC
1450 #include <asm/mpc85xx.h>
1451 
1452 static const u32 a4510_svrs[] __initconst = {
1453 	(SVR_P2040 << 8) | 0x10,	/* P2040 1.0 */
1454 	(SVR_P2040 << 8) | 0x11,	/* P2040 1.1 */
1455 	(SVR_P2041 << 8) | 0x10,	/* P2041 1.0 */
1456 	(SVR_P2041 << 8) | 0x11,	/* P2041 1.1 */
1457 	(SVR_P3041 << 8) | 0x10,	/* P3041 1.0 */
1458 	(SVR_P3041 << 8) | 0x11,	/* P3041 1.1 */
1459 	(SVR_P4040 << 8) | 0x20,	/* P4040 2.0 */
1460 	(SVR_P4080 << 8) | 0x20,	/* P4080 2.0 */
1461 	(SVR_P5010 << 8) | 0x10,	/* P5010 1.0 */
1462 	(SVR_P5010 << 8) | 0x20,	/* P5010 2.0 */
1463 	(SVR_P5020 << 8) | 0x10,	/* P5020 1.0 */
1464 	(SVR_P5021 << 8) | 0x10,	/* P5021 1.0 */
1465 	(SVR_P5040 << 8) | 0x10,	/* P5040 1.0 */
1466 };
1467 
1468 #define SVR_SECURITY	0x80000	/* The Security (E) bit */
1469 
1470 static bool __init has_erratum_a4510(void)
1471 {
1472 	u32 svr = mfspr(SPRN_SVR);
1473 	int i;
1474 
1475 	svr &= ~SVR_SECURITY;
1476 
1477 	for (i = 0; i < ARRAY_SIZE(a4510_svrs); i++) {
1478 		if (svr == a4510_svrs[i])
1479 			return true;
1480 	}
1481 
1482 	return false;
1483 }
1484 #else
1485 static bool __init has_erratum_a4510(void)
1486 {
1487 	return false;
1488 }
1489 #endif
1490 
1491 static void __init _clockgen_init(struct device_node *np, bool legacy)
1492 {
1493 	int i, ret;
1494 	bool is_old_ls1021a = false;
1495 
1496 	/* May have already been called by a legacy probe */
1497 	if (clockgen.node)
1498 		return;
1499 
1500 	clockgen.node = np;
1501 	clockgen.regs = of_iomap(np, 0);
1502 	if (!clockgen.regs &&
1503 	    of_device_is_compatible(of_root, "fsl,ls1021a")) {
1504 		/* Compatibility hack for old, broken device trees */
1505 		clockgen.regs = ioremap(0x1ee1000, 0x1000);
1506 		is_old_ls1021a = true;
1507 	}
1508 	if (!clockgen.regs) {
1509 		pr_err("%s(): %pOFn: of_iomap() failed\n", __func__, np);
1510 		return;
1511 	}
1512 
1513 	for (i = 0; i < ARRAY_SIZE(chipinfo); i++) {
1514 		if (of_device_is_compatible(np, chipinfo[i].compat))
1515 			break;
1516 		if (is_old_ls1021a &&
1517 		    !strcmp(chipinfo[i].compat, "fsl,ls1021a-clockgen"))
1518 			break;
1519 	}
1520 
1521 	if (i == ARRAY_SIZE(chipinfo)) {
1522 		pr_err("%s: unknown clockgen node %pOF\n", __func__, np);
1523 		goto err;
1524 	}
1525 	clockgen.info = chipinfo[i];
1526 
1527 	if (clockgen.info.guts_compat) {
1528 		struct device_node *guts;
1529 
1530 		guts = of_find_compatible_node(NULL, NULL,
1531 					       clockgen.info.guts_compat);
1532 		if (guts) {
1533 			clockgen.guts = of_iomap(guts, 0);
1534 			if (!clockgen.guts) {
1535 				pr_err("%s: Couldn't map %pOF regs\n", __func__,
1536 				       guts);
1537 			}
1538 			of_node_put(guts);
1539 		}
1540 
1541 	}
1542 
1543 	if (has_erratum_a4510())
1544 		clockgen.info.flags |= CG_CMUX_GE_PLAT;
1545 
1546 	clockgen.sysclk = create_sysclk("cg-sysclk");
1547 	clockgen.coreclk = create_coreclk("cg-coreclk");
1548 	create_plls(&clockgen);
1549 	create_muxes(&clockgen);
1550 
1551 	if (clockgen.info.init_periph)
1552 		clockgen.info.init_periph(&clockgen);
1553 
1554 	ret = of_clk_add_provider(np, clockgen_clk_get, &clockgen);
1555 	if (ret) {
1556 		pr_err("%s: Couldn't register clk provider for node %pOFn: %d\n",
1557 		       __func__, np, ret);
1558 	}
1559 
1560 	/* Don't create cpufreq device for legacy clockgen blocks */
1561 	add_cpufreq_dev = !legacy;
1562 
1563 	return;
1564 err:
1565 	iounmap(clockgen.regs);
1566 	clockgen.regs = NULL;
1567 }
1568 
1569 static void __init clockgen_init(struct device_node *np)
1570 {
1571 	_clockgen_init(np, false);
1572 }
1573 
1574 static int __init clockgen_cpufreq_init(void)
1575 {
1576 	struct platform_device *pdev;
1577 
1578 	if (add_cpufreq_dev) {
1579 		pdev = platform_device_register_simple("qoriq-cpufreq", -1,
1580 				NULL, 0);
1581 		if (IS_ERR(pdev))
1582 			pr_err("Couldn't register qoriq-cpufreq err=%ld\n",
1583 				PTR_ERR(pdev));
1584 	}
1585 	return 0;
1586 }
1587 device_initcall(clockgen_cpufreq_init);
1588 
1589 CLK_OF_DECLARE(qoriq_clockgen_1, "fsl,qoriq-clockgen-1.0", clockgen_init);
1590 CLK_OF_DECLARE(qoriq_clockgen_2, "fsl,qoriq-clockgen-2.0", clockgen_init);
1591 CLK_OF_DECLARE(qoriq_clockgen_b4420, "fsl,b4420-clockgen", clockgen_init);
1592 CLK_OF_DECLARE(qoriq_clockgen_b4860, "fsl,b4860-clockgen", clockgen_init);
1593 CLK_OF_DECLARE(qoriq_clockgen_ls1012a, "fsl,ls1012a-clockgen", clockgen_init);
1594 CLK_OF_DECLARE(qoriq_clockgen_ls1021a, "fsl,ls1021a-clockgen", clockgen_init);
1595 CLK_OF_DECLARE(qoriq_clockgen_ls1028a, "fsl,ls1028a-clockgen", clockgen_init);
1596 CLK_OF_DECLARE(qoriq_clockgen_ls1043a, "fsl,ls1043a-clockgen", clockgen_init);
1597 CLK_OF_DECLARE(qoriq_clockgen_ls1046a, "fsl,ls1046a-clockgen", clockgen_init);
1598 CLK_OF_DECLARE(qoriq_clockgen_ls1088a, "fsl,ls1088a-clockgen", clockgen_init);
1599 CLK_OF_DECLARE(qoriq_clockgen_ls2080a, "fsl,ls2080a-clockgen", clockgen_init);
1600 CLK_OF_DECLARE(qoriq_clockgen_lx2160a, "fsl,lx2160a-clockgen", clockgen_init);
1601 CLK_OF_DECLARE(qoriq_clockgen_p2041, "fsl,p2041-clockgen", clockgen_init);
1602 CLK_OF_DECLARE(qoriq_clockgen_p3041, "fsl,p3041-clockgen", clockgen_init);
1603 CLK_OF_DECLARE(qoriq_clockgen_p4080, "fsl,p4080-clockgen", clockgen_init);
1604 CLK_OF_DECLARE(qoriq_clockgen_p5020, "fsl,p5020-clockgen", clockgen_init);
1605 CLK_OF_DECLARE(qoriq_clockgen_p5040, "fsl,p5040-clockgen", clockgen_init);
1606 CLK_OF_DECLARE(qoriq_clockgen_t1023, "fsl,t1023-clockgen", clockgen_init);
1607 CLK_OF_DECLARE(qoriq_clockgen_t1040, "fsl,t1040-clockgen", clockgen_init);
1608 CLK_OF_DECLARE(qoriq_clockgen_t2080, "fsl,t2080-clockgen", clockgen_init);
1609 CLK_OF_DECLARE(qoriq_clockgen_t4240, "fsl,t4240-clockgen", clockgen_init);
1610 
1611 /* Legacy nodes */
1612 CLK_OF_DECLARE(qoriq_sysclk_1, "fsl,qoriq-sysclk-1.0", sysclk_init);
1613 CLK_OF_DECLARE(qoriq_sysclk_2, "fsl,qoriq-sysclk-2.0", sysclk_init);
1614 CLK_OF_DECLARE(qoriq_core_pll_1, "fsl,qoriq-core-pll-1.0", core_pll_init);
1615 CLK_OF_DECLARE(qoriq_core_pll_2, "fsl,qoriq-core-pll-2.0", core_pll_init);
1616 CLK_OF_DECLARE(qoriq_core_mux_1, "fsl,qoriq-core-mux-1.0", core_mux_init);
1617 CLK_OF_DECLARE(qoriq_core_mux_2, "fsl,qoriq-core-mux-2.0", core_mux_init);
1618 CLK_OF_DECLARE(qoriq_pltfrm_pll_1, "fsl,qoriq-platform-pll-1.0", pltfrm_pll_init);
1619 CLK_OF_DECLARE(qoriq_pltfrm_pll_2, "fsl,qoriq-platform-pll-2.0", pltfrm_pll_init);
1620