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