1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (c) 2015, 2018, The Linux Foundation. All rights reserved.
4 */
5
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>
11
12 #include "clk-alpha-pll.h"
13 #include "common.h"
14
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)
33
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])
38
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
46
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])
49
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])
59
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,
71 },
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,
81 },
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,
90 },
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,
102 },
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,
118 },
119 };
120 EXPORT_SYMBOL_GPL(clk_alpha_pll_regs);
121
122 /*
123 * Even though 40 bits are present, use only 32 for ease of calculation.
124 */
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)
129
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
136
137 #define PLL_STANDBY 0x0
138 #define PLL_RUN 0x1
139 #define PLL_OUT_MASK 0x7
140 #define PLL_RATE_MARGIN 500
141
142 /* TRION PLL specific settings and offsets */
143 #define TRION_PLL_CAL_VAL 0x44
144 #define TRION_PCAL_DONE BIT(26)
145
146 /* LUCID PLL specific settings and offsets */
147 #define LUCID_PCAL_DONE BIT(27)
148
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)
152
153 #define pll_has_64bit_config(p) ((PLL_CONFIG_CTL_U(p) - PLL_CONFIG_CTL(p)) == 4)
154
155 #define to_clk_alpha_pll(_hw) container_of(to_clk_regmap(_hw), \
156 struct clk_alpha_pll, clkr)
157
158 #define to_clk_alpha_pll_postdiv(_hw) container_of(to_clk_regmap(_hw), \
159 struct clk_alpha_pll_postdiv, clkr)
160
wait_for_pll(struct clk_alpha_pll * pll,u32 mask,bool inverse,const char * action)161 static int wait_for_pll(struct clk_alpha_pll *pll, u32 mask, bool inverse,
162 const char *action)
163 {
164 u32 val;
165 int count;
166 int ret;
167 const char *name = clk_hw_get_name(&pll->clkr.hw);
168
169 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
170 if (ret)
171 return ret;
172
173 for (count = 100; count > 0; count--) {
174 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
175 if (ret)
176 return ret;
177 if (inverse && !(val & mask))
178 return 0;
179 else if ((val & mask) == mask)
180 return 0;
181
182 udelay(1);
183 }
184
185 WARN(1, "%s failed to %s!\n", name, action);
186 return -ETIMEDOUT;
187 }
188
189 #define wait_for_pll_enable_active(pll) \
190 wait_for_pll(pll, PLL_ACTIVE_FLAG, 0, "enable")
191
192 #define wait_for_pll_enable_lock(pll) \
193 wait_for_pll(pll, PLL_LOCK_DET, 0, "enable")
194
195 #define wait_for_pll_disable(pll) \
196 wait_for_pll(pll, PLL_ACTIVE_FLAG, 1, "disable")
197
198 #define wait_for_pll_offline(pll) \
199 wait_for_pll(pll, PLL_OFFLINE_ACK, 0, "offline")
200
201 #define wait_for_pll_update(pll) \
202 wait_for_pll(pll, PLL_UPDATE, 1, "update")
203
204 #define wait_for_pll_update_ack_set(pll) \
205 wait_for_pll(pll, ALPHA_PLL_ACK_LATCH, 0, "update_ack_set")
206
207 #define wait_for_pll_update_ack_clear(pll) \
208 wait_for_pll(pll, ALPHA_PLL_ACK_LATCH, 1, "update_ack_clear")
209
clk_alpha_pll_configure(struct clk_alpha_pll * pll,struct regmap * regmap,const struct alpha_pll_config * config)210 void clk_alpha_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
211 const struct alpha_pll_config *config)
212 {
213 u32 val, mask;
214
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);
218
219 if (pll_has_64bit_config(pll))
220 regmap_write(regmap, PLL_CONFIG_CTL_U(pll),
221 config->config_ctl_hi_val);
222
223 if (pll_alpha_width(pll) > 32)
224 regmap_write(regmap, PLL_ALPHA_VAL_U(pll), config->alpha_hi);
225
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;
235
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;
243
244 regmap_update_bits(regmap, PLL_USER_CTL(pll), mask, val);
245
246 if (pll->flags & SUPPORTS_FSM_MODE)
247 qcom_pll_set_fsm_mode(regmap, PLL_MODE(pll), 6, 0);
248 }
249 EXPORT_SYMBOL_GPL(clk_alpha_pll_configure);
250
clk_alpha_pll_hwfsm_enable(struct clk_hw * hw)251 static int clk_alpha_pll_hwfsm_enable(struct clk_hw *hw)
252 {
253 int ret;
254 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
255 u32 val;
256
257 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
258 if (ret)
259 return ret;
260
261 val |= PLL_FSM_ENA;
262
263 if (pll->flags & SUPPORTS_OFFLINE_REQ)
264 val &= ~PLL_OFFLINE_REQ;
265
266 ret = regmap_write(pll->clkr.regmap, PLL_MODE(pll), val);
267 if (ret)
268 return ret;
269
270 /* Make sure enable request goes through before waiting for update */
271 mb();
272
273 return wait_for_pll_enable_active(pll);
274 }
275
clk_alpha_pll_hwfsm_disable(struct clk_hw * hw)276 static void clk_alpha_pll_hwfsm_disable(struct clk_hw *hw)
277 {
278 int ret;
279 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
280 u32 val;
281
282 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
283 if (ret)
284 return;
285
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);
289 if (ret)
290 return;
291
292 ret = wait_for_pll_offline(pll);
293 if (ret)
294 return;
295 }
296
297 /* Disable hwfsm */
298 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
299 PLL_FSM_ENA, 0);
300 if (ret)
301 return;
302
303 wait_for_pll_disable(pll);
304 }
305
pll_is_enabled(struct clk_hw * hw,u32 mask)306 static int pll_is_enabled(struct clk_hw *hw, u32 mask)
307 {
308 int ret;
309 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
310 u32 val;
311
312 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
313 if (ret)
314 return ret;
315
316 return !!(val & mask);
317 }
318
clk_alpha_pll_hwfsm_is_enabled(struct clk_hw * hw)319 static int clk_alpha_pll_hwfsm_is_enabled(struct clk_hw *hw)
320 {
321 return pll_is_enabled(hw, PLL_ACTIVE_FLAG);
322 }
323
clk_alpha_pll_is_enabled(struct clk_hw * hw)324 static int clk_alpha_pll_is_enabled(struct clk_hw *hw)
325 {
326 return pll_is_enabled(hw, PLL_LOCK_DET);
327 }
328
clk_alpha_pll_enable(struct clk_hw * hw)329 static int clk_alpha_pll_enable(struct clk_hw *hw)
330 {
331 int ret;
332 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
333 u32 val, mask;
334
335 mask = PLL_OUTCTRL | PLL_RESET_N | PLL_BYPASSNL;
336 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
337 if (ret)
338 return ret;
339
340 /* If in FSM mode, just vote for it */
341 if (val & PLL_VOTE_FSM_ENA) {
342 ret = clk_enable_regmap(hw);
343 if (ret)
344 return ret;
345 return wait_for_pll_enable_active(pll);
346 }
347
348 /* Skip if already enabled */
349 if ((val & mask) == mask)
350 return 0;
351
352 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
353 PLL_BYPASSNL, PLL_BYPASSNL);
354 if (ret)
355 return ret;
356
357 /*
358 * H/W requires a 5us delay between disabling the bypass and
359 * de-asserting the reset.
360 */
361 mb();
362 udelay(5);
363
364 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
365 PLL_RESET_N, PLL_RESET_N);
366 if (ret)
367 return ret;
368
369 ret = wait_for_pll_enable_lock(pll);
370 if (ret)
371 return ret;
372
373 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
374 PLL_OUTCTRL, PLL_OUTCTRL);
375
376 /* Ensure that the write above goes through before returning. */
377 mb();
378 return ret;
379 }
380
clk_alpha_pll_disable(struct clk_hw * hw)381 static void clk_alpha_pll_disable(struct clk_hw *hw)
382 {
383 int ret;
384 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
385 u32 val, mask;
386
387 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
388 if (ret)
389 return;
390
391 /* If in FSM mode, just unvote it */
392 if (val & PLL_VOTE_FSM_ENA) {
393 clk_disable_regmap(hw);
394 return;
395 }
396
397 mask = PLL_OUTCTRL;
398 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), mask, 0);
399
400 /* Delay of 2 output clock ticks required until output is disabled */
401 mb();
402 udelay(1);
403
404 mask = PLL_RESET_N | PLL_BYPASSNL;
405 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), mask, 0);
406 }
407
408 static unsigned long
alpha_pll_calc_rate(u64 prate,u32 l,u32 a,u32 alpha_width)409 alpha_pll_calc_rate(u64 prate, u32 l, u32 a, u32 alpha_width)
410 {
411 return (prate * l) + ((prate * a) >> ALPHA_SHIFT(alpha_width));
412 }
413
414 static unsigned long
alpha_pll_round_rate(unsigned long rate,unsigned long prate,u32 * l,u64 * a,u32 alpha_width)415 alpha_pll_round_rate(unsigned long rate, unsigned long prate, u32 *l, u64 *a,
416 u32 alpha_width)
417 {
418 u64 remainder;
419 u64 quotient;
420
421 quotient = rate;
422 remainder = do_div(quotient, prate);
423 *l = quotient;
424
425 if (!remainder) {
426 *a = 0;
427 return rate;
428 }
429
430 /* Upper ALPHA_BITWIDTH bits of Alpha */
431 quotient = remainder << ALPHA_SHIFT(alpha_width);
432
433 remainder = do_div(quotient, prate);
434
435 if (remainder)
436 quotient++;
437
438 *a = quotient;
439 return alpha_pll_calc_rate(prate, *l, *a, alpha_width);
440 }
441
442 static const struct pll_vco *
alpha_pll_find_vco(const struct clk_alpha_pll * pll,unsigned long rate)443 alpha_pll_find_vco(const struct clk_alpha_pll *pll, unsigned long rate)
444 {
445 const struct pll_vco *v = pll->vco_table;
446 const struct pll_vco *end = v + pll->num_vco;
447
448 for (; v < end; v++)
449 if (rate >= v->min_freq && rate <= v->max_freq)
450 return v;
451
452 return NULL;
453 }
454
455 static unsigned long
clk_alpha_pll_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)456 clk_alpha_pll_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
457 {
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);
462
463 regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l);
464
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),
470 &high);
471 a = (u64)high << 32 | low;
472 } else {
473 a = low & GENMASK(alpha_width - 1, 0);
474 }
475
476 if (alpha_width > ALPHA_BITWIDTH)
477 a >>= alpha_width - ALPHA_BITWIDTH;
478 }
479
480 return alpha_pll_calc_rate(prate, l, a, alpha_width);
481 }
482
483
__clk_alpha_pll_update_latch(struct clk_alpha_pll * pll)484 static int __clk_alpha_pll_update_latch(struct clk_alpha_pll *pll)
485 {
486 int ret;
487 u32 mode;
488
489 regmap_read(pll->clkr.regmap, PLL_MODE(pll), &mode);
490
491 /* Latch the input to the PLL */
492 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_UPDATE,
493 PLL_UPDATE);
494
495 /* Wait for 2 reference cycle before checking ACK bit */
496 udelay(1);
497
498 /*
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.
504 */
505 if (mode & PLL_UPDATE_BYPASS) {
506 ret = wait_for_pll_update_ack_set(pll);
507 if (ret)
508 return ret;
509
510 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_UPDATE, 0);
511 } else {
512 ret = wait_for_pll_update(pll);
513 if (ret)
514 return ret;
515 }
516
517 ret = wait_for_pll_update_ack_clear(pll);
518 if (ret)
519 return ret;
520
521 /* Wait for PLL output to stabilize */
522 udelay(10);
523
524 return 0;
525 }
526
clk_alpha_pll_update_latch(struct clk_alpha_pll * pll,int (* is_enabled)(struct clk_hw *))527 static int clk_alpha_pll_update_latch(struct clk_alpha_pll *pll,
528 int (*is_enabled)(struct clk_hw *))
529 {
530 if (!is_enabled(&pll->clkr.hw) ||
531 !(pll->flags & SUPPORTS_DYNAMIC_UPDATE))
532 return 0;
533
534 return __clk_alpha_pll_update_latch(pll);
535 }
536
__clk_alpha_pll_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long prate,int (* is_enabled)(struct clk_hw *))537 static int __clk_alpha_pll_set_rate(struct clk_hw *hw, unsigned long rate,
538 unsigned long prate,
539 int (*is_enabled)(struct clk_hw *))
540 {
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);
544 u64 a;
545
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));
551 return -EINVAL;
552 }
553
554 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
555
556 if (alpha_width > ALPHA_BITWIDTH)
557 a <<= alpha_width - ALPHA_BITWIDTH;
558
559 if (alpha_width > 32)
560 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll), a >> 32);
561
562 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a);
563
564 if (vco) {
565 regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
566 PLL_VCO_MASK << PLL_VCO_SHIFT,
567 vco->val << PLL_VCO_SHIFT);
568 }
569
570 regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
571 PLL_ALPHA_EN, PLL_ALPHA_EN);
572
573 return clk_alpha_pll_update_latch(pll, is_enabled);
574 }
575
clk_alpha_pll_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long prate)576 static int clk_alpha_pll_set_rate(struct clk_hw *hw, unsigned long rate,
577 unsigned long prate)
578 {
579 return __clk_alpha_pll_set_rate(hw, rate, prate,
580 clk_alpha_pll_is_enabled);
581 }
582
clk_alpha_pll_hwfsm_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long prate)583 static int clk_alpha_pll_hwfsm_set_rate(struct clk_hw *hw, unsigned long rate,
584 unsigned long prate)
585 {
586 return __clk_alpha_pll_set_rate(hw, rate, prate,
587 clk_alpha_pll_hwfsm_is_enabled);
588 }
589
clk_alpha_pll_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * prate)590 static long clk_alpha_pll_round_rate(struct clk_hw *hw, unsigned long rate,
591 unsigned long *prate)
592 {
593 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
594 u32 l, alpha_width = pll_alpha_width(pll);
595 u64 a;
596 unsigned long min_freq, max_freq;
597
598 rate = alpha_pll_round_rate(rate, *prate, &l, &a, alpha_width);
599 if (!pll->vco_table || alpha_pll_find_vco(pll, rate))
600 return rate;
601
602 min_freq = pll->vco_table[0].min_freq;
603 max_freq = pll->vco_table[pll->num_vco - 1].max_freq;
604
605 return clamp(rate, min_freq, max_freq);
606 }
607
608 static unsigned long
alpha_huayra_pll_calc_rate(u64 prate,u32 l,u32 a)609 alpha_huayra_pll_calc_rate(u64 prate, u32 l, u32 a)
610 {
611 /*
612 * a contains 16 bit alpha_val in two’s complement number in the range
613 * of [-0.5, 0.5).
614 */
615 if (a >= BIT(PLL_HUAYRA_ALPHA_WIDTH - 1))
616 l -= 1;
617
618 return (prate * l) + (prate * a >> PLL_HUAYRA_ALPHA_WIDTH);
619 }
620
621 static unsigned long
alpha_huayra_pll_round_rate(unsigned long rate,unsigned long prate,u32 * l,u32 * a)622 alpha_huayra_pll_round_rate(unsigned long rate, unsigned long prate,
623 u32 *l, u32 *a)
624 {
625 u64 remainder;
626 u64 quotient;
627
628 quotient = rate;
629 remainder = do_div(quotient, prate);
630 *l = quotient;
631
632 if (!remainder) {
633 *a = 0;
634 return rate;
635 }
636
637 quotient = remainder << PLL_HUAYRA_ALPHA_WIDTH;
638 remainder = do_div(quotient, prate);
639
640 if (remainder)
641 quotient++;
642
643 /*
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.
647 */
648 if (quotient >= BIT(PLL_HUAYRA_ALPHA_WIDTH - 1))
649 *l += 1;
650
651 *a = quotient;
652 return alpha_huayra_pll_calc_rate(prate, *l, *a);
653 }
654
655 static unsigned long
alpha_pll_huayra_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)656 alpha_pll_huayra_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
657 {
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;
661
662 regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l);
663 regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl);
664
665 if (ctl & PLL_ALPHA_EN) {
666 regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &alpha);
667 /*
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
671 *
672 * Fout=FIN*(L+(M/N))
673 *
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.
676 *
677 * When alpha_mode=0, it is a two’s complement number in the
678 * range [-0.5, 0.5).
679 *
680 * Fout=FIN*(L+(alpha_val)/2^16)
681 *
682 * where alpha_val is two’s complement number.
683 */
684 if (!(ctl & PLL_ALPHA_MODE))
685 return alpha_huayra_pll_calc_rate(rate, l, alpha);
686
687 alpha_m = alpha >> PLL_HUAYRA_M_SHIFT & PLL_HUAYRA_M_MASK;
688 alpha_n = alpha >> PLL_HUAYRA_N_SHIFT & PLL_HUAYRA_N_MASK;
689
690 rate *= l;
691 tmp = parent_rate;
692 if (alpha_m >= BIT(PLL_HUAYRA_M_WIDTH - 1)) {
693 alpha_m = BIT(PLL_HUAYRA_M_WIDTH) - alpha_m;
694 tmp *= alpha_m;
695 do_div(tmp, alpha_n);
696 rate -= tmp;
697 } else {
698 tmp *= alpha_m;
699 do_div(tmp, alpha_n);
700 rate += tmp;
701 }
702
703 return rate;
704 }
705
706 return alpha_huayra_pll_calc_rate(rate, l, alpha);
707 }
708
alpha_pll_huayra_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long prate)709 static int alpha_pll_huayra_set_rate(struct clk_hw *hw, unsigned long rate,
710 unsigned long prate)
711 {
712 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
713 u32 l, a, ctl, cur_alpha = 0;
714
715 rate = alpha_huayra_pll_round_rate(rate, prate, &l, &a);
716
717 regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl);
718
719 if (ctl & PLL_ALPHA_EN)
720 regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &cur_alpha);
721
722 /*
723 * Huayra PLL supports PLL dynamic programming. User can change L_VAL,
724 * without having to go through the power on sequence.
725 */
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));
730 return -EBUSY;
731 }
732
733 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
734 /* Ensure that the write above goes to detect L val change. */
735 mb();
736 return wait_for_pll_enable_lock(pll);
737 }
738
739 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
740 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a);
741
742 if (a == 0)
743 regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
744 PLL_ALPHA_EN, 0x0);
745 else
746 regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
747 PLL_ALPHA_EN | PLL_ALPHA_MODE, PLL_ALPHA_EN);
748
749 return 0;
750 }
751
alpha_pll_huayra_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * prate)752 static long alpha_pll_huayra_round_rate(struct clk_hw *hw, unsigned long rate,
753 unsigned long *prate)
754 {
755 u32 l, a;
756
757 return alpha_huayra_pll_round_rate(rate, *prate, &l, &a);
758 }
759
trion_pll_is_enabled(struct clk_alpha_pll * pll,struct regmap * regmap)760 static int trion_pll_is_enabled(struct clk_alpha_pll *pll,
761 struct regmap *regmap)
762 {
763 u32 mode_regval, opmode_regval;
764 int ret;
765
766 ret = regmap_read(regmap, PLL_MODE(pll), &mode_regval);
767 ret |= regmap_read(regmap, PLL_OPMODE(pll), &opmode_regval);
768 if (ret)
769 return 0;
770
771 return ((opmode_regval & PLL_RUN) && (mode_regval & PLL_OUTCTRL));
772 }
773
clk_trion_pll_is_enabled(struct clk_hw * hw)774 static int clk_trion_pll_is_enabled(struct clk_hw *hw)
775 {
776 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
777
778 return trion_pll_is_enabled(pll, pll->clkr.regmap);
779 }
780
clk_trion_pll_enable(struct clk_hw * hw)781 static int clk_trion_pll_enable(struct clk_hw *hw)
782 {
783 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
784 struct regmap *regmap = pll->clkr.regmap;
785 u32 val;
786 int ret;
787
788 ret = regmap_read(regmap, PLL_MODE(pll), &val);
789 if (ret)
790 return ret;
791
792 /* If in FSM mode, just vote for it */
793 if (val & PLL_VOTE_FSM_ENA) {
794 ret = clk_enable_regmap(hw);
795 if (ret)
796 return ret;
797 return wait_for_pll_enable_active(pll);
798 }
799
800 /* Set operation mode to RUN */
801 regmap_write(regmap, PLL_OPMODE(pll), PLL_RUN);
802
803 ret = wait_for_pll_enable_lock(pll);
804 if (ret)
805 return ret;
806
807 /* Enable the PLL outputs */
808 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll),
809 PLL_OUT_MASK, PLL_OUT_MASK);
810 if (ret)
811 return ret;
812
813 /* Enable the global PLL outputs */
814 return regmap_update_bits(regmap, PLL_MODE(pll),
815 PLL_OUTCTRL, PLL_OUTCTRL);
816 }
817
clk_trion_pll_disable(struct clk_hw * hw)818 static void clk_trion_pll_disable(struct clk_hw *hw)
819 {
820 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
821 struct regmap *regmap = pll->clkr.regmap;
822 u32 val;
823 int ret;
824
825 ret = regmap_read(regmap, PLL_MODE(pll), &val);
826 if (ret)
827 return;
828
829 /* If in FSM mode, just unvote it */
830 if (val & PLL_VOTE_FSM_ENA) {
831 clk_disable_regmap(hw);
832 return;
833 }
834
835 /* Disable the global PLL output */
836 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
837 if (ret)
838 return;
839
840 /* Disable the PLL outputs */
841 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll),
842 PLL_OUT_MASK, 0);
843 if (ret)
844 return;
845
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);
849 }
850
851 static unsigned long
clk_trion_pll_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)852 clk_trion_pll_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
853 {
854 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
855 u32 l, frac, alpha_width = pll_alpha_width(pll);
856
857 regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l);
858 regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &frac);
859
860 return alpha_pll_calc_rate(parent_rate, l, frac, alpha_width);
861 }
862
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,
868 };
869 EXPORT_SYMBOL_GPL(clk_alpha_pll_fixed_ops);
870
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,
878 };
879 EXPORT_SYMBOL_GPL(clk_alpha_pll_ops);
880
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,
888 };
889 EXPORT_SYMBOL_GPL(clk_alpha_pll_huayra_ops);
890
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,
898 };
899 EXPORT_SYMBOL_GPL(clk_alpha_pll_hwfsm_ops);
900
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,
907 };
908 EXPORT_SYMBOL_GPL(clk_alpha_pll_fixed_trion_ops);
909
910 static unsigned long
clk_alpha_pll_postdiv_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)911 clk_alpha_pll_postdiv_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
912 {
913 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
914 u32 ctl;
915
916 regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl);
917
918 ctl >>= PLL_POST_DIV_SHIFT;
919 ctl &= PLL_POST_DIV_MASK(pll);
920
921 return parent_rate >> fls(ctl);
922 }
923
924 static const struct clk_div_table clk_alpha_div_table[] = {
925 { 0x0, 1 },
926 { 0x1, 2 },
927 { 0x3, 4 },
928 { 0x7, 8 },
929 { 0xf, 16 },
930 { }
931 };
932
933 static const struct clk_div_table clk_alpha_2bit_div_table[] = {
934 { 0x0, 1 },
935 { 0x1, 2 },
936 { 0x3, 4 },
937 { }
938 };
939
940 static long
clk_alpha_pll_postdiv_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * prate)941 clk_alpha_pll_postdiv_round_rate(struct clk_hw *hw, unsigned long rate,
942 unsigned long *prate)
943 {
944 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
945 const struct clk_div_table *table;
946
947 if (pll->width == 2)
948 table = clk_alpha_2bit_div_table;
949 else
950 table = clk_alpha_div_table;
951
952 return divider_round_rate(hw, rate, prate, table,
953 pll->width, CLK_DIVIDER_POWER_OF_TWO);
954 }
955
956 static long
clk_alpha_pll_postdiv_round_ro_rate(struct clk_hw * hw,unsigned long rate,unsigned long * prate)957 clk_alpha_pll_postdiv_round_ro_rate(struct clk_hw *hw, unsigned long rate,
958 unsigned long *prate)
959 {
960 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
961 u32 ctl, div;
962
963 regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl);
964
965 ctl >>= PLL_POST_DIV_SHIFT;
966 ctl &= BIT(pll->width) - 1;
967 div = 1 << fls(ctl);
968
969 if (clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT)
970 *prate = clk_hw_round_rate(clk_hw_get_parent(hw), div * rate);
971
972 return DIV_ROUND_UP_ULL((u64)*prate, div);
973 }
974
clk_alpha_pll_postdiv_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)975 static int clk_alpha_pll_postdiv_set_rate(struct clk_hw *hw, unsigned long rate,
976 unsigned long parent_rate)
977 {
978 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
979 int div;
980
981 /* 16 -> 0xf, 8 -> 0x7, 4 -> 0x3, 2 -> 0x1, 1 -> 0x0 */
982 div = DIV_ROUND_UP_ULL(parent_rate, rate) - 1;
983
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);
987 }
988
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,
993 };
994 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_ops);
995
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,
999 };
1000 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_ro_ops);
1001
clk_fabia_pll_configure(struct clk_alpha_pll * pll,struct regmap * regmap,const struct alpha_pll_config * config)1002 void clk_fabia_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
1003 const struct alpha_pll_config *config)
1004 {
1005 u32 val, mask;
1006
1007 if (config->l)
1008 regmap_write(regmap, PLL_L_VAL(pll), config->l);
1009
1010 if (config->alpha)
1011 regmap_write(regmap, PLL_FRAC(pll), config->alpha);
1012
1013 if (config->config_ctl_val)
1014 regmap_write(regmap, PLL_CONFIG_CTL(pll),
1015 config->config_ctl_val);
1016
1017 if (config->config_ctl_hi_val)
1018 regmap_write(regmap, PLL_CONFIG_CTL_U(pll),
1019 config->config_ctl_hi_val);
1020
1021 if (config->user_ctl_val)
1022 regmap_write(regmap, PLL_USER_CTL(pll), config->user_ctl_val);
1023
1024 if (config->user_ctl_hi_val)
1025 regmap_write(regmap, PLL_USER_CTL_U(pll),
1026 config->user_ctl_hi_val);
1027
1028 if (config->test_ctl_val)
1029 regmap_write(regmap, PLL_TEST_CTL(pll),
1030 config->test_ctl_val);
1031
1032 if (config->test_ctl_hi_val)
1033 regmap_write(regmap, PLL_TEST_CTL_U(pll),
1034 config->test_ctl_hi_val);
1035
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);
1040 }
1041
1042 regmap_update_bits(regmap, PLL_MODE(pll), PLL_UPDATE_BYPASS,
1043 PLL_UPDATE_BYPASS);
1044
1045 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N);
1046 }
1047 EXPORT_SYMBOL_GPL(clk_fabia_pll_configure);
1048
alpha_pll_fabia_enable(struct clk_hw * hw)1049 static int alpha_pll_fabia_enable(struct clk_hw *hw)
1050 {
1051 int ret;
1052 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1053 u32 val, opmode_val;
1054 struct regmap *regmap = pll->clkr.regmap;
1055
1056 ret = regmap_read(regmap, PLL_MODE(pll), &val);
1057 if (ret)
1058 return ret;
1059
1060 /* If in FSM mode, just vote for it */
1061 if (val & PLL_VOTE_FSM_ENA) {
1062 ret = clk_enable_regmap(hw);
1063 if (ret)
1064 return ret;
1065 return wait_for_pll_enable_active(pll);
1066 }
1067
1068 ret = regmap_read(regmap, PLL_OPMODE(pll), &opmode_val);
1069 if (ret)
1070 return ret;
1071
1072 /* Skip If PLL is already running */
1073 if ((opmode_val & PLL_RUN) && (val & PLL_OUTCTRL))
1074 return 0;
1075
1076 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
1077 if (ret)
1078 return ret;
1079
1080 ret = regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY);
1081 if (ret)
1082 return ret;
1083
1084 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N,
1085 PLL_RESET_N);
1086 if (ret)
1087 return ret;
1088
1089 ret = regmap_write(regmap, PLL_OPMODE(pll), PLL_RUN);
1090 if (ret)
1091 return ret;
1092
1093 ret = wait_for_pll_enable_lock(pll);
1094 if (ret)
1095 return ret;
1096
1097 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll),
1098 PLL_OUT_MASK, PLL_OUT_MASK);
1099 if (ret)
1100 return ret;
1101
1102 return regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL,
1103 PLL_OUTCTRL);
1104 }
1105
alpha_pll_fabia_disable(struct clk_hw * hw)1106 static void alpha_pll_fabia_disable(struct clk_hw *hw)
1107 {
1108 int ret;
1109 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1110 u32 val;
1111 struct regmap *regmap = pll->clkr.regmap;
1112
1113 ret = regmap_read(regmap, PLL_MODE(pll), &val);
1114 if (ret)
1115 return;
1116
1117 /* If in FSM mode, just unvote it */
1118 if (val & PLL_FSM_ENA) {
1119 clk_disable_regmap(hw);
1120 return;
1121 }
1122
1123 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
1124 if (ret)
1125 return;
1126
1127 /* Disable main outputs */
1128 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll), PLL_OUT_MASK, 0);
1129 if (ret)
1130 return;
1131
1132 /* Place the PLL in STANDBY */
1133 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY);
1134 }
1135
alpha_pll_fabia_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)1136 static unsigned long alpha_pll_fabia_recalc_rate(struct clk_hw *hw,
1137 unsigned long parent_rate)
1138 {
1139 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1140 u32 l, frac, alpha_width = pll_alpha_width(pll);
1141
1142 regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l);
1143 regmap_read(pll->clkr.regmap, PLL_FRAC(pll), &frac);
1144
1145 return alpha_pll_calc_rate(parent_rate, l, frac, alpha_width);
1146 }
1147
alpha_pll_fabia_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long prate)1148 static int alpha_pll_fabia_set_rate(struct clk_hw *hw, unsigned long rate,
1149 unsigned long prate)
1150 {
1151 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1152 u32 l, alpha_width = pll_alpha_width(pll);
1153 u64 a;
1154 unsigned long rrate, max = rate + PLL_RATE_MARGIN;
1155
1156 rrate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width);
1157
1158 /*
1159 * Due to limited number of bits for fractional rate programming, the
1160 * rounded up rate could be marginally higher than the requested rate.
1161 */
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);
1165 return -EINVAL;
1166 }
1167
1168 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
1169 regmap_write(pll->clkr.regmap, PLL_FRAC(pll), a);
1170
1171 return __clk_alpha_pll_update_latch(pll);
1172 }
1173
alpha_pll_fabia_prepare(struct clk_hw * hw)1174 static int alpha_pll_fabia_prepare(struct clk_hw *hw)
1175 {
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);
1182 u64 a;
1183 int ret;
1184
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);
1187 if (ret)
1188 return ret;
1189
1190 /* Return early if calibration is not needed. */
1191 if (val & PLL_RESET_N)
1192 return 0;
1193
1194 vco = alpha_pll_find_vco(pll, clk_hw_get_rate(hw));
1195 if (!vco) {
1196 pr_err("%s: alpha pll not in a valid vco range\n", name);
1197 return -EINVAL;
1198 }
1199
1200 cal_freq = DIV_ROUND_CLOSEST((pll->vco_table[0].min_freq +
1201 pll->vco_table[0].max_freq) * 54, 100);
1202
1203 parent_hw = clk_hw_get_parent(hw);
1204 if (!parent_hw)
1205 return -EINVAL;
1206
1207 rrate = alpha_pll_round_rate(cal_freq, clk_hw_get_rate(parent_hw),
1208 &cal_l, &a, alpha_width);
1209 /*
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.
1212 */
1213 if (rrate > (cal_freq + PLL_RATE_MARGIN) || rrate < cal_freq)
1214 return -EINVAL;
1215
1216 /* Setup PLL for calibration frequency */
1217 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), cal_l);
1218
1219 /* Bringup the PLL at calibration frequency */
1220 ret = clk_alpha_pll_enable(hw);
1221 if (ret) {
1222 pr_err("%s: alpha pll calibration failed\n", name);
1223 return ret;
1224 }
1225
1226 clk_alpha_pll_disable(hw);
1227
1228 return 0;
1229 }
1230
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,
1239 };
1240 EXPORT_SYMBOL_GPL(clk_alpha_pll_fabia_ops);
1241
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,
1248 };
1249 EXPORT_SYMBOL_GPL(clk_alpha_pll_fixed_fabia_ops);
1250
clk_alpha_pll_postdiv_fabia_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)1251 static unsigned long clk_alpha_pll_postdiv_fabia_recalc_rate(struct clk_hw *hw,
1252 unsigned long parent_rate)
1253 {
1254 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1255 u32 i, div = 1, val;
1256 int ret;
1257
1258 ret = regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &val);
1259 if (ret)
1260 return ret;
1261
1262 val >>= pll->post_div_shift;
1263 val &= BIT(pll->width) - 1;
1264
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;
1268 break;
1269 }
1270 }
1271
1272 return (parent_rate / div);
1273 }
1274
1275 static unsigned long
clk_trion_pll_postdiv_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)1276 clk_trion_pll_postdiv_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
1277 {
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;
1281
1282 regmap_read(regmap, PLL_USER_CTL(pll), &val);
1283
1284 val >>= pll->post_div_shift;
1285 val &= PLL_POST_DIV_MASK(pll);
1286
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;
1290 break;
1291 }
1292 }
1293
1294 return (parent_rate / div);
1295 }
1296
1297 static long
clk_trion_pll_postdiv_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * prate)1298 clk_trion_pll_postdiv_round_rate(struct clk_hw *hw, unsigned long rate,
1299 unsigned long *prate)
1300 {
1301 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1302
1303 return divider_round_rate(hw, rate, prate, pll->post_div_table,
1304 pll->width, CLK_DIVIDER_ROUND_CLOSEST);
1305 };
1306
1307 static int
clk_trion_pll_postdiv_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)1308 clk_trion_pll_postdiv_set_rate(struct clk_hw *hw, unsigned long rate,
1309 unsigned long parent_rate)
1310 {
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;
1314
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;
1319 break;
1320 }
1321 }
1322
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);
1326 }
1327
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,
1332 };
1333 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_trion_ops);
1334
clk_alpha_pll_postdiv_fabia_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * prate)1335 static long clk_alpha_pll_postdiv_fabia_round_rate(struct clk_hw *hw,
1336 unsigned long rate, unsigned long *prate)
1337 {
1338 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1339
1340 return divider_round_rate(hw, rate, prate, pll->post_div_table,
1341 pll->width, CLK_DIVIDER_ROUND_CLOSEST);
1342 }
1343
clk_alpha_pll_postdiv_fabia_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)1344 static int clk_alpha_pll_postdiv_fabia_set_rate(struct clk_hw *hw,
1345 unsigned long rate, unsigned long parent_rate)
1346 {
1347 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1348 int i, val = 0, div, ret;
1349
1350 /*
1351 * If the PLL is in FSM mode, then treat set_rate callback as a
1352 * no-operation.
1353 */
1354 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
1355 if (ret)
1356 return ret;
1357
1358 if (val & PLL_VOTE_FSM_ENA)
1359 return 0;
1360
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;
1365 break;
1366 }
1367 }
1368
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);
1372 }
1373
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,
1378 };
1379 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_fabia_ops);
1380
1381 /**
1382 * clk_lucid_pll_configure - configure the lucid pll
1383 *
1384 * @pll: clk alpha pll
1385 * @regmap: register map
1386 * @config: configuration to apply for pll
1387 */
clk_trion_pll_configure(struct clk_alpha_pll * pll,struct regmap * regmap,const struct alpha_pll_config * config)1388 void clk_trion_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
1389 const struct alpha_pll_config *config)
1390 {
1391 if (config->l)
1392 regmap_write(regmap, PLL_L_VAL(pll), config->l);
1393
1394 regmap_write(regmap, PLL_CAL_L_VAL(pll), TRION_PLL_CAL_VAL);
1395
1396 if (config->alpha)
1397 regmap_write(regmap, PLL_ALPHA_VAL(pll), config->alpha);
1398
1399 if (config->config_ctl_val)
1400 regmap_write(regmap, PLL_CONFIG_CTL(pll),
1401 config->config_ctl_val);
1402
1403 if (config->config_ctl_hi_val)
1404 regmap_write(regmap, PLL_CONFIG_CTL_U(pll),
1405 config->config_ctl_hi_val);
1406
1407 if (config->config_ctl_hi1_val)
1408 regmap_write(regmap, PLL_CONFIG_CTL_U1(pll),
1409 config->config_ctl_hi1_val);
1410
1411 if (config->user_ctl_val)
1412 regmap_write(regmap, PLL_USER_CTL(pll),
1413 config->user_ctl_val);
1414
1415 if (config->user_ctl_hi_val)
1416 regmap_write(regmap, PLL_USER_CTL_U(pll),
1417 config->user_ctl_hi_val);
1418
1419 if (config->user_ctl_hi1_val)
1420 regmap_write(regmap, PLL_USER_CTL_U1(pll),
1421 config->user_ctl_hi1_val);
1422
1423 if (config->test_ctl_val)
1424 regmap_write(regmap, PLL_TEST_CTL(pll),
1425 config->test_ctl_val);
1426
1427 if (config->test_ctl_hi_val)
1428 regmap_write(regmap, PLL_TEST_CTL_U(pll),
1429 config->test_ctl_hi_val);
1430
1431 if (config->test_ctl_hi1_val)
1432 regmap_write(regmap, PLL_TEST_CTL_U1(pll),
1433 config->test_ctl_hi1_val);
1434
1435 regmap_update_bits(regmap, PLL_MODE(pll), PLL_UPDATE_BYPASS,
1436 PLL_UPDATE_BYPASS);
1437
1438 /* Disable PLL output */
1439 regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
1440
1441 /* Set operation mode to OFF */
1442 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY);
1443
1444 /* Place the PLL in STANDBY mode */
1445 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N);
1446 }
1447 EXPORT_SYMBOL_GPL(clk_trion_pll_configure);
1448
1449 /*
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.
1452 */
__alpha_pll_trion_prepare(struct clk_hw * hw,u32 pcal_done)1453 static int __alpha_pll_trion_prepare(struct clk_hw *hw, u32 pcal_done)
1454 {
1455 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1456 u32 regval;
1457 int ret;
1458
1459 /* Return early if calibration is not needed. */
1460 regmap_read(pll->clkr.regmap, PLL_STATUS(pll), ®val);
1461 if (regval & pcal_done)
1462 return 0;
1463
1464 /* On/off to calibrate */
1465 ret = clk_trion_pll_enable(hw);
1466 if (!ret)
1467 clk_trion_pll_disable(hw);
1468
1469 return ret;
1470 }
1471
alpha_pll_trion_prepare(struct clk_hw * hw)1472 static int alpha_pll_trion_prepare(struct clk_hw *hw)
1473 {
1474 return __alpha_pll_trion_prepare(hw, TRION_PCAL_DONE);
1475 }
1476
alpha_pll_lucid_prepare(struct clk_hw * hw)1477 static int alpha_pll_lucid_prepare(struct clk_hw *hw)
1478 {
1479 return __alpha_pll_trion_prepare(hw, LUCID_PCAL_DONE);
1480 }
1481
alpha_pll_trion_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long prate)1482 static int alpha_pll_trion_set_rate(struct clk_hw *hw, unsigned long rate,
1483 unsigned long prate)
1484 {
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);
1488 u64 a;
1489 int ret;
1490
1491 rrate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width);
1492
1493 /*
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.
1496 */
1497 if (rrate > (rate + PLL_RATE_MARGIN) || rrate < rate) {
1498 pr_err("Call set rate on the PLL with rounded rates!\n");
1499 return -EINVAL;
1500 }
1501
1502 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
1503 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a);
1504
1505 /* Latch the PLL input */
1506 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
1507 PLL_UPDATE, PLL_UPDATE);
1508 if (ret)
1509 return ret;
1510
1511 /* Wait for 2 reference cycles before checking the ACK bit. */
1512 udelay(1);
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");
1516 return -EINVAL;
1517 }
1518
1519 /* Return the latch input to 0 */
1520 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
1521 PLL_UPDATE, 0);
1522 if (ret)
1523 return ret;
1524
1525 if (clk_hw_is_enabled(hw)) {
1526 ret = wait_for_pll_enable_lock(pll);
1527 if (ret)
1528 return ret;
1529 }
1530
1531 /* Wait for PLL output to stabilize */
1532 udelay(100);
1533 return 0;
1534 }
1535
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,
1544 };
1545 EXPORT_SYMBOL_GPL(clk_alpha_pll_trion_ops);
1546
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,
1555 };
1556 EXPORT_SYMBOL_GPL(clk_alpha_pll_lucid_ops);
1557
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,
1562 };
1563 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_lucid_ops);
1564