xref: /openbmc/linux/drivers/clk/bcm/clk-iproc-pll.c (revision 4f6cce39)
1 /*
2  * Copyright (C) 2014 Broadcom Corporation
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation version 2.
7  *
8  * This program is distributed "as is" WITHOUT ANY WARRANTY of any
9  * kind, whether express or implied; without even the implied warranty
10  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  */
13 
14 #include <linux/kernel.h>
15 #include <linux/err.h>
16 #include <linux/clk-provider.h>
17 #include <linux/io.h>
18 #include <linux/of.h>
19 #include <linux/clkdev.h>
20 #include <linux/of_address.h>
21 #include <linux/delay.h>
22 
23 #include "clk-iproc.h"
24 
25 #define PLL_VCO_HIGH_SHIFT 19
26 #define PLL_VCO_LOW_SHIFT  30
27 
28 /*
29  * PLL MACRO_SELECT modes 0 to 5 choose pre-calculated PLL output frequencies
30  * from a look-up table. Mode 7 allows user to manipulate PLL clock dividers
31  */
32 #define PLL_USER_MODE 7
33 
34 /* number of delay loops waiting for PLL to lock */
35 #define LOCK_DELAY 100
36 
37 /* number of VCO frequency bands */
38 #define NUM_FREQ_BANDS 8
39 
40 #define NUM_KP_BANDS 3
41 enum kp_band {
42 	KP_BAND_MID = 0,
43 	KP_BAND_HIGH,
44 	KP_BAND_HIGH_HIGH
45 };
46 
47 static const unsigned int kp_table[NUM_KP_BANDS][NUM_FREQ_BANDS] = {
48 	{ 5, 6, 6, 7, 7, 8, 9, 10 },
49 	{ 4, 4, 5, 5, 6, 7, 8, 9  },
50 	{ 4, 5, 5, 6, 7, 8, 9, 10 },
51 };
52 
53 static const unsigned long ref_freq_table[NUM_FREQ_BANDS][2] = {
54 	{ 10000000,  12500000  },
55 	{ 12500000,  15000000  },
56 	{ 15000000,  20000000  },
57 	{ 20000000,  25000000  },
58 	{ 25000000,  50000000  },
59 	{ 50000000,  75000000  },
60 	{ 75000000,  100000000 },
61 	{ 100000000, 125000000 },
62 };
63 
64 enum vco_freq_range {
65 	VCO_LOW       = 700000000U,
66 	VCO_MID       = 1200000000U,
67 	VCO_HIGH      = 2200000000U,
68 	VCO_HIGH_HIGH = 3100000000U,
69 	VCO_MAX       = 4000000000U,
70 };
71 
72 struct iproc_pll;
73 
74 struct iproc_clk {
75 	struct clk_hw hw;
76 	const char *name;
77 	struct iproc_pll *pll;
78 	unsigned long rate;
79 	const struct iproc_clk_ctrl *ctrl;
80 };
81 
82 struct iproc_pll {
83 	void __iomem *status_base;
84 	void __iomem *control_base;
85 	void __iomem *pwr_base;
86 	void __iomem *asiu_base;
87 
88 	const struct iproc_pll_ctrl *ctrl;
89 	const struct iproc_pll_vco_param *vco_param;
90 	unsigned int num_vco_entries;
91 
92 	struct clk_hw_onecell_data *clk_data;
93 	struct iproc_clk *clks;
94 };
95 
96 #define to_iproc_clk(hw) container_of(hw, struct iproc_clk, hw)
97 
98 /*
99  * Based on the target frequency, find a match from the VCO frequency parameter
100  * table and return its index
101  */
102 static int pll_get_rate_index(struct iproc_pll *pll, unsigned int target_rate)
103 {
104 	int i;
105 
106 	for (i = 0; i < pll->num_vco_entries; i++)
107 		if (target_rate == pll->vco_param[i].rate)
108 			break;
109 
110 	if (i >= pll->num_vco_entries)
111 		return -EINVAL;
112 
113 	return i;
114 }
115 
116 static int get_kp(unsigned long ref_freq, enum kp_band kp_index)
117 {
118 	int i;
119 
120 	if (ref_freq < ref_freq_table[0][0])
121 		return -EINVAL;
122 
123 	for (i = 0; i < NUM_FREQ_BANDS; i++) {
124 		if (ref_freq >= ref_freq_table[i][0] &&
125 		    ref_freq < ref_freq_table[i][1])
126 			return kp_table[kp_index][i];
127 	}
128 	return -EINVAL;
129 }
130 
131 static int pll_wait_for_lock(struct iproc_pll *pll)
132 {
133 	int i;
134 	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
135 
136 	for (i = 0; i < LOCK_DELAY; i++) {
137 		u32 val = readl(pll->status_base + ctrl->status.offset);
138 
139 		if (val & (1 << ctrl->status.shift))
140 			return 0;
141 		udelay(10);
142 	}
143 
144 	return -EIO;
145 }
146 
147 static void iproc_pll_write(const struct iproc_pll *pll, void __iomem *base,
148 			    const u32 offset, u32 val)
149 {
150 	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
151 
152 	writel(val, base + offset);
153 
154 	if (unlikely(ctrl->flags & IPROC_CLK_NEEDS_READ_BACK &&
155 		     (base == pll->status_base || base == pll->control_base)))
156 		val = readl(base + offset);
157 }
158 
159 static void __pll_disable(struct iproc_pll *pll)
160 {
161 	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
162 	u32 val;
163 
164 	if (ctrl->flags & IPROC_CLK_PLL_ASIU) {
165 		val = readl(pll->asiu_base + ctrl->asiu.offset);
166 		val &= ~(1 << ctrl->asiu.en_shift);
167 		iproc_pll_write(pll, pll->asiu_base, ctrl->asiu.offset, val);
168 	}
169 
170 	if (ctrl->flags & IPROC_CLK_EMBED_PWRCTRL) {
171 		val = readl(pll->control_base + ctrl->aon.offset);
172 		val |= bit_mask(ctrl->aon.pwr_width) << ctrl->aon.pwr_shift;
173 		iproc_pll_write(pll, pll->control_base, ctrl->aon.offset, val);
174 	}
175 
176 	if (pll->pwr_base) {
177 		/* latch input value so core power can be shut down */
178 		val = readl(pll->pwr_base + ctrl->aon.offset);
179 		val |= 1 << ctrl->aon.iso_shift;
180 		iproc_pll_write(pll, pll->pwr_base, ctrl->aon.offset, val);
181 
182 		/* power down the core */
183 		val &= ~(bit_mask(ctrl->aon.pwr_width) << ctrl->aon.pwr_shift);
184 		iproc_pll_write(pll, pll->pwr_base, ctrl->aon.offset, val);
185 	}
186 }
187 
188 static int __pll_enable(struct iproc_pll *pll)
189 {
190 	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
191 	u32 val;
192 
193 	if (ctrl->flags & IPROC_CLK_EMBED_PWRCTRL) {
194 		val = readl(pll->control_base + ctrl->aon.offset);
195 		val &= ~(bit_mask(ctrl->aon.pwr_width) << ctrl->aon.pwr_shift);
196 		iproc_pll_write(pll, pll->control_base, ctrl->aon.offset, val);
197 	}
198 
199 	if (pll->pwr_base) {
200 		/* power up the PLL and make sure it's not latched */
201 		val = readl(pll->pwr_base + ctrl->aon.offset);
202 		val |= bit_mask(ctrl->aon.pwr_width) << ctrl->aon.pwr_shift;
203 		val &= ~(1 << ctrl->aon.iso_shift);
204 		iproc_pll_write(pll, pll->pwr_base, ctrl->aon.offset, val);
205 	}
206 
207 	/* certain PLLs also need to be ungated from the ASIU top level */
208 	if (ctrl->flags & IPROC_CLK_PLL_ASIU) {
209 		val = readl(pll->asiu_base + ctrl->asiu.offset);
210 		val |= (1 << ctrl->asiu.en_shift);
211 		iproc_pll_write(pll, pll->asiu_base, ctrl->asiu.offset, val);
212 	}
213 
214 	return 0;
215 }
216 
217 static void __pll_put_in_reset(struct iproc_pll *pll)
218 {
219 	u32 val;
220 	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
221 	const struct iproc_pll_reset_ctrl *reset = &ctrl->reset;
222 
223 	val = readl(pll->control_base + reset->offset);
224 	if (ctrl->flags & IPROC_CLK_PLL_RESET_ACTIVE_LOW)
225 		val |= BIT(reset->reset_shift) | BIT(reset->p_reset_shift);
226 	else
227 		val &= ~(BIT(reset->reset_shift) | BIT(reset->p_reset_shift));
228 	iproc_pll_write(pll, pll->control_base, reset->offset, val);
229 }
230 
231 static void __pll_bring_out_reset(struct iproc_pll *pll, unsigned int kp,
232 				  unsigned int ka, unsigned int ki)
233 {
234 	u32 val;
235 	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
236 	const struct iproc_pll_reset_ctrl *reset = &ctrl->reset;
237 	const struct iproc_pll_dig_filter_ctrl *dig_filter = &ctrl->dig_filter;
238 
239 	val = readl(pll->control_base + dig_filter->offset);
240 	val &= ~(bit_mask(dig_filter->ki_width) << dig_filter->ki_shift |
241 		bit_mask(dig_filter->kp_width) << dig_filter->kp_shift |
242 		bit_mask(dig_filter->ka_width) << dig_filter->ka_shift);
243 	val |= ki << dig_filter->ki_shift | kp << dig_filter->kp_shift |
244 	       ka << dig_filter->ka_shift;
245 	iproc_pll_write(pll, pll->control_base, dig_filter->offset, val);
246 
247 	val = readl(pll->control_base + reset->offset);
248 	if (ctrl->flags & IPROC_CLK_PLL_RESET_ACTIVE_LOW)
249 		val &= ~(BIT(reset->reset_shift) | BIT(reset->p_reset_shift));
250 	else
251 		val |= BIT(reset->reset_shift) | BIT(reset->p_reset_shift);
252 	iproc_pll_write(pll, pll->control_base, reset->offset, val);
253 }
254 
255 static int pll_set_rate(struct iproc_clk *clk, unsigned int rate_index,
256 			unsigned long parent_rate)
257 {
258 	struct iproc_pll *pll = clk->pll;
259 	const struct iproc_pll_vco_param *vco = &pll->vco_param[rate_index];
260 	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
261 	int ka = 0, ki, kp, ret;
262 	unsigned long rate = vco->rate;
263 	u32 val;
264 	enum kp_band kp_index;
265 	unsigned long ref_freq;
266 
267 	/*
268 	 * reference frequency = parent frequency / PDIV
269 	 * If PDIV = 0, then it becomes a multiplier (x2)
270 	 */
271 	if (vco->pdiv == 0)
272 		ref_freq = parent_rate * 2;
273 	else
274 		ref_freq = parent_rate / vco->pdiv;
275 
276 	/* determine Ki and Kp index based on target VCO frequency */
277 	if (rate >= VCO_LOW && rate < VCO_HIGH) {
278 		ki = 4;
279 		kp_index = KP_BAND_MID;
280 	} else if (rate >= VCO_HIGH && rate && rate < VCO_HIGH_HIGH) {
281 		ki = 3;
282 		kp_index = KP_BAND_HIGH;
283 	} else if (rate >= VCO_HIGH_HIGH && rate < VCO_MAX) {
284 		ki = 3;
285 		kp_index = KP_BAND_HIGH_HIGH;
286 	} else {
287 		pr_err("%s: pll: %s has invalid rate: %lu\n", __func__,
288 				clk->name, rate);
289 		return -EINVAL;
290 	}
291 
292 	kp = get_kp(ref_freq, kp_index);
293 	if (kp < 0) {
294 		pr_err("%s: pll: %s has invalid kp\n", __func__, clk->name);
295 		return kp;
296 	}
297 
298 	ret = __pll_enable(pll);
299 	if (ret) {
300 		pr_err("%s: pll: %s fails to enable\n", __func__, clk->name);
301 		return ret;
302 	}
303 
304 	/* put PLL in reset */
305 	__pll_put_in_reset(pll);
306 
307 	/* set PLL in user mode before modifying PLL controls */
308 	if (ctrl->flags & IPROC_CLK_PLL_USER_MODE_ON) {
309 		val = readl(pll->control_base + ctrl->macro_mode.offset);
310 		val &= ~(bit_mask(ctrl->macro_mode.width) <<
311 			ctrl->macro_mode.shift);
312 		val |= PLL_USER_MODE << ctrl->macro_mode.shift;
313 		iproc_pll_write(pll, pll->control_base,
314 			ctrl->macro_mode.offset, val);
315 	}
316 
317 	iproc_pll_write(pll, pll->control_base, ctrl->vco_ctrl.u_offset, 0);
318 
319 	val = readl(pll->control_base + ctrl->vco_ctrl.l_offset);
320 
321 	if (rate >= VCO_LOW && rate < VCO_MID)
322 		val |= (1 << PLL_VCO_LOW_SHIFT);
323 
324 	if (rate < VCO_HIGH)
325 		val &= ~(1 << PLL_VCO_HIGH_SHIFT);
326 	else
327 		val |= (1 << PLL_VCO_HIGH_SHIFT);
328 
329 	iproc_pll_write(pll, pll->control_base, ctrl->vco_ctrl.l_offset, val);
330 
331 	/* program integer part of NDIV */
332 	val = readl(pll->control_base + ctrl->ndiv_int.offset);
333 	val &= ~(bit_mask(ctrl->ndiv_int.width) << ctrl->ndiv_int.shift);
334 	val |= vco->ndiv_int << ctrl->ndiv_int.shift;
335 	iproc_pll_write(pll, pll->control_base, ctrl->ndiv_int.offset, val);
336 
337 	/* program fractional part of NDIV */
338 	if (ctrl->flags & IPROC_CLK_PLL_HAS_NDIV_FRAC) {
339 		val = readl(pll->control_base + ctrl->ndiv_frac.offset);
340 		val &= ~(bit_mask(ctrl->ndiv_frac.width) <<
341 			 ctrl->ndiv_frac.shift);
342 		val |= vco->ndiv_frac << ctrl->ndiv_frac.shift;
343 		iproc_pll_write(pll, pll->control_base, ctrl->ndiv_frac.offset,
344 				val);
345 	}
346 
347 	/* program PDIV */
348 	val = readl(pll->control_base + ctrl->pdiv.offset);
349 	val &= ~(bit_mask(ctrl->pdiv.width) << ctrl->pdiv.shift);
350 	val |= vco->pdiv << ctrl->pdiv.shift;
351 	iproc_pll_write(pll, pll->control_base, ctrl->pdiv.offset, val);
352 
353 	__pll_bring_out_reset(pll, kp, ka, ki);
354 
355 	ret = pll_wait_for_lock(pll);
356 	if (ret < 0) {
357 		pr_err("%s: pll: %s failed to lock\n", __func__, clk->name);
358 		return ret;
359 	}
360 
361 	return 0;
362 }
363 
364 static int iproc_pll_enable(struct clk_hw *hw)
365 {
366 	struct iproc_clk *clk = to_iproc_clk(hw);
367 	struct iproc_pll *pll = clk->pll;
368 
369 	return __pll_enable(pll);
370 }
371 
372 static void iproc_pll_disable(struct clk_hw *hw)
373 {
374 	struct iproc_clk *clk = to_iproc_clk(hw);
375 	struct iproc_pll *pll = clk->pll;
376 	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
377 
378 	if (ctrl->flags & IPROC_CLK_AON)
379 		return;
380 
381 	__pll_disable(pll);
382 }
383 
384 static unsigned long iproc_pll_recalc_rate(struct clk_hw *hw,
385 					   unsigned long parent_rate)
386 {
387 	struct iproc_clk *clk = to_iproc_clk(hw);
388 	struct iproc_pll *pll = clk->pll;
389 	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
390 	u32 val;
391 	u64 ndiv, ndiv_int, ndiv_frac;
392 	unsigned int pdiv;
393 
394 	if (parent_rate == 0)
395 		return 0;
396 
397 	/* PLL needs to be locked */
398 	val = readl(pll->status_base + ctrl->status.offset);
399 	if ((val & (1 << ctrl->status.shift)) == 0) {
400 		clk->rate = 0;
401 		return 0;
402 	}
403 
404 	/*
405 	 * PLL output frequency =
406 	 *
407 	 * ((ndiv_int + ndiv_frac / 2^20) * (parent clock rate / pdiv)
408 	 */
409 	val = readl(pll->control_base + ctrl->ndiv_int.offset);
410 	ndiv_int = (val >> ctrl->ndiv_int.shift) &
411 		bit_mask(ctrl->ndiv_int.width);
412 	ndiv = ndiv_int << 20;
413 
414 	if (ctrl->flags & IPROC_CLK_PLL_HAS_NDIV_FRAC) {
415 		val = readl(pll->control_base + ctrl->ndiv_frac.offset);
416 		ndiv_frac = (val >> ctrl->ndiv_frac.shift) &
417 			bit_mask(ctrl->ndiv_frac.width);
418 		ndiv += ndiv_frac;
419 	}
420 
421 	val = readl(pll->control_base + ctrl->pdiv.offset);
422 	pdiv = (val >> ctrl->pdiv.shift) & bit_mask(ctrl->pdiv.width);
423 
424 	clk->rate = (ndiv * parent_rate) >> 20;
425 
426 	if (pdiv == 0)
427 		clk->rate *= 2;
428 	else
429 		clk->rate /= pdiv;
430 
431 	return clk->rate;
432 }
433 
434 static long iproc_pll_round_rate(struct clk_hw *hw, unsigned long rate,
435 				 unsigned long *parent_rate)
436 {
437 	unsigned i;
438 	struct iproc_clk *clk = to_iproc_clk(hw);
439 	struct iproc_pll *pll = clk->pll;
440 
441 	if (rate == 0 || *parent_rate == 0 || !pll->vco_param)
442 		return -EINVAL;
443 
444 	for (i = 0; i < pll->num_vco_entries; i++) {
445 		if (rate <= pll->vco_param[i].rate)
446 			break;
447 	}
448 
449 	if (i == pll->num_vco_entries)
450 		i--;
451 
452 	return pll->vco_param[i].rate;
453 }
454 
455 static int iproc_pll_set_rate(struct clk_hw *hw, unsigned long rate,
456 		unsigned long parent_rate)
457 {
458 	struct iproc_clk *clk = to_iproc_clk(hw);
459 	struct iproc_pll *pll = clk->pll;
460 	int rate_index, ret;
461 
462 	rate_index = pll_get_rate_index(pll, rate);
463 	if (rate_index < 0)
464 		return rate_index;
465 
466 	ret = pll_set_rate(clk, rate_index, parent_rate);
467 	return ret;
468 }
469 
470 static const struct clk_ops iproc_pll_ops = {
471 	.enable = iproc_pll_enable,
472 	.disable = iproc_pll_disable,
473 	.recalc_rate = iproc_pll_recalc_rate,
474 	.round_rate = iproc_pll_round_rate,
475 	.set_rate = iproc_pll_set_rate,
476 };
477 
478 static int iproc_clk_enable(struct clk_hw *hw)
479 {
480 	struct iproc_clk *clk = to_iproc_clk(hw);
481 	const struct iproc_clk_ctrl *ctrl = clk->ctrl;
482 	struct iproc_pll *pll = clk->pll;
483 	u32 val;
484 
485 	/* channel enable is active low */
486 	val = readl(pll->control_base + ctrl->enable.offset);
487 	val &= ~(1 << ctrl->enable.enable_shift);
488 	iproc_pll_write(pll, pll->control_base, ctrl->enable.offset, val);
489 
490 	/* also make sure channel is not held */
491 	val = readl(pll->control_base + ctrl->enable.offset);
492 	val &= ~(1 << ctrl->enable.hold_shift);
493 	iproc_pll_write(pll, pll->control_base, ctrl->enable.offset, val);
494 
495 	return 0;
496 }
497 
498 static void iproc_clk_disable(struct clk_hw *hw)
499 {
500 	struct iproc_clk *clk = to_iproc_clk(hw);
501 	const struct iproc_clk_ctrl *ctrl = clk->ctrl;
502 	struct iproc_pll *pll = clk->pll;
503 	u32 val;
504 
505 	if (ctrl->flags & IPROC_CLK_AON)
506 		return;
507 
508 	val = readl(pll->control_base + ctrl->enable.offset);
509 	val |= 1 << ctrl->enable.enable_shift;
510 	iproc_pll_write(pll, pll->control_base, ctrl->enable.offset, val);
511 }
512 
513 static unsigned long iproc_clk_recalc_rate(struct clk_hw *hw,
514 		unsigned long parent_rate)
515 {
516 	struct iproc_clk *clk = to_iproc_clk(hw);
517 	const struct iproc_clk_ctrl *ctrl = clk->ctrl;
518 	struct iproc_pll *pll = clk->pll;
519 	u32 val;
520 	unsigned int mdiv;
521 
522 	if (parent_rate == 0)
523 		return 0;
524 
525 	val = readl(pll->control_base + ctrl->mdiv.offset);
526 	mdiv = (val >> ctrl->mdiv.shift) & bit_mask(ctrl->mdiv.width);
527 	if (mdiv == 0)
528 		mdiv = 256;
529 
530 	if (ctrl->flags & IPROC_CLK_MCLK_DIV_BY_2)
531 		clk->rate = parent_rate / (mdiv * 2);
532 	else
533 		clk->rate = parent_rate / mdiv;
534 
535 	return clk->rate;
536 }
537 
538 static long iproc_clk_round_rate(struct clk_hw *hw, unsigned long rate,
539 		unsigned long *parent_rate)
540 {
541 	unsigned int div;
542 
543 	if (rate == 0 || *parent_rate == 0)
544 		return -EINVAL;
545 
546 	if (rate == *parent_rate)
547 		return *parent_rate;
548 
549 	div = DIV_ROUND_UP(*parent_rate, rate);
550 	if (div < 2)
551 		return *parent_rate;
552 
553 	if (div > 256)
554 		div = 256;
555 
556 	return *parent_rate / div;
557 }
558 
559 static int iproc_clk_set_rate(struct clk_hw *hw, unsigned long rate,
560 		unsigned long parent_rate)
561 {
562 	struct iproc_clk *clk = to_iproc_clk(hw);
563 	const struct iproc_clk_ctrl *ctrl = clk->ctrl;
564 	struct iproc_pll *pll = clk->pll;
565 	u32 val;
566 	unsigned int div;
567 
568 	if (rate == 0 || parent_rate == 0)
569 		return -EINVAL;
570 
571 	if (ctrl->flags & IPROC_CLK_MCLK_DIV_BY_2)
572 		div = DIV_ROUND_UP(parent_rate, rate * 2);
573 	else
574 		div = DIV_ROUND_UP(parent_rate, rate);
575 	if (div > 256)
576 		return -EINVAL;
577 
578 	val = readl(pll->control_base + ctrl->mdiv.offset);
579 	if (div == 256) {
580 		val &= ~(bit_mask(ctrl->mdiv.width) << ctrl->mdiv.shift);
581 	} else {
582 		val &= ~(bit_mask(ctrl->mdiv.width) << ctrl->mdiv.shift);
583 		val |= div << ctrl->mdiv.shift;
584 	}
585 	iproc_pll_write(pll, pll->control_base, ctrl->mdiv.offset, val);
586 	if (ctrl->flags & IPROC_CLK_MCLK_DIV_BY_2)
587 		clk->rate = parent_rate / (div * 2);
588 	else
589 		clk->rate = parent_rate / div;
590 
591 	return 0;
592 }
593 
594 static const struct clk_ops iproc_clk_ops = {
595 	.enable = iproc_clk_enable,
596 	.disable = iproc_clk_disable,
597 	.recalc_rate = iproc_clk_recalc_rate,
598 	.round_rate = iproc_clk_round_rate,
599 	.set_rate = iproc_clk_set_rate,
600 };
601 
602 /**
603  * Some PLLs require the PLL SW override bit to be set before changes can be
604  * applied to the PLL
605  */
606 static void iproc_pll_sw_cfg(struct iproc_pll *pll)
607 {
608 	const struct iproc_pll_ctrl *ctrl = pll->ctrl;
609 
610 	if (ctrl->flags & IPROC_CLK_PLL_NEEDS_SW_CFG) {
611 		u32 val;
612 
613 		val = readl(pll->control_base + ctrl->sw_ctrl.offset);
614 		val |= BIT(ctrl->sw_ctrl.shift);
615 		iproc_pll_write(pll, pll->control_base, ctrl->sw_ctrl.offset,
616 				val);
617 	}
618 }
619 
620 void __init iproc_pll_clk_setup(struct device_node *node,
621 				const struct iproc_pll_ctrl *pll_ctrl,
622 				const struct iproc_pll_vco_param *vco,
623 				unsigned int num_vco_entries,
624 				const struct iproc_clk_ctrl *clk_ctrl,
625 				unsigned int num_clks)
626 {
627 	int i, ret;
628 	struct iproc_pll *pll;
629 	struct iproc_clk *iclk;
630 	struct clk_init_data init;
631 	const char *parent_name;
632 
633 	if (WARN_ON(!pll_ctrl) || WARN_ON(!clk_ctrl))
634 		return;
635 
636 	pll = kzalloc(sizeof(*pll), GFP_KERNEL);
637 	if (WARN_ON(!pll))
638 		return;
639 
640 	pll->clk_data = kzalloc(sizeof(*pll->clk_data->hws) * num_clks +
641 				sizeof(*pll->clk_data), GFP_KERNEL);
642 	if (WARN_ON(!pll->clk_data))
643 		goto err_clk_data;
644 	pll->clk_data->num = num_clks;
645 
646 	pll->clks = kcalloc(num_clks, sizeof(*pll->clks), GFP_KERNEL);
647 	if (WARN_ON(!pll->clks))
648 		goto err_clks;
649 
650 	pll->control_base = of_iomap(node, 0);
651 	if (WARN_ON(!pll->control_base))
652 		goto err_pll_iomap;
653 
654 	/* Some SoCs do not require the pwr_base, thus failing is not fatal */
655 	pll->pwr_base = of_iomap(node, 1);
656 
657 	/* some PLLs require gating control at the top ASIU level */
658 	if (pll_ctrl->flags & IPROC_CLK_PLL_ASIU) {
659 		pll->asiu_base = of_iomap(node, 2);
660 		if (WARN_ON(!pll->asiu_base))
661 			goto err_asiu_iomap;
662 	}
663 
664 	if (pll_ctrl->flags & IPROC_CLK_PLL_SPLIT_STAT_CTRL) {
665 		/* Some SoCs have a split status/control.  If this does not
666 		 * exist, assume they are unified.
667 		 */
668 		pll->status_base = of_iomap(node, 2);
669 		if (!pll->status_base)
670 			goto err_status_iomap;
671 	} else
672 		pll->status_base = pll->control_base;
673 
674 	/* initialize and register the PLL itself */
675 	pll->ctrl = pll_ctrl;
676 
677 	iclk = &pll->clks[0];
678 	iclk->pll = pll;
679 	iclk->name = node->name;
680 
681 	init.name = node->name;
682 	init.ops = &iproc_pll_ops;
683 	init.flags = 0;
684 	parent_name = of_clk_get_parent_name(node, 0);
685 	init.parent_names = (parent_name ? &parent_name : NULL);
686 	init.num_parents = (parent_name ? 1 : 0);
687 	iclk->hw.init = &init;
688 
689 	if (vco) {
690 		pll->num_vco_entries = num_vco_entries;
691 		pll->vco_param = vco;
692 	}
693 
694 	iproc_pll_sw_cfg(pll);
695 
696 	ret = clk_hw_register(NULL, &iclk->hw);
697 	if (WARN_ON(ret))
698 		goto err_pll_register;
699 
700 	pll->clk_data->hws[0] = &iclk->hw;
701 
702 	/* now initialize and register all leaf clocks */
703 	for (i = 1; i < num_clks; i++) {
704 		const char *clk_name;
705 
706 		memset(&init, 0, sizeof(init));
707 		parent_name = node->name;
708 
709 		ret = of_property_read_string_index(node, "clock-output-names",
710 						    i, &clk_name);
711 		if (WARN_ON(ret))
712 			goto err_clk_register;
713 
714 		iclk = &pll->clks[i];
715 		iclk->name = clk_name;
716 		iclk->pll = pll;
717 		iclk->ctrl = &clk_ctrl[i];
718 
719 		init.name = clk_name;
720 		init.ops = &iproc_clk_ops;
721 		init.flags = 0;
722 		init.parent_names = (parent_name ? &parent_name : NULL);
723 		init.num_parents = (parent_name ? 1 : 0);
724 		iclk->hw.init = &init;
725 
726 		ret = clk_hw_register(NULL, &iclk->hw);
727 		if (WARN_ON(ret))
728 			goto err_clk_register;
729 
730 		pll->clk_data->hws[i] = &iclk->hw;
731 	}
732 
733 	ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
734 				     pll->clk_data);
735 	if (WARN_ON(ret))
736 		goto err_clk_register;
737 
738 	return;
739 
740 err_clk_register:
741 	while (--i >= 0)
742 		clk_hw_unregister(pll->clk_data->hws[i]);
743 
744 err_pll_register:
745 	if (pll->status_base != pll->control_base)
746 		iounmap(pll->status_base);
747 
748 err_status_iomap:
749 	if (pll->asiu_base)
750 		iounmap(pll->asiu_base);
751 
752 err_asiu_iomap:
753 	if (pll->pwr_base)
754 		iounmap(pll->pwr_base);
755 
756 	iounmap(pll->control_base);
757 
758 err_pll_iomap:
759 	kfree(pll->clks);
760 
761 err_clks:
762 	kfree(pll->clk_data);
763 
764 err_clk_data:
765 	kfree(pll);
766 }
767