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