1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2019 Microchip Technology Inc.
7 #include <linux/bitfield.h>
8 #include <linux/clk-provider.h>
9 #include <linux/clkdev.h>
10 #include <linux/clk/at91_pmc.h>
12 #include <linux/mfd/syscon.h>
13 #include <linux/regmap.h>
17 #define PMC_PLL_CTRL0_DIV_MSK GENMASK(7, 0)
18 #define PMC_PLL_CTRL1_MUL_MSK GENMASK(31, 24)
19 #define PMC_PLL_CTRL1_FRACR_MSK GENMASK(21, 0)
21 #define PLL_DIV_MAX (FIELD_GET(PMC_PLL_CTRL0_DIV_MSK, UINT_MAX) + 1)
23 #define PLL_MUL_MAX (FIELD_GET(PMC_PLL_CTRL1_MUL_MSK, UINT_MAX) + 1)
25 #define FCORE_MIN (600000000)
26 #define FCORE_MAX (1200000000)
30 struct sam9x60_pll_core
{
31 struct regmap
*regmap
;
33 const struct clk_pll_characteristics
*characteristics
;
34 const struct clk_pll_layout
*layout
;
40 struct sam9x60_pll_core core
;
46 struct sam9x60_pll_core core
;
50 #define to_sam9x60_pll_core(hw) container_of(hw, struct sam9x60_pll_core, hw)
51 #define to_sam9x60_frac(core) container_of(core, struct sam9x60_frac, core)
52 #define to_sam9x60_div(core) container_of(core, struct sam9x60_div, core)
54 static inline bool sam9x60_pll_ready(struct regmap
*regmap
, int id
)
58 regmap_read(regmap
, AT91_PMC_PLL_ISR0
, &status
);
60 return !!(status
& BIT(id
));
63 static bool sam9x60_frac_pll_ready(struct regmap
*regmap
, u8 id
)
65 return sam9x60_pll_ready(regmap
, id
);
68 static unsigned long sam9x60_frac_pll_recalc_rate(struct clk_hw
*hw
,
69 unsigned long parent_rate
)
71 struct sam9x60_pll_core
*core
= to_sam9x60_pll_core(hw
);
72 struct sam9x60_frac
*frac
= to_sam9x60_frac(core
);
74 return (parent_rate
* (frac
->mul
+ 1) +
75 ((u64
)parent_rate
* frac
->frac
>> 22));
78 static int sam9x60_frac_pll_prepare(struct clk_hw
*hw
)
80 struct sam9x60_pll_core
*core
= to_sam9x60_pll_core(hw
);
81 struct sam9x60_frac
*frac
= to_sam9x60_frac(core
);
82 struct regmap
*regmap
= core
->regmap
;
83 unsigned int val
, cfrac
, cmul
;
86 spin_lock_irqsave(core
->lock
, flags
);
88 regmap_update_bits(regmap
, AT91_PMC_PLL_UPDT
,
89 AT91_PMC_PLL_UPDT_ID_MSK
, core
->id
);
90 regmap_read(regmap
, AT91_PMC_PLL_CTRL1
, &val
);
91 cmul
= (val
& core
->layout
->mul_mask
) >> core
->layout
->mul_shift
;
92 cfrac
= (val
& core
->layout
->frac_mask
) >> core
->layout
->frac_shift
;
94 if (sam9x60_frac_pll_ready(regmap
, core
->id
) &&
95 (cmul
== frac
->mul
&& cfrac
== frac
->frac
))
98 /* Recommended value for PMC_PLL_ACR */
99 if (core
->characteristics
->upll
)
100 val
= AT91_PMC_PLL_ACR_DEFAULT_UPLL
;
102 val
= AT91_PMC_PLL_ACR_DEFAULT_PLLA
;
103 regmap_write(regmap
, AT91_PMC_PLL_ACR
, val
);
105 regmap_write(regmap
, AT91_PMC_PLL_CTRL1
,
106 (frac
->mul
<< core
->layout
->mul_shift
) |
107 (frac
->frac
<< core
->layout
->frac_shift
));
109 if (core
->characteristics
->upll
) {
110 /* Enable the UTMI internal bandgap */
111 val
|= AT91_PMC_PLL_ACR_UTMIBG
;
112 regmap_write(regmap
, AT91_PMC_PLL_ACR
, val
);
116 /* Enable the UTMI internal regulator */
117 val
|= AT91_PMC_PLL_ACR_UTMIVR
;
118 regmap_write(regmap
, AT91_PMC_PLL_ACR
, val
);
123 regmap_update_bits(regmap
, AT91_PMC_PLL_UPDT
,
124 AT91_PMC_PLL_UPDT_UPDATE
| AT91_PMC_PLL_UPDT_ID_MSK
,
125 AT91_PMC_PLL_UPDT_UPDATE
| core
->id
);
127 regmap_update_bits(regmap
, AT91_PMC_PLL_CTRL0
,
128 AT91_PMC_PLL_CTRL0_ENLOCK
| AT91_PMC_PLL_CTRL0_ENPLL
,
129 AT91_PMC_PLL_CTRL0_ENLOCK
| AT91_PMC_PLL_CTRL0_ENPLL
);
131 regmap_update_bits(regmap
, AT91_PMC_PLL_UPDT
,
132 AT91_PMC_PLL_UPDT_UPDATE
| AT91_PMC_PLL_UPDT_ID_MSK
,
133 AT91_PMC_PLL_UPDT_UPDATE
| core
->id
);
135 while (!sam9x60_pll_ready(regmap
, core
->id
))
139 spin_unlock_irqrestore(core
->lock
, flags
);
144 static void sam9x60_frac_pll_unprepare(struct clk_hw
*hw
)
146 struct sam9x60_pll_core
*core
= to_sam9x60_pll_core(hw
);
147 struct regmap
*regmap
= core
->regmap
;
150 spin_lock_irqsave(core
->lock
, flags
);
152 regmap_update_bits(regmap
, AT91_PMC_PLL_UPDT
,
153 AT91_PMC_PLL_UPDT_ID_MSK
, core
->id
);
155 regmap_update_bits(regmap
, AT91_PMC_PLL_CTRL0
, AT91_PMC_PLL_CTRL0_ENPLL
, 0);
157 if (core
->characteristics
->upll
)
158 regmap_update_bits(regmap
, AT91_PMC_PLL_ACR
,
159 AT91_PMC_PLL_ACR_UTMIBG
| AT91_PMC_PLL_ACR_UTMIVR
, 0);
161 regmap_update_bits(regmap
, AT91_PMC_PLL_UPDT
,
162 AT91_PMC_PLL_UPDT_UPDATE
| AT91_PMC_PLL_UPDT_ID_MSK
,
163 AT91_PMC_PLL_UPDT_UPDATE
| core
->id
);
165 spin_unlock_irqrestore(core
->lock
, flags
);
168 static int sam9x60_frac_pll_is_prepared(struct clk_hw
*hw
)
170 struct sam9x60_pll_core
*core
= to_sam9x60_pll_core(hw
);
172 return sam9x60_pll_ready(core
->regmap
, core
->id
);
175 static long sam9x60_frac_pll_compute_mul_frac(struct sam9x60_pll_core
*core
,
177 unsigned long parent_rate
,
180 struct sam9x60_frac
*frac
= to_sam9x60_frac(core
);
181 unsigned long tmprate
, remainder
;
182 unsigned long nmul
= 0;
183 unsigned long nfrac
= 0;
185 if (rate
< FCORE_MIN
|| rate
> FCORE_MAX
)
189 * Calculate the multiplier associated with the current
190 * divider that provide the closest rate to the requested one.
192 nmul
= mult_frac(rate
, 1, parent_rate
);
193 tmprate
= mult_frac(parent_rate
, nmul
, 1);
194 remainder
= rate
- tmprate
;
197 nfrac
= DIV_ROUND_CLOSEST_ULL((u64
)remainder
* (1 << 22),
200 tmprate
+= DIV_ROUND_CLOSEST_ULL((u64
)nfrac
* parent_rate
,
204 /* Check if resulted rate is a valid. */
205 if (tmprate
< FCORE_MIN
|| tmprate
> FCORE_MAX
)
209 frac
->mul
= nmul
- 1;
216 static long sam9x60_frac_pll_round_rate(struct clk_hw
*hw
, unsigned long rate
,
217 unsigned long *parent_rate
)
219 struct sam9x60_pll_core
*core
= to_sam9x60_pll_core(hw
);
221 return sam9x60_frac_pll_compute_mul_frac(core
, rate
, *parent_rate
, false);
224 static int sam9x60_frac_pll_set_rate(struct clk_hw
*hw
, unsigned long rate
,
225 unsigned long parent_rate
)
227 struct sam9x60_pll_core
*core
= to_sam9x60_pll_core(hw
);
229 return sam9x60_frac_pll_compute_mul_frac(core
, rate
, parent_rate
, true);
232 static int sam9x60_frac_pll_set_rate_chg(struct clk_hw
*hw
, unsigned long rate
,
233 unsigned long parent_rate
)
235 struct sam9x60_pll_core
*core
= to_sam9x60_pll_core(hw
);
236 struct sam9x60_frac
*frac
= to_sam9x60_frac(core
);
237 struct regmap
*regmap
= core
->regmap
;
238 unsigned long irqflags
;
239 unsigned int val
, cfrac
, cmul
;
242 ret
= sam9x60_frac_pll_compute_mul_frac(core
, rate
, parent_rate
, true);
246 spin_lock_irqsave(core
->lock
, irqflags
);
248 regmap_update_bits(regmap
, AT91_PMC_PLL_UPDT
, AT91_PMC_PLL_UPDT_ID_MSK
,
250 regmap_read(regmap
, AT91_PMC_PLL_CTRL1
, &val
);
251 cmul
= (val
& core
->layout
->mul_mask
) >> core
->layout
->mul_shift
;
252 cfrac
= (val
& core
->layout
->frac_mask
) >> core
->layout
->frac_shift
;
254 if (cmul
== frac
->mul
&& cfrac
== frac
->frac
)
257 regmap_write(regmap
, AT91_PMC_PLL_CTRL1
,
258 (frac
->mul
<< core
->layout
->mul_shift
) |
259 (frac
->frac
<< core
->layout
->frac_shift
));
261 regmap_update_bits(regmap
, AT91_PMC_PLL_UPDT
,
262 AT91_PMC_PLL_UPDT_UPDATE
| AT91_PMC_PLL_UPDT_ID_MSK
,
263 AT91_PMC_PLL_UPDT_UPDATE
| core
->id
);
265 regmap_update_bits(regmap
, AT91_PMC_PLL_CTRL0
,
266 AT91_PMC_PLL_CTRL0_ENLOCK
| AT91_PMC_PLL_CTRL0_ENPLL
,
267 AT91_PMC_PLL_CTRL0_ENLOCK
|
268 AT91_PMC_PLL_CTRL0_ENPLL
);
270 regmap_update_bits(regmap
, AT91_PMC_PLL_UPDT
,
271 AT91_PMC_PLL_UPDT_UPDATE
| AT91_PMC_PLL_UPDT_ID_MSK
,
272 AT91_PMC_PLL_UPDT_UPDATE
| core
->id
);
274 while (!sam9x60_pll_ready(regmap
, core
->id
))
278 spin_unlock_irqrestore(core
->lock
, irqflags
);
283 static const struct clk_ops sam9x60_frac_pll_ops
= {
284 .prepare
= sam9x60_frac_pll_prepare
,
285 .unprepare
= sam9x60_frac_pll_unprepare
,
286 .is_prepared
= sam9x60_frac_pll_is_prepared
,
287 .recalc_rate
= sam9x60_frac_pll_recalc_rate
,
288 .round_rate
= sam9x60_frac_pll_round_rate
,
289 .set_rate
= sam9x60_frac_pll_set_rate
,
292 static const struct clk_ops sam9x60_frac_pll_ops_chg
= {
293 .prepare
= sam9x60_frac_pll_prepare
,
294 .unprepare
= sam9x60_frac_pll_unprepare
,
295 .is_prepared
= sam9x60_frac_pll_is_prepared
,
296 .recalc_rate
= sam9x60_frac_pll_recalc_rate
,
297 .round_rate
= sam9x60_frac_pll_round_rate
,
298 .set_rate
= sam9x60_frac_pll_set_rate_chg
,
301 static int sam9x60_div_pll_prepare(struct clk_hw
*hw
)
303 struct sam9x60_pll_core
*core
= to_sam9x60_pll_core(hw
);
304 struct sam9x60_div
*div
= to_sam9x60_div(core
);
305 struct regmap
*regmap
= core
->regmap
;
307 unsigned int val
, cdiv
;
309 spin_lock_irqsave(core
->lock
, flags
);
310 regmap_update_bits(regmap
, AT91_PMC_PLL_UPDT
,
311 AT91_PMC_PLL_UPDT_ID_MSK
, core
->id
);
312 regmap_read(regmap
, AT91_PMC_PLL_CTRL0
, &val
);
313 cdiv
= (val
& core
->layout
->div_mask
) >> core
->layout
->div_shift
;
315 /* Stop if enabled an nothing changed. */
316 if (!!(val
& core
->layout
->endiv_mask
) && cdiv
== div
->div
)
319 regmap_update_bits(regmap
, AT91_PMC_PLL_CTRL0
,
320 core
->layout
->div_mask
| core
->layout
->endiv_mask
,
321 (div
->div
<< core
->layout
->div_shift
) |
322 (1 << core
->layout
->endiv_shift
));
324 regmap_update_bits(regmap
, AT91_PMC_PLL_UPDT
,
325 AT91_PMC_PLL_UPDT_UPDATE
| AT91_PMC_PLL_UPDT_ID_MSK
,
326 AT91_PMC_PLL_UPDT_UPDATE
| core
->id
);
328 while (!sam9x60_pll_ready(regmap
, core
->id
))
332 spin_unlock_irqrestore(core
->lock
, flags
);
337 static void sam9x60_div_pll_unprepare(struct clk_hw
*hw
)
339 struct sam9x60_pll_core
*core
= to_sam9x60_pll_core(hw
);
340 struct regmap
*regmap
= core
->regmap
;
343 spin_lock_irqsave(core
->lock
, flags
);
345 regmap_update_bits(regmap
, AT91_PMC_PLL_UPDT
,
346 AT91_PMC_PLL_UPDT_ID_MSK
, core
->id
);
348 regmap_update_bits(regmap
, AT91_PMC_PLL_CTRL0
,
349 core
->layout
->endiv_mask
, 0);
351 regmap_update_bits(regmap
, AT91_PMC_PLL_UPDT
,
352 AT91_PMC_PLL_UPDT_UPDATE
| AT91_PMC_PLL_UPDT_ID_MSK
,
353 AT91_PMC_PLL_UPDT_UPDATE
| core
->id
);
355 spin_unlock_irqrestore(core
->lock
, flags
);
358 static int sam9x60_div_pll_is_prepared(struct clk_hw
*hw
)
360 struct sam9x60_pll_core
*core
= to_sam9x60_pll_core(hw
);
361 struct regmap
*regmap
= core
->regmap
;
365 spin_lock_irqsave(core
->lock
, flags
);
367 regmap_update_bits(regmap
, AT91_PMC_PLL_UPDT
,
368 AT91_PMC_PLL_UPDT_ID_MSK
, core
->id
);
369 regmap_read(regmap
, AT91_PMC_PLL_CTRL0
, &val
);
371 spin_unlock_irqrestore(core
->lock
, flags
);
373 return !!(val
& core
->layout
->endiv_mask
);
376 static unsigned long sam9x60_div_pll_recalc_rate(struct clk_hw
*hw
,
377 unsigned long parent_rate
)
379 struct sam9x60_pll_core
*core
= to_sam9x60_pll_core(hw
);
380 struct sam9x60_div
*div
= to_sam9x60_div(core
);
382 return DIV_ROUND_CLOSEST_ULL(parent_rate
, (div
->div
+ 1));
385 static long sam9x60_div_pll_compute_div(struct sam9x60_pll_core
*core
,
386 unsigned long *parent_rate
,
389 const struct clk_pll_characteristics
*characteristics
=
390 core
->characteristics
;
391 struct clk_hw
*parent
= clk_hw_get_parent(&core
->hw
);
392 unsigned long tmp_rate
, tmp_parent_rate
, tmp_diff
;
393 long best_diff
= -1, best_rate
= -EINVAL
;
399 if (rate
< characteristics
->output
[0].min
||
400 rate
> characteristics
->output
[0].max
)
403 for (divid
= 1; divid
< core
->layout
->div_mask
; divid
++) {
404 tmp_parent_rate
= clk_hw_round_rate(parent
, rate
* divid
);
405 if (!tmp_parent_rate
)
408 tmp_rate
= DIV_ROUND_CLOSEST_ULL(tmp_parent_rate
, divid
);
409 tmp_diff
= abs(rate
- tmp_rate
);
411 if (best_diff
< 0 || best_diff
> tmp_diff
) {
412 *parent_rate
= tmp_parent_rate
;
413 best_rate
= tmp_rate
;
414 best_diff
= tmp_diff
;
421 if (best_rate
< characteristics
->output
[0].min
||
422 best_rate
> characteristics
->output
[0].max
)
428 static long sam9x60_div_pll_round_rate(struct clk_hw
*hw
, unsigned long rate
,
429 unsigned long *parent_rate
)
431 struct sam9x60_pll_core
*core
= to_sam9x60_pll_core(hw
);
433 return sam9x60_div_pll_compute_div(core
, parent_rate
, rate
);
436 static int sam9x60_div_pll_set_rate(struct clk_hw
*hw
, unsigned long rate
,
437 unsigned long parent_rate
)
439 struct sam9x60_pll_core
*core
= to_sam9x60_pll_core(hw
);
440 struct sam9x60_div
*div
= to_sam9x60_div(core
);
442 div
->div
= DIV_ROUND_CLOSEST(parent_rate
, rate
) - 1;
447 static int sam9x60_div_pll_set_rate_chg(struct clk_hw
*hw
, unsigned long rate
,
448 unsigned long parent_rate
)
450 struct sam9x60_pll_core
*core
= to_sam9x60_pll_core(hw
);
451 struct sam9x60_div
*div
= to_sam9x60_div(core
);
452 struct regmap
*regmap
= core
->regmap
;
453 unsigned long irqflags
;
454 unsigned int val
, cdiv
;
456 div
->div
= DIV_ROUND_CLOSEST(parent_rate
, rate
) - 1;
458 spin_lock_irqsave(core
->lock
, irqflags
);
459 regmap_update_bits(regmap
, AT91_PMC_PLL_UPDT
, AT91_PMC_PLL_UPDT_ID_MSK
,
461 regmap_read(regmap
, AT91_PMC_PLL_CTRL0
, &val
);
462 cdiv
= (val
& core
->layout
->div_mask
) >> core
->layout
->div_shift
;
464 /* Stop if nothing changed. */
465 if (cdiv
== div
->div
)
468 regmap_update_bits(regmap
, AT91_PMC_PLL_CTRL0
,
469 core
->layout
->div_mask
,
470 (div
->div
<< core
->layout
->div_shift
));
472 regmap_update_bits(regmap
, AT91_PMC_PLL_UPDT
,
473 AT91_PMC_PLL_UPDT_UPDATE
| AT91_PMC_PLL_UPDT_ID_MSK
,
474 AT91_PMC_PLL_UPDT_UPDATE
| core
->id
);
476 while (!sam9x60_pll_ready(regmap
, core
->id
))
480 spin_unlock_irqrestore(core
->lock
, irqflags
);
485 static const struct clk_ops sam9x60_div_pll_ops
= {
486 .prepare
= sam9x60_div_pll_prepare
,
487 .unprepare
= sam9x60_div_pll_unprepare
,
488 .is_prepared
= sam9x60_div_pll_is_prepared
,
489 .recalc_rate
= sam9x60_div_pll_recalc_rate
,
490 .round_rate
= sam9x60_div_pll_round_rate
,
491 .set_rate
= sam9x60_div_pll_set_rate
,
494 static const struct clk_ops sam9x60_div_pll_ops_chg
= {
495 .prepare
= sam9x60_div_pll_prepare
,
496 .unprepare
= sam9x60_div_pll_unprepare
,
497 .is_prepared
= sam9x60_div_pll_is_prepared
,
498 .recalc_rate
= sam9x60_div_pll_recalc_rate
,
499 .round_rate
= sam9x60_div_pll_round_rate
,
500 .set_rate
= sam9x60_div_pll_set_rate_chg
,
503 struct clk_hw
* __init
504 sam9x60_clk_register_frac_pll(struct regmap
*regmap
, spinlock_t
*lock
,
505 const char *name
, const char *parent_name
,
506 struct clk_hw
*parent_hw
, u8 id
,
507 const struct clk_pll_characteristics
*characteristics
,
508 const struct clk_pll_layout
*layout
, u32 flags
)
510 struct sam9x60_frac
*frac
;
512 struct clk_init_data init
;
513 unsigned long parent_rate
, irqflags
;
517 if (id
> PLL_MAX_ID
|| !lock
|| !parent_hw
)
518 return ERR_PTR(-EINVAL
);
520 frac
= kzalloc(sizeof(*frac
), GFP_KERNEL
);
522 return ERR_PTR(-ENOMEM
);
525 init
.parent_names
= &parent_name
;
526 init
.num_parents
= 1;
527 if (flags
& CLK_SET_RATE_GATE
)
528 init
.ops
= &sam9x60_frac_pll_ops
;
530 init
.ops
= &sam9x60_frac_pll_ops_chg
;
535 frac
->core
.hw
.init
= &init
;
536 frac
->core
.characteristics
= characteristics
;
537 frac
->core
.layout
= layout
;
538 frac
->core
.regmap
= regmap
;
539 frac
->core
.lock
= lock
;
541 spin_lock_irqsave(frac
->core
.lock
, irqflags
);
542 if (sam9x60_pll_ready(regmap
, id
)) {
543 regmap_update_bits(regmap
, AT91_PMC_PLL_UPDT
,
544 AT91_PMC_PLL_UPDT_ID_MSK
, id
);
545 regmap_read(regmap
, AT91_PMC_PLL_CTRL1
, &val
);
546 frac
->mul
= FIELD_GET(PMC_PLL_CTRL1_MUL_MSK
, val
);
547 frac
->frac
= FIELD_GET(PMC_PLL_CTRL1_FRACR_MSK
, val
);
550 * This means the PLL is not setup by bootloaders. In this
551 * case we need to set the minimum rate for it. Otherwise
552 * a clock child of this PLL may be enabled before setting
553 * its rate leading to enabling this PLL with unsupported
554 * rate. This will lead to PLL not being locked at all.
556 parent_rate
= clk_hw_get_rate(parent_hw
);
558 hw
= ERR_PTR(-EINVAL
);
562 ret
= sam9x60_frac_pll_compute_mul_frac(&frac
->core
, FCORE_MIN
,
569 spin_unlock_irqrestore(frac
->core
.lock
, irqflags
);
572 ret
= clk_hw_register(NULL
, hw
);
581 spin_unlock_irqrestore(frac
->core
.lock
, irqflags
);
586 struct clk_hw
* __init
587 sam9x60_clk_register_div_pll(struct regmap
*regmap
, spinlock_t
*lock
,
588 const char *name
, const char *parent_name
, u8 id
,
589 const struct clk_pll_characteristics
*characteristics
,
590 const struct clk_pll_layout
*layout
, u32 flags
)
592 struct sam9x60_div
*div
;
594 struct clk_init_data init
;
595 unsigned long irqflags
;
599 if (id
> PLL_MAX_ID
|| !lock
)
600 return ERR_PTR(-EINVAL
);
602 div
= kzalloc(sizeof(*div
), GFP_KERNEL
);
604 return ERR_PTR(-ENOMEM
);
607 init
.parent_names
= &parent_name
;
608 init
.num_parents
= 1;
609 if (flags
& CLK_SET_RATE_GATE
)
610 init
.ops
= &sam9x60_div_pll_ops
;
612 init
.ops
= &sam9x60_div_pll_ops_chg
;
616 div
->core
.hw
.init
= &init
;
617 div
->core
.characteristics
= characteristics
;
618 div
->core
.layout
= layout
;
619 div
->core
.regmap
= regmap
;
620 div
->core
.lock
= lock
;
622 spin_lock_irqsave(div
->core
.lock
, irqflags
);
624 regmap_update_bits(regmap
, AT91_PMC_PLL_UPDT
,
625 AT91_PMC_PLL_UPDT_ID_MSK
, id
);
626 regmap_read(regmap
, AT91_PMC_PLL_CTRL0
, &val
);
627 div
->div
= FIELD_GET(PMC_PLL_CTRL0_DIV_MSK
, val
);
629 spin_unlock_irqrestore(div
->core
.lock
, irqflags
);
632 ret
= clk_hw_register(NULL
, hw
);