1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2015, 2018, The Linux Foundation. All rights reserved.
6 #include <linux/kernel.h>
7 #include <linux/export.h>
8 #include <linux/clk-provider.h>
9 #include <linux/regmap.h>
10 #include <linux/delay.h>
12 #include "clk-alpha-pll.h"
15 #define PLL_MODE(p) ((p)->offset + 0x0)
16 # define PLL_OUTCTRL BIT(0)
17 # define PLL_BYPASSNL BIT(1)
18 # define PLL_RESET_N BIT(2)
19 # define PLL_OFFLINE_REQ BIT(7)
20 # define PLL_LOCK_COUNT_SHIFT 8
21 # define PLL_LOCK_COUNT_MASK 0x3f
22 # define PLL_BIAS_COUNT_SHIFT 14
23 # define PLL_BIAS_COUNT_MASK 0x3f
24 # define PLL_VOTE_FSM_ENA BIT(20)
25 # define PLL_FSM_ENA BIT(20)
26 # define PLL_VOTE_FSM_RESET BIT(21)
27 # define PLL_UPDATE BIT(22)
28 # define PLL_UPDATE_BYPASS BIT(23)
29 # define PLL_OFFLINE_ACK BIT(28)
30 # define ALPHA_PLL_ACK_LATCH BIT(29)
31 # define PLL_ACTIVE_FLAG BIT(30)
32 # define PLL_LOCK_DET BIT(31)
34 #define PLL_L_VAL(p) ((p)->offset + (p)->regs[PLL_OFF_L_VAL])
35 #define PLL_CAL_L_VAL(p) ((p)->offset + (p)->regs[PLL_OFF_CAL_L_VAL])
36 #define PLL_ALPHA_VAL(p) ((p)->offset + (p)->regs[PLL_OFF_ALPHA_VAL])
37 #define PLL_ALPHA_VAL_U(p) ((p)->offset + (p)->regs[PLL_OFF_ALPHA_VAL_U])
39 #define PLL_USER_CTL(p) ((p)->offset + (p)->regs[PLL_OFF_USER_CTL])
40 # define PLL_POST_DIV_SHIFT 8
41 # define PLL_POST_DIV_MASK(p) GENMASK((p)->width, 0)
42 # define PLL_ALPHA_EN BIT(24)
43 # define PLL_ALPHA_MODE BIT(25)
44 # define PLL_VCO_SHIFT 20
45 # define PLL_VCO_MASK 0x3
47 #define PLL_USER_CTL_U(p) ((p)->offset + (p)->regs[PLL_OFF_USER_CTL_U])
48 #define PLL_USER_CTL_U1(p) ((p)->offset + (p)->regs[PLL_OFF_USER_CTL_U1])
50 #define PLL_CONFIG_CTL(p) ((p)->offset + (p)->regs[PLL_OFF_CONFIG_CTL])
51 #define PLL_CONFIG_CTL_U(p) ((p)->offset + (p)->regs[PLL_OFF_CONFIG_CTL_U])
52 #define PLL_CONFIG_CTL_U1(p) ((p)->offset + (p)->regs[PLL_OFF_CONFIG_CTL_U1])
53 #define PLL_TEST_CTL(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL])
54 #define PLL_TEST_CTL_U(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL_U])
55 #define PLL_TEST_CTL_U1(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL_U1])
56 #define PLL_STATUS(p) ((p)->offset + (p)->regs[PLL_OFF_STATUS])
57 #define PLL_OPMODE(p) ((p)->offset + (p)->regs[PLL_OFF_OPMODE])
58 #define PLL_FRAC(p) ((p)->offset + (p)->regs[PLL_OFF_FRAC])
60 const u8 clk_alpha_pll_regs[][PLL_OFF_MAX_REGS] = {
61 [CLK_ALPHA_PLL_TYPE_DEFAULT] = {
62 [PLL_OFF_L_VAL] = 0x04,
63 [PLL_OFF_ALPHA_VAL] = 0x08,
64 [PLL_OFF_ALPHA_VAL_U] = 0x0c,
65 [PLL_OFF_USER_CTL] = 0x10,
66 [PLL_OFF_USER_CTL_U] = 0x14,
67 [PLL_OFF_CONFIG_CTL] = 0x18,
68 [PLL_OFF_TEST_CTL] = 0x1c,
69 [PLL_OFF_TEST_CTL_U] = 0x20,
70 [PLL_OFF_STATUS] = 0x24,
72 [CLK_ALPHA_PLL_TYPE_HUAYRA] = {
73 [PLL_OFF_L_VAL] = 0x04,
74 [PLL_OFF_ALPHA_VAL] = 0x08,
75 [PLL_OFF_USER_CTL] = 0x10,
76 [PLL_OFF_CONFIG_CTL] = 0x14,
77 [PLL_OFF_CONFIG_CTL_U] = 0x18,
78 [PLL_OFF_TEST_CTL] = 0x1c,
79 [PLL_OFF_TEST_CTL_U] = 0x20,
80 [PLL_OFF_STATUS] = 0x24,
82 [CLK_ALPHA_PLL_TYPE_BRAMMO] = {
83 [PLL_OFF_L_VAL] = 0x04,
84 [PLL_OFF_ALPHA_VAL] = 0x08,
85 [PLL_OFF_ALPHA_VAL_U] = 0x0c,
86 [PLL_OFF_USER_CTL] = 0x10,
87 [PLL_OFF_CONFIG_CTL] = 0x18,
88 [PLL_OFF_TEST_CTL] = 0x1c,
89 [PLL_OFF_STATUS] = 0x24,
91 [CLK_ALPHA_PLL_TYPE_FABIA] = {
92 [PLL_OFF_L_VAL] = 0x04,
93 [PLL_OFF_USER_CTL] = 0x0c,
94 [PLL_OFF_USER_CTL_U] = 0x10,
95 [PLL_OFF_CONFIG_CTL] = 0x14,
96 [PLL_OFF_CONFIG_CTL_U] = 0x18,
97 [PLL_OFF_TEST_CTL] = 0x1c,
98 [PLL_OFF_TEST_CTL_U] = 0x20,
99 [PLL_OFF_STATUS] = 0x24,
100 [PLL_OFF_OPMODE] = 0x2c,
101 [PLL_OFF_FRAC] = 0x38,
103 [CLK_ALPHA_PLL_TYPE_TRION] = {
104 [PLL_OFF_L_VAL] = 0x04,
105 [PLL_OFF_CAL_L_VAL] = 0x08,
106 [PLL_OFF_USER_CTL] = 0x0c,
107 [PLL_OFF_USER_CTL_U] = 0x10,
108 [PLL_OFF_USER_CTL_U1] = 0x14,
109 [PLL_OFF_CONFIG_CTL] = 0x18,
110 [PLL_OFF_CONFIG_CTL_U] = 0x1c,
111 [PLL_OFF_CONFIG_CTL_U1] = 0x20,
112 [PLL_OFF_TEST_CTL] = 0x24,
113 [PLL_OFF_TEST_CTL_U] = 0x28,
114 [PLL_OFF_TEST_CTL_U1] = 0x2c,
115 [PLL_OFF_STATUS] = 0x30,
116 [PLL_OFF_OPMODE] = 0x38,
117 [PLL_OFF_ALPHA_VAL] = 0x40,
120 EXPORT_SYMBOL_GPL(clk_alpha_pll_regs);
123 * Even though 40 bits are present, use only 32 for ease of calculation.
125 #define ALPHA_REG_BITWIDTH 40
126 #define ALPHA_REG_16BIT_WIDTH 16
127 #define ALPHA_BITWIDTH 32U
128 #define ALPHA_SHIFT(w) min(w, ALPHA_BITWIDTH)
130 #define PLL_HUAYRA_M_WIDTH 8
131 #define PLL_HUAYRA_M_SHIFT 8
132 #define PLL_HUAYRA_M_MASK 0xff
133 #define PLL_HUAYRA_N_SHIFT 0
134 #define PLL_HUAYRA_N_MASK 0xff
135 #define PLL_HUAYRA_ALPHA_WIDTH 16
137 #define PLL_STANDBY 0x0
139 #define PLL_OUT_MASK 0x7
140 #define PLL_RATE_MARGIN 500
142 /* TRION PLL specific settings and offsets */
143 #define TRION_PLL_CAL_VAL 0x44
144 #define TRION_PCAL_DONE BIT(26)
146 /* LUCID PLL specific settings and offsets */
147 #define LUCID_PCAL_DONE BIT(27)
149 #define pll_alpha_width(p) \
150 ((PLL_ALPHA_VAL_U(p) - PLL_ALPHA_VAL(p) == 4) ? \
151 ALPHA_REG_BITWIDTH : ALPHA_REG_16BIT_WIDTH)
153 #define pll_has_64bit_config(p) ((PLL_CONFIG_CTL_U(p) - PLL_CONFIG_CTL(p)) == 4)
155 #define to_clk_alpha_pll(_hw) container_of(to_clk_regmap(_hw), \
156 struct clk_alpha_pll, clkr)
158 #define to_clk_alpha_pll_postdiv(_hw) container_of(to_clk_regmap(_hw), \
159 struct clk_alpha_pll_postdiv, clkr)
161 static int wait_for_pll(struct clk_alpha_pll *pll, u32 mask, bool inverse,
167 const char *name = clk_hw_get_name(&pll->clkr.hw);
169 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
173 for (count = 100; count > 0; count--) {
174 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
177 if (inverse && !(val & mask))
179 else if ((val & mask) == mask)
185 WARN(1, "%s failed to %s!\n", name, action);
189 #define wait_for_pll_enable_active(pll) \
190 wait_for_pll(pll, PLL_ACTIVE_FLAG, 0, "enable")
192 #define wait_for_pll_enable_lock(pll) \
193 wait_for_pll(pll, PLL_LOCK_DET, 0, "enable")
195 #define wait_for_pll_disable(pll) \
196 wait_for_pll(pll, PLL_ACTIVE_FLAG, 1, "disable")
198 #define wait_for_pll_offline(pll) \
199 wait_for_pll(pll, PLL_OFFLINE_ACK, 0, "offline")
201 #define wait_for_pll_update(pll) \
202 wait_for_pll(pll, PLL_UPDATE, 1, "update")
204 #define wait_for_pll_update_ack_set(pll) \
205 wait_for_pll(pll, ALPHA_PLL_ACK_LATCH, 0, "update_ack_set")
207 #define wait_for_pll_update_ack_clear(pll) \
208 wait_for_pll(pll, ALPHA_PLL_ACK_LATCH, 1, "update_ack_clear")
210 void clk_alpha_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
211 const struct alpha_pll_config *config)
215 regmap_write(regmap, PLL_L_VAL(pll), config->l);
216 regmap_write(regmap, PLL_ALPHA_VAL(pll), config->alpha);
217 regmap_write(regmap, PLL_CONFIG_CTL(pll), config->config_ctl_val);
219 if (pll_has_64bit_config(pll))
220 regmap_write(regmap, PLL_CONFIG_CTL_U(pll),
221 config->config_ctl_hi_val);
223 if (pll_alpha_width(pll) > 32)
224 regmap_write(regmap, PLL_ALPHA_VAL_U(pll), config->alpha_hi);
226 val = config->main_output_mask;
227 val |= config->aux_output_mask;
228 val |= config->aux2_output_mask;
229 val |= config->early_output_mask;
230 val |= config->pre_div_val;
231 val |= config->post_div_val;
232 val |= config->vco_val;
233 val |= config->alpha_en_mask;
234 val |= config->alpha_mode_mask;
236 mask = config->main_output_mask;
237 mask |= config->aux_output_mask;
238 mask |= config->aux2_output_mask;
239 mask |= config->early_output_mask;
240 mask |= config->pre_div_mask;
241 mask |= config->post_div_mask;
242 mask |= config->vco_mask;
244 regmap_update_bits(regmap, PLL_USER_CTL(pll), mask, val);
246 if (pll->flags & SUPPORTS_FSM_MODE)
247 qcom_pll_set_fsm_mode(regmap, PLL_MODE(pll), 6, 0);
249 EXPORT_SYMBOL_GPL(clk_alpha_pll_configure);
251 static int clk_alpha_pll_hwfsm_enable(struct clk_hw *hw)
254 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
257 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
263 if (pll->flags & SUPPORTS_OFFLINE_REQ)
264 val &= ~PLL_OFFLINE_REQ;
266 ret = regmap_write(pll->clkr.regmap, PLL_MODE(pll), val);
270 /* Make sure enable request goes through before waiting for update */
273 return wait_for_pll_enable_active(pll);
276 static void clk_alpha_pll_hwfsm_disable(struct clk_hw *hw)
279 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
282 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
286 if (pll->flags & SUPPORTS_OFFLINE_REQ) {
287 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
288 PLL_OFFLINE_REQ, PLL_OFFLINE_REQ);
292 ret = wait_for_pll_offline(pll);
298 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
303 wait_for_pll_disable(pll);
306 static int pll_is_enabled(struct clk_hw *hw, u32 mask)
309 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
312 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
316 return !!(val & mask);
319 static int clk_alpha_pll_hwfsm_is_enabled(struct clk_hw *hw)
321 return pll_is_enabled(hw, PLL_ACTIVE_FLAG);
324 static int clk_alpha_pll_is_enabled(struct clk_hw *hw)
326 return pll_is_enabled(hw, PLL_LOCK_DET);
329 static int clk_alpha_pll_enable(struct clk_hw *hw)
332 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
335 mask = PLL_OUTCTRL | PLL_RESET_N | PLL_BYPASSNL;
336 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
340 /* If in FSM mode, just vote for it */
341 if (val & PLL_VOTE_FSM_ENA) {
342 ret = clk_enable_regmap(hw);
345 return wait_for_pll_enable_active(pll);
348 /* Skip if already enabled */
349 if ((val & mask) == mask)
352 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
353 PLL_BYPASSNL, PLL_BYPASSNL);
358 * H/W requires a 5us delay between disabling the bypass and
359 * de-asserting the reset.
364 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
365 PLL_RESET_N, PLL_RESET_N);
369 ret = wait_for_pll_enable_lock(pll);
373 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
374 PLL_OUTCTRL, PLL_OUTCTRL);
376 /* Ensure that the write above goes through before returning. */
381 static void clk_alpha_pll_disable(struct clk_hw *hw)
384 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
387 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
391 /* If in FSM mode, just unvote it */
392 if (val & PLL_VOTE_FSM_ENA) {
393 clk_disable_regmap(hw);
398 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), mask, 0);
400 /* Delay of 2 output clock ticks required until output is disabled */
404 mask = PLL_RESET_N | PLL_BYPASSNL;
405 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), mask, 0);
409 alpha_pll_calc_rate(u64 prate, u32 l, u32 a, u32 alpha_width)
411 return (prate * l) + ((prate * a) >> ALPHA_SHIFT(alpha_width));
415 alpha_pll_round_rate(unsigned long rate, unsigned long prate, u32 *l, u64 *a,
422 remainder = do_div(quotient, prate);
430 /* Upper ALPHA_BITWIDTH bits of Alpha */
431 quotient = remainder << ALPHA_SHIFT(alpha_width);
433 remainder = do_div(quotient, prate);
439 return alpha_pll_calc_rate(prate, *l, *a, alpha_width);
442 static const struct pll_vco *
443 alpha_pll_find_vco(const struct clk_alpha_pll *pll, unsigned long rate)
445 const struct pll_vco *v = pll->vco_table;
446 const struct pll_vco *end = v + pll->num_vco;
449 if (rate >= v->min_freq && rate <= v->max_freq)
456 clk_alpha_pll_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
458 u32 l, low, high, ctl;
459 u64 a = 0, prate = parent_rate;
460 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
461 u32 alpha_width = pll_alpha_width(pll);
463 regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l);
465 regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl);
466 if (ctl & PLL_ALPHA_EN) {
467 regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &low);
468 if (alpha_width > 32) {
469 regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll),
471 a = (u64)high << 32 | low;
473 a = low & GENMASK(alpha_width - 1, 0);
476 if (alpha_width > ALPHA_BITWIDTH)
477 a >>= alpha_width - ALPHA_BITWIDTH;
480 return alpha_pll_calc_rate(prate, l, a, alpha_width);
484 static int __clk_alpha_pll_update_latch(struct clk_alpha_pll *pll)
489 regmap_read(pll->clkr.regmap, PLL_MODE(pll), &mode);
491 /* Latch the input to the PLL */
492 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_UPDATE,
495 /* Wait for 2 reference cycle before checking ACK bit */
499 * PLL will latch the new L, Alpha and freq control word.
500 * PLL will respond by raising PLL_ACK_LATCH output when new programming
501 * has been latched in and PLL is being updated. When
502 * UPDATE_LOGIC_BYPASS bit is not set, PLL_UPDATE will be cleared
503 * automatically by hardware when PLL_ACK_LATCH is asserted by PLL.
505 if (mode & PLL_UPDATE_BYPASS) {
506 ret = wait_for_pll_update_ack_set(pll);
510 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_UPDATE, 0);
512 ret = wait_for_pll_update(pll);
517 ret = wait_for_pll_update_ack_clear(pll);
521 /* Wait for PLL output to stabilize */
527 static int clk_alpha_pll_update_latch(struct clk_alpha_pll *pll,
528 int (*is_enabled)(struct clk_hw *))
530 if (!is_enabled(&pll->clkr.hw) ||
531 !(pll->flags & SUPPORTS_DYNAMIC_UPDATE))
534 return __clk_alpha_pll_update_latch(pll);
537 static int __clk_alpha_pll_set_rate(struct clk_hw *hw, unsigned long rate,
539 int (*is_enabled)(struct clk_hw *))
541 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
542 const struct pll_vco *vco;
543 u32 l, alpha_width = pll_alpha_width(pll);
546 rate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width);
547 vco = alpha_pll_find_vco(pll, rate);
548 if (pll->vco_table && !vco) {
549 pr_err("%s: alpha pll not in a valid vco range\n",
550 clk_hw_get_name(hw));
554 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
556 if (alpha_width > ALPHA_BITWIDTH)
557 a <<= alpha_width - ALPHA_BITWIDTH;
559 if (alpha_width > 32)
560 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll), a >> 32);
562 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a);
565 regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
566 PLL_VCO_MASK << PLL_VCO_SHIFT,
567 vco->val << PLL_VCO_SHIFT);
570 regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
571 PLL_ALPHA_EN, PLL_ALPHA_EN);
573 return clk_alpha_pll_update_latch(pll, is_enabled);
576 static int clk_alpha_pll_set_rate(struct clk_hw *hw, unsigned long rate,
579 return __clk_alpha_pll_set_rate(hw, rate, prate,
580 clk_alpha_pll_is_enabled);
583 static int clk_alpha_pll_hwfsm_set_rate(struct clk_hw *hw, unsigned long rate,
586 return __clk_alpha_pll_set_rate(hw, rate, prate,
587 clk_alpha_pll_hwfsm_is_enabled);
590 static long clk_alpha_pll_round_rate(struct clk_hw *hw, unsigned long rate,
591 unsigned long *prate)
593 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
594 u32 l, alpha_width = pll_alpha_width(pll);
596 unsigned long min_freq, max_freq;
598 rate = alpha_pll_round_rate(rate, *prate, &l, &a, alpha_width);
599 if (!pll->vco_table || alpha_pll_find_vco(pll, rate))
602 min_freq = pll->vco_table[0].min_freq;
603 max_freq = pll->vco_table[pll->num_vco - 1].max_freq;
605 return clamp(rate, min_freq, max_freq);
609 alpha_huayra_pll_calc_rate(u64 prate, u32 l, u32 a)
612 * a contains 16 bit alpha_val in two’s complement number in the range
615 if (a >= BIT(PLL_HUAYRA_ALPHA_WIDTH - 1))
618 return (prate * l) + (prate * a >> PLL_HUAYRA_ALPHA_WIDTH);
622 alpha_huayra_pll_round_rate(unsigned long rate, unsigned long prate,
629 remainder = do_div(quotient, prate);
637 quotient = remainder << PLL_HUAYRA_ALPHA_WIDTH;
638 remainder = do_div(quotient, prate);
644 * alpha_val should be in two’s complement number in the range
645 * of [-0.5, 0.5) so if quotient >= 0.5 then increment the l value
646 * since alpha value will be subtracted in this case.
648 if (quotient >= BIT(PLL_HUAYRA_ALPHA_WIDTH - 1))
652 return alpha_huayra_pll_calc_rate(prate, *l, *a);
656 alpha_pll_huayra_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
658 u64 rate = parent_rate, tmp;
659 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
660 u32 l, alpha = 0, ctl, alpha_m, alpha_n;
662 regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l);
663 regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl);
665 if (ctl & PLL_ALPHA_EN) {
666 regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &alpha);
668 * Depending upon alpha_mode, it can be treated as M/N value or
669 * as a two’s complement number. When alpha_mode=1,
670 * pll_alpha_val<15:8>=M and pll_apla_val<7:0>=N
674 * M is a signed number (-128 to 127) and N is unsigned
675 * (0 to 255). M/N has to be within +/-0.5.
677 * When alpha_mode=0, it is a two’s complement number in the
680 * Fout=FIN*(L+(alpha_val)/2^16)
682 * where alpha_val is two’s complement number.
684 if (!(ctl & PLL_ALPHA_MODE))
685 return alpha_huayra_pll_calc_rate(rate, l, alpha);
687 alpha_m = alpha >> PLL_HUAYRA_M_SHIFT & PLL_HUAYRA_M_MASK;
688 alpha_n = alpha >> PLL_HUAYRA_N_SHIFT & PLL_HUAYRA_N_MASK;
692 if (alpha_m >= BIT(PLL_HUAYRA_M_WIDTH - 1)) {
693 alpha_m = BIT(PLL_HUAYRA_M_WIDTH) - alpha_m;
695 do_div(tmp, alpha_n);
699 do_div(tmp, alpha_n);
706 return alpha_huayra_pll_calc_rate(rate, l, alpha);
709 static int alpha_pll_huayra_set_rate(struct clk_hw *hw, unsigned long rate,
712 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
713 u32 l, a, ctl, cur_alpha = 0;
715 rate = alpha_huayra_pll_round_rate(rate, prate, &l, &a);
717 regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl);
719 if (ctl & PLL_ALPHA_EN)
720 regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &cur_alpha);
723 * Huayra PLL supports PLL dynamic programming. User can change L_VAL,
724 * without having to go through the power on sequence.
726 if (clk_alpha_pll_is_enabled(hw)) {
727 if (cur_alpha != a) {
728 pr_err("%s: clock needs to be gated\n",
729 clk_hw_get_name(hw));
733 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
734 /* Ensure that the write above goes to detect L val change. */
736 return wait_for_pll_enable_lock(pll);
739 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
740 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a);
743 regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
746 regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
747 PLL_ALPHA_EN | PLL_ALPHA_MODE, PLL_ALPHA_EN);
752 static long alpha_pll_huayra_round_rate(struct clk_hw *hw, unsigned long rate,
753 unsigned long *prate)
757 return alpha_huayra_pll_round_rate(rate, *prate, &l, &a);
760 static int trion_pll_is_enabled(struct clk_alpha_pll *pll,
761 struct regmap *regmap)
763 u32 mode_regval, opmode_regval;
766 ret = regmap_read(regmap, PLL_MODE(pll), &mode_regval);
767 ret |= regmap_read(regmap, PLL_OPMODE(pll), &opmode_regval);
771 return ((opmode_regval & PLL_RUN) && (mode_regval & PLL_OUTCTRL));
774 static int clk_trion_pll_is_enabled(struct clk_hw *hw)
776 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
778 return trion_pll_is_enabled(pll, pll->clkr.regmap);
781 static int clk_trion_pll_enable(struct clk_hw *hw)
783 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
784 struct regmap *regmap = pll->clkr.regmap;
788 ret = regmap_read(regmap, PLL_MODE(pll), &val);
792 /* If in FSM mode, just vote for it */
793 if (val & PLL_VOTE_FSM_ENA) {
794 ret = clk_enable_regmap(hw);
797 return wait_for_pll_enable_active(pll);
800 /* Set operation mode to RUN */
801 regmap_write(regmap, PLL_OPMODE(pll), PLL_RUN);
803 ret = wait_for_pll_enable_lock(pll);
807 /* Enable the PLL outputs */
808 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll),
809 PLL_OUT_MASK, PLL_OUT_MASK);
813 /* Enable the global PLL outputs */
814 return regmap_update_bits(regmap, PLL_MODE(pll),
815 PLL_OUTCTRL, PLL_OUTCTRL);
818 static void clk_trion_pll_disable(struct clk_hw *hw)
820 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
821 struct regmap *regmap = pll->clkr.regmap;
825 ret = regmap_read(regmap, PLL_MODE(pll), &val);
829 /* If in FSM mode, just unvote it */
830 if (val & PLL_VOTE_FSM_ENA) {
831 clk_disable_regmap(hw);
835 /* Disable the global PLL output */
836 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
840 /* Disable the PLL outputs */
841 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll),
846 /* Place the PLL mode in STANDBY */
847 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY);
848 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N);
852 clk_trion_pll_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
854 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
855 u32 l, frac, alpha_width = pll_alpha_width(pll);
857 regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l);
858 regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &frac);
860 return alpha_pll_calc_rate(parent_rate, l, frac, alpha_width);
863 const struct clk_ops clk_alpha_pll_fixed_ops = {
864 .enable = clk_alpha_pll_enable,
865 .disable = clk_alpha_pll_disable,
866 .is_enabled = clk_alpha_pll_is_enabled,
867 .recalc_rate = clk_alpha_pll_recalc_rate,
869 EXPORT_SYMBOL_GPL(clk_alpha_pll_fixed_ops);
871 const struct clk_ops clk_alpha_pll_ops = {
872 .enable = clk_alpha_pll_enable,
873 .disable = clk_alpha_pll_disable,
874 .is_enabled = clk_alpha_pll_is_enabled,
875 .recalc_rate = clk_alpha_pll_recalc_rate,
876 .round_rate = clk_alpha_pll_round_rate,
877 .set_rate = clk_alpha_pll_set_rate,
879 EXPORT_SYMBOL_GPL(clk_alpha_pll_ops);
881 const struct clk_ops clk_alpha_pll_huayra_ops = {
882 .enable = clk_alpha_pll_enable,
883 .disable = clk_alpha_pll_disable,
884 .is_enabled = clk_alpha_pll_is_enabled,
885 .recalc_rate = alpha_pll_huayra_recalc_rate,
886 .round_rate = alpha_pll_huayra_round_rate,
887 .set_rate = alpha_pll_huayra_set_rate,
889 EXPORT_SYMBOL_GPL(clk_alpha_pll_huayra_ops);
891 const struct clk_ops clk_alpha_pll_hwfsm_ops = {
892 .enable = clk_alpha_pll_hwfsm_enable,
893 .disable = clk_alpha_pll_hwfsm_disable,
894 .is_enabled = clk_alpha_pll_hwfsm_is_enabled,
895 .recalc_rate = clk_alpha_pll_recalc_rate,
896 .round_rate = clk_alpha_pll_round_rate,
897 .set_rate = clk_alpha_pll_hwfsm_set_rate,
899 EXPORT_SYMBOL_GPL(clk_alpha_pll_hwfsm_ops);
901 const struct clk_ops clk_alpha_pll_fixed_trion_ops = {
902 .enable = clk_trion_pll_enable,
903 .disable = clk_trion_pll_disable,
904 .is_enabled = clk_trion_pll_is_enabled,
905 .recalc_rate = clk_trion_pll_recalc_rate,
906 .round_rate = clk_alpha_pll_round_rate,
908 EXPORT_SYMBOL_GPL(clk_alpha_pll_fixed_trion_ops);
911 clk_alpha_pll_postdiv_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
913 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
916 regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl);
918 ctl >>= PLL_POST_DIV_SHIFT;
919 ctl &= PLL_POST_DIV_MASK(pll);
921 return parent_rate >> fls(ctl);
924 static const struct clk_div_table clk_alpha_div_table[] = {
933 static const struct clk_div_table clk_alpha_2bit_div_table[] = {
941 clk_alpha_pll_postdiv_round_rate(struct clk_hw *hw, unsigned long rate,
942 unsigned long *prate)
944 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
945 const struct clk_div_table *table;
948 table = clk_alpha_2bit_div_table;
950 table = clk_alpha_div_table;
952 return divider_round_rate(hw, rate, prate, table,
953 pll->width, CLK_DIVIDER_POWER_OF_TWO);
957 clk_alpha_pll_postdiv_round_ro_rate(struct clk_hw *hw, unsigned long rate,
958 unsigned long *prate)
960 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
963 regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl);
965 ctl >>= PLL_POST_DIV_SHIFT;
966 ctl &= BIT(pll->width) - 1;
969 if (clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT)
970 *prate = clk_hw_round_rate(clk_hw_get_parent(hw), div * rate);
972 return DIV_ROUND_UP_ULL((u64)*prate, div);
975 static int clk_alpha_pll_postdiv_set_rate(struct clk_hw *hw, unsigned long rate,
976 unsigned long parent_rate)
978 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
981 /* 16 -> 0xf, 8 -> 0x7, 4 -> 0x3, 2 -> 0x1, 1 -> 0x0 */
982 div = DIV_ROUND_UP_ULL(parent_rate, rate) - 1;
984 return regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
985 PLL_POST_DIV_MASK(pll) << PLL_POST_DIV_SHIFT,
986 div << PLL_POST_DIV_SHIFT);
989 const struct clk_ops clk_alpha_pll_postdiv_ops = {
990 .recalc_rate = clk_alpha_pll_postdiv_recalc_rate,
991 .round_rate = clk_alpha_pll_postdiv_round_rate,
992 .set_rate = clk_alpha_pll_postdiv_set_rate,
994 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_ops);
996 const struct clk_ops clk_alpha_pll_postdiv_ro_ops = {
997 .round_rate = clk_alpha_pll_postdiv_round_ro_rate,
998 .recalc_rate = clk_alpha_pll_postdiv_recalc_rate,
1000 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_ro_ops);
1002 void clk_fabia_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
1003 const struct alpha_pll_config *config)
1008 regmap_write(regmap, PLL_L_VAL(pll), config->l);
1011 regmap_write(regmap, PLL_FRAC(pll), config->alpha);
1013 if (config->config_ctl_val)
1014 regmap_write(regmap, PLL_CONFIG_CTL(pll),
1015 config->config_ctl_val);
1017 if (config->config_ctl_hi_val)
1018 regmap_write(regmap, PLL_CONFIG_CTL_U(pll),
1019 config->config_ctl_hi_val);
1021 if (config->user_ctl_val)
1022 regmap_write(regmap, PLL_USER_CTL(pll), config->user_ctl_val);
1024 if (config->user_ctl_hi_val)
1025 regmap_write(regmap, PLL_USER_CTL_U(pll),
1026 config->user_ctl_hi_val);
1028 if (config->test_ctl_val)
1029 regmap_write(regmap, PLL_TEST_CTL(pll),
1030 config->test_ctl_val);
1032 if (config->test_ctl_hi_val)
1033 regmap_write(regmap, PLL_TEST_CTL_U(pll),
1034 config->test_ctl_hi_val);
1036 if (config->post_div_mask) {
1037 mask = config->post_div_mask;
1038 val = config->post_div_val;
1039 regmap_update_bits(regmap, PLL_USER_CTL(pll), mask, val);
1042 regmap_update_bits(regmap, PLL_MODE(pll), PLL_UPDATE_BYPASS,
1045 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N);
1047 EXPORT_SYMBOL_GPL(clk_fabia_pll_configure);
1049 static int alpha_pll_fabia_enable(struct clk_hw *hw)
1052 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1053 u32 val, opmode_val;
1054 struct regmap *regmap = pll->clkr.regmap;
1056 ret = regmap_read(regmap, PLL_MODE(pll), &val);
1060 /* If in FSM mode, just vote for it */
1061 if (val & PLL_VOTE_FSM_ENA) {
1062 ret = clk_enable_regmap(hw);
1065 return wait_for_pll_enable_active(pll);
1068 ret = regmap_read(regmap, PLL_OPMODE(pll), &opmode_val);
1072 /* Skip If PLL is already running */
1073 if ((opmode_val & PLL_RUN) && (val & PLL_OUTCTRL))
1076 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
1080 ret = regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY);
1084 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N,
1089 ret = regmap_write(regmap, PLL_OPMODE(pll), PLL_RUN);
1093 ret = wait_for_pll_enable_lock(pll);
1097 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll),
1098 PLL_OUT_MASK, PLL_OUT_MASK);
1102 return regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL,
1106 static void alpha_pll_fabia_disable(struct clk_hw *hw)
1109 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1111 struct regmap *regmap = pll->clkr.regmap;
1113 ret = regmap_read(regmap, PLL_MODE(pll), &val);
1117 /* If in FSM mode, just unvote it */
1118 if (val & PLL_FSM_ENA) {
1119 clk_disable_regmap(hw);
1123 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
1127 /* Disable main outputs */
1128 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll), PLL_OUT_MASK, 0);
1132 /* Place the PLL in STANDBY */
1133 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY);
1136 static unsigned long alpha_pll_fabia_recalc_rate(struct clk_hw *hw,
1137 unsigned long parent_rate)
1139 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1140 u32 l, frac, alpha_width = pll_alpha_width(pll);
1142 regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l);
1143 regmap_read(pll->clkr.regmap, PLL_FRAC(pll), &frac);
1145 return alpha_pll_calc_rate(parent_rate, l, frac, alpha_width);
1148 static int alpha_pll_fabia_set_rate(struct clk_hw *hw, unsigned long rate,
1149 unsigned long prate)
1151 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1152 u32 l, alpha_width = pll_alpha_width(pll);
1154 unsigned long rrate, max = rate + PLL_RATE_MARGIN;
1156 rrate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width);
1159 * Due to limited number of bits for fractional rate programming, the
1160 * rounded up rate could be marginally higher than the requested rate.
1162 if (rrate > (rate + PLL_RATE_MARGIN) || rrate < rate) {
1163 pr_err("%s: Rounded rate %lu not within range [%lu, %lu)\n",
1164 clk_hw_get_name(hw), rrate, rate, max);
1168 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
1169 regmap_write(pll->clkr.regmap, PLL_FRAC(pll), a);
1171 return __clk_alpha_pll_update_latch(pll);
1174 static int alpha_pll_fabia_prepare(struct clk_hw *hw)
1176 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1177 const struct pll_vco *vco;
1178 struct clk_hw *parent_hw;
1179 unsigned long cal_freq, rrate;
1180 u32 cal_l, val, alpha_width = pll_alpha_width(pll);
1181 const char *name = clk_hw_get_name(hw);
1185 /* Check if calibration needs to be done i.e. PLL is in reset */
1186 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
1190 /* Return early if calibration is not needed. */
1191 if (val & PLL_RESET_N)
1194 vco = alpha_pll_find_vco(pll, clk_hw_get_rate(hw));
1196 pr_err("%s: alpha pll not in a valid vco range\n", name);
1200 cal_freq = DIV_ROUND_CLOSEST((pll->vco_table[0].min_freq +
1201 pll->vco_table[0].max_freq) * 54, 100);
1203 parent_hw = clk_hw_get_parent(hw);
1207 rrate = alpha_pll_round_rate(cal_freq, clk_hw_get_rate(parent_hw),
1208 &cal_l, &a, alpha_width);
1210 * Due to a limited number of bits for fractional rate programming, the
1211 * rounded up rate could be marginally higher than the requested rate.
1213 if (rrate > (cal_freq + PLL_RATE_MARGIN) || rrate < cal_freq)
1216 /* Setup PLL for calibration frequency */
1217 regmap_write(pll->clkr.regmap, PLL_CAL_L_VAL(pll), cal_l);
1219 /* Bringup the PLL at calibration frequency */
1220 ret = clk_alpha_pll_enable(hw);
1222 pr_err("%s: alpha pll calibration failed\n", name);
1226 clk_alpha_pll_disable(hw);
1231 const struct clk_ops clk_alpha_pll_fabia_ops = {
1232 .prepare = alpha_pll_fabia_prepare,
1233 .enable = alpha_pll_fabia_enable,
1234 .disable = alpha_pll_fabia_disable,
1235 .is_enabled = clk_alpha_pll_is_enabled,
1236 .set_rate = alpha_pll_fabia_set_rate,
1237 .recalc_rate = alpha_pll_fabia_recalc_rate,
1238 .round_rate = clk_alpha_pll_round_rate,
1240 EXPORT_SYMBOL_GPL(clk_alpha_pll_fabia_ops);
1242 const struct clk_ops clk_alpha_pll_fixed_fabia_ops = {
1243 .enable = alpha_pll_fabia_enable,
1244 .disable = alpha_pll_fabia_disable,
1245 .is_enabled = clk_alpha_pll_is_enabled,
1246 .recalc_rate = alpha_pll_fabia_recalc_rate,
1247 .round_rate = clk_alpha_pll_round_rate,
1249 EXPORT_SYMBOL_GPL(clk_alpha_pll_fixed_fabia_ops);
1251 static unsigned long clk_alpha_pll_postdiv_fabia_recalc_rate(struct clk_hw *hw,
1252 unsigned long parent_rate)
1254 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1255 u32 i, div = 1, val;
1258 ret = regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &val);
1262 val >>= pll->post_div_shift;
1263 val &= BIT(pll->width) - 1;
1265 for (i = 0; i < pll->num_post_div; i++) {
1266 if (pll->post_div_table[i].val == val) {
1267 div = pll->post_div_table[i].div;
1272 return (parent_rate / div);
1275 static unsigned long
1276 clk_trion_pll_postdiv_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
1278 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1279 struct regmap *regmap = pll->clkr.regmap;
1280 u32 i, div = 1, val;
1282 regmap_read(regmap, PLL_USER_CTL(pll), &val);
1284 val >>= pll->post_div_shift;
1285 val &= PLL_POST_DIV_MASK(pll);
1287 for (i = 0; i < pll->num_post_div; i++) {
1288 if (pll->post_div_table[i].val == val) {
1289 div = pll->post_div_table[i].div;
1294 return (parent_rate / div);
1298 clk_trion_pll_postdiv_round_rate(struct clk_hw *hw, unsigned long rate,
1299 unsigned long *prate)
1301 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1303 return divider_round_rate(hw, rate, prate, pll->post_div_table,
1304 pll->width, CLK_DIVIDER_ROUND_CLOSEST);
1308 clk_trion_pll_postdiv_set_rate(struct clk_hw *hw, unsigned long rate,
1309 unsigned long parent_rate)
1311 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1312 struct regmap *regmap = pll->clkr.regmap;
1313 int i, val = 0, div;
1315 div = DIV_ROUND_UP_ULL(parent_rate, rate);
1316 for (i = 0; i < pll->num_post_div; i++) {
1317 if (pll->post_div_table[i].div == div) {
1318 val = pll->post_div_table[i].val;
1323 return regmap_update_bits(regmap, PLL_USER_CTL(pll),
1324 PLL_POST_DIV_MASK(pll) << PLL_POST_DIV_SHIFT,
1325 val << PLL_POST_DIV_SHIFT);
1328 const struct clk_ops clk_alpha_pll_postdiv_trion_ops = {
1329 .recalc_rate = clk_trion_pll_postdiv_recalc_rate,
1330 .round_rate = clk_trion_pll_postdiv_round_rate,
1331 .set_rate = clk_trion_pll_postdiv_set_rate,
1333 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_trion_ops);
1335 static long clk_alpha_pll_postdiv_fabia_round_rate(struct clk_hw *hw,
1336 unsigned long rate, unsigned long *prate)
1338 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1340 return divider_round_rate(hw, rate, prate, pll->post_div_table,
1341 pll->width, CLK_DIVIDER_ROUND_CLOSEST);
1344 static int clk_alpha_pll_postdiv_fabia_set_rate(struct clk_hw *hw,
1345 unsigned long rate, unsigned long parent_rate)
1347 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1348 int i, val = 0, div, ret;
1351 * If the PLL is in FSM mode, then treat set_rate callback as a
1354 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
1358 if (val & PLL_VOTE_FSM_ENA)
1361 div = DIV_ROUND_UP_ULL(parent_rate, rate);
1362 for (i = 0; i < pll->num_post_div; i++) {
1363 if (pll->post_div_table[i].div == div) {
1364 val = pll->post_div_table[i].val;
1369 return regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
1370 (BIT(pll->width) - 1) << pll->post_div_shift,
1371 val << pll->post_div_shift);
1374 const struct clk_ops clk_alpha_pll_postdiv_fabia_ops = {
1375 .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate,
1376 .round_rate = clk_alpha_pll_postdiv_fabia_round_rate,
1377 .set_rate = clk_alpha_pll_postdiv_fabia_set_rate,
1379 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_fabia_ops);
1382 * clk_trion_pll_configure - configure the trion pll
1384 * @pll: clk alpha pll
1385 * @regmap: register map
1386 * @config: configuration to apply for pll
1388 void clk_trion_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
1389 const struct alpha_pll_config *config)
1392 regmap_write(regmap, PLL_L_VAL(pll), config->l);
1394 regmap_write(regmap, PLL_CAL_L_VAL(pll), TRION_PLL_CAL_VAL);
1397 regmap_write(regmap, PLL_ALPHA_VAL(pll), config->alpha);
1399 if (config->config_ctl_val)
1400 regmap_write(regmap, PLL_CONFIG_CTL(pll),
1401 config->config_ctl_val);
1403 if (config->config_ctl_hi_val)
1404 regmap_write(regmap, PLL_CONFIG_CTL_U(pll),
1405 config->config_ctl_hi_val);
1407 if (config->config_ctl_hi1_val)
1408 regmap_write(regmap, PLL_CONFIG_CTL_U1(pll),
1409 config->config_ctl_hi1_val);
1411 if (config->user_ctl_val)
1412 regmap_write(regmap, PLL_USER_CTL(pll),
1413 config->user_ctl_val);
1415 if (config->user_ctl_hi_val)
1416 regmap_write(regmap, PLL_USER_CTL_U(pll),
1417 config->user_ctl_hi_val);
1419 if (config->user_ctl_hi1_val)
1420 regmap_write(regmap, PLL_USER_CTL_U1(pll),
1421 config->user_ctl_hi1_val);
1423 if (config->test_ctl_val)
1424 regmap_write(regmap, PLL_TEST_CTL(pll),
1425 config->test_ctl_val);
1427 if (config->test_ctl_hi_val)
1428 regmap_write(regmap, PLL_TEST_CTL_U(pll),
1429 config->test_ctl_hi_val);
1431 if (config->test_ctl_hi1_val)
1432 regmap_write(regmap, PLL_TEST_CTL_U1(pll),
1433 config->test_ctl_hi1_val);
1435 regmap_update_bits(regmap, PLL_MODE(pll), PLL_UPDATE_BYPASS,
1438 /* Disable PLL output */
1439 regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
1441 /* Set operation mode to OFF */
1442 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY);
1444 /* Place the PLL in STANDBY mode */
1445 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N);
1447 EXPORT_SYMBOL_GPL(clk_trion_pll_configure);
1450 * The TRION PLL requires a power-on self-calibration which happens when the
1451 * PLL comes out of reset. Calibrate in case it is not completed.
1453 static int __alpha_pll_trion_prepare(struct clk_hw *hw, u32 pcal_done)
1455 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1459 /* Return early if calibration is not needed. */
1460 regmap_read(pll->clkr.regmap, PLL_STATUS(pll), ®val);
1461 if (regval & pcal_done)
1464 /* On/off to calibrate */
1465 ret = clk_trion_pll_enable(hw);
1467 clk_trion_pll_disable(hw);
1472 static int alpha_pll_trion_prepare(struct clk_hw *hw)
1474 return __alpha_pll_trion_prepare(hw, TRION_PCAL_DONE);
1477 static int alpha_pll_lucid_prepare(struct clk_hw *hw)
1479 return __alpha_pll_trion_prepare(hw, LUCID_PCAL_DONE);
1482 static int alpha_pll_trion_set_rate(struct clk_hw *hw, unsigned long rate,
1483 unsigned long prate)
1485 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1486 unsigned long rrate;
1487 u32 regval, l, alpha_width = pll_alpha_width(pll);
1491 rrate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width);
1494 * Due to a limited number of bits for fractional rate programming, the
1495 * rounded up rate could be marginally higher than the requested rate.
1497 if (rrate > (rate + PLL_RATE_MARGIN) || rrate < rate) {
1498 pr_err("Call set rate on the PLL with rounded rates!\n");
1502 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
1503 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a);
1505 /* Latch the PLL input */
1506 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
1507 PLL_UPDATE, PLL_UPDATE);
1511 /* Wait for 2 reference cycles before checking the ACK bit. */
1513 regmap_read(pll->clkr.regmap, PLL_MODE(pll), ®val);
1514 if (!(regval & ALPHA_PLL_ACK_LATCH)) {
1515 pr_err("Lucid PLL latch failed. Output may be unstable!\n");
1519 /* Return the latch input to 0 */
1520 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
1525 if (clk_hw_is_enabled(hw)) {
1526 ret = wait_for_pll_enable_lock(pll);
1531 /* Wait for PLL output to stabilize */
1536 const struct clk_ops clk_alpha_pll_trion_ops = {
1537 .prepare = alpha_pll_trion_prepare,
1538 .enable = clk_trion_pll_enable,
1539 .disable = clk_trion_pll_disable,
1540 .is_enabled = clk_trion_pll_is_enabled,
1541 .recalc_rate = clk_trion_pll_recalc_rate,
1542 .round_rate = clk_alpha_pll_round_rate,
1543 .set_rate = alpha_pll_trion_set_rate,
1545 EXPORT_SYMBOL_GPL(clk_alpha_pll_trion_ops);
1547 const struct clk_ops clk_alpha_pll_lucid_ops = {
1548 .prepare = alpha_pll_lucid_prepare,
1549 .enable = clk_trion_pll_enable,
1550 .disable = clk_trion_pll_disable,
1551 .is_enabled = clk_trion_pll_is_enabled,
1552 .recalc_rate = clk_trion_pll_recalc_rate,
1553 .round_rate = clk_alpha_pll_round_rate,
1554 .set_rate = alpha_pll_trion_set_rate,
1556 EXPORT_SYMBOL_GPL(clk_alpha_pll_lucid_ops);
1558 const struct clk_ops clk_alpha_pll_postdiv_lucid_ops = {
1559 .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate,
1560 .round_rate = clk_alpha_pll_postdiv_fabia_round_rate,
1561 .set_rate = clk_alpha_pll_postdiv_fabia_set_rate,
1563 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_lucid_ops);