1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (c) 2015, 2018, The Linux Foundation. All rights reserved.
4 * Copyright (c) 2021, 2023, Qualcomm Innovation Center, Inc. All rights reserved.
5 */
6
7 #include <linux/kernel.h>
8 #include <linux/export.h>
9 #include <linux/clk-provider.h>
10 #include <linux/regmap.h>
11 #include <linux/delay.h>
12
13 #include "clk-alpha-pll.h"
14 #include "common.h"
15
16 #define PLL_MODE(p) ((p)->offset + 0x0)
17 # define PLL_OUTCTRL BIT(0)
18 # define PLL_BYPASSNL BIT(1)
19 # define PLL_RESET_N BIT(2)
20 # define PLL_OFFLINE_REQ BIT(7)
21 # define PLL_LOCK_COUNT_SHIFT 8
22 # define PLL_LOCK_COUNT_MASK 0x3f
23 # define PLL_BIAS_COUNT_SHIFT 14
24 # define PLL_BIAS_COUNT_MASK 0x3f
25 # define PLL_VOTE_FSM_ENA BIT(20)
26 # define PLL_FSM_ENA BIT(20)
27 # define PLL_VOTE_FSM_RESET BIT(21)
28 # define PLL_UPDATE BIT(22)
29 # define PLL_UPDATE_BYPASS BIT(23)
30 # define PLL_FSM_LEGACY_MODE BIT(24)
31 # define PLL_OFFLINE_ACK BIT(28)
32 # define ALPHA_PLL_ACK_LATCH BIT(29)
33 # define PLL_ACTIVE_FLAG BIT(30)
34 # define PLL_LOCK_DET BIT(31)
35
36 #define PLL_L_VAL(p) ((p)->offset + (p)->regs[PLL_OFF_L_VAL])
37 #define PLL_CAL_L_VAL(p) ((p)->offset + (p)->regs[PLL_OFF_CAL_L_VAL])
38 #define PLL_ALPHA_VAL(p) ((p)->offset + (p)->regs[PLL_OFF_ALPHA_VAL])
39 #define PLL_ALPHA_VAL_U(p) ((p)->offset + (p)->regs[PLL_OFF_ALPHA_VAL_U])
40
41 #define PLL_USER_CTL(p) ((p)->offset + (p)->regs[PLL_OFF_USER_CTL])
42 # define PLL_POST_DIV_SHIFT 8
43 # define PLL_POST_DIV_MASK(p) GENMASK((p)->width - 1, 0)
44 # define PLL_ALPHA_EN BIT(24)
45 # define PLL_ALPHA_MODE BIT(25)
46 # define PLL_VCO_SHIFT 20
47 # define PLL_VCO_MASK 0x3
48
49 #define PLL_USER_CTL_U(p) ((p)->offset + (p)->regs[PLL_OFF_USER_CTL_U])
50 #define PLL_USER_CTL_U1(p) ((p)->offset + (p)->regs[PLL_OFF_USER_CTL_U1])
51
52 #define PLL_CONFIG_CTL(p) ((p)->offset + (p)->regs[PLL_OFF_CONFIG_CTL])
53 #define PLL_CONFIG_CTL_U(p) ((p)->offset + (p)->regs[PLL_OFF_CONFIG_CTL_U])
54 #define PLL_CONFIG_CTL_U1(p) ((p)->offset + (p)->regs[PLL_OFF_CONFIG_CTL_U1])
55 #define PLL_TEST_CTL(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL])
56 #define PLL_TEST_CTL_U(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL_U])
57 #define PLL_TEST_CTL_U1(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL_U1])
58 #define PLL_TEST_CTL_U2(p) ((p)->offset + (p)->regs[PLL_OFF_TEST_CTL_U2])
59 #define PLL_STATUS(p) ((p)->offset + (p)->regs[PLL_OFF_STATUS])
60 #define PLL_OPMODE(p) ((p)->offset + (p)->regs[PLL_OFF_OPMODE])
61 #define PLL_FRAC(p) ((p)->offset + (p)->regs[PLL_OFF_FRAC])
62
63 const u8 clk_alpha_pll_regs[][PLL_OFF_MAX_REGS] = {
64 [CLK_ALPHA_PLL_TYPE_DEFAULT] = {
65 [PLL_OFF_L_VAL] = 0x04,
66 [PLL_OFF_ALPHA_VAL] = 0x08,
67 [PLL_OFF_ALPHA_VAL_U] = 0x0c,
68 [PLL_OFF_USER_CTL] = 0x10,
69 [PLL_OFF_USER_CTL_U] = 0x14,
70 [PLL_OFF_CONFIG_CTL] = 0x18,
71 [PLL_OFF_TEST_CTL] = 0x1c,
72 [PLL_OFF_TEST_CTL_U] = 0x20,
73 [PLL_OFF_STATUS] = 0x24,
74 },
75 [CLK_ALPHA_PLL_TYPE_HUAYRA] = {
76 [PLL_OFF_L_VAL] = 0x04,
77 [PLL_OFF_ALPHA_VAL] = 0x08,
78 [PLL_OFF_USER_CTL] = 0x10,
79 [PLL_OFF_CONFIG_CTL] = 0x14,
80 [PLL_OFF_CONFIG_CTL_U] = 0x18,
81 [PLL_OFF_TEST_CTL] = 0x1c,
82 [PLL_OFF_TEST_CTL_U] = 0x20,
83 [PLL_OFF_STATUS] = 0x24,
84 },
85 [CLK_ALPHA_PLL_TYPE_BRAMMO] = {
86 [PLL_OFF_L_VAL] = 0x04,
87 [PLL_OFF_ALPHA_VAL] = 0x08,
88 [PLL_OFF_ALPHA_VAL_U] = 0x0c,
89 [PLL_OFF_USER_CTL] = 0x10,
90 [PLL_OFF_CONFIG_CTL] = 0x18,
91 [PLL_OFF_TEST_CTL] = 0x1c,
92 [PLL_OFF_STATUS] = 0x24,
93 },
94 [CLK_ALPHA_PLL_TYPE_FABIA] = {
95 [PLL_OFF_L_VAL] = 0x04,
96 [PLL_OFF_USER_CTL] = 0x0c,
97 [PLL_OFF_USER_CTL_U] = 0x10,
98 [PLL_OFF_CONFIG_CTL] = 0x14,
99 [PLL_OFF_CONFIG_CTL_U] = 0x18,
100 [PLL_OFF_TEST_CTL] = 0x1c,
101 [PLL_OFF_TEST_CTL_U] = 0x20,
102 [PLL_OFF_STATUS] = 0x24,
103 [PLL_OFF_OPMODE] = 0x2c,
104 [PLL_OFF_FRAC] = 0x38,
105 },
106 [CLK_ALPHA_PLL_TYPE_TRION] = {
107 [PLL_OFF_L_VAL] = 0x04,
108 [PLL_OFF_CAL_L_VAL] = 0x08,
109 [PLL_OFF_USER_CTL] = 0x0c,
110 [PLL_OFF_USER_CTL_U] = 0x10,
111 [PLL_OFF_USER_CTL_U1] = 0x14,
112 [PLL_OFF_CONFIG_CTL] = 0x18,
113 [PLL_OFF_CONFIG_CTL_U] = 0x1c,
114 [PLL_OFF_CONFIG_CTL_U1] = 0x20,
115 [PLL_OFF_TEST_CTL] = 0x24,
116 [PLL_OFF_TEST_CTL_U] = 0x28,
117 [PLL_OFF_TEST_CTL_U1] = 0x2c,
118 [PLL_OFF_STATUS] = 0x30,
119 [PLL_OFF_OPMODE] = 0x38,
120 [PLL_OFF_ALPHA_VAL] = 0x40,
121 },
122 [CLK_ALPHA_PLL_TYPE_AGERA] = {
123 [PLL_OFF_L_VAL] = 0x04,
124 [PLL_OFF_ALPHA_VAL] = 0x08,
125 [PLL_OFF_USER_CTL] = 0x0c,
126 [PLL_OFF_CONFIG_CTL] = 0x10,
127 [PLL_OFF_CONFIG_CTL_U] = 0x14,
128 [PLL_OFF_TEST_CTL] = 0x18,
129 [PLL_OFF_TEST_CTL_U] = 0x1c,
130 [PLL_OFF_STATUS] = 0x2c,
131 },
132 [CLK_ALPHA_PLL_TYPE_ZONDA] = {
133 [PLL_OFF_L_VAL] = 0x04,
134 [PLL_OFF_ALPHA_VAL] = 0x08,
135 [PLL_OFF_USER_CTL] = 0x0c,
136 [PLL_OFF_CONFIG_CTL] = 0x10,
137 [PLL_OFF_CONFIG_CTL_U] = 0x14,
138 [PLL_OFF_CONFIG_CTL_U1] = 0x18,
139 [PLL_OFF_TEST_CTL] = 0x1c,
140 [PLL_OFF_TEST_CTL_U] = 0x20,
141 [PLL_OFF_TEST_CTL_U1] = 0x24,
142 [PLL_OFF_OPMODE] = 0x28,
143 [PLL_OFF_STATUS] = 0x38,
144 },
145 [CLK_ALPHA_PLL_TYPE_LUCID_EVO] = {
146 [PLL_OFF_OPMODE] = 0x04,
147 [PLL_OFF_STATUS] = 0x0c,
148 [PLL_OFF_L_VAL] = 0x10,
149 [PLL_OFF_ALPHA_VAL] = 0x14,
150 [PLL_OFF_USER_CTL] = 0x18,
151 [PLL_OFF_USER_CTL_U] = 0x1c,
152 [PLL_OFF_CONFIG_CTL] = 0x20,
153 [PLL_OFF_CONFIG_CTL_U] = 0x24,
154 [PLL_OFF_CONFIG_CTL_U1] = 0x28,
155 [PLL_OFF_TEST_CTL] = 0x2c,
156 [PLL_OFF_TEST_CTL_U] = 0x30,
157 [PLL_OFF_TEST_CTL_U1] = 0x34,
158 },
159 [CLK_ALPHA_PLL_TYPE_LUCID_OLE] = {
160 [PLL_OFF_OPMODE] = 0x04,
161 [PLL_OFF_STATE] = 0x08,
162 [PLL_OFF_STATUS] = 0x0c,
163 [PLL_OFF_L_VAL] = 0x10,
164 [PLL_OFF_ALPHA_VAL] = 0x14,
165 [PLL_OFF_USER_CTL] = 0x18,
166 [PLL_OFF_USER_CTL_U] = 0x1c,
167 [PLL_OFF_CONFIG_CTL] = 0x20,
168 [PLL_OFF_CONFIG_CTL_U] = 0x24,
169 [PLL_OFF_CONFIG_CTL_U1] = 0x28,
170 [PLL_OFF_TEST_CTL] = 0x2c,
171 [PLL_OFF_TEST_CTL_U] = 0x30,
172 [PLL_OFF_TEST_CTL_U1] = 0x34,
173 [PLL_OFF_TEST_CTL_U2] = 0x38,
174 },
175 [CLK_ALPHA_PLL_TYPE_RIVIAN_EVO] = {
176 [PLL_OFF_OPMODE] = 0x04,
177 [PLL_OFF_STATUS] = 0x0c,
178 [PLL_OFF_L_VAL] = 0x10,
179 [PLL_OFF_USER_CTL] = 0x14,
180 [PLL_OFF_USER_CTL_U] = 0x18,
181 [PLL_OFF_CONFIG_CTL] = 0x1c,
182 [PLL_OFF_CONFIG_CTL_U] = 0x20,
183 [PLL_OFF_CONFIG_CTL_U1] = 0x24,
184 [PLL_OFF_TEST_CTL] = 0x28,
185 [PLL_OFF_TEST_CTL_U] = 0x2c,
186 },
187 [CLK_ALPHA_PLL_TYPE_DEFAULT_EVO] = {
188 [PLL_OFF_L_VAL] = 0x04,
189 [PLL_OFF_ALPHA_VAL] = 0x08,
190 [PLL_OFF_ALPHA_VAL_U] = 0x0c,
191 [PLL_OFF_TEST_CTL] = 0x10,
192 [PLL_OFF_TEST_CTL_U] = 0x14,
193 [PLL_OFF_USER_CTL] = 0x18,
194 [PLL_OFF_USER_CTL_U] = 0x1c,
195 [PLL_OFF_CONFIG_CTL] = 0x20,
196 [PLL_OFF_STATUS] = 0x24,
197 },
198 [CLK_ALPHA_PLL_TYPE_BRAMMO_EVO] = {
199 [PLL_OFF_L_VAL] = 0x04,
200 [PLL_OFF_ALPHA_VAL] = 0x08,
201 [PLL_OFF_ALPHA_VAL_U] = 0x0c,
202 [PLL_OFF_TEST_CTL] = 0x10,
203 [PLL_OFF_TEST_CTL_U] = 0x14,
204 [PLL_OFF_USER_CTL] = 0x18,
205 [PLL_OFF_CONFIG_CTL] = 0x1C,
206 [PLL_OFF_STATUS] = 0x20,
207 },
208 [CLK_ALPHA_PLL_TYPE_STROMER] = {
209 [PLL_OFF_L_VAL] = 0x08,
210 [PLL_OFF_ALPHA_VAL] = 0x10,
211 [PLL_OFF_ALPHA_VAL_U] = 0x14,
212 [PLL_OFF_USER_CTL] = 0x18,
213 [PLL_OFF_USER_CTL_U] = 0x1c,
214 [PLL_OFF_CONFIG_CTL] = 0x20,
215 [PLL_OFF_TEST_CTL] = 0x30,
216 [PLL_OFF_TEST_CTL_U] = 0x34,
217 [PLL_OFF_STATUS] = 0x28,
218 },
219 [CLK_ALPHA_PLL_TYPE_STROMER_PLUS] = {
220 [PLL_OFF_L_VAL] = 0x04,
221 [PLL_OFF_USER_CTL] = 0x08,
222 [PLL_OFF_USER_CTL_U] = 0x0c,
223 [PLL_OFF_CONFIG_CTL] = 0x10,
224 [PLL_OFF_TEST_CTL] = 0x14,
225 [PLL_OFF_TEST_CTL_U] = 0x18,
226 [PLL_OFF_STATUS] = 0x1c,
227 [PLL_OFF_ALPHA_VAL] = 0x24,
228 [PLL_OFF_ALPHA_VAL_U] = 0x28,
229 },
230 };
231 EXPORT_SYMBOL_GPL(clk_alpha_pll_regs);
232
233 /*
234 * Even though 40 bits are present, use only 32 for ease of calculation.
235 */
236 #define ALPHA_REG_BITWIDTH 40
237 #define ALPHA_REG_16BIT_WIDTH 16
238 #define ALPHA_BITWIDTH 32U
239 #define ALPHA_SHIFT(w) min(w, ALPHA_BITWIDTH)
240
241 #define ALPHA_PLL_STATUS_REG_SHIFT 8
242
243 #define PLL_HUAYRA_M_WIDTH 8
244 #define PLL_HUAYRA_M_SHIFT 8
245 #define PLL_HUAYRA_M_MASK 0xff
246 #define PLL_HUAYRA_N_SHIFT 0
247 #define PLL_HUAYRA_N_MASK 0xff
248 #define PLL_HUAYRA_ALPHA_WIDTH 16
249
250 #define PLL_STANDBY 0x0
251 #define PLL_RUN 0x1
252 #define PLL_OUT_MASK 0x7
253 #define PLL_RATE_MARGIN 500
254
255 /* TRION PLL specific settings and offsets */
256 #define TRION_PLL_CAL_VAL 0x44
257 #define TRION_PCAL_DONE BIT(26)
258
259 /* LUCID PLL specific settings and offsets */
260 #define LUCID_PCAL_DONE BIT(27)
261
262 /* LUCID 5LPE PLL specific settings and offsets */
263 #define LUCID_5LPE_PCAL_DONE BIT(11)
264 #define LUCID_5LPE_ALPHA_PLL_ACK_LATCH BIT(13)
265 #define LUCID_5LPE_PLL_LATCH_INPUT BIT(14)
266 #define LUCID_5LPE_ENABLE_VOTE_RUN BIT(21)
267
268 /* LUCID EVO PLL specific settings and offsets */
269 #define LUCID_EVO_PCAL_NOT_DONE BIT(8)
270 #define LUCID_EVO_ENABLE_VOTE_RUN BIT(25)
271 #define LUCID_EVO_PLL_L_VAL_MASK GENMASK(15, 0)
272 #define LUCID_EVO_PLL_CAL_L_VAL_SHIFT 16
273
274 /* ZONDA PLL specific */
275 #define ZONDA_PLL_OUT_MASK 0xf
276 #define ZONDA_STAY_IN_CFA BIT(16)
277 #define ZONDA_PLL_FREQ_LOCK_DET BIT(29)
278
279 #define pll_alpha_width(p) \
280 ((PLL_ALPHA_VAL_U(p) - PLL_ALPHA_VAL(p) == 4) ? \
281 ALPHA_REG_BITWIDTH : ALPHA_REG_16BIT_WIDTH)
282
283 #define pll_has_64bit_config(p) ((PLL_CONFIG_CTL_U(p) - PLL_CONFIG_CTL(p)) == 4)
284
285 #define to_clk_alpha_pll(_hw) container_of(to_clk_regmap(_hw), \
286 struct clk_alpha_pll, clkr)
287
288 #define to_clk_alpha_pll_postdiv(_hw) container_of(to_clk_regmap(_hw), \
289 struct clk_alpha_pll_postdiv, clkr)
290
wait_for_pll(struct clk_alpha_pll * pll,u32 mask,bool inverse,const char * action)291 static int wait_for_pll(struct clk_alpha_pll *pll, u32 mask, bool inverse,
292 const char *action)
293 {
294 u32 val;
295 int count;
296 int ret;
297 const char *name = clk_hw_get_name(&pll->clkr.hw);
298
299 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
300 if (ret)
301 return ret;
302
303 for (count = 200; count > 0; count--) {
304 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
305 if (ret)
306 return ret;
307 if (inverse && !(val & mask))
308 return 0;
309 else if ((val & mask) == mask)
310 return 0;
311
312 udelay(1);
313 }
314
315 WARN(1, "%s failed to %s!\n", name, action);
316 return -ETIMEDOUT;
317 }
318
319 #define wait_for_pll_enable_active(pll) \
320 wait_for_pll(pll, PLL_ACTIVE_FLAG, 0, "enable")
321
322 #define wait_for_pll_enable_lock(pll) \
323 wait_for_pll(pll, PLL_LOCK_DET, 0, "enable")
324
325 #define wait_for_zonda_pll_freq_lock(pll) \
326 wait_for_pll(pll, ZONDA_PLL_FREQ_LOCK_DET, 0, "freq enable")
327
328 #define wait_for_pll_disable(pll) \
329 wait_for_pll(pll, PLL_ACTIVE_FLAG, 1, "disable")
330
331 #define wait_for_pll_offline(pll) \
332 wait_for_pll(pll, PLL_OFFLINE_ACK, 0, "offline")
333
334 #define wait_for_pll_update(pll) \
335 wait_for_pll(pll, PLL_UPDATE, 1, "update")
336
337 #define wait_for_pll_update_ack_set(pll) \
338 wait_for_pll(pll, ALPHA_PLL_ACK_LATCH, 0, "update_ack_set")
339
340 #define wait_for_pll_update_ack_clear(pll) \
341 wait_for_pll(pll, ALPHA_PLL_ACK_LATCH, 1, "update_ack_clear")
342
clk_alpha_pll_write_config(struct regmap * regmap,unsigned int reg,unsigned int val)343 static void clk_alpha_pll_write_config(struct regmap *regmap, unsigned int reg,
344 unsigned int val)
345 {
346 if (val)
347 regmap_write(regmap, reg, val);
348 }
349
clk_alpha_pll_configure(struct clk_alpha_pll * pll,struct regmap * regmap,const struct alpha_pll_config * config)350 void clk_alpha_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
351 const struct alpha_pll_config *config)
352 {
353 u32 val, mask;
354
355 regmap_write(regmap, PLL_L_VAL(pll), config->l);
356 regmap_write(regmap, PLL_ALPHA_VAL(pll), config->alpha);
357 regmap_write(regmap, PLL_CONFIG_CTL(pll), config->config_ctl_val);
358
359 if (pll_has_64bit_config(pll))
360 regmap_write(regmap, PLL_CONFIG_CTL_U(pll),
361 config->config_ctl_hi_val);
362
363 if (pll_alpha_width(pll) > 32)
364 regmap_write(regmap, PLL_ALPHA_VAL_U(pll), config->alpha_hi);
365
366 val = config->main_output_mask;
367 val |= config->aux_output_mask;
368 val |= config->aux2_output_mask;
369 val |= config->early_output_mask;
370 val |= config->pre_div_val;
371 val |= config->post_div_val;
372 val |= config->vco_val;
373 val |= config->alpha_en_mask;
374 val |= config->alpha_mode_mask;
375
376 mask = config->main_output_mask;
377 mask |= config->aux_output_mask;
378 mask |= config->aux2_output_mask;
379 mask |= config->early_output_mask;
380 mask |= config->pre_div_mask;
381 mask |= config->post_div_mask;
382 mask |= config->vco_mask;
383
384 regmap_update_bits(regmap, PLL_USER_CTL(pll), mask, val);
385
386 if (config->test_ctl_mask)
387 regmap_update_bits(regmap, PLL_TEST_CTL(pll),
388 config->test_ctl_mask,
389 config->test_ctl_val);
390 else
391 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL(pll),
392 config->test_ctl_val);
393
394 if (config->test_ctl_hi_mask)
395 regmap_update_bits(regmap, PLL_TEST_CTL_U(pll),
396 config->test_ctl_hi_mask,
397 config->test_ctl_hi_val);
398 else
399 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U(pll),
400 config->test_ctl_hi_val);
401
402 if (pll->flags & SUPPORTS_FSM_MODE)
403 qcom_pll_set_fsm_mode(regmap, PLL_MODE(pll), 6, 0);
404 }
405 EXPORT_SYMBOL_GPL(clk_alpha_pll_configure);
406
clk_alpha_pll_hwfsm_enable(struct clk_hw * hw)407 static int clk_alpha_pll_hwfsm_enable(struct clk_hw *hw)
408 {
409 int ret;
410 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
411 u32 val;
412
413 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
414 if (ret)
415 return ret;
416
417 val |= PLL_FSM_ENA;
418
419 if (pll->flags & SUPPORTS_OFFLINE_REQ)
420 val &= ~PLL_OFFLINE_REQ;
421
422 ret = regmap_write(pll->clkr.regmap, PLL_MODE(pll), val);
423 if (ret)
424 return ret;
425
426 /* Make sure enable request goes through before waiting for update */
427 mb();
428
429 return wait_for_pll_enable_active(pll);
430 }
431
clk_alpha_pll_hwfsm_disable(struct clk_hw * hw)432 static void clk_alpha_pll_hwfsm_disable(struct clk_hw *hw)
433 {
434 int ret;
435 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
436 u32 val;
437
438 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
439 if (ret)
440 return;
441
442 if (pll->flags & SUPPORTS_OFFLINE_REQ) {
443 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
444 PLL_OFFLINE_REQ, PLL_OFFLINE_REQ);
445 if (ret)
446 return;
447
448 ret = wait_for_pll_offline(pll);
449 if (ret)
450 return;
451 }
452
453 /* Disable hwfsm */
454 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
455 PLL_FSM_ENA, 0);
456 if (ret)
457 return;
458
459 wait_for_pll_disable(pll);
460 }
461
pll_is_enabled(struct clk_hw * hw,u32 mask)462 static int pll_is_enabled(struct clk_hw *hw, u32 mask)
463 {
464 int ret;
465 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
466 u32 val;
467
468 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
469 if (ret)
470 return ret;
471
472 return !!(val & mask);
473 }
474
clk_alpha_pll_hwfsm_is_enabled(struct clk_hw * hw)475 static int clk_alpha_pll_hwfsm_is_enabled(struct clk_hw *hw)
476 {
477 return pll_is_enabled(hw, PLL_ACTIVE_FLAG);
478 }
479
clk_alpha_pll_is_enabled(struct clk_hw * hw)480 static int clk_alpha_pll_is_enabled(struct clk_hw *hw)
481 {
482 return pll_is_enabled(hw, PLL_LOCK_DET);
483 }
484
clk_alpha_pll_enable(struct clk_hw * hw)485 static int clk_alpha_pll_enable(struct clk_hw *hw)
486 {
487 int ret;
488 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
489 u32 val, mask;
490
491 mask = PLL_OUTCTRL | PLL_RESET_N | PLL_BYPASSNL;
492 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
493 if (ret)
494 return ret;
495
496 /* If in FSM mode, just vote for it */
497 if (val & PLL_VOTE_FSM_ENA) {
498 ret = clk_enable_regmap(hw);
499 if (ret)
500 return ret;
501 return wait_for_pll_enable_active(pll);
502 }
503
504 /* Skip if already enabled */
505 if ((val & mask) == mask)
506 return 0;
507
508 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
509 PLL_BYPASSNL, PLL_BYPASSNL);
510 if (ret)
511 return ret;
512
513 /*
514 * H/W requires a 5us delay between disabling the bypass and
515 * de-asserting the reset.
516 */
517 mb();
518 udelay(5);
519
520 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
521 PLL_RESET_N, PLL_RESET_N);
522 if (ret)
523 return ret;
524
525 ret = wait_for_pll_enable_lock(pll);
526 if (ret)
527 return ret;
528
529 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll),
530 PLL_OUTCTRL, PLL_OUTCTRL);
531
532 /* Ensure that the write above goes through before returning. */
533 mb();
534 return ret;
535 }
536
clk_alpha_pll_disable(struct clk_hw * hw)537 static void clk_alpha_pll_disable(struct clk_hw *hw)
538 {
539 int ret;
540 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
541 u32 val, mask;
542
543 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
544 if (ret)
545 return;
546
547 /* If in FSM mode, just unvote it */
548 if (val & PLL_VOTE_FSM_ENA) {
549 clk_disable_regmap(hw);
550 return;
551 }
552
553 mask = PLL_OUTCTRL;
554 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), mask, 0);
555
556 /* Delay of 2 output clock ticks required until output is disabled */
557 mb();
558 udelay(1);
559
560 mask = PLL_RESET_N | PLL_BYPASSNL;
561 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), mask, 0);
562 }
563
564 static unsigned long
alpha_pll_calc_rate(u64 prate,u32 l,u32 a,u32 alpha_width)565 alpha_pll_calc_rate(u64 prate, u32 l, u32 a, u32 alpha_width)
566 {
567 return (prate * l) + ((prate * a) >> ALPHA_SHIFT(alpha_width));
568 }
569
570 static unsigned long
alpha_pll_round_rate(unsigned long rate,unsigned long prate,u32 * l,u64 * a,u32 alpha_width)571 alpha_pll_round_rate(unsigned long rate, unsigned long prate, u32 *l, u64 *a,
572 u32 alpha_width)
573 {
574 u64 remainder;
575 u64 quotient;
576
577 quotient = rate;
578 remainder = do_div(quotient, prate);
579 *l = quotient;
580
581 if (!remainder) {
582 *a = 0;
583 return rate;
584 }
585
586 /* Upper ALPHA_BITWIDTH bits of Alpha */
587 quotient = remainder << ALPHA_SHIFT(alpha_width);
588
589 remainder = do_div(quotient, prate);
590
591 if (remainder)
592 quotient++;
593
594 *a = quotient;
595 return alpha_pll_calc_rate(prate, *l, *a, alpha_width);
596 }
597
598 static const struct pll_vco *
alpha_pll_find_vco(const struct clk_alpha_pll * pll,unsigned long rate)599 alpha_pll_find_vco(const struct clk_alpha_pll *pll, unsigned long rate)
600 {
601 const struct pll_vco *v = pll->vco_table;
602 const struct pll_vco *end = v + pll->num_vco;
603
604 for (; v < end; v++)
605 if (rate >= v->min_freq && rate <= v->max_freq)
606 return v;
607
608 return NULL;
609 }
610
611 static unsigned long
clk_alpha_pll_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)612 clk_alpha_pll_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
613 {
614 u32 l, low, high, ctl;
615 u64 a = 0, prate = parent_rate;
616 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
617 u32 alpha_width = pll_alpha_width(pll);
618
619 regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l);
620
621 regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl);
622 if (ctl & PLL_ALPHA_EN) {
623 regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &low);
624 if (alpha_width > 32) {
625 regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll),
626 &high);
627 a = (u64)high << 32 | low;
628 } else {
629 a = low & GENMASK(alpha_width - 1, 0);
630 }
631
632 if (alpha_width > ALPHA_BITWIDTH)
633 a >>= alpha_width - ALPHA_BITWIDTH;
634 }
635
636 return alpha_pll_calc_rate(prate, l, a, alpha_width);
637 }
638
639
__clk_alpha_pll_update_latch(struct clk_alpha_pll * pll)640 static int __clk_alpha_pll_update_latch(struct clk_alpha_pll *pll)
641 {
642 int ret;
643 u32 mode;
644
645 regmap_read(pll->clkr.regmap, PLL_MODE(pll), &mode);
646
647 /* Latch the input to the PLL */
648 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_UPDATE,
649 PLL_UPDATE);
650
651 /* Wait for 2 reference cycle before checking ACK bit */
652 udelay(1);
653
654 /*
655 * PLL will latch the new L, Alpha and freq control word.
656 * PLL will respond by raising PLL_ACK_LATCH output when new programming
657 * has been latched in and PLL is being updated. When
658 * UPDATE_LOGIC_BYPASS bit is not set, PLL_UPDATE will be cleared
659 * automatically by hardware when PLL_ACK_LATCH is asserted by PLL.
660 */
661 if (mode & PLL_UPDATE_BYPASS) {
662 ret = wait_for_pll_update_ack_set(pll);
663 if (ret)
664 return ret;
665
666 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_UPDATE, 0);
667 } else {
668 ret = wait_for_pll_update(pll);
669 if (ret)
670 return ret;
671 }
672
673 ret = wait_for_pll_update_ack_clear(pll);
674 if (ret)
675 return ret;
676
677 /* Wait for PLL output to stabilize */
678 udelay(10);
679
680 return 0;
681 }
682
clk_alpha_pll_update_latch(struct clk_alpha_pll * pll,int (* is_enabled)(struct clk_hw *))683 static int clk_alpha_pll_update_latch(struct clk_alpha_pll *pll,
684 int (*is_enabled)(struct clk_hw *))
685 {
686 if (!is_enabled(&pll->clkr.hw) ||
687 !(pll->flags & SUPPORTS_DYNAMIC_UPDATE))
688 return 0;
689
690 return __clk_alpha_pll_update_latch(pll);
691 }
692
__clk_alpha_pll_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long prate,int (* is_enabled)(struct clk_hw *))693 static int __clk_alpha_pll_set_rate(struct clk_hw *hw, unsigned long rate,
694 unsigned long prate,
695 int (*is_enabled)(struct clk_hw *))
696 {
697 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
698 const struct pll_vco *vco;
699 u32 l, alpha_width = pll_alpha_width(pll);
700 u64 a;
701
702 rate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width);
703 vco = alpha_pll_find_vco(pll, rate);
704 if (pll->vco_table && !vco) {
705 pr_err("%s: alpha pll not in a valid vco range\n",
706 clk_hw_get_name(hw));
707 return -EINVAL;
708 }
709
710 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
711
712 if (alpha_width > ALPHA_BITWIDTH)
713 a <<= alpha_width - ALPHA_BITWIDTH;
714
715 if (alpha_width > 32)
716 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll), a >> 32);
717
718 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a);
719
720 if (vco) {
721 regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
722 PLL_VCO_MASK << PLL_VCO_SHIFT,
723 vco->val << PLL_VCO_SHIFT);
724 }
725
726 regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
727 PLL_ALPHA_EN, PLL_ALPHA_EN);
728
729 return clk_alpha_pll_update_latch(pll, is_enabled);
730 }
731
clk_alpha_pll_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long prate)732 static int clk_alpha_pll_set_rate(struct clk_hw *hw, unsigned long rate,
733 unsigned long prate)
734 {
735 return __clk_alpha_pll_set_rate(hw, rate, prate,
736 clk_alpha_pll_is_enabled);
737 }
738
clk_alpha_pll_hwfsm_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long prate)739 static int clk_alpha_pll_hwfsm_set_rate(struct clk_hw *hw, unsigned long rate,
740 unsigned long prate)
741 {
742 return __clk_alpha_pll_set_rate(hw, rate, prate,
743 clk_alpha_pll_hwfsm_is_enabled);
744 }
745
clk_alpha_pll_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * prate)746 static long clk_alpha_pll_round_rate(struct clk_hw *hw, unsigned long rate,
747 unsigned long *prate)
748 {
749 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
750 u32 l, alpha_width = pll_alpha_width(pll);
751 u64 a;
752 unsigned long min_freq, max_freq;
753
754 rate = alpha_pll_round_rate(rate, *prate, &l, &a, alpha_width);
755 if (!pll->vco_table || alpha_pll_find_vco(pll, rate))
756 return rate;
757
758 min_freq = pll->vco_table[0].min_freq;
759 max_freq = pll->vco_table[pll->num_vco - 1].max_freq;
760
761 return clamp(rate, min_freq, max_freq);
762 }
763
764 static unsigned long
alpha_huayra_pll_calc_rate(u64 prate,u32 l,u32 a)765 alpha_huayra_pll_calc_rate(u64 prate, u32 l, u32 a)
766 {
767 /*
768 * a contains 16 bit alpha_val in two’s complement number in the range
769 * of [-0.5, 0.5).
770 */
771 if (a >= BIT(PLL_HUAYRA_ALPHA_WIDTH - 1))
772 l -= 1;
773
774 return (prate * l) + (prate * a >> PLL_HUAYRA_ALPHA_WIDTH);
775 }
776
777 static unsigned long
alpha_huayra_pll_round_rate(unsigned long rate,unsigned long prate,u32 * l,u32 * a)778 alpha_huayra_pll_round_rate(unsigned long rate, unsigned long prate,
779 u32 *l, u32 *a)
780 {
781 u64 remainder;
782 u64 quotient;
783
784 quotient = rate;
785 remainder = do_div(quotient, prate);
786 *l = quotient;
787
788 if (!remainder) {
789 *a = 0;
790 return rate;
791 }
792
793 quotient = remainder << PLL_HUAYRA_ALPHA_WIDTH;
794 remainder = do_div(quotient, prate);
795
796 if (remainder)
797 quotient++;
798
799 /*
800 * alpha_val should be in two’s complement number in the range
801 * of [-0.5, 0.5) so if quotient >= 0.5 then increment the l value
802 * since alpha value will be subtracted in this case.
803 */
804 if (quotient >= BIT(PLL_HUAYRA_ALPHA_WIDTH - 1))
805 *l += 1;
806
807 *a = quotient;
808 return alpha_huayra_pll_calc_rate(prate, *l, *a);
809 }
810
811 static unsigned long
alpha_pll_huayra_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)812 alpha_pll_huayra_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
813 {
814 u64 rate = parent_rate, tmp;
815 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
816 u32 l, alpha = 0, ctl, alpha_m, alpha_n;
817
818 regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l);
819 regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl);
820
821 if (ctl & PLL_ALPHA_EN) {
822 regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &alpha);
823 /*
824 * Depending upon alpha_mode, it can be treated as M/N value or
825 * as a two’s complement number. When alpha_mode=1,
826 * pll_alpha_val<15:8>=M and pll_apla_val<7:0>=N
827 *
828 * Fout=FIN*(L+(M/N))
829 *
830 * M is a signed number (-128 to 127) and N is unsigned
831 * (0 to 255). M/N has to be within +/-0.5.
832 *
833 * When alpha_mode=0, it is a two’s complement number in the
834 * range [-0.5, 0.5).
835 *
836 * Fout=FIN*(L+(alpha_val)/2^16)
837 *
838 * where alpha_val is two’s complement number.
839 */
840 if (!(ctl & PLL_ALPHA_MODE))
841 return alpha_huayra_pll_calc_rate(rate, l, alpha);
842
843 alpha_m = alpha >> PLL_HUAYRA_M_SHIFT & PLL_HUAYRA_M_MASK;
844 alpha_n = alpha >> PLL_HUAYRA_N_SHIFT & PLL_HUAYRA_N_MASK;
845
846 rate *= l;
847 tmp = parent_rate;
848 if (alpha_m >= BIT(PLL_HUAYRA_M_WIDTH - 1)) {
849 alpha_m = BIT(PLL_HUAYRA_M_WIDTH) - alpha_m;
850 tmp *= alpha_m;
851 do_div(tmp, alpha_n);
852 rate -= tmp;
853 } else {
854 tmp *= alpha_m;
855 do_div(tmp, alpha_n);
856 rate += tmp;
857 }
858
859 return rate;
860 }
861
862 return alpha_huayra_pll_calc_rate(rate, l, alpha);
863 }
864
alpha_pll_huayra_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long prate)865 static int alpha_pll_huayra_set_rate(struct clk_hw *hw, unsigned long rate,
866 unsigned long prate)
867 {
868 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
869 u32 l, a, ctl, cur_alpha = 0;
870
871 rate = alpha_huayra_pll_round_rate(rate, prate, &l, &a);
872
873 regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl);
874
875 if (ctl & PLL_ALPHA_EN)
876 regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &cur_alpha);
877
878 /*
879 * Huayra PLL supports PLL dynamic programming. User can change L_VAL,
880 * without having to go through the power on sequence.
881 */
882 if (clk_alpha_pll_is_enabled(hw)) {
883 if (cur_alpha != a) {
884 pr_err("%s: clock needs to be gated\n",
885 clk_hw_get_name(hw));
886 return -EBUSY;
887 }
888
889 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
890 /* Ensure that the write above goes to detect L val change. */
891 mb();
892 return wait_for_pll_enable_lock(pll);
893 }
894
895 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
896 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a);
897
898 if (a == 0)
899 regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
900 PLL_ALPHA_EN, 0x0);
901 else
902 regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
903 PLL_ALPHA_EN | PLL_ALPHA_MODE, PLL_ALPHA_EN);
904
905 return 0;
906 }
907
alpha_pll_huayra_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * prate)908 static long alpha_pll_huayra_round_rate(struct clk_hw *hw, unsigned long rate,
909 unsigned long *prate)
910 {
911 u32 l, a;
912
913 return alpha_huayra_pll_round_rate(rate, *prate, &l, &a);
914 }
915
trion_pll_is_enabled(struct clk_alpha_pll * pll,struct regmap * regmap)916 static int trion_pll_is_enabled(struct clk_alpha_pll *pll,
917 struct regmap *regmap)
918 {
919 u32 mode_val, opmode_val;
920 int ret;
921
922 ret = regmap_read(regmap, PLL_MODE(pll), &mode_val);
923 ret |= regmap_read(regmap, PLL_OPMODE(pll), &opmode_val);
924 if (ret)
925 return 0;
926
927 return ((opmode_val & PLL_RUN) && (mode_val & PLL_OUTCTRL));
928 }
929
clk_trion_pll_is_enabled(struct clk_hw * hw)930 static int clk_trion_pll_is_enabled(struct clk_hw *hw)
931 {
932 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
933
934 return trion_pll_is_enabled(pll, pll->clkr.regmap);
935 }
936
clk_trion_pll_enable(struct clk_hw * hw)937 static int clk_trion_pll_enable(struct clk_hw *hw)
938 {
939 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
940 struct regmap *regmap = pll->clkr.regmap;
941 u32 val;
942 int ret;
943
944 ret = regmap_read(regmap, PLL_MODE(pll), &val);
945 if (ret)
946 return ret;
947
948 /* If in FSM mode, just vote for it */
949 if (val & PLL_VOTE_FSM_ENA) {
950 ret = clk_enable_regmap(hw);
951 if (ret)
952 return ret;
953 return wait_for_pll_enable_active(pll);
954 }
955
956 /* Set operation mode to RUN */
957 regmap_write(regmap, PLL_OPMODE(pll), PLL_RUN);
958
959 ret = wait_for_pll_enable_lock(pll);
960 if (ret)
961 return ret;
962
963 /* Enable the PLL outputs */
964 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll),
965 PLL_OUT_MASK, PLL_OUT_MASK);
966 if (ret)
967 return ret;
968
969 /* Enable the global PLL outputs */
970 return regmap_update_bits(regmap, PLL_MODE(pll),
971 PLL_OUTCTRL, PLL_OUTCTRL);
972 }
973
clk_trion_pll_disable(struct clk_hw * hw)974 static void clk_trion_pll_disable(struct clk_hw *hw)
975 {
976 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
977 struct regmap *regmap = pll->clkr.regmap;
978 u32 val;
979 int ret;
980
981 ret = regmap_read(regmap, PLL_MODE(pll), &val);
982 if (ret)
983 return;
984
985 /* If in FSM mode, just unvote it */
986 if (val & PLL_VOTE_FSM_ENA) {
987 clk_disable_regmap(hw);
988 return;
989 }
990
991 /* Disable the global PLL output */
992 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
993 if (ret)
994 return;
995
996 /* Disable the PLL outputs */
997 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll),
998 PLL_OUT_MASK, 0);
999 if (ret)
1000 return;
1001
1002 /* Place the PLL mode in STANDBY */
1003 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY);
1004 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N);
1005 }
1006
1007 static unsigned long
clk_trion_pll_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)1008 clk_trion_pll_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
1009 {
1010 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1011 u32 l, frac, alpha_width = pll_alpha_width(pll);
1012
1013 regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l);
1014 regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &frac);
1015
1016 return alpha_pll_calc_rate(parent_rate, l, frac, alpha_width);
1017 }
1018
1019 const struct clk_ops clk_alpha_pll_fixed_ops = {
1020 .enable = clk_alpha_pll_enable,
1021 .disable = clk_alpha_pll_disable,
1022 .is_enabled = clk_alpha_pll_is_enabled,
1023 .recalc_rate = clk_alpha_pll_recalc_rate,
1024 };
1025 EXPORT_SYMBOL_GPL(clk_alpha_pll_fixed_ops);
1026
1027 const struct clk_ops clk_alpha_pll_ops = {
1028 .enable = clk_alpha_pll_enable,
1029 .disable = clk_alpha_pll_disable,
1030 .is_enabled = clk_alpha_pll_is_enabled,
1031 .recalc_rate = clk_alpha_pll_recalc_rate,
1032 .round_rate = clk_alpha_pll_round_rate,
1033 .set_rate = clk_alpha_pll_set_rate,
1034 };
1035 EXPORT_SYMBOL_GPL(clk_alpha_pll_ops);
1036
1037 const struct clk_ops clk_alpha_pll_huayra_ops = {
1038 .enable = clk_alpha_pll_enable,
1039 .disable = clk_alpha_pll_disable,
1040 .is_enabled = clk_alpha_pll_is_enabled,
1041 .recalc_rate = alpha_pll_huayra_recalc_rate,
1042 .round_rate = alpha_pll_huayra_round_rate,
1043 .set_rate = alpha_pll_huayra_set_rate,
1044 };
1045 EXPORT_SYMBOL_GPL(clk_alpha_pll_huayra_ops);
1046
1047 const struct clk_ops clk_alpha_pll_hwfsm_ops = {
1048 .enable = clk_alpha_pll_hwfsm_enable,
1049 .disable = clk_alpha_pll_hwfsm_disable,
1050 .is_enabled = clk_alpha_pll_hwfsm_is_enabled,
1051 .recalc_rate = clk_alpha_pll_recalc_rate,
1052 .round_rate = clk_alpha_pll_round_rate,
1053 .set_rate = clk_alpha_pll_hwfsm_set_rate,
1054 };
1055 EXPORT_SYMBOL_GPL(clk_alpha_pll_hwfsm_ops);
1056
1057 const struct clk_ops clk_alpha_pll_fixed_trion_ops = {
1058 .enable = clk_trion_pll_enable,
1059 .disable = clk_trion_pll_disable,
1060 .is_enabled = clk_trion_pll_is_enabled,
1061 .recalc_rate = clk_trion_pll_recalc_rate,
1062 .round_rate = clk_alpha_pll_round_rate,
1063 };
1064 EXPORT_SYMBOL_GPL(clk_alpha_pll_fixed_trion_ops);
1065
1066 static unsigned long
clk_alpha_pll_postdiv_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)1067 clk_alpha_pll_postdiv_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
1068 {
1069 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1070 u32 ctl;
1071
1072 regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl);
1073
1074 ctl >>= PLL_POST_DIV_SHIFT;
1075 ctl &= PLL_POST_DIV_MASK(pll);
1076
1077 return parent_rate >> fls(ctl);
1078 }
1079
1080 static const struct clk_div_table clk_alpha_div_table[] = {
1081 { 0x0, 1 },
1082 { 0x1, 2 },
1083 { 0x3, 4 },
1084 { 0x7, 8 },
1085 { 0xf, 16 },
1086 { }
1087 };
1088
1089 static const struct clk_div_table clk_alpha_2bit_div_table[] = {
1090 { 0x0, 1 },
1091 { 0x1, 2 },
1092 { 0x3, 4 },
1093 { }
1094 };
1095
1096 static long
clk_alpha_pll_postdiv_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * prate)1097 clk_alpha_pll_postdiv_round_rate(struct clk_hw *hw, unsigned long rate,
1098 unsigned long *prate)
1099 {
1100 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1101 const struct clk_div_table *table;
1102
1103 if (pll->width == 2)
1104 table = clk_alpha_2bit_div_table;
1105 else
1106 table = clk_alpha_div_table;
1107
1108 return divider_round_rate(hw, rate, prate, table,
1109 pll->width, CLK_DIVIDER_POWER_OF_TWO);
1110 }
1111
1112 static long
clk_alpha_pll_postdiv_round_ro_rate(struct clk_hw * hw,unsigned long rate,unsigned long * prate)1113 clk_alpha_pll_postdiv_round_ro_rate(struct clk_hw *hw, unsigned long rate,
1114 unsigned long *prate)
1115 {
1116 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1117 u32 ctl, div;
1118
1119 regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl);
1120
1121 ctl >>= PLL_POST_DIV_SHIFT;
1122 ctl &= BIT(pll->width) - 1;
1123 div = 1 << fls(ctl);
1124
1125 if (clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT)
1126 *prate = clk_hw_round_rate(clk_hw_get_parent(hw), div * rate);
1127
1128 return DIV_ROUND_UP_ULL((u64)*prate, div);
1129 }
1130
clk_alpha_pll_postdiv_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)1131 static int clk_alpha_pll_postdiv_set_rate(struct clk_hw *hw, unsigned long rate,
1132 unsigned long parent_rate)
1133 {
1134 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1135 int div;
1136
1137 /* 16 -> 0xf, 8 -> 0x7, 4 -> 0x3, 2 -> 0x1, 1 -> 0x0 */
1138 div = DIV_ROUND_UP_ULL(parent_rate, rate) - 1;
1139
1140 return regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
1141 PLL_POST_DIV_MASK(pll) << PLL_POST_DIV_SHIFT,
1142 div << PLL_POST_DIV_SHIFT);
1143 }
1144
1145 const struct clk_ops clk_alpha_pll_postdiv_ops = {
1146 .recalc_rate = clk_alpha_pll_postdiv_recalc_rate,
1147 .round_rate = clk_alpha_pll_postdiv_round_rate,
1148 .set_rate = clk_alpha_pll_postdiv_set_rate,
1149 };
1150 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_ops);
1151
1152 const struct clk_ops clk_alpha_pll_postdiv_ro_ops = {
1153 .round_rate = clk_alpha_pll_postdiv_round_ro_rate,
1154 .recalc_rate = clk_alpha_pll_postdiv_recalc_rate,
1155 };
1156 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_ro_ops);
1157
clk_fabia_pll_configure(struct clk_alpha_pll * pll,struct regmap * regmap,const struct alpha_pll_config * config)1158 void clk_fabia_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
1159 const struct alpha_pll_config *config)
1160 {
1161 u32 val, mask;
1162
1163 clk_alpha_pll_write_config(regmap, PLL_L_VAL(pll), config->l);
1164 clk_alpha_pll_write_config(regmap, PLL_FRAC(pll), config->alpha);
1165 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL(pll),
1166 config->config_ctl_val);
1167 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U(pll),
1168 config->config_ctl_hi_val);
1169 clk_alpha_pll_write_config(regmap, PLL_USER_CTL(pll),
1170 config->user_ctl_val);
1171 clk_alpha_pll_write_config(regmap, PLL_USER_CTL_U(pll),
1172 config->user_ctl_hi_val);
1173 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL(pll),
1174 config->test_ctl_val);
1175 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U(pll),
1176 config->test_ctl_hi_val);
1177
1178 if (config->post_div_mask) {
1179 mask = config->post_div_mask;
1180 val = config->post_div_val;
1181 regmap_update_bits(regmap, PLL_USER_CTL(pll), mask, val);
1182 }
1183
1184 if (pll->flags & SUPPORTS_FSM_LEGACY_MODE)
1185 regmap_update_bits(regmap, PLL_MODE(pll), PLL_FSM_LEGACY_MODE,
1186 PLL_FSM_LEGACY_MODE);
1187
1188 regmap_update_bits(regmap, PLL_MODE(pll), PLL_UPDATE_BYPASS,
1189 PLL_UPDATE_BYPASS);
1190
1191 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N);
1192 }
1193 EXPORT_SYMBOL_GPL(clk_fabia_pll_configure);
1194
alpha_pll_fabia_enable(struct clk_hw * hw)1195 static int alpha_pll_fabia_enable(struct clk_hw *hw)
1196 {
1197 int ret;
1198 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1199 u32 val, opmode_val;
1200 struct regmap *regmap = pll->clkr.regmap;
1201
1202 ret = regmap_read(regmap, PLL_MODE(pll), &val);
1203 if (ret)
1204 return ret;
1205
1206 /* If in FSM mode, just vote for it */
1207 if (val & PLL_VOTE_FSM_ENA) {
1208 ret = clk_enable_regmap(hw);
1209 if (ret)
1210 return ret;
1211 return wait_for_pll_enable_active(pll);
1212 }
1213
1214 ret = regmap_read(regmap, PLL_OPMODE(pll), &opmode_val);
1215 if (ret)
1216 return ret;
1217
1218 /* Skip If PLL is already running */
1219 if ((opmode_val & PLL_RUN) && (val & PLL_OUTCTRL))
1220 return 0;
1221
1222 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
1223 if (ret)
1224 return ret;
1225
1226 ret = regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY);
1227 if (ret)
1228 return ret;
1229
1230 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N,
1231 PLL_RESET_N);
1232 if (ret)
1233 return ret;
1234
1235 ret = regmap_write(regmap, PLL_OPMODE(pll), PLL_RUN);
1236 if (ret)
1237 return ret;
1238
1239 ret = wait_for_pll_enable_lock(pll);
1240 if (ret)
1241 return ret;
1242
1243 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll),
1244 PLL_OUT_MASK, PLL_OUT_MASK);
1245 if (ret)
1246 return ret;
1247
1248 return regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL,
1249 PLL_OUTCTRL);
1250 }
1251
alpha_pll_fabia_disable(struct clk_hw * hw)1252 static void alpha_pll_fabia_disable(struct clk_hw *hw)
1253 {
1254 int ret;
1255 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1256 u32 val;
1257 struct regmap *regmap = pll->clkr.regmap;
1258
1259 ret = regmap_read(regmap, PLL_MODE(pll), &val);
1260 if (ret)
1261 return;
1262
1263 /* If in FSM mode, just unvote it */
1264 if (val & PLL_FSM_ENA) {
1265 clk_disable_regmap(hw);
1266 return;
1267 }
1268
1269 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
1270 if (ret)
1271 return;
1272
1273 /* Disable main outputs */
1274 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll), PLL_OUT_MASK, 0);
1275 if (ret)
1276 return;
1277
1278 /* Place the PLL in STANDBY */
1279 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY);
1280 }
1281
alpha_pll_fabia_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)1282 static unsigned long alpha_pll_fabia_recalc_rate(struct clk_hw *hw,
1283 unsigned long parent_rate)
1284 {
1285 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1286 u32 l, frac, alpha_width = pll_alpha_width(pll);
1287
1288 regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l);
1289 regmap_read(pll->clkr.regmap, PLL_FRAC(pll), &frac);
1290
1291 return alpha_pll_calc_rate(parent_rate, l, frac, alpha_width);
1292 }
1293
1294 /*
1295 * Due to limited number of bits for fractional rate programming, the
1296 * rounded up rate could be marginally higher than the requested rate.
1297 */
alpha_pll_check_rate_margin(struct clk_hw * hw,unsigned long rrate,unsigned long rate)1298 static int alpha_pll_check_rate_margin(struct clk_hw *hw,
1299 unsigned long rrate, unsigned long rate)
1300 {
1301 unsigned long rate_margin = rate + PLL_RATE_MARGIN;
1302
1303 if (rrate > rate_margin || rrate < rate) {
1304 pr_err("%s: Rounded rate %lu not within range [%lu, %lu)\n",
1305 clk_hw_get_name(hw), rrate, rate, rate_margin);
1306 return -EINVAL;
1307 }
1308
1309 return 0;
1310 }
1311
alpha_pll_fabia_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long prate)1312 static int alpha_pll_fabia_set_rate(struct clk_hw *hw, unsigned long rate,
1313 unsigned long prate)
1314 {
1315 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1316 u32 l, alpha_width = pll_alpha_width(pll);
1317 unsigned long rrate;
1318 int ret;
1319 u64 a;
1320
1321 rrate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width);
1322
1323 ret = alpha_pll_check_rate_margin(hw, rrate, rate);
1324 if (ret < 0)
1325 return ret;
1326
1327 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
1328 regmap_write(pll->clkr.regmap, PLL_FRAC(pll), a);
1329
1330 return __clk_alpha_pll_update_latch(pll);
1331 }
1332
alpha_pll_fabia_prepare(struct clk_hw * hw)1333 static int alpha_pll_fabia_prepare(struct clk_hw *hw)
1334 {
1335 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1336 const struct pll_vco *vco;
1337 struct clk_hw *parent_hw;
1338 unsigned long cal_freq, rrate;
1339 u32 cal_l, val, alpha_width = pll_alpha_width(pll);
1340 const char *name = clk_hw_get_name(hw);
1341 u64 a;
1342 int ret;
1343
1344 /* Check if calibration needs to be done i.e. PLL is in reset */
1345 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
1346 if (ret)
1347 return ret;
1348
1349 /* Return early if calibration is not needed. */
1350 if (val & PLL_RESET_N)
1351 return 0;
1352
1353 vco = alpha_pll_find_vco(pll, clk_hw_get_rate(hw));
1354 if (!vco) {
1355 pr_err("%s: alpha pll not in a valid vco range\n", name);
1356 return -EINVAL;
1357 }
1358
1359 cal_freq = DIV_ROUND_CLOSEST((pll->vco_table[0].min_freq +
1360 pll->vco_table[0].max_freq) * 54, 100);
1361
1362 parent_hw = clk_hw_get_parent(hw);
1363 if (!parent_hw)
1364 return -EINVAL;
1365
1366 rrate = alpha_pll_round_rate(cal_freq, clk_hw_get_rate(parent_hw),
1367 &cal_l, &a, alpha_width);
1368
1369 ret = alpha_pll_check_rate_margin(hw, rrate, cal_freq);
1370 if (ret < 0)
1371 return ret;
1372
1373 /* Setup PLL for calibration frequency */
1374 regmap_write(pll->clkr.regmap, PLL_CAL_L_VAL(pll), cal_l);
1375
1376 /* Bringup the PLL at calibration frequency */
1377 ret = clk_alpha_pll_enable(hw);
1378 if (ret) {
1379 pr_err("%s: alpha pll calibration failed\n", name);
1380 return ret;
1381 }
1382
1383 clk_alpha_pll_disable(hw);
1384
1385 return 0;
1386 }
1387
1388 const struct clk_ops clk_alpha_pll_fabia_ops = {
1389 .prepare = alpha_pll_fabia_prepare,
1390 .enable = alpha_pll_fabia_enable,
1391 .disable = alpha_pll_fabia_disable,
1392 .is_enabled = clk_alpha_pll_is_enabled,
1393 .set_rate = alpha_pll_fabia_set_rate,
1394 .recalc_rate = alpha_pll_fabia_recalc_rate,
1395 .round_rate = clk_alpha_pll_round_rate,
1396 };
1397 EXPORT_SYMBOL_GPL(clk_alpha_pll_fabia_ops);
1398
1399 const struct clk_ops clk_alpha_pll_fixed_fabia_ops = {
1400 .enable = alpha_pll_fabia_enable,
1401 .disable = alpha_pll_fabia_disable,
1402 .is_enabled = clk_alpha_pll_is_enabled,
1403 .recalc_rate = alpha_pll_fabia_recalc_rate,
1404 .round_rate = clk_alpha_pll_round_rate,
1405 };
1406 EXPORT_SYMBOL_GPL(clk_alpha_pll_fixed_fabia_ops);
1407
clk_alpha_pll_postdiv_fabia_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)1408 static unsigned long clk_alpha_pll_postdiv_fabia_recalc_rate(struct clk_hw *hw,
1409 unsigned long parent_rate)
1410 {
1411 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1412 u32 i, div = 1, val;
1413 int ret;
1414
1415 ret = regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &val);
1416 if (ret)
1417 return ret;
1418
1419 val >>= pll->post_div_shift;
1420 val &= BIT(pll->width) - 1;
1421
1422 for (i = 0; i < pll->num_post_div; i++) {
1423 if (pll->post_div_table[i].val == val) {
1424 div = pll->post_div_table[i].div;
1425 break;
1426 }
1427 }
1428
1429 return (parent_rate / div);
1430 }
1431
1432 static unsigned long
clk_trion_pll_postdiv_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)1433 clk_trion_pll_postdiv_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
1434 {
1435 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1436 struct regmap *regmap = pll->clkr.regmap;
1437 u32 i, div = 1, val;
1438
1439 regmap_read(regmap, PLL_USER_CTL(pll), &val);
1440
1441 val >>= pll->post_div_shift;
1442 val &= PLL_POST_DIV_MASK(pll);
1443
1444 for (i = 0; i < pll->num_post_div; i++) {
1445 if (pll->post_div_table[i].val == val) {
1446 div = pll->post_div_table[i].div;
1447 break;
1448 }
1449 }
1450
1451 return (parent_rate / div);
1452 }
1453
1454 static long
clk_trion_pll_postdiv_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * prate)1455 clk_trion_pll_postdiv_round_rate(struct clk_hw *hw, unsigned long rate,
1456 unsigned long *prate)
1457 {
1458 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1459
1460 return divider_round_rate(hw, rate, prate, pll->post_div_table,
1461 pll->width, CLK_DIVIDER_ROUND_CLOSEST);
1462 };
1463
1464 static int
clk_trion_pll_postdiv_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)1465 clk_trion_pll_postdiv_set_rate(struct clk_hw *hw, unsigned long rate,
1466 unsigned long parent_rate)
1467 {
1468 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1469 struct regmap *regmap = pll->clkr.regmap;
1470 int i, val = 0, div;
1471
1472 div = DIV_ROUND_UP_ULL(parent_rate, rate);
1473 for (i = 0; i < pll->num_post_div; i++) {
1474 if (pll->post_div_table[i].div == div) {
1475 val = pll->post_div_table[i].val;
1476 break;
1477 }
1478 }
1479
1480 return regmap_update_bits(regmap, PLL_USER_CTL(pll),
1481 PLL_POST_DIV_MASK(pll) << pll->post_div_shift,
1482 val << pll->post_div_shift);
1483 }
1484
1485 const struct clk_ops clk_alpha_pll_postdiv_trion_ops = {
1486 .recalc_rate = clk_trion_pll_postdiv_recalc_rate,
1487 .round_rate = clk_trion_pll_postdiv_round_rate,
1488 .set_rate = clk_trion_pll_postdiv_set_rate,
1489 };
1490 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_trion_ops);
1491
clk_alpha_pll_postdiv_fabia_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * prate)1492 static long clk_alpha_pll_postdiv_fabia_round_rate(struct clk_hw *hw,
1493 unsigned long rate, unsigned long *prate)
1494 {
1495 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1496
1497 return divider_round_rate(hw, rate, prate, pll->post_div_table,
1498 pll->width, CLK_DIVIDER_ROUND_CLOSEST);
1499 }
1500
clk_alpha_pll_postdiv_fabia_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)1501 static int clk_alpha_pll_postdiv_fabia_set_rate(struct clk_hw *hw,
1502 unsigned long rate, unsigned long parent_rate)
1503 {
1504 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1505 int i, val = 0, div, ret;
1506
1507 /*
1508 * If the PLL is in FSM mode, then treat set_rate callback as a
1509 * no-operation.
1510 */
1511 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
1512 if (ret)
1513 return ret;
1514
1515 if (val & PLL_VOTE_FSM_ENA)
1516 return 0;
1517
1518 div = DIV_ROUND_UP_ULL(parent_rate, rate);
1519 for (i = 0; i < pll->num_post_div; i++) {
1520 if (pll->post_div_table[i].div == div) {
1521 val = pll->post_div_table[i].val;
1522 break;
1523 }
1524 }
1525
1526 return regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
1527 (BIT(pll->width) - 1) << pll->post_div_shift,
1528 val << pll->post_div_shift);
1529 }
1530
1531 const struct clk_ops clk_alpha_pll_postdiv_fabia_ops = {
1532 .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate,
1533 .round_rate = clk_alpha_pll_postdiv_fabia_round_rate,
1534 .set_rate = clk_alpha_pll_postdiv_fabia_set_rate,
1535 };
1536 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_fabia_ops);
1537
1538 /**
1539 * clk_trion_pll_configure - configure the trion pll
1540 *
1541 * @pll: clk alpha pll
1542 * @regmap: register map
1543 * @config: configuration to apply for pll
1544 */
clk_trion_pll_configure(struct clk_alpha_pll * pll,struct regmap * regmap,const struct alpha_pll_config * config)1545 void clk_trion_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
1546 const struct alpha_pll_config *config)
1547 {
1548 /*
1549 * If the bootloader left the PLL enabled it's likely that there are
1550 * RCGs that will lock up if we disable the PLL below.
1551 */
1552 if (trion_pll_is_enabled(pll, regmap)) {
1553 pr_debug("Trion PLL is already enabled, skipping configuration\n");
1554 return;
1555 }
1556
1557 clk_alpha_pll_write_config(regmap, PLL_L_VAL(pll), config->l);
1558 regmap_write(regmap, PLL_CAL_L_VAL(pll), TRION_PLL_CAL_VAL);
1559 clk_alpha_pll_write_config(regmap, PLL_ALPHA_VAL(pll), config->alpha);
1560 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL(pll),
1561 config->config_ctl_val);
1562 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U(pll),
1563 config->config_ctl_hi_val);
1564 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U1(pll),
1565 config->config_ctl_hi1_val);
1566 clk_alpha_pll_write_config(regmap, PLL_USER_CTL(pll),
1567 config->user_ctl_val);
1568 clk_alpha_pll_write_config(regmap, PLL_USER_CTL_U(pll),
1569 config->user_ctl_hi_val);
1570 clk_alpha_pll_write_config(regmap, PLL_USER_CTL_U1(pll),
1571 config->user_ctl_hi1_val);
1572 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL(pll),
1573 config->test_ctl_val);
1574 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U(pll),
1575 config->test_ctl_hi_val);
1576 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U1(pll),
1577 config->test_ctl_hi1_val);
1578
1579 regmap_update_bits(regmap, PLL_MODE(pll), PLL_UPDATE_BYPASS,
1580 PLL_UPDATE_BYPASS);
1581
1582 /* Disable PLL output */
1583 regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
1584
1585 /* Set operation mode to OFF */
1586 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY);
1587
1588 /* Place the PLL in STANDBY mode */
1589 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N);
1590 }
1591 EXPORT_SYMBOL_GPL(clk_trion_pll_configure);
1592
1593 /*
1594 * The TRION PLL requires a power-on self-calibration which happens when the
1595 * PLL comes out of reset. Calibrate in case it is not completed.
1596 */
__alpha_pll_trion_prepare(struct clk_hw * hw,u32 pcal_done)1597 static int __alpha_pll_trion_prepare(struct clk_hw *hw, u32 pcal_done)
1598 {
1599 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1600 u32 val;
1601 int ret;
1602
1603 /* Return early if calibration is not needed. */
1604 regmap_read(pll->clkr.regmap, PLL_STATUS(pll), &val);
1605 if (val & pcal_done)
1606 return 0;
1607
1608 /* On/off to calibrate */
1609 ret = clk_trion_pll_enable(hw);
1610 if (!ret)
1611 clk_trion_pll_disable(hw);
1612
1613 return ret;
1614 }
1615
alpha_pll_trion_prepare(struct clk_hw * hw)1616 static int alpha_pll_trion_prepare(struct clk_hw *hw)
1617 {
1618 return __alpha_pll_trion_prepare(hw, TRION_PCAL_DONE);
1619 }
1620
alpha_pll_lucid_prepare(struct clk_hw * hw)1621 static int alpha_pll_lucid_prepare(struct clk_hw *hw)
1622 {
1623 return __alpha_pll_trion_prepare(hw, LUCID_PCAL_DONE);
1624 }
1625
__alpha_pll_trion_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long prate,u32 latch_bit,u32 latch_ack)1626 static int __alpha_pll_trion_set_rate(struct clk_hw *hw, unsigned long rate,
1627 unsigned long prate, u32 latch_bit, u32 latch_ack)
1628 {
1629 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1630 unsigned long rrate;
1631 u32 val, l, alpha_width = pll_alpha_width(pll);
1632 u64 a;
1633 int ret;
1634
1635 rrate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width);
1636
1637 ret = alpha_pll_check_rate_margin(hw, rrate, rate);
1638 if (ret < 0)
1639 return ret;
1640
1641 regmap_update_bits(pll->clkr.regmap, PLL_L_VAL(pll), LUCID_EVO_PLL_L_VAL_MASK, l);
1642 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a);
1643
1644 /* Latch the PLL input */
1645 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), latch_bit, latch_bit);
1646 if (ret)
1647 return ret;
1648
1649 /* Wait for 2 reference cycles before checking the ACK bit. */
1650 udelay(1);
1651 regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
1652 if (!(val & latch_ack)) {
1653 pr_err("Lucid PLL latch failed. Output may be unstable!\n");
1654 return -EINVAL;
1655 }
1656
1657 /* Return the latch input to 0 */
1658 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), latch_bit, 0);
1659 if (ret)
1660 return ret;
1661
1662 if (clk_hw_is_enabled(hw)) {
1663 ret = wait_for_pll_enable_lock(pll);
1664 if (ret)
1665 return ret;
1666 }
1667
1668 /* Wait for PLL output to stabilize */
1669 udelay(100);
1670 return 0;
1671 }
1672
alpha_pll_trion_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long prate)1673 static int alpha_pll_trion_set_rate(struct clk_hw *hw, unsigned long rate,
1674 unsigned long prate)
1675 {
1676 return __alpha_pll_trion_set_rate(hw, rate, prate, PLL_UPDATE, ALPHA_PLL_ACK_LATCH);
1677 }
1678
1679 const struct clk_ops clk_alpha_pll_trion_ops = {
1680 .prepare = alpha_pll_trion_prepare,
1681 .enable = clk_trion_pll_enable,
1682 .disable = clk_trion_pll_disable,
1683 .is_enabled = clk_trion_pll_is_enabled,
1684 .recalc_rate = clk_trion_pll_recalc_rate,
1685 .round_rate = clk_alpha_pll_round_rate,
1686 .set_rate = alpha_pll_trion_set_rate,
1687 };
1688 EXPORT_SYMBOL_GPL(clk_alpha_pll_trion_ops);
1689
1690 const struct clk_ops clk_alpha_pll_lucid_ops = {
1691 .prepare = alpha_pll_lucid_prepare,
1692 .enable = clk_trion_pll_enable,
1693 .disable = clk_trion_pll_disable,
1694 .is_enabled = clk_trion_pll_is_enabled,
1695 .recalc_rate = clk_trion_pll_recalc_rate,
1696 .round_rate = clk_alpha_pll_round_rate,
1697 .set_rate = alpha_pll_trion_set_rate,
1698 };
1699 EXPORT_SYMBOL_GPL(clk_alpha_pll_lucid_ops);
1700
1701 const struct clk_ops clk_alpha_pll_postdiv_lucid_ops = {
1702 .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate,
1703 .round_rate = clk_alpha_pll_postdiv_fabia_round_rate,
1704 .set_rate = clk_alpha_pll_postdiv_fabia_set_rate,
1705 };
1706 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_lucid_ops);
1707
clk_agera_pll_configure(struct clk_alpha_pll * pll,struct regmap * regmap,const struct alpha_pll_config * config)1708 void clk_agera_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
1709 const struct alpha_pll_config *config)
1710 {
1711 clk_alpha_pll_write_config(regmap, PLL_L_VAL(pll), config->l);
1712 clk_alpha_pll_write_config(regmap, PLL_ALPHA_VAL(pll), config->alpha);
1713 clk_alpha_pll_write_config(regmap, PLL_USER_CTL(pll),
1714 config->user_ctl_val);
1715 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL(pll),
1716 config->config_ctl_val);
1717 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U(pll),
1718 config->config_ctl_hi_val);
1719 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL(pll),
1720 config->test_ctl_val);
1721 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U(pll),
1722 config->test_ctl_hi_val);
1723 }
1724 EXPORT_SYMBOL_GPL(clk_agera_pll_configure);
1725
clk_alpha_pll_agera_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long prate)1726 static int clk_alpha_pll_agera_set_rate(struct clk_hw *hw, unsigned long rate,
1727 unsigned long prate)
1728 {
1729 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1730 u32 l, alpha_width = pll_alpha_width(pll);
1731 int ret;
1732 unsigned long rrate;
1733 u64 a;
1734
1735 rrate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width);
1736 ret = alpha_pll_check_rate_margin(hw, rrate, rate);
1737 if (ret < 0)
1738 return ret;
1739
1740 /* change L_VAL without having to go through the power on sequence */
1741 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
1742 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a);
1743
1744 if (clk_hw_is_enabled(hw))
1745 return wait_for_pll_enable_lock(pll);
1746
1747 return 0;
1748 }
1749
1750 const struct clk_ops clk_alpha_pll_agera_ops = {
1751 .enable = clk_alpha_pll_enable,
1752 .disable = clk_alpha_pll_disable,
1753 .is_enabled = clk_alpha_pll_is_enabled,
1754 .recalc_rate = alpha_pll_fabia_recalc_rate,
1755 .round_rate = clk_alpha_pll_round_rate,
1756 .set_rate = clk_alpha_pll_agera_set_rate,
1757 };
1758 EXPORT_SYMBOL_GPL(clk_alpha_pll_agera_ops);
1759
1760 /**
1761 * clk_lucid_5lpe_pll_configure - configure the lucid 5lpe pll
1762 *
1763 * @pll: clk alpha pll
1764 * @regmap: register map
1765 * @config: configuration to apply for pll
1766 */
clk_lucid_5lpe_pll_configure(struct clk_alpha_pll * pll,struct regmap * regmap,const struct alpha_pll_config * config)1767 void clk_lucid_5lpe_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
1768 const struct alpha_pll_config *config)
1769 {
1770 /*
1771 * If the bootloader left the PLL enabled it's likely that there are
1772 * RCGs that will lock up if we disable the PLL below.
1773 */
1774 if (trion_pll_is_enabled(pll, regmap)) {
1775 pr_debug("Lucid 5LPE PLL is already enabled, skipping configuration\n");
1776 return;
1777 }
1778
1779 clk_alpha_pll_write_config(regmap, PLL_L_VAL(pll), config->l);
1780 regmap_write(regmap, PLL_CAL_L_VAL(pll), TRION_PLL_CAL_VAL);
1781 clk_alpha_pll_write_config(regmap, PLL_ALPHA_VAL(pll), config->alpha);
1782 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL(pll),
1783 config->config_ctl_val);
1784 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U(pll),
1785 config->config_ctl_hi_val);
1786 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U1(pll),
1787 config->config_ctl_hi1_val);
1788 clk_alpha_pll_write_config(regmap, PLL_USER_CTL(pll),
1789 config->user_ctl_val);
1790 clk_alpha_pll_write_config(regmap, PLL_USER_CTL_U(pll),
1791 config->user_ctl_hi_val);
1792 clk_alpha_pll_write_config(regmap, PLL_USER_CTL_U1(pll),
1793 config->user_ctl_hi1_val);
1794 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL(pll),
1795 config->test_ctl_val);
1796 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U(pll),
1797 config->test_ctl_hi_val);
1798 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U1(pll),
1799 config->test_ctl_hi1_val);
1800
1801 /* Disable PLL output */
1802 regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
1803
1804 /* Set operation mode to OFF */
1805 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY);
1806
1807 /* Place the PLL in STANDBY mode */
1808 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N);
1809 }
1810 EXPORT_SYMBOL_GPL(clk_lucid_5lpe_pll_configure);
1811
alpha_pll_lucid_5lpe_enable(struct clk_hw * hw)1812 static int alpha_pll_lucid_5lpe_enable(struct clk_hw *hw)
1813 {
1814 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1815 u32 val;
1816 int ret;
1817
1818 ret = regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &val);
1819 if (ret)
1820 return ret;
1821
1822 /* If in FSM mode, just vote for it */
1823 if (val & LUCID_5LPE_ENABLE_VOTE_RUN) {
1824 ret = clk_enable_regmap(hw);
1825 if (ret)
1826 return ret;
1827 return wait_for_pll_enable_lock(pll);
1828 }
1829
1830 /* Check if PLL is already enabled, return if enabled */
1831 ret = trion_pll_is_enabled(pll, pll->clkr.regmap);
1832 if (ret < 0)
1833 return ret;
1834
1835 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N);
1836 if (ret)
1837 return ret;
1838
1839 regmap_write(pll->clkr.regmap, PLL_OPMODE(pll), PLL_RUN);
1840
1841 ret = wait_for_pll_enable_lock(pll);
1842 if (ret)
1843 return ret;
1844
1845 /* Enable the PLL outputs */
1846 ret = regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll), PLL_OUT_MASK, PLL_OUT_MASK);
1847 if (ret)
1848 return ret;
1849
1850 /* Enable the global PLL outputs */
1851 return regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_OUTCTRL, PLL_OUTCTRL);
1852 }
1853
alpha_pll_lucid_5lpe_disable(struct clk_hw * hw)1854 static void alpha_pll_lucid_5lpe_disable(struct clk_hw *hw)
1855 {
1856 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1857 u32 val;
1858 int ret;
1859
1860 ret = regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &val);
1861 if (ret)
1862 return;
1863
1864 /* If in FSM mode, just unvote it */
1865 if (val & LUCID_5LPE_ENABLE_VOTE_RUN) {
1866 clk_disable_regmap(hw);
1867 return;
1868 }
1869
1870 /* Disable the global PLL output */
1871 ret = regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
1872 if (ret)
1873 return;
1874
1875 /* Disable the PLL outputs */
1876 ret = regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll), PLL_OUT_MASK, 0);
1877 if (ret)
1878 return;
1879
1880 /* Place the PLL mode in STANDBY */
1881 regmap_write(pll->clkr.regmap, PLL_OPMODE(pll), PLL_STANDBY);
1882 }
1883
1884 /*
1885 * The Lucid 5LPE PLL requires a power-on self-calibration which happens
1886 * when the PLL comes out of reset. Calibrate in case it is not completed.
1887 */
alpha_pll_lucid_5lpe_prepare(struct clk_hw * hw)1888 static int alpha_pll_lucid_5lpe_prepare(struct clk_hw *hw)
1889 {
1890 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
1891 struct clk_hw *p;
1892 u32 val = 0;
1893 int ret;
1894
1895 /* Return early if calibration is not needed. */
1896 regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
1897 if (val & LUCID_5LPE_PCAL_DONE)
1898 return 0;
1899
1900 p = clk_hw_get_parent(hw);
1901 if (!p)
1902 return -EINVAL;
1903
1904 ret = alpha_pll_lucid_5lpe_enable(hw);
1905 if (ret)
1906 return ret;
1907
1908 alpha_pll_lucid_5lpe_disable(hw);
1909
1910 return 0;
1911 }
1912
alpha_pll_lucid_5lpe_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long prate)1913 static int alpha_pll_lucid_5lpe_set_rate(struct clk_hw *hw, unsigned long rate,
1914 unsigned long prate)
1915 {
1916 return __alpha_pll_trion_set_rate(hw, rate, prate,
1917 LUCID_5LPE_PLL_LATCH_INPUT,
1918 LUCID_5LPE_ALPHA_PLL_ACK_LATCH);
1919 }
1920
__clk_lucid_pll_postdiv_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate,unsigned long enable_vote_run)1921 static int __clk_lucid_pll_postdiv_set_rate(struct clk_hw *hw, unsigned long rate,
1922 unsigned long parent_rate,
1923 unsigned long enable_vote_run)
1924 {
1925 struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
1926 struct regmap *regmap = pll->clkr.regmap;
1927 int i, val, div, ret;
1928 u32 mask;
1929
1930 /*
1931 * If the PLL is in FSM mode, then treat set_rate callback as a
1932 * no-operation.
1933 */
1934 ret = regmap_read(regmap, PLL_USER_CTL(pll), &val);
1935 if (ret)
1936 return ret;
1937
1938 if (val & enable_vote_run)
1939 return 0;
1940
1941 if (!pll->post_div_table) {
1942 pr_err("Missing the post_div_table for the %s PLL\n",
1943 clk_hw_get_name(&pll->clkr.hw));
1944 return -EINVAL;
1945 }
1946
1947 div = DIV_ROUND_UP_ULL((u64)parent_rate, rate);
1948 for (i = 0; i < pll->num_post_div; i++) {
1949 if (pll->post_div_table[i].div == div) {
1950 val = pll->post_div_table[i].val;
1951 break;
1952 }
1953 }
1954
1955 mask = GENMASK(pll->width + pll->post_div_shift - 1, pll->post_div_shift);
1956 return regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
1957 mask, val << pll->post_div_shift);
1958 }
1959
clk_lucid_5lpe_pll_postdiv_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)1960 static int clk_lucid_5lpe_pll_postdiv_set_rate(struct clk_hw *hw, unsigned long rate,
1961 unsigned long parent_rate)
1962 {
1963 return __clk_lucid_pll_postdiv_set_rate(hw, rate, parent_rate, LUCID_5LPE_ENABLE_VOTE_RUN);
1964 }
1965
1966 const struct clk_ops clk_alpha_pll_lucid_5lpe_ops = {
1967 .prepare = alpha_pll_lucid_5lpe_prepare,
1968 .enable = alpha_pll_lucid_5lpe_enable,
1969 .disable = alpha_pll_lucid_5lpe_disable,
1970 .is_enabled = clk_trion_pll_is_enabled,
1971 .recalc_rate = clk_trion_pll_recalc_rate,
1972 .round_rate = clk_alpha_pll_round_rate,
1973 .set_rate = alpha_pll_lucid_5lpe_set_rate,
1974 };
1975 EXPORT_SYMBOL_GPL(clk_alpha_pll_lucid_5lpe_ops);
1976
1977 const struct clk_ops clk_alpha_pll_fixed_lucid_5lpe_ops = {
1978 .enable = alpha_pll_lucid_5lpe_enable,
1979 .disable = alpha_pll_lucid_5lpe_disable,
1980 .is_enabled = clk_trion_pll_is_enabled,
1981 .recalc_rate = clk_trion_pll_recalc_rate,
1982 .round_rate = clk_alpha_pll_round_rate,
1983 };
1984 EXPORT_SYMBOL_GPL(clk_alpha_pll_fixed_lucid_5lpe_ops);
1985
1986 const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops = {
1987 .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate,
1988 .round_rate = clk_alpha_pll_postdiv_fabia_round_rate,
1989 .set_rate = clk_lucid_5lpe_pll_postdiv_set_rate,
1990 };
1991 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_lucid_5lpe_ops);
1992
clk_zonda_pll_configure(struct clk_alpha_pll * pll,struct regmap * regmap,const struct alpha_pll_config * config)1993 void clk_zonda_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
1994 const struct alpha_pll_config *config)
1995 {
1996 clk_alpha_pll_write_config(regmap, PLL_L_VAL(pll), config->l);
1997 clk_alpha_pll_write_config(regmap, PLL_ALPHA_VAL(pll), config->alpha);
1998 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL(pll), config->config_ctl_val);
1999 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U(pll), config->config_ctl_hi_val);
2000 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U1(pll), config->config_ctl_hi1_val);
2001 clk_alpha_pll_write_config(regmap, PLL_USER_CTL(pll), config->user_ctl_val);
2002 clk_alpha_pll_write_config(regmap, PLL_USER_CTL_U(pll), config->user_ctl_hi_val);
2003 clk_alpha_pll_write_config(regmap, PLL_USER_CTL_U1(pll), config->user_ctl_hi1_val);
2004 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL(pll), config->test_ctl_val);
2005 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U(pll), config->test_ctl_hi_val);
2006 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U1(pll), config->test_ctl_hi1_val);
2007
2008 regmap_update_bits(regmap, PLL_MODE(pll), PLL_BYPASSNL, 0);
2009
2010 /* Disable PLL output */
2011 regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
2012
2013 /* Set operation mode to OFF */
2014 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY);
2015
2016 /* Place the PLL in STANDBY mode */
2017 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N);
2018 }
2019 EXPORT_SYMBOL_GPL(clk_zonda_pll_configure);
2020
clk_zonda_pll_enable(struct clk_hw * hw)2021 static int clk_zonda_pll_enable(struct clk_hw *hw)
2022 {
2023 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
2024 struct regmap *regmap = pll->clkr.regmap;
2025 u32 val;
2026 int ret;
2027
2028 regmap_read(regmap, PLL_MODE(pll), &val);
2029
2030 /* If in FSM mode, just vote for it */
2031 if (val & PLL_VOTE_FSM_ENA) {
2032 ret = clk_enable_regmap(hw);
2033 if (ret)
2034 return ret;
2035 return wait_for_pll_enable_active(pll);
2036 }
2037
2038 /* Get the PLL out of bypass mode */
2039 regmap_update_bits(regmap, PLL_MODE(pll), PLL_BYPASSNL, PLL_BYPASSNL);
2040
2041 /*
2042 * H/W requires a 1us delay between disabling the bypass and
2043 * de-asserting the reset.
2044 */
2045 udelay(1);
2046
2047 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N);
2048
2049 /* Set operation mode to RUN */
2050 regmap_write(regmap, PLL_OPMODE(pll), PLL_RUN);
2051
2052 regmap_read(regmap, PLL_TEST_CTL(pll), &val);
2053
2054 /* If cfa mode then poll for freq lock */
2055 if (val & ZONDA_STAY_IN_CFA)
2056 ret = wait_for_zonda_pll_freq_lock(pll);
2057 else
2058 ret = wait_for_pll_enable_lock(pll);
2059 if (ret)
2060 return ret;
2061
2062 /* Enable the PLL outputs */
2063 regmap_update_bits(regmap, PLL_USER_CTL(pll), ZONDA_PLL_OUT_MASK, ZONDA_PLL_OUT_MASK);
2064
2065 /* Enable the global PLL outputs */
2066 regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, PLL_OUTCTRL);
2067
2068 return 0;
2069 }
2070
clk_zonda_pll_disable(struct clk_hw * hw)2071 static void clk_zonda_pll_disable(struct clk_hw *hw)
2072 {
2073 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
2074 struct regmap *regmap = pll->clkr.regmap;
2075 u32 val;
2076
2077 regmap_read(regmap, PLL_MODE(pll), &val);
2078
2079 /* If in FSM mode, just unvote it */
2080 if (val & PLL_VOTE_FSM_ENA) {
2081 clk_disable_regmap(hw);
2082 return;
2083 }
2084
2085 /* Disable the global PLL output */
2086 regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
2087
2088 /* Disable the PLL outputs */
2089 regmap_update_bits(regmap, PLL_USER_CTL(pll), ZONDA_PLL_OUT_MASK, 0);
2090
2091 /* Put the PLL in bypass and reset */
2092 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N | PLL_BYPASSNL, 0);
2093
2094 /* Place the PLL mode in OFF state */
2095 regmap_write(regmap, PLL_OPMODE(pll), 0x0);
2096 }
2097
clk_zonda_pll_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long prate)2098 static int clk_zonda_pll_set_rate(struct clk_hw *hw, unsigned long rate,
2099 unsigned long prate)
2100 {
2101 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
2102 unsigned long rrate;
2103 u32 test_ctl_val;
2104 u32 l, alpha_width = pll_alpha_width(pll);
2105 u64 a;
2106 int ret;
2107
2108 rrate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width);
2109
2110 ret = alpha_pll_check_rate_margin(hw, rrate, rate);
2111 if (ret < 0)
2112 return ret;
2113
2114 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a);
2115 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
2116
2117 /* Wait before polling for the frequency latch */
2118 udelay(5);
2119
2120 /* Read stay in cfa mode */
2121 regmap_read(pll->clkr.regmap, PLL_TEST_CTL(pll), &test_ctl_val);
2122
2123 /* If cfa mode then poll for freq lock */
2124 if (test_ctl_val & ZONDA_STAY_IN_CFA)
2125 ret = wait_for_zonda_pll_freq_lock(pll);
2126 else
2127 ret = wait_for_pll_enable_lock(pll);
2128 if (ret)
2129 return ret;
2130
2131 /* Wait for PLL output to stabilize */
2132 udelay(100);
2133 return 0;
2134 }
2135
2136 const struct clk_ops clk_alpha_pll_zonda_ops = {
2137 .enable = clk_zonda_pll_enable,
2138 .disable = clk_zonda_pll_disable,
2139 .is_enabled = clk_trion_pll_is_enabled,
2140 .recalc_rate = clk_trion_pll_recalc_rate,
2141 .round_rate = clk_alpha_pll_round_rate,
2142 .set_rate = clk_zonda_pll_set_rate,
2143 };
2144 EXPORT_SYMBOL_GPL(clk_alpha_pll_zonda_ops);
2145
clk_lucid_evo_pll_configure(struct clk_alpha_pll * pll,struct regmap * regmap,const struct alpha_pll_config * config)2146 void clk_lucid_evo_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
2147 const struct alpha_pll_config *config)
2148 {
2149 u32 lval = config->l;
2150
2151 lval |= TRION_PLL_CAL_VAL << LUCID_EVO_PLL_CAL_L_VAL_SHIFT;
2152 clk_alpha_pll_write_config(regmap, PLL_L_VAL(pll), lval);
2153 clk_alpha_pll_write_config(regmap, PLL_ALPHA_VAL(pll), config->alpha);
2154 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL(pll), config->config_ctl_val);
2155 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U(pll), config->config_ctl_hi_val);
2156 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U1(pll), config->config_ctl_hi1_val);
2157 clk_alpha_pll_write_config(regmap, PLL_USER_CTL(pll), config->user_ctl_val);
2158 clk_alpha_pll_write_config(regmap, PLL_USER_CTL_U(pll), config->user_ctl_hi_val);
2159 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL(pll), config->test_ctl_val);
2160 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U(pll), config->test_ctl_hi_val);
2161 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U1(pll), config->test_ctl_hi1_val);
2162 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U2(pll), config->test_ctl_hi2_val);
2163
2164 /* Disable PLL output */
2165 regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
2166
2167 /* Set operation mode to STANDBY and de-assert the reset */
2168 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY);
2169 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N);
2170 }
2171 EXPORT_SYMBOL_GPL(clk_lucid_evo_pll_configure);
2172
alpha_pll_lucid_evo_enable(struct clk_hw * hw)2173 static int alpha_pll_lucid_evo_enable(struct clk_hw *hw)
2174 {
2175 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
2176 struct regmap *regmap = pll->clkr.regmap;
2177 u32 val;
2178 int ret;
2179
2180 ret = regmap_read(regmap, PLL_USER_CTL(pll), &val);
2181 if (ret)
2182 return ret;
2183
2184 /* If in FSM mode, just vote for it */
2185 if (val & LUCID_EVO_ENABLE_VOTE_RUN) {
2186 ret = clk_enable_regmap(hw);
2187 if (ret)
2188 return ret;
2189 return wait_for_pll_enable_lock(pll);
2190 }
2191
2192 /* Check if PLL is already enabled */
2193 ret = trion_pll_is_enabled(pll, regmap);
2194 if (ret < 0) {
2195 return ret;
2196 } else if (ret) {
2197 pr_warn("%s PLL is already enabled\n", clk_hw_get_name(&pll->clkr.hw));
2198 return 0;
2199 }
2200
2201 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, PLL_RESET_N);
2202 if (ret)
2203 return ret;
2204
2205 /* Set operation mode to RUN */
2206 regmap_write(regmap, PLL_OPMODE(pll), PLL_RUN);
2207
2208 ret = wait_for_pll_enable_lock(pll);
2209 if (ret)
2210 return ret;
2211
2212 /* Enable the PLL outputs */
2213 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll), PLL_OUT_MASK, PLL_OUT_MASK);
2214 if (ret)
2215 return ret;
2216
2217 /* Enable the global PLL outputs */
2218 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, PLL_OUTCTRL);
2219 if (ret)
2220 return ret;
2221
2222 /* Ensure that the write above goes through before returning. */
2223 mb();
2224 return ret;
2225 }
2226
_alpha_pll_lucid_evo_disable(struct clk_hw * hw,bool reset)2227 static void _alpha_pll_lucid_evo_disable(struct clk_hw *hw, bool reset)
2228 {
2229 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
2230 struct regmap *regmap = pll->clkr.regmap;
2231 u32 val;
2232 int ret;
2233
2234 ret = regmap_read(regmap, PLL_USER_CTL(pll), &val);
2235 if (ret)
2236 return;
2237
2238 /* If in FSM mode, just unvote it */
2239 if (val & LUCID_EVO_ENABLE_VOTE_RUN) {
2240 clk_disable_regmap(hw);
2241 return;
2242 }
2243
2244 /* Disable the global PLL output */
2245 ret = regmap_update_bits(regmap, PLL_MODE(pll), PLL_OUTCTRL, 0);
2246 if (ret)
2247 return;
2248
2249 /* Disable the PLL outputs */
2250 ret = regmap_update_bits(regmap, PLL_USER_CTL(pll), PLL_OUT_MASK, 0);
2251 if (ret)
2252 return;
2253
2254 /* Place the PLL mode in STANDBY */
2255 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY);
2256
2257 if (reset)
2258 regmap_update_bits(regmap, PLL_MODE(pll), PLL_RESET_N, 0);
2259 }
2260
_alpha_pll_lucid_evo_prepare(struct clk_hw * hw,bool reset)2261 static int _alpha_pll_lucid_evo_prepare(struct clk_hw *hw, bool reset)
2262 {
2263 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
2264 struct clk_hw *p;
2265 u32 val = 0;
2266 int ret;
2267
2268 /* Return early if calibration is not needed. */
2269 regmap_read(pll->clkr.regmap, PLL_MODE(pll), &val);
2270 if (!(val & LUCID_EVO_PCAL_NOT_DONE))
2271 return 0;
2272
2273 p = clk_hw_get_parent(hw);
2274 if (!p)
2275 return -EINVAL;
2276
2277 ret = alpha_pll_lucid_evo_enable(hw);
2278 if (ret)
2279 return ret;
2280
2281 _alpha_pll_lucid_evo_disable(hw, reset);
2282
2283 return 0;
2284 }
2285
alpha_pll_lucid_evo_disable(struct clk_hw * hw)2286 static void alpha_pll_lucid_evo_disable(struct clk_hw *hw)
2287 {
2288 _alpha_pll_lucid_evo_disable(hw, false);
2289 }
2290
alpha_pll_lucid_evo_prepare(struct clk_hw * hw)2291 static int alpha_pll_lucid_evo_prepare(struct clk_hw *hw)
2292 {
2293 return _alpha_pll_lucid_evo_prepare(hw, false);
2294 }
2295
alpha_pll_reset_lucid_evo_disable(struct clk_hw * hw)2296 static void alpha_pll_reset_lucid_evo_disable(struct clk_hw *hw)
2297 {
2298 _alpha_pll_lucid_evo_disable(hw, true);
2299 }
2300
alpha_pll_reset_lucid_evo_prepare(struct clk_hw * hw)2301 static int alpha_pll_reset_lucid_evo_prepare(struct clk_hw *hw)
2302 {
2303 return _alpha_pll_lucid_evo_prepare(hw, true);
2304 }
2305
alpha_pll_lucid_evo_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)2306 static unsigned long alpha_pll_lucid_evo_recalc_rate(struct clk_hw *hw,
2307 unsigned long parent_rate)
2308 {
2309 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
2310 struct regmap *regmap = pll->clkr.regmap;
2311 u32 l, frac;
2312
2313 regmap_read(regmap, PLL_L_VAL(pll), &l);
2314 l &= LUCID_EVO_PLL_L_VAL_MASK;
2315 regmap_read(regmap, PLL_ALPHA_VAL(pll), &frac);
2316
2317 return alpha_pll_calc_rate(parent_rate, l, frac, pll_alpha_width(pll));
2318 }
2319
clk_lucid_evo_pll_postdiv_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)2320 static int clk_lucid_evo_pll_postdiv_set_rate(struct clk_hw *hw, unsigned long rate,
2321 unsigned long parent_rate)
2322 {
2323 return __clk_lucid_pll_postdiv_set_rate(hw, rate, parent_rate, LUCID_EVO_ENABLE_VOTE_RUN);
2324 }
2325
2326 const struct clk_ops clk_alpha_pll_fixed_lucid_evo_ops = {
2327 .enable = alpha_pll_lucid_evo_enable,
2328 .disable = alpha_pll_lucid_evo_disable,
2329 .is_enabled = clk_trion_pll_is_enabled,
2330 .recalc_rate = alpha_pll_lucid_evo_recalc_rate,
2331 .round_rate = clk_alpha_pll_round_rate,
2332 };
2333 EXPORT_SYMBOL_GPL(clk_alpha_pll_fixed_lucid_evo_ops);
2334
2335 const struct clk_ops clk_alpha_pll_postdiv_lucid_evo_ops = {
2336 .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate,
2337 .round_rate = clk_alpha_pll_postdiv_fabia_round_rate,
2338 .set_rate = clk_lucid_evo_pll_postdiv_set_rate,
2339 };
2340 EXPORT_SYMBOL_GPL(clk_alpha_pll_postdiv_lucid_evo_ops);
2341
2342 const struct clk_ops clk_alpha_pll_lucid_evo_ops = {
2343 .prepare = alpha_pll_lucid_evo_prepare,
2344 .enable = alpha_pll_lucid_evo_enable,
2345 .disable = alpha_pll_lucid_evo_disable,
2346 .is_enabled = clk_trion_pll_is_enabled,
2347 .recalc_rate = alpha_pll_lucid_evo_recalc_rate,
2348 .round_rate = clk_alpha_pll_round_rate,
2349 .set_rate = alpha_pll_lucid_5lpe_set_rate,
2350 };
2351 EXPORT_SYMBOL_GPL(clk_alpha_pll_lucid_evo_ops);
2352
2353 const struct clk_ops clk_alpha_pll_reset_lucid_evo_ops = {
2354 .prepare = alpha_pll_reset_lucid_evo_prepare,
2355 .enable = alpha_pll_lucid_evo_enable,
2356 .disable = alpha_pll_reset_lucid_evo_disable,
2357 .is_enabled = clk_trion_pll_is_enabled,
2358 .recalc_rate = alpha_pll_lucid_evo_recalc_rate,
2359 .round_rate = clk_alpha_pll_round_rate,
2360 .set_rate = alpha_pll_lucid_5lpe_set_rate,
2361 };
2362 EXPORT_SYMBOL_GPL(clk_alpha_pll_reset_lucid_evo_ops);
2363
clk_rivian_evo_pll_configure(struct clk_alpha_pll * pll,struct regmap * regmap,const struct alpha_pll_config * config)2364 void clk_rivian_evo_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
2365 const struct alpha_pll_config *config)
2366 {
2367 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL(pll), config->config_ctl_val);
2368 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U(pll), config->config_ctl_hi_val);
2369 clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U1(pll), config->config_ctl_hi1_val);
2370 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL(pll), config->test_ctl_val);
2371 clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U(pll), config->test_ctl_hi_val);
2372 clk_alpha_pll_write_config(regmap, PLL_L_VAL(pll), config->l);
2373 clk_alpha_pll_write_config(regmap, PLL_USER_CTL(pll), config->user_ctl_val);
2374 clk_alpha_pll_write_config(regmap, PLL_USER_CTL_U(pll), config->user_ctl_hi_val);
2375
2376 regmap_write(regmap, PLL_OPMODE(pll), PLL_STANDBY);
2377
2378 regmap_update_bits(regmap, PLL_MODE(pll),
2379 PLL_RESET_N | PLL_BYPASSNL | PLL_OUTCTRL,
2380 PLL_RESET_N | PLL_BYPASSNL);
2381 }
2382 EXPORT_SYMBOL_GPL(clk_rivian_evo_pll_configure);
2383
clk_rivian_evo_pll_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)2384 static unsigned long clk_rivian_evo_pll_recalc_rate(struct clk_hw *hw,
2385 unsigned long parent_rate)
2386 {
2387 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
2388 u32 l;
2389
2390 regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l);
2391
2392 return parent_rate * l;
2393 }
2394
clk_rivian_evo_pll_round_rate(struct clk_hw * hw,unsigned long rate,unsigned long * prate)2395 static long clk_rivian_evo_pll_round_rate(struct clk_hw *hw, unsigned long rate,
2396 unsigned long *prate)
2397 {
2398 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
2399 unsigned long min_freq, max_freq;
2400 u32 l;
2401 u64 a;
2402
2403 rate = alpha_pll_round_rate(rate, *prate, &l, &a, 0);
2404 if (!pll->vco_table || alpha_pll_find_vco(pll, rate))
2405 return rate;
2406
2407 min_freq = pll->vco_table[0].min_freq;
2408 max_freq = pll->vco_table[pll->num_vco - 1].max_freq;
2409
2410 return clamp(rate, min_freq, max_freq);
2411 }
2412
2413 const struct clk_ops clk_alpha_pll_rivian_evo_ops = {
2414 .enable = alpha_pll_lucid_5lpe_enable,
2415 .disable = alpha_pll_lucid_5lpe_disable,
2416 .is_enabled = clk_trion_pll_is_enabled,
2417 .recalc_rate = clk_rivian_evo_pll_recalc_rate,
2418 .round_rate = clk_rivian_evo_pll_round_rate,
2419 };
2420 EXPORT_SYMBOL_GPL(clk_alpha_pll_rivian_evo_ops);
2421
clk_stromer_pll_configure(struct clk_alpha_pll * pll,struct regmap * regmap,const struct alpha_pll_config * config)2422 void clk_stromer_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
2423 const struct alpha_pll_config *config)
2424 {
2425 u32 val, val_u, mask, mask_u;
2426
2427 regmap_write(regmap, PLL_L_VAL(pll), config->l);
2428 regmap_write(regmap, PLL_ALPHA_VAL(pll), config->alpha);
2429 regmap_write(regmap, PLL_CONFIG_CTL(pll), config->config_ctl_val);
2430
2431 if (pll_has_64bit_config(pll))
2432 regmap_write(regmap, PLL_CONFIG_CTL_U(pll),
2433 config->config_ctl_hi_val);
2434
2435 if (pll_alpha_width(pll) > 32)
2436 regmap_write(regmap, PLL_ALPHA_VAL_U(pll), config->alpha_hi);
2437
2438 val = config->main_output_mask;
2439 val |= config->aux_output_mask;
2440 val |= config->aux2_output_mask;
2441 val |= config->early_output_mask;
2442 val |= config->pre_div_val;
2443 val |= config->post_div_val;
2444 val |= config->vco_val;
2445 val |= config->alpha_en_mask;
2446 val |= config->alpha_mode_mask;
2447
2448 mask = config->main_output_mask;
2449 mask |= config->aux_output_mask;
2450 mask |= config->aux2_output_mask;
2451 mask |= config->early_output_mask;
2452 mask |= config->pre_div_mask;
2453 mask |= config->post_div_mask;
2454 mask |= config->vco_mask;
2455 mask |= config->alpha_en_mask;
2456 mask |= config->alpha_mode_mask;
2457
2458 regmap_update_bits(regmap, PLL_USER_CTL(pll), mask, val);
2459
2460 /* Stromer APSS PLL does not enable LOCK_DET by default, so enable it */
2461 val_u = config->status_val << ALPHA_PLL_STATUS_REG_SHIFT;
2462 val_u |= config->lock_det;
2463
2464 mask_u = config->status_mask;
2465 mask_u |= config->lock_det;
2466
2467 regmap_update_bits(regmap, PLL_USER_CTL_U(pll), mask_u, val_u);
2468 regmap_write(regmap, PLL_TEST_CTL(pll), config->test_ctl_val);
2469 regmap_write(regmap, PLL_TEST_CTL_U(pll), config->test_ctl_hi_val);
2470
2471 if (pll->flags & SUPPORTS_FSM_MODE)
2472 qcom_pll_set_fsm_mode(regmap, PLL_MODE(pll), 6, 0);
2473 }
2474 EXPORT_SYMBOL_GPL(clk_stromer_pll_configure);
2475
clk_alpha_pll_stromer_determine_rate(struct clk_hw * hw,struct clk_rate_request * req)2476 static int clk_alpha_pll_stromer_determine_rate(struct clk_hw *hw,
2477 struct clk_rate_request *req)
2478 {
2479 u32 l;
2480 u64 a;
2481
2482 req->rate = alpha_pll_round_rate(req->rate, req->best_parent_rate,
2483 &l, &a, ALPHA_REG_BITWIDTH);
2484
2485 return 0;
2486 }
2487
clk_alpha_pll_stromer_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long prate)2488 static int clk_alpha_pll_stromer_set_rate(struct clk_hw *hw, unsigned long rate,
2489 unsigned long prate)
2490 {
2491 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
2492 int ret;
2493 u32 l;
2494 u64 a;
2495
2496 rate = alpha_pll_round_rate(rate, prate, &l, &a, ALPHA_REG_BITWIDTH);
2497
2498 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
2499
2500 a <<= ALPHA_REG_BITWIDTH - ALPHA_BITWIDTH;
2501 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a);
2502 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll),
2503 a >> ALPHA_BITWIDTH);
2504
2505 regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
2506 PLL_ALPHA_EN, PLL_ALPHA_EN);
2507
2508 if (!clk_hw_is_enabled(hw))
2509 return 0;
2510
2511 /*
2512 * Stromer PLL supports Dynamic programming.
2513 * It allows the PLL frequency to be changed on-the-fly without first
2514 * execution of a shutdown procedure followed by a bring up procedure.
2515 */
2516 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_UPDATE,
2517 PLL_UPDATE);
2518
2519 ret = wait_for_pll_update(pll);
2520 if (ret)
2521 return ret;
2522
2523 return wait_for_pll_enable_lock(pll);
2524 }
2525
2526 const struct clk_ops clk_alpha_pll_stromer_ops = {
2527 .enable = clk_alpha_pll_enable,
2528 .disable = clk_alpha_pll_disable,
2529 .is_enabled = clk_alpha_pll_is_enabled,
2530 .recalc_rate = clk_alpha_pll_recalc_rate,
2531 .determine_rate = clk_alpha_pll_stromer_determine_rate,
2532 .set_rate = clk_alpha_pll_stromer_set_rate,
2533 };
2534 EXPORT_SYMBOL_GPL(clk_alpha_pll_stromer_ops);
2535
clk_alpha_pll_stromer_plus_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long prate)2536 static int clk_alpha_pll_stromer_plus_set_rate(struct clk_hw *hw,
2537 unsigned long rate,
2538 unsigned long prate)
2539 {
2540 struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
2541 u32 l, alpha_width = pll_alpha_width(pll);
2542 int ret, pll_mode;
2543 u64 a;
2544
2545 rate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width);
2546
2547 ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &pll_mode);
2548 if (ret)
2549 return ret;
2550
2551 regmap_write(pll->clkr.regmap, PLL_MODE(pll), 0);
2552
2553 /* Delay of 2 output clock ticks required until output is disabled */
2554 udelay(1);
2555
2556 regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l);
2557
2558 if (alpha_width > ALPHA_BITWIDTH)
2559 a <<= alpha_width - ALPHA_BITWIDTH;
2560
2561 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a);
2562 regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll),
2563 a >> ALPHA_BITWIDTH);
2564
2565 regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll),
2566 PLL_ALPHA_EN, PLL_ALPHA_EN);
2567
2568 regmap_write(pll->clkr.regmap, PLL_MODE(pll), PLL_BYPASSNL);
2569
2570 /* Wait five micro seconds or more */
2571 udelay(5);
2572 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_RESET_N,
2573 PLL_RESET_N);
2574
2575 /* The lock time should be less than 50 micro seconds worst case */
2576 usleep_range(50, 60);
2577
2578 ret = wait_for_pll_enable_lock(pll);
2579 if (ret) {
2580 pr_err("Wait for PLL enable lock failed [%s] %d\n",
2581 clk_hw_get_name(hw), ret);
2582 return ret;
2583 }
2584
2585 if (pll_mode & PLL_OUTCTRL)
2586 regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_OUTCTRL,
2587 PLL_OUTCTRL);
2588
2589 return 0;
2590 }
2591
2592 const struct clk_ops clk_alpha_pll_stromer_plus_ops = {
2593 .prepare = clk_alpha_pll_enable,
2594 .unprepare = clk_alpha_pll_disable,
2595 .is_enabled = clk_alpha_pll_is_enabled,
2596 .recalc_rate = clk_alpha_pll_recalc_rate,
2597 .determine_rate = clk_alpha_pll_stromer_determine_rate,
2598 .set_rate = clk_alpha_pll_stromer_plus_set_rate,
2599 };
2600 EXPORT_SYMBOL_GPL(clk_alpha_pll_stromer_plus_ops);
2601