xref: /linux/drivers/clk/renesas/rzg2l-cpg.c (revision 502d45774af09f1c681c754c4b7cdfb5d7f72fd9)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * RZ/G2L Clock Pulse Generator
4  *
5  * Copyright (C) 2021 Renesas Electronics Corp.
6  *
7  * Based on renesas-cpg-mssr.c
8  *
9  * Copyright (C) 2015 Glider bvba
10  * Copyright (C) 2013 Ideas On Board SPRL
11  * Copyright (C) 2015 Renesas Electronics Corp.
12  */
13 
14 #include <linux/atomic.h>
15 #include <linux/bitfield.h>
16 #include <linux/cleanup.h>
17 #include <linux/clk.h>
18 #include <linux/clk-provider.h>
19 #include <linux/clk/renesas.h>
20 #include <linux/debugfs.h>
21 #include <linux/delay.h>
22 #include <linux/device.h>
23 #include <linux/init.h>
24 #include <linux/iopoll.h>
25 #include <linux/math64.h>
26 #include <linux/module.h>
27 #include <linux/of.h>
28 #include <linux/platform_device.h>
29 #include <linux/pm_clock.h>
30 #include <linux/pm_domain.h>
31 #include <linux/reset-controller.h>
32 #include <linux/slab.h>
33 #include <linux/string_choices.h>
34 #include <linux/units.h>
35 
36 #include <dt-bindings/clock/renesas-cpg-mssr.h>
37 
38 #include "rzg2l-cpg.h"
39 
40 #ifdef DEBUG
41 #define WARN_DEBUG(x)	WARN_ON(x)
42 #else
43 #define WARN_DEBUG(x)	do { } while (0)
44 #endif
45 
46 #define GET_SHIFT(val)		((val >> 12) & 0xff)
47 #define GET_WIDTH(val)		((val >> 8) & 0xf)
48 
49 #define KDIV(val)		((s16)FIELD_GET(GENMASK(31, 16), val))
50 #define MDIV(val)		FIELD_GET(GENMASK(15, 6), val)
51 #define PDIV(val)		FIELD_GET(GENMASK(5, 0), val)
52 #define SDIV(val)		FIELD_GET(GENMASK(2, 0), val)
53 
54 #define RZG3S_DIV_P		GENMASK(28, 26)
55 #define RZG3S_DIV_M		GENMASK(25, 22)
56 #define RZG3S_DIV_NI		GENMASK(21, 13)
57 #define RZG3S_DIV_NF		GENMASK(12, 1)
58 #define RZG3S_SEL_PLL		BIT(0)
59 
60 #define CPG_PLL1_SETTING_OFFSET(conf)	FIELD_GET(GENMASK(11, 0), (conf))
61 #define CPG_PLL_STBY_OFFSET(conf)	FIELD_GET(GENMASK(23, 12), (conf))
62 #define CPG_PLL_STBY_RESETB_WEN		BIT(16)
63 #define CPG_PLL_STBY_RESETB		BIT(0)
64 #define CPG_PLL_CLK1_OFFSET(x)		(CPG_PLL_STBY_OFFSET(x) + 0x4)
65 #define CPG_PLL_CLK2_OFFSET(x)		(CPG_PLL_STBY_OFFSET(x) + 0x8)
66 #define CPG_PLL_MON_OFFSET(x)		(CPG_PLL_STBY_OFFSET(x) + 0xc)
67 #define CPG_PLL_MON_LOCK		BIT(4)
68 #define CPG_PLL_MON_RESETB		BIT(0)
69 
70 #define CLK_ON_R(reg)		(reg)
71 #define CLK_MON_R(reg)		(0x180 + (reg))
72 #define CLK_RST_R(reg)		(reg)
73 #define CLK_MRST_R(reg)		(0x180 + (reg))
74 
75 #define GET_REG_OFFSET(val)		((val >> 20) & 0xfff)
76 
77 #define CPG_WEN_BIT		BIT(16)
78 
79 #define MAX_VCLK_FREQ		(148500000)
80 
81 #define MSTOP_OFF(conf)		FIELD_GET(GENMASK(31, 16), (conf))
82 #define MSTOP_MASK(conf)	FIELD_GET(GENMASK(15, 0), (conf))
83 
84 #define PLL5_FOUTVCO_MIN	800000000
85 #define PLL5_FOUTVCO_MAX	3000000000
86 #define PLL5_POSTDIV_MIN	1
87 #define PLL5_POSTDIV_MAX	7
88 #define PLL5_REFDIV_MIN		1
89 #define PLL5_REFDIV_MAX		2
90 #define PLL5_INTIN_MIN		20
91 #define PLL5_INTIN_MAX		320
92 #define PLL5_HSCLK_MIN		10000000
93 #define PLL5_HSCLK_MAX		187500000
94 
95 /**
96  * struct clk_hw_data - clock hardware data
97  * @hw: clock hw
98  * @conf: clock configuration (register offset, shift, width)
99  * @sconf: clock status configuration (register offset, shift, width)
100  * @priv: CPG private data structure
101  */
102 struct clk_hw_data {
103 	struct clk_hw hw;
104 	u32 conf;
105 	u32 sconf;
106 	struct rzg2l_cpg_priv *priv;
107 };
108 
109 #define to_clk_hw_data(_hw)	container_of(_hw, struct clk_hw_data, hw)
110 
111 /**
112  * struct sd_mux_hw_data - SD MUX clock hardware data
113  * @hw_data: clock hw data
114  * @mtable: clock mux table
115  */
116 struct sd_mux_hw_data {
117 	struct clk_hw_data hw_data;
118 	const u32 *mtable;
119 };
120 
121 #define to_sd_mux_hw_data(_hw)	container_of(_hw, struct sd_mux_hw_data, hw_data)
122 
123 /**
124  * struct div_hw_data - divider clock hardware data
125  * @hw_data: clock hw data
126  * @dtable: pointer to divider table
127  * @invalid_rate: invalid rate for divider
128  * @max_rate: maximum rate for divider
129  * @width: divider width
130  */
131 struct div_hw_data {
132 	struct clk_hw_data hw_data;
133 	const struct clk_div_table *dtable;
134 	unsigned long invalid_rate;
135 	unsigned long max_rate;
136 	u32 width;
137 };
138 
139 #define to_div_hw_data(_hw)	container_of(_hw, struct div_hw_data, hw_data)
140 
141 struct rzg2l_pll5_param {
142 	u32 pl5_fracin;
143 	u16 pl5_intin;
144 	u8 pl5_refdiv;
145 	u8 pl5_postdiv1;
146 	u8 pl5_postdiv2;
147 	u8 pl5_spread;
148 };
149 
150 /* PLL5 output will be used for DPI or MIPI-DSI */
151 static int dsi_div_target = PLL5_TARGET_DPI;
152 
153 /* Required division ratio for MIPI D-PHY clock depending on number of lanes and bpp. */
154 static u8 dsi_div_ab_desired;
155 
156 struct rzg2l_pll5_mux_dsi_div_param {
157 	u8 clksrc;
158 	u8 dsi_div_a;
159 	u8 dsi_div_b;
160 };
161 
162 /**
163  * struct rzg2l_cpg_priv - Clock Pulse Generator Private Data
164  *
165  * @rcdev: Reset controller entity
166  * @dev: CPG device
167  * @base: CPG register block base address
168  * @rmw_lock: protects register accesses
169  * @clks: Array containing all Core and Module Clocks
170  * @num_core_clks: Number of Core Clocks in clks[]
171  * @num_mod_clks: Number of Module Clocks in clks[]
172  * @num_resets: Number of Module Resets in info->resets[]
173  * @last_dt_core_clk: ID of the last Core Clock exported to DT
174  * @info: Pointer to platform data
175  * @genpd: PM domain
176  * @mux_dsi_div_params: pll5 mux and dsi div parameters
177  */
178 struct rzg2l_cpg_priv {
179 	struct reset_controller_dev rcdev;
180 	struct device *dev;
181 	void __iomem *base;
182 	spinlock_t rmw_lock;
183 
184 	struct clk **clks;
185 	unsigned int num_core_clks;
186 	unsigned int num_mod_clks;
187 	unsigned int num_resets;
188 	unsigned int last_dt_core_clk;
189 
190 	const struct rzg2l_cpg_info *info;
191 
192 	struct generic_pm_domain genpd;
193 
194 	struct rzg2l_pll5_mux_dsi_div_param mux_dsi_div_params;
195 };
196 
rzg2l_cpg_div_ab(u8 a,u8 b)197 static inline u8 rzg2l_cpg_div_ab(u8 a, u8 b)
198 {
199 	return (b + 1) << a;
200 }
201 
rzg2l_cpg_del_clk_provider(void * data)202 static void rzg2l_cpg_del_clk_provider(void *data)
203 {
204 	of_clk_del_provider(data);
205 }
206 
207 /* Must be called in atomic context. */
rzg2l_cpg_wait_clk_update_done(void __iomem * base,u32 conf)208 static int rzg2l_cpg_wait_clk_update_done(void __iomem *base, u32 conf)
209 {
210 	u32 bitmask = GENMASK(GET_WIDTH(conf) - 1, 0) << GET_SHIFT(conf);
211 	u32 off = GET_REG_OFFSET(conf);
212 	u32 val;
213 
214 	return readl_poll_timeout_atomic(base + off, val, !(val & bitmask), 10, 200);
215 }
216 
rzg2l_cpg_sd_clk_mux_notifier(struct notifier_block * nb,unsigned long event,void * data)217 int rzg2l_cpg_sd_clk_mux_notifier(struct notifier_block *nb, unsigned long event,
218 				  void *data)
219 {
220 	struct clk_notifier_data *cnd = data;
221 	struct clk_hw *hw = __clk_get_hw(cnd->clk);
222 	struct clk_hw_data *clk_hw_data = to_clk_hw_data(hw);
223 	struct rzg2l_cpg_priv *priv = clk_hw_data->priv;
224 	u32 off = GET_REG_OFFSET(clk_hw_data->conf);
225 	u32 shift = GET_SHIFT(clk_hw_data->conf);
226 	const u32 clk_src_266 = 3;
227 	unsigned long flags;
228 	int ret;
229 
230 	if (event != PRE_RATE_CHANGE || (cnd->new_rate / MEGA == 266))
231 		return NOTIFY_DONE;
232 
233 	spin_lock_irqsave(&priv->rmw_lock, flags);
234 
235 	/*
236 	 * As per the HW manual, we should not directly switch from 533 MHz to
237 	 * 400 MHz and vice versa. To change the setting from 2’b01 (533 MHz)
238 	 * to 2’b10 (400 MHz) or vice versa, Switch to 2’b11 (266 MHz) first,
239 	 * and then switch to the target setting (2’b01 (533 MHz) or 2’b10
240 	 * (400 MHz)).
241 	 * Setting a value of '0' to the SEL_SDHI0_SET or SEL_SDHI1_SET clock
242 	 * switching register is prohibited.
243 	 * The clock mux has 3 input clocks(533 MHz, 400 MHz, and 266 MHz), and
244 	 * the index to value mapping is done by adding 1 to the index.
245 	 */
246 
247 	writel((CPG_WEN_BIT | clk_src_266) << shift, priv->base + off);
248 
249 	/* Wait for the update done. */
250 	ret = rzg2l_cpg_wait_clk_update_done(priv->base, clk_hw_data->sconf);
251 
252 	spin_unlock_irqrestore(&priv->rmw_lock, flags);
253 
254 	if (ret)
255 		dev_err(priv->dev, "failed to switch to safe clk source\n");
256 
257 	return notifier_from_errno(ret);
258 }
259 
rzg3s_cpg_div_clk_notifier(struct notifier_block * nb,unsigned long event,void * data)260 int rzg3s_cpg_div_clk_notifier(struct notifier_block *nb, unsigned long event,
261 			       void *data)
262 {
263 	struct clk_notifier_data *cnd = data;
264 	struct clk_hw *hw = __clk_get_hw(cnd->clk);
265 	struct clk_hw_data *clk_hw_data = to_clk_hw_data(hw);
266 	struct div_hw_data *div_hw_data = to_div_hw_data(clk_hw_data);
267 	struct rzg2l_cpg_priv *priv = clk_hw_data->priv;
268 	u32 off = GET_REG_OFFSET(clk_hw_data->conf);
269 	u32 shift = GET_SHIFT(clk_hw_data->conf);
270 	unsigned long flags;
271 	int ret = 0;
272 	u32 val;
273 
274 	if (event != PRE_RATE_CHANGE || !div_hw_data->invalid_rate ||
275 	    div_hw_data->invalid_rate % cnd->new_rate)
276 		return NOTIFY_DONE;
277 
278 	spin_lock_irqsave(&priv->rmw_lock, flags);
279 
280 	val = readl(priv->base + off);
281 	val >>= shift;
282 	val &= GENMASK(GET_WIDTH(clk_hw_data->conf) - 1, 0);
283 
284 	/*
285 	 * There are different constraints for the user of this notifiers as follows:
286 	 * 1/ SD div cannot be 1 (val == 0) if parent rate is 800MHz
287 	 * 2/ OCTA / SPI div cannot be 1 (val == 0) if parent rate is 400MHz
288 	 * As SD can have only one parent having 800MHz and OCTA div can have
289 	 * only one parent having 400MHz we took into account the parent rate
290 	 * at the beginning of function (by checking invalid_rate % new_rate).
291 	 * Now it is time to check the hardware divider and update it accordingly.
292 	 */
293 	if (!val) {
294 		writel((CPG_WEN_BIT | 1) << shift, priv->base + off);
295 		/* Wait for the update done. */
296 		ret = rzg2l_cpg_wait_clk_update_done(priv->base, clk_hw_data->sconf);
297 	}
298 
299 	spin_unlock_irqrestore(&priv->rmw_lock, flags);
300 
301 	if (ret)
302 		dev_err(priv->dev, "Failed to downgrade the div\n");
303 
304 	return notifier_from_errno(ret);
305 }
306 
rzg2l_register_notifier(struct clk_hw * hw,const struct cpg_core_clk * core,struct rzg2l_cpg_priv * priv)307 static int rzg2l_register_notifier(struct clk_hw *hw, const struct cpg_core_clk *core,
308 				   struct rzg2l_cpg_priv *priv)
309 {
310 	struct notifier_block *nb;
311 
312 	if (!core->notifier)
313 		return 0;
314 
315 	nb = devm_kzalloc(priv->dev, sizeof(*nb), GFP_KERNEL);
316 	if (!nb)
317 		return -ENOMEM;
318 
319 	nb->notifier_call = core->notifier;
320 
321 	return clk_notifier_register(hw->clk, nb);
322 }
323 
rzg3s_div_clk_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)324 static unsigned long rzg3s_div_clk_recalc_rate(struct clk_hw *hw,
325 					       unsigned long parent_rate)
326 {
327 	struct clk_hw_data *clk_hw_data = to_clk_hw_data(hw);
328 	struct div_hw_data *div_hw_data = to_div_hw_data(clk_hw_data);
329 	struct rzg2l_cpg_priv *priv = clk_hw_data->priv;
330 	u32 val;
331 
332 	val = readl(priv->base + GET_REG_OFFSET(clk_hw_data->conf));
333 	val >>= GET_SHIFT(clk_hw_data->conf);
334 	val &= GENMASK(GET_WIDTH(clk_hw_data->conf) - 1, 0);
335 
336 	return divider_recalc_rate(hw, parent_rate, val, div_hw_data->dtable,
337 				   CLK_DIVIDER_ROUND_CLOSEST, div_hw_data->width);
338 }
339 
rzg3s_div_clk_determine_rate(struct clk_hw * hw,struct clk_rate_request * req)340 static int rzg3s_div_clk_determine_rate(struct clk_hw *hw, struct clk_rate_request *req)
341 {
342 	struct clk_hw_data *clk_hw_data = to_clk_hw_data(hw);
343 	struct div_hw_data *div_hw_data = to_div_hw_data(clk_hw_data);
344 
345 	if (div_hw_data->max_rate && req->rate > div_hw_data->max_rate)
346 		req->rate = div_hw_data->max_rate;
347 
348 	return divider_determine_rate(hw, req, div_hw_data->dtable, div_hw_data->width,
349 				      CLK_DIVIDER_ROUND_CLOSEST);
350 }
351 
rzg3s_div_clk_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)352 static int rzg3s_div_clk_set_rate(struct clk_hw *hw, unsigned long rate,
353 				  unsigned long parent_rate)
354 {
355 	struct clk_hw_data *clk_hw_data = to_clk_hw_data(hw);
356 	struct div_hw_data *div_hw_data = to_div_hw_data(clk_hw_data);
357 	struct rzg2l_cpg_priv *priv = clk_hw_data->priv;
358 	u32 off = GET_REG_OFFSET(clk_hw_data->conf);
359 	u32 shift = GET_SHIFT(clk_hw_data->conf);
360 	unsigned long flags;
361 	u32 val;
362 	int ret;
363 
364 	val = divider_get_val(rate, parent_rate, div_hw_data->dtable, div_hw_data->width,
365 			      CLK_DIVIDER_ROUND_CLOSEST);
366 
367 	spin_lock_irqsave(&priv->rmw_lock, flags);
368 	writel((CPG_WEN_BIT | val) << shift, priv->base + off);
369 	/* Wait for the update done. */
370 	ret = rzg2l_cpg_wait_clk_update_done(priv->base, clk_hw_data->sconf);
371 	spin_unlock_irqrestore(&priv->rmw_lock, flags);
372 
373 	return ret;
374 }
375 
376 static const struct clk_ops rzg3s_div_clk_ops = {
377 	.recalc_rate = rzg3s_div_clk_recalc_rate,
378 	.determine_rate = rzg3s_div_clk_determine_rate,
379 	.set_rate = rzg3s_div_clk_set_rate,
380 };
381 
382 static struct clk * __init
rzg3s_cpg_div_clk_register(const struct cpg_core_clk * core,struct rzg2l_cpg_priv * priv)383 rzg3s_cpg_div_clk_register(const struct cpg_core_clk *core, struct rzg2l_cpg_priv *priv)
384 {
385 	struct div_hw_data *div_hw_data;
386 	struct clk_init_data init = {};
387 	const struct clk_div_table *clkt;
388 	struct clk_hw *clk_hw;
389 	const struct clk *parent;
390 	const char *parent_name;
391 	u32 max = 0;
392 	int ret;
393 
394 	parent = priv->clks[core->parent];
395 	if (IS_ERR(parent))
396 		return ERR_CAST(parent);
397 
398 	parent_name = __clk_get_name(parent);
399 
400 	div_hw_data = devm_kzalloc(priv->dev, sizeof(*div_hw_data), GFP_KERNEL);
401 	if (!div_hw_data)
402 		return ERR_PTR(-ENOMEM);
403 
404 	init.name = core->name;
405 	init.flags = core->flag;
406 	init.ops = &rzg3s_div_clk_ops;
407 	init.parent_names = &parent_name;
408 	init.num_parents = 1;
409 
410 	/* Get the maximum divider to retrieve div width. */
411 	for (clkt = core->dtable; clkt->div; clkt++) {
412 		if (max < clkt->div)
413 			max = clkt->div;
414 	}
415 
416 	div_hw_data->hw_data.priv = priv;
417 	div_hw_data->hw_data.conf = core->conf;
418 	div_hw_data->hw_data.sconf = core->sconf;
419 	div_hw_data->dtable = core->dtable;
420 	div_hw_data->invalid_rate = core->invalid_rate;
421 	div_hw_data->max_rate = core->max_rate;
422 	div_hw_data->width = fls(max) - 1;
423 
424 	clk_hw = &div_hw_data->hw_data.hw;
425 	clk_hw->init = &init;
426 
427 	ret = devm_clk_hw_register(priv->dev, clk_hw);
428 	if (ret)
429 		return ERR_PTR(ret);
430 
431 	ret = rzg2l_register_notifier(clk_hw, core, priv);
432 	if (ret) {
433 		dev_err(priv->dev, "Failed to register notifier for %s\n",
434 			core->name);
435 		return ERR_PTR(ret);
436 	}
437 
438 	return clk_hw->clk;
439 }
440 
441 static struct clk * __init
rzg2l_cpg_div_clk_register(const struct cpg_core_clk * core,struct rzg2l_cpg_priv * priv)442 rzg2l_cpg_div_clk_register(const struct cpg_core_clk *core,
443 			   struct rzg2l_cpg_priv *priv)
444 {
445 	void __iomem *base = priv->base;
446 	struct device *dev = priv->dev;
447 	const struct clk *parent;
448 	const char *parent_name;
449 	struct clk_hw *clk_hw;
450 
451 	parent = priv->clks[core->parent];
452 	if (IS_ERR(parent))
453 		return ERR_CAST(parent);
454 
455 	parent_name = __clk_get_name(parent);
456 
457 	if (core->dtable)
458 		clk_hw = clk_hw_register_divider_table(dev, core->name,
459 						       parent_name, 0,
460 						       base + GET_REG_OFFSET(core->conf),
461 						       GET_SHIFT(core->conf),
462 						       GET_WIDTH(core->conf),
463 						       core->flag,
464 						       core->dtable,
465 						       &priv->rmw_lock);
466 	else
467 		clk_hw = clk_hw_register_divider(dev, core->name,
468 						 parent_name, 0,
469 						 base + GET_REG_OFFSET(core->conf),
470 						 GET_SHIFT(core->conf),
471 						 GET_WIDTH(core->conf),
472 						 core->flag, &priv->rmw_lock);
473 
474 	if (IS_ERR(clk_hw))
475 		return ERR_CAST(clk_hw);
476 
477 	return clk_hw->clk;
478 }
479 
480 static struct clk * __init
rzg2l_cpg_mux_clk_register(const struct cpg_core_clk * core,struct rzg2l_cpg_priv * priv)481 rzg2l_cpg_mux_clk_register(const struct cpg_core_clk *core,
482 			   struct rzg2l_cpg_priv *priv)
483 {
484 	const struct clk_hw *clk_hw;
485 
486 	clk_hw = devm_clk_hw_register_mux(priv->dev, core->name,
487 					  core->parent_names, core->num_parents,
488 					  core->flag,
489 					  priv->base + GET_REG_OFFSET(core->conf),
490 					  GET_SHIFT(core->conf),
491 					  GET_WIDTH(core->conf),
492 					  core->mux_flags, &priv->rmw_lock);
493 	if (IS_ERR(clk_hw))
494 		return ERR_CAST(clk_hw);
495 
496 	return clk_hw->clk;
497 }
498 
rzg2l_cpg_sd_clk_mux_set_parent(struct clk_hw * hw,u8 index)499 static int rzg2l_cpg_sd_clk_mux_set_parent(struct clk_hw *hw, u8 index)
500 {
501 	struct clk_hw_data *clk_hw_data = to_clk_hw_data(hw);
502 	struct sd_mux_hw_data *sd_mux_hw_data = to_sd_mux_hw_data(clk_hw_data);
503 	struct rzg2l_cpg_priv *priv = clk_hw_data->priv;
504 	u32 off = GET_REG_OFFSET(clk_hw_data->conf);
505 	u32 shift = GET_SHIFT(clk_hw_data->conf);
506 	unsigned long flags;
507 	u32 val;
508 	int ret;
509 
510 	val = clk_mux_index_to_val(sd_mux_hw_data->mtable, CLK_MUX_ROUND_CLOSEST, index);
511 
512 	spin_lock_irqsave(&priv->rmw_lock, flags);
513 
514 	writel((CPG_WEN_BIT | val) << shift, priv->base + off);
515 
516 	/* Wait for the update done. */
517 	ret = rzg2l_cpg_wait_clk_update_done(priv->base, clk_hw_data->sconf);
518 
519 	spin_unlock_irqrestore(&priv->rmw_lock, flags);
520 
521 	if (ret)
522 		dev_err(priv->dev, "Failed to switch parent\n");
523 
524 	return ret;
525 }
526 
rzg2l_cpg_sd_clk_mux_get_parent(struct clk_hw * hw)527 static u8 rzg2l_cpg_sd_clk_mux_get_parent(struct clk_hw *hw)
528 {
529 	struct clk_hw_data *clk_hw_data = to_clk_hw_data(hw);
530 	struct sd_mux_hw_data *sd_mux_hw_data = to_sd_mux_hw_data(clk_hw_data);
531 	struct rzg2l_cpg_priv *priv = clk_hw_data->priv;
532 	u32 val;
533 
534 	val = readl(priv->base + GET_REG_OFFSET(clk_hw_data->conf));
535 	val >>= GET_SHIFT(clk_hw_data->conf);
536 	val &= GENMASK(GET_WIDTH(clk_hw_data->conf) - 1, 0);
537 
538 	return clk_mux_val_to_index(hw, sd_mux_hw_data->mtable, CLK_MUX_ROUND_CLOSEST, val);
539 }
540 
541 static const struct clk_ops rzg2l_cpg_sd_clk_mux_ops = {
542 	.determine_rate = __clk_mux_determine_rate_closest,
543 	.set_parent	= rzg2l_cpg_sd_clk_mux_set_parent,
544 	.get_parent	= rzg2l_cpg_sd_clk_mux_get_parent,
545 };
546 
547 static struct clk * __init
rzg2l_cpg_sd_mux_clk_register(const struct cpg_core_clk * core,struct rzg2l_cpg_priv * priv)548 rzg2l_cpg_sd_mux_clk_register(const struct cpg_core_clk *core,
549 			      struct rzg2l_cpg_priv *priv)
550 {
551 	struct sd_mux_hw_data *sd_mux_hw_data;
552 	struct clk_init_data init;
553 	struct clk_hw *clk_hw;
554 	int ret;
555 
556 	sd_mux_hw_data = devm_kzalloc(priv->dev, sizeof(*sd_mux_hw_data), GFP_KERNEL);
557 	if (!sd_mux_hw_data)
558 		return ERR_PTR(-ENOMEM);
559 
560 	sd_mux_hw_data->hw_data.priv = priv;
561 	sd_mux_hw_data->hw_data.conf = core->conf;
562 	sd_mux_hw_data->hw_data.sconf = core->sconf;
563 	sd_mux_hw_data->mtable = core->mtable;
564 
565 	init.name = core->name;
566 	init.ops = &rzg2l_cpg_sd_clk_mux_ops;
567 	init.flags = core->flag;
568 	init.num_parents = core->num_parents;
569 	init.parent_names = core->parent_names;
570 
571 	clk_hw = &sd_mux_hw_data->hw_data.hw;
572 	clk_hw->init = &init;
573 
574 	ret = devm_clk_hw_register(priv->dev, clk_hw);
575 	if (ret)
576 		return ERR_PTR(ret);
577 
578 	ret = rzg2l_register_notifier(clk_hw, core, priv);
579 	if (ret) {
580 		dev_err(priv->dev, "Failed to register notifier for %s\n",
581 			core->name);
582 		return ERR_PTR(ret);
583 	}
584 
585 	return clk_hw->clk;
586 }
587 
588 /*
589  * VCO-->[POSTDIV1,2]--FOUTPOSTDIV--------------->|
590  *                          |                     |-->[1/(DSI DIV A * B)]--> MIPI_DSI_VCLK
591  *                          |-->[1/2]--FOUT1PH0-->|
592  *                          |
593  *                          |------->[1/16]--------------------------------> hsclk (MIPI-PHY)
594  */
595 static unsigned long
rzg2l_cpg_get_foutpostdiv_rate(struct rzg2l_cpg_priv * priv,struct rzg2l_pll5_param * params,unsigned long rate)596 rzg2l_cpg_get_foutpostdiv_rate(struct rzg2l_cpg_priv *priv,
597 			       struct rzg2l_pll5_param *params,
598 			       unsigned long rate)
599 {
600 	const u32 extal_hz = EXTAL_FREQ_IN_MEGA_HZ * MEGA;
601 	unsigned long foutpostdiv_rate;
602 	unsigned int a, b, odd;
603 	unsigned long hsclk;
604 	u8 dsi_div_ab_calc;
605 	u64 foutvco_rate;
606 
607 	if (dsi_div_target == PLL5_TARGET_DSI) {
608 		/* Check hsclk */
609 		hsclk = rate * dsi_div_ab_desired / 16;
610 		if (hsclk < PLL5_HSCLK_MIN || hsclk > PLL5_HSCLK_MAX) {
611 			dev_err(priv->dev, "hsclk out of range\n");
612 			return 0;
613 		}
614 
615 		/* Determine the correct clock source based on even/odd of the divider */
616 		odd = dsi_div_ab_desired & 1;
617 		if (odd) {
618 			priv->mux_dsi_div_params.clksrc = 0;	/* FOUTPOSTDIV */
619 			dsi_div_ab_calc = dsi_div_ab_desired;
620 		} else {
621 			priv->mux_dsi_div_params.clksrc = 1;	/*  FOUT1PH0 */
622 			dsi_div_ab_calc = dsi_div_ab_desired / 2;
623 		}
624 
625 		/* Calculate the DIV_DSI_A and DIV_DSI_B based on the desired divider */
626 		for (a = 0; a < 4; a++) {
627 			/* FOUT1PH0: Max output of DIV_DSI_A is 750MHz so at least 1/2 to be safe */
628 			if (!odd && a == 0)
629 				continue;
630 
631 			/* FOUTPOSTDIV: DIV_DSI_A must always be 1/1 */
632 			if (odd && a != 0)
633 				break;
634 
635 			for (b = 0; b < 16; b++) {
636 				/* FOUTPOSTDIV: DIV_DSI_B must always be odd divider 1/(b+1) */
637 				if (odd && b & 1)
638 					continue;
639 
640 				if (rzg2l_cpg_div_ab(a, b) == dsi_div_ab_calc) {
641 					priv->mux_dsi_div_params.dsi_div_a = a;
642 					priv->mux_dsi_div_params.dsi_div_b = b;
643 					goto calc_pll_clk;
644 				}
645 			}
646 		}
647 
648 		dev_err(priv->dev, "Failed to calculate DIV_DSI_A,B\n");
649 
650 		return 0;
651 	} else if (dsi_div_target == PLL5_TARGET_DPI) {
652 		/* Fixed settings for DPI */
653 		priv->mux_dsi_div_params.clksrc = 0;
654 		priv->mux_dsi_div_params.dsi_div_a = 3; /* Divided by 8 */
655 		priv->mux_dsi_div_params.dsi_div_b = 0; /* Divided by 1 */
656 		dsi_div_ab_desired = rzg2l_cpg_div_ab(priv->mux_dsi_div_params.dsi_div_a,
657 						      priv->mux_dsi_div_params.dsi_div_b);
658 	}
659 
660 calc_pll_clk:
661 	/* PLL5 (MIPI_DSI_PLLCLK) = VCO / POSTDIV1 / POSTDIV2 */
662 	for (params->pl5_postdiv1 = PLL5_POSTDIV_MIN;
663 	     params->pl5_postdiv1 <= PLL5_POSTDIV_MAX;
664 	     params->pl5_postdiv1++) {
665 		for (params->pl5_postdiv2 = PLL5_POSTDIV_MIN;
666 		     params->pl5_postdiv2 <= PLL5_POSTDIV_MAX;
667 		     params->pl5_postdiv2++) {
668 			foutvco_rate = rate * params->pl5_postdiv1 * params->pl5_postdiv2 *
669 				       dsi_div_ab_desired;
670 			if (foutvco_rate <= PLL5_FOUTVCO_MIN || foutvco_rate >= PLL5_FOUTVCO_MAX)
671 				continue;
672 
673 			for (params->pl5_refdiv = PLL5_REFDIV_MIN;
674 			     params->pl5_refdiv <= PLL5_REFDIV_MAX;
675 			     params->pl5_refdiv++) {
676 				u32 rem;
677 
678 				params->pl5_intin = div_u64_rem(foutvco_rate * params->pl5_refdiv,
679 								extal_hz, &rem);
680 
681 				if (params->pl5_intin < PLL5_INTIN_MIN ||
682 				    params->pl5_intin > PLL5_INTIN_MAX)
683 					continue;
684 
685 				params->pl5_fracin = div_u64((u64)rem << 24, extal_hz);
686 
687 				goto clk_valid;
688 			}
689 		}
690 	}
691 
692 	dev_err(priv->dev, "Failed to calculate PLL5 settings\n");
693 	return 0;
694 
695 clk_valid:
696 	params->pl5_spread = 0x16;
697 
698 	foutvco_rate = div_u64(mul_u32_u32(EXTAL_FREQ_IN_MEGA_HZ * MEGA,
699 					   (params->pl5_intin << 24) + params->pl5_fracin),
700 			       params->pl5_refdiv) >> 24;
701 	foutpostdiv_rate = DIV_U64_ROUND_CLOSEST(foutvco_rate,
702 						 params->pl5_postdiv1 * params->pl5_postdiv2);
703 
704 	return foutpostdiv_rate;
705 }
706 
707 struct dsi_div_hw_data {
708 	struct clk_hw hw;
709 	u32 conf;
710 	unsigned long rate;
711 	struct rzg2l_cpg_priv *priv;
712 };
713 
714 #define to_dsi_div_hw_data(_hw)	container_of(_hw, struct dsi_div_hw_data, hw)
715 
rzg2l_cpg_dsi_div_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)716 static unsigned long rzg2l_cpg_dsi_div_recalc_rate(struct clk_hw *hw,
717 						   unsigned long parent_rate)
718 {
719 	struct dsi_div_hw_data *dsi_div = to_dsi_div_hw_data(hw);
720 	unsigned long rate = dsi_div->rate;
721 
722 	if (!rate)
723 		rate = parent_rate;
724 
725 	return rate;
726 }
727 
rzg2l_cpg_get_vclk_parent_rate(struct clk_hw * hw,unsigned long rate)728 static unsigned long rzg2l_cpg_get_vclk_parent_rate(struct clk_hw *hw,
729 						    unsigned long rate)
730 {
731 	struct dsi_div_hw_data *dsi_div = to_dsi_div_hw_data(hw);
732 	struct rzg2l_cpg_priv *priv = dsi_div->priv;
733 	struct rzg2l_pll5_param params;
734 	unsigned long parent_rate;
735 
736 	parent_rate = rzg2l_cpg_get_foutpostdiv_rate(priv, &params, rate);
737 
738 	if (priv->mux_dsi_div_params.clksrc)
739 		parent_rate /= 2;
740 
741 	return parent_rate;
742 }
743 
rzg2l_cpg_dsi_div_determine_rate(struct clk_hw * hw,struct clk_rate_request * req)744 static int rzg2l_cpg_dsi_div_determine_rate(struct clk_hw *hw,
745 					    struct clk_rate_request *req)
746 {
747 	if (req->rate > MAX_VCLK_FREQ)
748 		req->rate = MAX_VCLK_FREQ;
749 
750 	req->best_parent_rate = rzg2l_cpg_get_vclk_parent_rate(hw, req->rate);
751 
752 	if (!req->best_parent_rate)
753 		return -EINVAL;
754 
755 	return 0;
756 }
757 
rzg2l_cpg_dsi_div_set_divider(u8 divider,int target)758 void rzg2l_cpg_dsi_div_set_divider(u8 divider, int target)
759 {
760 	dsi_div_ab_desired = divider;
761 	dsi_div_target = target;
762 }
763 EXPORT_SYMBOL_GPL(rzg2l_cpg_dsi_div_set_divider);
764 
rzg2l_cpg_dsi_div_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)765 static int rzg2l_cpg_dsi_div_set_rate(struct clk_hw *hw,
766 				      unsigned long rate,
767 				      unsigned long parent_rate)
768 {
769 	struct dsi_div_hw_data *dsi_div = to_dsi_div_hw_data(hw);
770 	struct rzg2l_cpg_priv *priv = dsi_div->priv;
771 
772 	/*
773 	 * MUX -->DIV_DSI_{A,B} -->M3 -->VCLK
774 	 *
775 	 * Based on the dot clock, the DSI divider clock sets the divider value,
776 	 * calculates the pll parameters for generating FOUTPOSTDIV and the clk
777 	 * source for the MUX and propagates that info to the parents.
778 	 */
779 
780 	if (!rate || rate > MAX_VCLK_FREQ)
781 		return -EINVAL;
782 
783 	dsi_div->rate = rate;
784 	writel(CPG_PL5_SDIV_DIV_DSI_A_WEN | CPG_PL5_SDIV_DIV_DSI_B_WEN |
785 	       (priv->mux_dsi_div_params.dsi_div_a << 0) |
786 	       (priv->mux_dsi_div_params.dsi_div_b << 8),
787 	       priv->base + CPG_PL5_SDIV);
788 
789 	return 0;
790 }
791 
792 static const struct clk_ops rzg2l_cpg_dsi_div_ops = {
793 	.recalc_rate = rzg2l_cpg_dsi_div_recalc_rate,
794 	.determine_rate = rzg2l_cpg_dsi_div_determine_rate,
795 	.set_rate = rzg2l_cpg_dsi_div_set_rate,
796 };
797 
798 static struct clk * __init
rzg2l_cpg_dsi_div_clk_register(const struct cpg_core_clk * core,struct rzg2l_cpg_priv * priv)799 rzg2l_cpg_dsi_div_clk_register(const struct cpg_core_clk *core,
800 			       struct rzg2l_cpg_priv *priv)
801 {
802 	struct dsi_div_hw_data *clk_hw_data;
803 	const struct clk *parent;
804 	const char *parent_name;
805 	struct clk_init_data init;
806 	struct clk_hw *clk_hw;
807 	int ret;
808 
809 	parent = priv->clks[core->parent];
810 	if (IS_ERR(parent))
811 		return ERR_CAST(parent);
812 
813 	clk_hw_data = devm_kzalloc(priv->dev, sizeof(*clk_hw_data), GFP_KERNEL);
814 	if (!clk_hw_data)
815 		return ERR_PTR(-ENOMEM);
816 
817 	clk_hw_data->priv = priv;
818 
819 	parent_name = __clk_get_name(parent);
820 	init.name = core->name;
821 	init.ops = &rzg2l_cpg_dsi_div_ops;
822 	init.flags = CLK_SET_RATE_PARENT;
823 	init.parent_names = &parent_name;
824 	init.num_parents = 1;
825 
826 	clk_hw = &clk_hw_data->hw;
827 	clk_hw->init = &init;
828 
829 	ret = devm_clk_hw_register(priv->dev, clk_hw);
830 	if (ret)
831 		return ERR_PTR(ret);
832 
833 	return clk_hw->clk;
834 }
835 
836 struct pll5_mux_hw_data {
837 	struct clk_hw hw;
838 	u32 conf;
839 	unsigned long rate;
840 	struct rzg2l_cpg_priv *priv;
841 };
842 
843 #define to_pll5_mux_hw_data(_hw)	container_of(_hw, struct pll5_mux_hw_data, hw)
844 
rzg2l_cpg_pll5_4_clk_mux_determine_rate(struct clk_hw * hw,struct clk_rate_request * req)845 static int rzg2l_cpg_pll5_4_clk_mux_determine_rate(struct clk_hw *hw,
846 						   struct clk_rate_request *req)
847 {
848 	struct clk_hw *parent;
849 	struct pll5_mux_hw_data *hwdata = to_pll5_mux_hw_data(hw);
850 	struct rzg2l_cpg_priv *priv = hwdata->priv;
851 
852 	parent = clk_hw_get_parent_by_index(hw, priv->mux_dsi_div_params.clksrc);
853 	req->best_parent_hw = parent;
854 	req->best_parent_rate = req->rate;
855 
856 	return 0;
857 }
858 
rzg2l_cpg_pll5_4_clk_mux_set_parent(struct clk_hw * hw,u8 index)859 static int rzg2l_cpg_pll5_4_clk_mux_set_parent(struct clk_hw *hw, u8 index)
860 {
861 	struct pll5_mux_hw_data *hwdata = to_pll5_mux_hw_data(hw);
862 	struct rzg2l_cpg_priv *priv = hwdata->priv;
863 
864 	/*
865 	 * FOUTPOSTDIV--->|
866 	 *  |             | -->MUX -->DIV_DSIA_B -->M3 -->VCLK
867 	 *  |--FOUT1PH0-->|
868 	 *
869 	 * Based on the dot clock, the DSI divider clock calculates the parent
870 	 * rate and clk source for the MUX. It propagates that info to
871 	 * pll5_4_clk_mux which sets the clock source for DSI divider clock.
872 	 */
873 
874 	writel(CPG_OTHERFUNC1_REG_RES0_ON_WEN | index,
875 	       priv->base + CPG_OTHERFUNC1_REG);
876 
877 	return 0;
878 }
879 
rzg2l_cpg_pll5_4_clk_mux_get_parent(struct clk_hw * hw)880 static u8 rzg2l_cpg_pll5_4_clk_mux_get_parent(struct clk_hw *hw)
881 {
882 	struct pll5_mux_hw_data *hwdata = to_pll5_mux_hw_data(hw);
883 	struct rzg2l_cpg_priv *priv = hwdata->priv;
884 
885 	return readl(priv->base + GET_REG_OFFSET(hwdata->conf));
886 }
887 
888 static const struct clk_ops rzg2l_cpg_pll5_4_clk_mux_ops = {
889 	.determine_rate = rzg2l_cpg_pll5_4_clk_mux_determine_rate,
890 	.set_parent	= rzg2l_cpg_pll5_4_clk_mux_set_parent,
891 	.get_parent	= rzg2l_cpg_pll5_4_clk_mux_get_parent,
892 };
893 
894 static struct clk * __init
rzg2l_cpg_pll5_4_mux_clk_register(const struct cpg_core_clk * core,struct rzg2l_cpg_priv * priv)895 rzg2l_cpg_pll5_4_mux_clk_register(const struct cpg_core_clk *core,
896 				  struct rzg2l_cpg_priv *priv)
897 {
898 	struct pll5_mux_hw_data *clk_hw_data;
899 	struct clk_init_data init;
900 	struct clk_hw *clk_hw;
901 	int ret;
902 
903 	clk_hw_data = devm_kzalloc(priv->dev, sizeof(*clk_hw_data), GFP_KERNEL);
904 	if (!clk_hw_data)
905 		return ERR_PTR(-ENOMEM);
906 
907 	clk_hw_data->priv = priv;
908 	clk_hw_data->conf = core->conf;
909 
910 	init.name = core->name;
911 	init.ops = &rzg2l_cpg_pll5_4_clk_mux_ops;
912 	init.flags = CLK_SET_RATE_PARENT;
913 	init.num_parents = core->num_parents;
914 	init.parent_names = core->parent_names;
915 
916 	clk_hw = &clk_hw_data->hw;
917 	clk_hw->init = &init;
918 
919 	ret = devm_clk_hw_register(priv->dev, clk_hw);
920 	if (ret)
921 		return ERR_PTR(ret);
922 
923 	return clk_hw->clk;
924 }
925 
926 struct sipll5 {
927 	struct clk_hw hw;
928 	u32 conf;
929 	unsigned long foutpostdiv_rate;
930 	struct rzg2l_cpg_priv *priv;
931 };
932 
933 #define to_sipll5(_hw)	container_of(_hw, struct sipll5, hw)
934 
rzg2l_cpg_sipll5_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)935 static unsigned long rzg2l_cpg_sipll5_recalc_rate(struct clk_hw *hw,
936 						  unsigned long parent_rate)
937 {
938 	struct sipll5 *sipll5 = to_sipll5(hw);
939 	unsigned long pll5_rate = sipll5->foutpostdiv_rate;
940 
941 	if (!pll5_rate)
942 		pll5_rate = parent_rate;
943 
944 	return pll5_rate;
945 }
946 
rzg2l_cpg_sipll5_set_rate(struct clk_hw * hw,unsigned long rate,unsigned long parent_rate)947 static int rzg2l_cpg_sipll5_set_rate(struct clk_hw *hw,
948 				     unsigned long rate,
949 				     unsigned long parent_rate)
950 {
951 	struct sipll5 *sipll5 = to_sipll5(hw);
952 	struct rzg2l_cpg_priv *priv = sipll5->priv;
953 	struct rzg2l_pll5_param params;
954 	unsigned long vclk_rate;
955 	int ret;
956 	u32 val;
957 
958 	/*
959 	 *  OSC --> PLL5 --> FOUTPOSTDIV-->|
960 	 *                   |             | -->MUX -->DIV_DSIA_B -->M3 -->VCLK
961 	 *                   |--FOUT1PH0-->|
962 	 *
963 	 * Based on the dot clock, the DSI divider clock calculates the parent
964 	 * rate and the pll5 parameters for generating FOUTPOSTDIV. It propagates
965 	 * that info to sipll5 which sets parameters for generating FOUTPOSTDIV.
966 	 *
967 	 * OSC --> PLL5 --> FOUTPOSTDIV
968 	 */
969 
970 	if (!rate)
971 		return -EINVAL;
972 
973 	vclk_rate = rate / dsi_div_ab_desired;
974 	sipll5->foutpostdiv_rate =
975 		rzg2l_cpg_get_foutpostdiv_rate(priv, &params, vclk_rate);
976 
977 	/* Put PLL5 into standby mode */
978 	writel(CPG_SIPLL5_STBY_RESETB_WEN, priv->base + CPG_SIPLL5_STBY);
979 	ret = readl_poll_timeout(priv->base + CPG_SIPLL5_MON, val,
980 				 !(val & CPG_SIPLL5_MON_PLL5_LOCK), 100, 250000);
981 	if (ret) {
982 		dev_err(priv->dev, "failed to release pll5 lock\n");
983 		return ret;
984 	}
985 
986 	/* Output clock setting 1 */
987 	writel((params.pl5_postdiv1 << 0) | (params.pl5_postdiv2 << 4) |
988 	       (params.pl5_refdiv << 8), priv->base + CPG_SIPLL5_CLK1);
989 
990 	/* Output clock setting, SSCG modulation value setting 3 */
991 	writel((params.pl5_fracin << 8), priv->base + CPG_SIPLL5_CLK3);
992 
993 	/* Output clock setting 4 */
994 	writel(CPG_SIPLL5_CLK4_RESV_LSB | (params.pl5_intin << 16),
995 	       priv->base + CPG_SIPLL5_CLK4);
996 
997 	/* Output clock setting 5 */
998 	writel(params.pl5_spread, priv->base + CPG_SIPLL5_CLK5);
999 
1000 	/* PLL normal mode setting */
1001 	writel(CPG_SIPLL5_STBY_DOWNSPREAD_WEN | CPG_SIPLL5_STBY_SSCG_EN_WEN |
1002 	       CPG_SIPLL5_STBY_RESETB_WEN | CPG_SIPLL5_STBY_RESETB,
1003 	       priv->base + CPG_SIPLL5_STBY);
1004 
1005 	/* PLL normal mode transition, output clock stability check */
1006 	ret = readl_poll_timeout(priv->base + CPG_SIPLL5_MON, val,
1007 				 (val & CPG_SIPLL5_MON_PLL5_LOCK), 100, 250000);
1008 	if (ret) {
1009 		dev_err(priv->dev, "failed to lock pll5\n");
1010 		return ret;
1011 	}
1012 
1013 	return 0;
1014 }
1015 
1016 static const struct clk_ops rzg2l_cpg_sipll5_ops = {
1017 	.recalc_rate = rzg2l_cpg_sipll5_recalc_rate,
1018 	.determine_rate = clk_determine_rate_noop,
1019 	.set_rate = rzg2l_cpg_sipll5_set_rate,
1020 };
1021 
1022 static struct clk * __init
rzg2l_cpg_sipll5_register(const struct cpg_core_clk * core,struct rzg2l_cpg_priv * priv)1023 rzg2l_cpg_sipll5_register(const struct cpg_core_clk *core,
1024 			  struct rzg2l_cpg_priv *priv)
1025 {
1026 	const struct clk *parent;
1027 	struct clk_init_data init;
1028 	const char *parent_name;
1029 	struct sipll5 *sipll5;
1030 	struct clk_hw *clk_hw;
1031 	int ret;
1032 
1033 	parent = priv->clks[core->parent];
1034 	if (IS_ERR(parent))
1035 		return ERR_CAST(parent);
1036 
1037 	sipll5 = devm_kzalloc(priv->dev, sizeof(*sipll5), GFP_KERNEL);
1038 	if (!sipll5)
1039 		return ERR_PTR(-ENOMEM);
1040 
1041 	init.name = core->name;
1042 	parent_name = __clk_get_name(parent);
1043 	init.ops = &rzg2l_cpg_sipll5_ops;
1044 	init.flags = 0;
1045 	init.parent_names = &parent_name;
1046 	init.num_parents = 1;
1047 
1048 	sipll5->hw.init = &init;
1049 	sipll5->conf = core->conf;
1050 	sipll5->priv = priv;
1051 
1052 	writel(CPG_SIPLL5_STBY_SSCG_EN_WEN | CPG_SIPLL5_STBY_RESETB_WEN |
1053 	       CPG_SIPLL5_STBY_RESETB, priv->base + CPG_SIPLL5_STBY);
1054 
1055 	clk_hw = &sipll5->hw;
1056 	clk_hw->init = &init;
1057 
1058 	ret = devm_clk_hw_register(priv->dev, clk_hw);
1059 	if (ret)
1060 		return ERR_PTR(ret);
1061 
1062 	rzg2l_cpg_dsi_div_set_divider(8, PLL5_TARGET_DPI);
1063 
1064 	return clk_hw->clk;
1065 }
1066 
1067 struct pll_clk {
1068 	struct clk_hw hw;
1069 	unsigned long default_rate;
1070 	unsigned int conf;
1071 	unsigned int type;
1072 	void __iomem *base;
1073 	struct rzg2l_cpg_priv *priv;
1074 };
1075 
1076 #define to_pll(_hw)	container_of(_hw, struct pll_clk, hw)
1077 
rzg2l_cpg_pll_clk_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)1078 static unsigned long rzg2l_cpg_pll_clk_recalc_rate(struct clk_hw *hw,
1079 						   unsigned long parent_rate)
1080 {
1081 	struct pll_clk *pll_clk = to_pll(hw);
1082 	struct rzg2l_cpg_priv *priv = pll_clk->priv;
1083 	unsigned int val1, val2;
1084 	u64 rate;
1085 
1086 	if (pll_clk->type != CLK_TYPE_SAM_PLL)
1087 		return parent_rate;
1088 
1089 	val1 = readl(priv->base + CPG_PLL_CLK1_OFFSET(pll_clk->conf));
1090 	val2 = readl(priv->base + CPG_PLL_CLK2_OFFSET(pll_clk->conf));
1091 
1092 	rate = mul_u64_u32_shr(parent_rate, (MDIV(val1) << 16) + KDIV(val1),
1093 			       16 + SDIV(val2));
1094 
1095 	return DIV_ROUND_CLOSEST_ULL(rate, PDIV(val1));
1096 }
1097 
1098 static const struct clk_ops rzg2l_cpg_pll_ops = {
1099 	.recalc_rate = rzg2l_cpg_pll_clk_recalc_rate,
1100 };
1101 
rzg3s_cpg_pll_clk_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)1102 static unsigned long rzg3s_cpg_pll_clk_recalc_rate(struct clk_hw *hw,
1103 						   unsigned long parent_rate)
1104 {
1105 	struct pll_clk *pll_clk = to_pll(hw);
1106 	struct rzg2l_cpg_priv *priv = pll_clk->priv;
1107 	u32 nir, nfr, mr, pr, val, setting;
1108 	u64 rate;
1109 
1110 	setting = CPG_PLL1_SETTING_OFFSET(pll_clk->conf);
1111 	if (setting) {
1112 		val = readl(priv->base + setting);
1113 		if (val & RZG3S_SEL_PLL)
1114 			return pll_clk->default_rate;
1115 	}
1116 
1117 	val = readl(priv->base + CPG_PLL_CLK1_OFFSET(pll_clk->conf));
1118 
1119 	pr = 1 << FIELD_GET(RZG3S_DIV_P, val);
1120 	/* Hardware interprets values higher than 8 as p = 16. */
1121 	if (pr > 8)
1122 		pr = 16;
1123 
1124 	mr  = FIELD_GET(RZG3S_DIV_M, val) + 1;
1125 	nir = FIELD_GET(RZG3S_DIV_NI, val) + 1;
1126 	nfr = FIELD_GET(RZG3S_DIV_NF, val);
1127 
1128 	rate = mul_u64_u32_shr(parent_rate, 4096 * nir + nfr, 12);
1129 
1130 	return DIV_ROUND_CLOSEST_ULL(rate, (mr * pr));
1131 }
1132 
1133 static const struct clk_ops rzg3s_cpg_pll_ops = {
1134 	.recalc_rate = rzg3s_cpg_pll_clk_recalc_rate,
1135 };
1136 
1137 static struct clk * __init
rzg2l_cpg_pll_clk_register(const struct cpg_core_clk * core,struct rzg2l_cpg_priv * priv,const struct clk_ops * ops)1138 rzg2l_cpg_pll_clk_register(const struct cpg_core_clk *core,
1139 			   struct rzg2l_cpg_priv *priv,
1140 			   const struct clk_ops *ops)
1141 {
1142 	struct device *dev = priv->dev;
1143 	const struct clk *parent;
1144 	struct clk_init_data init;
1145 	const char *parent_name;
1146 	struct pll_clk *pll_clk;
1147 	int ret;
1148 
1149 	parent = priv->clks[core->parent];
1150 	if (IS_ERR(parent))
1151 		return ERR_CAST(parent);
1152 
1153 	pll_clk = devm_kzalloc(dev, sizeof(*pll_clk), GFP_KERNEL);
1154 	if (!pll_clk)
1155 		return ERR_PTR(-ENOMEM);
1156 
1157 	parent_name = __clk_get_name(parent);
1158 	init.name = core->name;
1159 	init.ops = ops;
1160 	init.flags = 0;
1161 	init.parent_names = &parent_name;
1162 	init.num_parents = 1;
1163 
1164 	pll_clk->hw.init = &init;
1165 	pll_clk->conf = core->conf;
1166 	pll_clk->base = priv->base;
1167 	pll_clk->priv = priv;
1168 	pll_clk->type = core->type;
1169 	pll_clk->default_rate = core->default_rate;
1170 
1171 	ret = devm_clk_hw_register(dev, &pll_clk->hw);
1172 	if (ret)
1173 		return ERR_PTR(ret);
1174 
1175 	return pll_clk->hw.clk;
1176 }
1177 
rzg3l_cpg_pll_clk_is_enabled(struct clk_hw * hw)1178 static int rzg3l_cpg_pll_clk_is_enabled(struct clk_hw *hw)
1179 {
1180 	struct pll_clk *pll_clk = to_pll(hw);
1181 	struct rzg2l_cpg_priv *priv = pll_clk->priv;
1182 	u32 val = readl(priv->base + CPG_PLL_MON_OFFSET(pll_clk->conf));
1183 	u32 mon_val = CPG_PLL_MON_RESETB | CPG_PLL_MON_LOCK;
1184 
1185 	/* Ensure both RESETB and LOCK bits are set */
1186 	return (mon_val == (val & mon_val));
1187 }
1188 
rzg3l_cpg_pll_clk_endisable(struct clk_hw * hw,bool enable)1189 static int rzg3l_cpg_pll_clk_endisable(struct clk_hw *hw, bool enable)
1190 {
1191 	struct pll_clk *pll_clk = to_pll(hw);
1192 	struct rzg2l_cpg_priv *priv = pll_clk->priv;
1193 	u32 mon_mask = CPG_PLL_MON_RESETB | CPG_PLL_MON_LOCK;
1194 	u32 val = CPG_PLL_STBY_RESETB_WEN;
1195 	u32 stby_offset, mon_offset;
1196 	u32 mon_val = 0;
1197 	int ret;
1198 
1199 	stby_offset = CPG_PLL_STBY_OFFSET(pll_clk->conf);
1200 	mon_offset = CPG_PLL_MON_OFFSET(pll_clk->conf);
1201 
1202 	if (enable) {
1203 		val |= CPG_PLL_STBY_RESETB;
1204 		mon_val = mon_mask;
1205 	}
1206 
1207 	writel(val, priv->base + stby_offset);
1208 
1209 	/* ensure PLL is in normal/standby mode */
1210 	ret = readl_poll_timeout_atomic(priv->base + mon_offset, val,
1211 					mon_val == (val & mon_mask), 10, 100);
1212 	if (ret)
1213 		dev_err(priv->dev, "Failed to %s PLL 0x%x/%pC\n", enable ?
1214 			"enable" : "disable", stby_offset, hw->clk);
1215 
1216 	return ret;
1217 }
1218 
rzg3l_cpg_pll_clk_enable(struct clk_hw * hw)1219 static int rzg3l_cpg_pll_clk_enable(struct clk_hw *hw)
1220 {
1221 	if (rzg3l_cpg_pll_clk_is_enabled(hw))
1222 		return 0;
1223 
1224 	return rzg3l_cpg_pll_clk_endisable(hw, true);
1225 }
1226 
1227 static const struct clk_ops rzg3l_cpg_pll_ops = {
1228 	.is_enabled = rzg3l_cpg_pll_clk_is_enabled,
1229 	.enable = rzg3l_cpg_pll_clk_enable,
1230 	.recalc_rate = rzg3s_cpg_pll_clk_recalc_rate,
1231 };
1232 
1233 static struct clk
rzg2l_cpg_clk_src_twocell_get(struct of_phandle_args * clkspec,void * data)1234 *rzg2l_cpg_clk_src_twocell_get(struct of_phandle_args *clkspec,
1235 			       void *data)
1236 {
1237 	unsigned int clkidx = clkspec->args[1];
1238 	struct rzg2l_cpg_priv *priv = data;
1239 	struct device *dev = priv->dev;
1240 	const char *type;
1241 	struct clk *clk;
1242 
1243 	switch (clkspec->args[0]) {
1244 	case CPG_CORE:
1245 		type = "core";
1246 		if (clkidx > priv->last_dt_core_clk) {
1247 			dev_err(dev, "Invalid %s clock index %u\n", type, clkidx);
1248 			return ERR_PTR(-EINVAL);
1249 		}
1250 		clk = priv->clks[clkidx];
1251 		break;
1252 
1253 	case CPG_MOD:
1254 		type = "module";
1255 		if (clkidx >= priv->num_mod_clks) {
1256 			dev_err(dev, "Invalid %s clock index %u\n", type,
1257 				clkidx);
1258 			return ERR_PTR(-EINVAL);
1259 		}
1260 		clk = priv->clks[priv->num_core_clks + clkidx];
1261 		break;
1262 
1263 	default:
1264 		dev_err(dev, "Invalid CPG clock type %u\n", clkspec->args[0]);
1265 		return ERR_PTR(-EINVAL);
1266 	}
1267 
1268 	if (IS_ERR(clk))
1269 		dev_err(dev, "Cannot get %s clock %u: %ld\n", type, clkidx,
1270 			PTR_ERR(clk));
1271 	else
1272 		dev_dbg(dev, "clock (%u, %u) is %pC at %lu Hz\n",
1273 			clkspec->args[0], clkspec->args[1], clk,
1274 			clk_get_rate(clk));
1275 	return clk;
1276 }
1277 
1278 static void __init
rzg2l_cpg_register_core_clk(const struct cpg_core_clk * core,const struct rzg2l_cpg_info * info,struct rzg2l_cpg_priv * priv)1279 rzg2l_cpg_register_core_clk(const struct cpg_core_clk *core,
1280 			    const struct rzg2l_cpg_info *info,
1281 			    struct rzg2l_cpg_priv *priv)
1282 {
1283 	struct clk *clk = ERR_PTR(-EOPNOTSUPP), *parent;
1284 	struct device *dev = priv->dev;
1285 	unsigned int id = core->id, div = core->div;
1286 	const char *parent_name;
1287 	struct clk_hw *clk_hw;
1288 
1289 	WARN_DEBUG(id >= priv->num_core_clks);
1290 	WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT);
1291 
1292 	switch (core->type) {
1293 	case CLK_TYPE_IN:
1294 		clk = of_clk_get_by_name(priv->dev->of_node, core->name);
1295 		break;
1296 	case CLK_TYPE_FF:
1297 		WARN_DEBUG(core->parent >= priv->num_core_clks);
1298 		parent = priv->clks[core->parent];
1299 		if (IS_ERR(parent)) {
1300 			clk = parent;
1301 			goto fail;
1302 		}
1303 
1304 		parent_name = __clk_get_name(parent);
1305 		clk_hw = devm_clk_hw_register_fixed_factor(dev, core->name, parent_name,
1306 							   CLK_SET_RATE_PARENT,
1307 							   core->mult, div);
1308 		if (IS_ERR(clk_hw))
1309 			clk = ERR_CAST(clk_hw);
1310 		else
1311 			clk = clk_hw->clk;
1312 		break;
1313 	case CLK_TYPE_SAM_PLL:
1314 		clk = rzg2l_cpg_pll_clk_register(core, priv, &rzg2l_cpg_pll_ops);
1315 		break;
1316 	case CLK_TYPE_G3L_PLL:
1317 		clk = rzg2l_cpg_pll_clk_register(core, priv, &rzg3l_cpg_pll_ops);
1318 		break;
1319 	case CLK_TYPE_G3S_PLL:
1320 		clk = rzg2l_cpg_pll_clk_register(core, priv, &rzg3s_cpg_pll_ops);
1321 		break;
1322 	case CLK_TYPE_SIPLL5:
1323 		clk = rzg2l_cpg_sipll5_register(core, priv);
1324 		break;
1325 	case CLK_TYPE_DIV:
1326 		clk = rzg2l_cpg_div_clk_register(core, priv);
1327 		break;
1328 	case CLK_TYPE_G3S_DIV:
1329 		clk = rzg3s_cpg_div_clk_register(core, priv);
1330 		break;
1331 	case CLK_TYPE_MUX:
1332 		clk = rzg2l_cpg_mux_clk_register(core, priv);
1333 		break;
1334 	case CLK_TYPE_SD_MUX:
1335 		clk = rzg2l_cpg_sd_mux_clk_register(core, priv);
1336 		break;
1337 	case CLK_TYPE_PLL5_4_MUX:
1338 		clk = rzg2l_cpg_pll5_4_mux_clk_register(core, priv);
1339 		break;
1340 	case CLK_TYPE_DSI_DIV:
1341 		clk = rzg2l_cpg_dsi_div_clk_register(core, priv);
1342 		break;
1343 	default:
1344 		goto fail;
1345 	}
1346 
1347 	if (IS_ERR(clk))
1348 		goto fail;
1349 
1350 	dev_dbg(dev, "Core clock %pC at %lu Hz\n", clk, clk_get_rate(clk));
1351 	priv->clks[id] = clk;
1352 	return;
1353 
1354 fail:
1355 	dev_err(dev, "Failed to register %s clock %s: %ld\n", "core",
1356 		core->name, PTR_ERR(clk));
1357 }
1358 
1359 /**
1360  * struct mstop - MSTOP specific data structure
1361  * @usecnt: Usage counter for MSTOP settings (when zero the settings
1362  *          are applied to register)
1363  * @conf: MSTOP configuration (register offset, setup bits)
1364  */
1365 struct mstop {
1366 	atomic_t usecnt;
1367 	u32 conf;
1368 };
1369 
1370 /**
1371  * struct mod_clock - Module clock
1372  *
1373  * @hw: handle between common and hardware-specific interfaces
1374  * @priv: CPG/MSTP private data
1375  * @sibling: pointer to the other coupled clock
1376  * @mstop: MSTOP configuration
1377  * @shared_mstop_clks: clocks sharing the MSTOP with this clock
1378  * @off: register offset
1379  * @bit: ON/MON bit
1380  * @num_shared_mstop_clks: number of the clocks sharing MSTOP with this clock
1381  * @enabled: soft state of the clock, if it is coupled with another clock
1382  */
1383 struct mod_clock {
1384 	struct clk_hw hw;
1385 	struct rzg2l_cpg_priv *priv;
1386 	struct mod_clock *sibling;
1387 	struct mstop *mstop;
1388 	struct mod_clock **shared_mstop_clks;
1389 	u16 off;
1390 	u8 bit;
1391 	u8 num_shared_mstop_clks;
1392 	bool enabled;
1393 };
1394 
1395 #define to_mod_clock(_hw) container_of(_hw, struct mod_clock, hw)
1396 
1397 #define for_each_mod_clock(mod_clock, hw, priv) \
1398 	for (unsigned int __i = 0; (priv) && __i < (priv)->num_mod_clks; __i++) \
1399 		if ((priv)->clks[(priv)->num_core_clks + __i] == ERR_PTR(-ENOENT)) \
1400 			continue; \
1401 		else if (((hw) = __clk_get_hw((priv)->clks[(priv)->num_core_clks + __i])) && \
1402 			 ((mod_clock) = to_mod_clock(hw)))
1403 
1404 /* Need to be called with a lock held to avoid concurrent access to mstop->usecnt. */
rzg2l_mod_clock_module_set_state(struct mod_clock * clock,bool standby)1405 static void rzg2l_mod_clock_module_set_state(struct mod_clock *clock,
1406 					     bool standby)
1407 {
1408 	struct rzg2l_cpg_priv *priv = clock->priv;
1409 	struct mstop *mstop = clock->mstop;
1410 	bool update = false;
1411 	u32 value;
1412 
1413 	if (!mstop)
1414 		return;
1415 
1416 	value = MSTOP_MASK(mstop->conf) << 16;
1417 
1418 	if (standby) {
1419 		unsigned int criticals = 0;
1420 
1421 		for (unsigned int i = 0; i < clock->num_shared_mstop_clks; i++) {
1422 			struct mod_clock *clk = clock->shared_mstop_clks[i];
1423 
1424 			if (clk_hw_get_flags(&clk->hw) & CLK_IS_CRITICAL)
1425 				criticals++;
1426 		}
1427 
1428 		if (!clock->num_shared_mstop_clks &&
1429 		    clk_hw_get_flags(&clock->hw) & CLK_IS_CRITICAL)
1430 			criticals++;
1431 
1432 		/*
1433 		 * If this is a shared MSTOP and it is shared with critical clocks,
1434 		 * and the system boots up with this clock enabled but no driver
1435 		 * uses it the CCF will disable it (as it is unused). As we don't
1436 		 * increment reference counter for it at registration (to avoid
1437 		 * messing with clocks enabled at probe but later used by drivers)
1438 		 * do not set the MSTOP here too if it is shared with critical
1439 		 * clocks and ref counted only by those critical clocks.
1440 		 */
1441 		if (criticals && criticals == atomic_read(&mstop->usecnt))
1442 			return;
1443 
1444 		value |= MSTOP_MASK(mstop->conf);
1445 
1446 		/* Allow updates on probe when usecnt = 0. */
1447 		if (!atomic_read(&mstop->usecnt))
1448 			update = true;
1449 		else
1450 			update = atomic_dec_and_test(&mstop->usecnt);
1451 	} else {
1452 		if (!atomic_read(&mstop->usecnt))
1453 			update = true;
1454 		atomic_inc(&mstop->usecnt);
1455 	}
1456 
1457 	if (update)
1458 		writel(value, priv->base + MSTOP_OFF(mstop->conf));
1459 }
1460 
rzg2l_mod_clock_mstop_show(struct seq_file * s,void * what)1461 static int rzg2l_mod_clock_mstop_show(struct seq_file *s, void *what)
1462 {
1463 	struct rzg2l_cpg_priv *priv = s->private;
1464 	struct mod_clock *clk;
1465 	struct clk_hw *hw;
1466 
1467 	seq_printf(s, "%-20s %-5s %-10s\n", "", "", "MSTOP");
1468 	seq_printf(s, "%-20s %-5s %-10s\n", "", "clk", "-------------------------");
1469 	seq_printf(s, "%-20s %-5s %-5s %-5s %-6s %-6s\n",
1470 		   "clk_name", "cnt", "cnt", "off", "val", "shared");
1471 	seq_printf(s, "%-20s %-5s %-5s %-5s %-6s %-6s\n",
1472 		   "--------", "-----", "-----", "-----", "------", "------");
1473 
1474 	for_each_mod_clock(clk, hw, priv) {
1475 		u32 val;
1476 
1477 		if (!clk->mstop)
1478 			continue;
1479 
1480 		val = readl(priv->base + MSTOP_OFF(clk->mstop->conf)) &
1481 		      MSTOP_MASK(clk->mstop->conf);
1482 
1483 		seq_printf(s, "%-20s %-5d %-5d 0x%-3lx 0x%-4x", clk_hw_get_name(hw),
1484 			   __clk_get_enable_count(hw->clk), atomic_read(&clk->mstop->usecnt),
1485 			   MSTOP_OFF(clk->mstop->conf), val);
1486 
1487 		for (unsigned int i = 0; i < clk->num_shared_mstop_clks; i++)
1488 			seq_printf(s, " %pC", clk->shared_mstop_clks[i]->hw.clk);
1489 
1490 		seq_puts(s, "\n");
1491 	}
1492 
1493 	return 0;
1494 }
1495 DEFINE_SHOW_ATTRIBUTE(rzg2l_mod_clock_mstop);
1496 
rzg2l_mod_clock_endisable_helper(struct clk_hw * hw,bool enable,bool set_mstop_state)1497 static int rzg2l_mod_clock_endisable_helper(struct clk_hw *hw, bool enable,
1498 					    bool set_mstop_state)
1499 {
1500 	struct mod_clock *clock = to_mod_clock(hw);
1501 	struct rzg2l_cpg_priv *priv = clock->priv;
1502 	unsigned int reg = clock->off;
1503 	struct device *dev = priv->dev;
1504 	u32 bitmask = BIT(clock->bit);
1505 	u32 value;
1506 	int error;
1507 
1508 	if (!clock->off) {
1509 		dev_dbg(dev, "%pC does not support ON/OFF\n",  hw->clk);
1510 		return 0;
1511 	}
1512 
1513 	dev_dbg(dev, "CLK_ON 0x%x/%pC %s\n", CLK_ON_R(reg), hw->clk,
1514 		str_on_off(enable));
1515 
1516 	value = bitmask << 16;
1517 	if (enable)
1518 		value |= bitmask;
1519 
1520 	scoped_guard(spinlock_irqsave, &priv->rmw_lock) {
1521 		if (enable) {
1522 			writel(value, priv->base + CLK_ON_R(reg));
1523 			if (set_mstop_state)
1524 				rzg2l_mod_clock_module_set_state(clock, false);
1525 		} else {
1526 			if (set_mstop_state)
1527 				rzg2l_mod_clock_module_set_state(clock, true);
1528 			writel(value, priv->base + CLK_ON_R(reg));
1529 		}
1530 	}
1531 
1532 	if (!enable)
1533 		return 0;
1534 
1535 	if (!priv->info->has_clk_mon_regs)
1536 		return 0;
1537 
1538 	error = readl_poll_timeout_atomic(priv->base + CLK_MON_R(reg), value,
1539 					  value & bitmask, 0, 10);
1540 	if (error)
1541 		dev_err(dev, "Failed to enable CLK_ON 0x%x/%pC\n",
1542 			CLK_ON_R(reg), hw->clk);
1543 
1544 	return error;
1545 }
1546 
rzg2l_mod_clock_endisable(struct clk_hw * hw,bool enable)1547 static int rzg2l_mod_clock_endisable(struct clk_hw *hw, bool enable)
1548 {
1549 	return rzg2l_mod_clock_endisable_helper(hw, enable, true);
1550 }
1551 
rzg2l_mod_clock_enable(struct clk_hw * hw)1552 static int rzg2l_mod_clock_enable(struct clk_hw *hw)
1553 {
1554 	struct mod_clock *clock = to_mod_clock(hw);
1555 
1556 	if (clock->sibling) {
1557 		struct rzg2l_cpg_priv *priv = clock->priv;
1558 		unsigned long flags;
1559 		bool enabled;
1560 
1561 		spin_lock_irqsave(&priv->rmw_lock, flags);
1562 		enabled = clock->sibling->enabled;
1563 		clock->enabled = true;
1564 		spin_unlock_irqrestore(&priv->rmw_lock, flags);
1565 		if (enabled)
1566 			return 0;
1567 	}
1568 
1569 	return rzg2l_mod_clock_endisable(hw, true);
1570 }
1571 
rzg2l_mod_clock_disable(struct clk_hw * hw)1572 static void rzg2l_mod_clock_disable(struct clk_hw *hw)
1573 {
1574 	struct mod_clock *clock = to_mod_clock(hw);
1575 
1576 	if (clock->sibling) {
1577 		struct rzg2l_cpg_priv *priv = clock->priv;
1578 		unsigned long flags;
1579 		bool enabled;
1580 
1581 		spin_lock_irqsave(&priv->rmw_lock, flags);
1582 		enabled = clock->sibling->enabled;
1583 		clock->enabled = false;
1584 		spin_unlock_irqrestore(&priv->rmw_lock, flags);
1585 		if (enabled)
1586 			return;
1587 	}
1588 
1589 	rzg2l_mod_clock_endisable(hw, false);
1590 }
1591 
rzg2l_mod_clock_is_enabled(struct clk_hw * hw)1592 static int rzg2l_mod_clock_is_enabled(struct clk_hw *hw)
1593 {
1594 	struct mod_clock *clock = to_mod_clock(hw);
1595 	struct rzg2l_cpg_priv *priv = clock->priv;
1596 	u32 bitmask = BIT(clock->bit);
1597 	u32 value;
1598 
1599 	if (!clock->off) {
1600 		dev_dbg(priv->dev, "%pC does not support ON/OFF\n",  hw->clk);
1601 		return 1;
1602 	}
1603 
1604 	if (clock->sibling)
1605 		return clock->enabled;
1606 
1607 	if (priv->info->has_clk_mon_regs)
1608 		value = readl(priv->base + CLK_MON_R(clock->off));
1609 	else
1610 		value = readl(priv->base + clock->off);
1611 
1612 	return value & bitmask;
1613 }
1614 
1615 static const struct clk_ops rzg2l_mod_clock_ops = {
1616 	.enable = rzg2l_mod_clock_enable,
1617 	.disable = rzg2l_mod_clock_disable,
1618 	.is_enabled = rzg2l_mod_clock_is_enabled,
1619 };
1620 
1621 static struct mod_clock
rzg2l_mod_clock_get_sibling(struct mod_clock * clock,struct rzg2l_cpg_priv * priv)1622 *rzg2l_mod_clock_get_sibling(struct mod_clock *clock,
1623 			     struct rzg2l_cpg_priv *priv)
1624 {
1625 	struct mod_clock *clk;
1626 	struct clk_hw *hw;
1627 
1628 	for_each_mod_clock(clk, hw, priv) {
1629 		if (clock->off == clk->off && clock->bit == clk->bit)
1630 			return clk;
1631 	}
1632 
1633 	return NULL;
1634 }
1635 
rzg2l_mod_clock_get_mstop(struct rzg2l_cpg_priv * priv,u32 conf)1636 static struct mstop *rzg2l_mod_clock_get_mstop(struct rzg2l_cpg_priv *priv, u32 conf)
1637 {
1638 	struct mod_clock *clk;
1639 	struct clk_hw *hw;
1640 
1641 	for_each_mod_clock(clk, hw, priv) {
1642 		if (!clk->mstop)
1643 			continue;
1644 
1645 		if (clk->mstop->conf == conf)
1646 			return clk->mstop;
1647 	}
1648 
1649 	return NULL;
1650 }
1651 
rzg2l_mod_clock_init_mstop_helper(struct rzg2l_cpg_priv * priv,struct mod_clock * clk)1652 static void rzg2l_mod_clock_init_mstop_helper(struct rzg2l_cpg_priv *priv,
1653 					      struct mod_clock *clk)
1654 {
1655 	/*
1656 	 * Out of reset all modules are enabled. Set module state in case
1657 	 * associated clocks are disabled at probe/resume. Otherwise module
1658 	 * is in invalid HW state.
1659 	 */
1660 	scoped_guard(spinlock_irqsave, &priv->rmw_lock) {
1661 		if (!rzg2l_mod_clock_is_enabled(&clk->hw))
1662 			rzg2l_mod_clock_module_set_state(clk, true);
1663 	}
1664 }
1665 
rzg2l_mod_enable_crit_clock_init_mstop(struct rzg2l_cpg_priv * priv)1666 static void rzg2l_mod_enable_crit_clock_init_mstop(struct rzg2l_cpg_priv *priv)
1667 {
1668 	struct mod_clock *clk;
1669 	struct clk_hw *hw;
1670 
1671 	for_each_mod_clock(clk, hw, priv) {
1672 		if ((clk_hw_get_flags(&clk->hw) & CLK_IS_CRITICAL) &&
1673 		    (!rzg2l_mod_clock_is_enabled(&clk->hw)))
1674 			rzg2l_mod_clock_endisable_helper(&clk->hw, true, false);
1675 
1676 		if (clk->mstop)
1677 			rzg2l_mod_clock_init_mstop_helper(priv, clk);
1678 	}
1679 }
1680 
rzg2l_mod_clock_init_mstop(struct rzg2l_cpg_priv * priv)1681 static void rzg2l_mod_clock_init_mstop(struct rzg2l_cpg_priv *priv)
1682 {
1683 	struct mod_clock *clk;
1684 	struct clk_hw *hw;
1685 
1686 	for_each_mod_clock(clk, hw, priv) {
1687 		if (!clk->mstop)
1688 			continue;
1689 
1690 		rzg2l_mod_clock_init_mstop_helper(priv, clk);
1691 	}
1692 }
1693 
rzg2l_mod_clock_update_shared_mstop_clks(struct rzg2l_cpg_priv * priv,struct mod_clock * clock)1694 static int rzg2l_mod_clock_update_shared_mstop_clks(struct rzg2l_cpg_priv *priv,
1695 						    struct mod_clock *clock)
1696 {
1697 	struct mod_clock *clk;
1698 	struct clk_hw *hw;
1699 
1700 	if (!clock->mstop)
1701 		return 0;
1702 
1703 	for_each_mod_clock(clk, hw, priv) {
1704 		int num_shared_mstop_clks, incr = 1;
1705 		struct mod_clock **new_clks;
1706 
1707 		if (clk->mstop != clock->mstop)
1708 			continue;
1709 
1710 		num_shared_mstop_clks = clk->num_shared_mstop_clks;
1711 		if (!num_shared_mstop_clks)
1712 			incr++;
1713 
1714 		new_clks = devm_krealloc(priv->dev, clk->shared_mstop_clks,
1715 					 (num_shared_mstop_clks + incr) * sizeof(*new_clks),
1716 					 GFP_KERNEL);
1717 		if (!new_clks)
1718 			return -ENOMEM;
1719 
1720 		if (!num_shared_mstop_clks)
1721 			new_clks[num_shared_mstop_clks++] = clk;
1722 		new_clks[num_shared_mstop_clks++] = clock;
1723 
1724 		for (unsigned int i = 0; i < num_shared_mstop_clks; i++) {
1725 			new_clks[i]->shared_mstop_clks = new_clks;
1726 			new_clks[i]->num_shared_mstop_clks = num_shared_mstop_clks;
1727 		}
1728 		break;
1729 	}
1730 
1731 	return 0;
1732 }
1733 
1734 static void __init
rzg2l_cpg_register_mod_clk(const struct rzg2l_mod_clk * mod,const struct rzg2l_cpg_info * info,struct rzg2l_cpg_priv * priv)1735 rzg2l_cpg_register_mod_clk(const struct rzg2l_mod_clk *mod,
1736 			   const struct rzg2l_cpg_info *info,
1737 			   struct rzg2l_cpg_priv *priv)
1738 {
1739 	struct mod_clock *clock = NULL;
1740 	struct device *dev = priv->dev;
1741 	unsigned int id = mod->id;
1742 	struct clk_init_data init;
1743 	struct clk *parent, *clk;
1744 	const char *parent_name;
1745 	unsigned int i;
1746 	int ret;
1747 
1748 	WARN_DEBUG(id < priv->num_core_clks);
1749 	WARN_DEBUG(id >= priv->num_core_clks + priv->num_mod_clks);
1750 	WARN_DEBUG(mod->parent >= priv->num_core_clks + priv->num_mod_clks);
1751 	WARN_DEBUG(PTR_ERR(priv->clks[id]) != -ENOENT);
1752 
1753 	parent = priv->clks[mod->parent];
1754 	if (IS_ERR(parent)) {
1755 		clk = parent;
1756 		goto fail;
1757 	}
1758 
1759 	clock = devm_kzalloc(dev, sizeof(*clock), GFP_KERNEL);
1760 	if (!clock) {
1761 		clk = ERR_PTR(-ENOMEM);
1762 		goto fail;
1763 	}
1764 
1765 	init.name = mod->name;
1766 	init.ops = &rzg2l_mod_clock_ops;
1767 	init.flags = CLK_SET_RATE_PARENT;
1768 	for (i = 0; i < info->num_crit_mod_clks; i++)
1769 		if (id == info->crit_mod_clks[i]) {
1770 			dev_dbg(dev, "CPG %s setting CLK_IS_CRITICAL\n",
1771 				mod->name);
1772 			init.flags |= CLK_IS_CRITICAL;
1773 			break;
1774 		}
1775 
1776 	parent_name = __clk_get_name(parent);
1777 	init.parent_names = &parent_name;
1778 	init.num_parents = 1;
1779 
1780 	clock->off = mod->off;
1781 	clock->bit = mod->bit;
1782 	clock->priv = priv;
1783 	clock->hw.init = &init;
1784 
1785 	if (mod->mstop_conf) {
1786 		struct mstop *mstop = rzg2l_mod_clock_get_mstop(priv, mod->mstop_conf);
1787 
1788 		if (!mstop) {
1789 			mstop = devm_kzalloc(dev, sizeof(*mstop), GFP_KERNEL);
1790 			if (!mstop) {
1791 				clk = ERR_PTR(-ENOMEM);
1792 				goto fail;
1793 			}
1794 			mstop->conf = mod->mstop_conf;
1795 			atomic_set(&mstop->usecnt, 0);
1796 		}
1797 		clock->mstop = mstop;
1798 	}
1799 
1800 	ret = devm_clk_hw_register(dev, &clock->hw);
1801 	if (ret) {
1802 		clk = ERR_PTR(ret);
1803 		goto fail;
1804 	}
1805 
1806 	if (mod->is_coupled) {
1807 		struct mod_clock *sibling;
1808 
1809 		clock->enabled = rzg2l_mod_clock_is_enabled(&clock->hw);
1810 		sibling = rzg2l_mod_clock_get_sibling(clock, priv);
1811 		if (sibling) {
1812 			clock->sibling = sibling;
1813 			sibling->sibling = clock;
1814 		}
1815 	}
1816 
1817 	/* Keep this before priv->clks[id] is updated. */
1818 	ret = rzg2l_mod_clock_update_shared_mstop_clks(priv, clock);
1819 	if (ret) {
1820 		clk = ERR_PTR(ret);
1821 		goto fail;
1822 	}
1823 
1824 	clk = clock->hw.clk;
1825 	dev_dbg(dev, "Module clock %pC at %lu Hz\n", clk, clk_get_rate(clk));
1826 	priv->clks[id] = clk;
1827 
1828 	return;
1829 
1830 fail:
1831 	dev_err(dev, "Failed to register %s clock %s: %ld\n", "module",
1832 		mod->name, PTR_ERR(clk));
1833 }
1834 
1835 #define rcdev_to_priv(x)	container_of(x, struct rzg2l_cpg_priv, rcdev)
1836 
__rzg2l_cpg_assert(struct reset_controller_dev * rcdev,unsigned long id,bool assert)1837 static int __rzg2l_cpg_assert(struct reset_controller_dev *rcdev,
1838 			      unsigned long id, bool assert)
1839 {
1840 	struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
1841 	const struct rzg2l_cpg_info *info = priv->info;
1842 	unsigned int reg = info->resets[id].off;
1843 	u32 mask = BIT(info->resets[id].bit);
1844 	s8 monbit = info->resets[id].monbit;
1845 	u32 value = mask << 16;
1846 	u32 mon;
1847 	int ret;
1848 
1849 	dev_dbg(rcdev->dev, "%s id:%ld offset:0x%x\n",
1850 		assert ? "assert" : "deassert", id, CLK_RST_R(reg));
1851 
1852 	if (assert) {
1853 		for (unsigned int i = 0; i < priv->info->num_crit_resets; i++) {
1854 			if (id == priv->info->crit_resets[i])
1855 				return 0;
1856 		}
1857 	}
1858 
1859 	if (!assert)
1860 		value |= mask;
1861 	writel(value, priv->base + CLK_RST_R(reg));
1862 
1863 	if (info->has_clk_mon_regs) {
1864 		reg = CLK_MRST_R(reg);
1865 	} else if (monbit >= 0) {
1866 		reg = CPG_RST_MON;
1867 		mask = BIT(monbit);
1868 	} else {
1869 		/* Wait for at least one cycle of the RCLK clock (@ ca. 32 kHz) */
1870 		udelay(35);
1871 		return 0;
1872 	}
1873 
1874 	ret = readl_poll_timeout_atomic(priv->base + reg, mon,
1875 					assert == !!(mon & mask), 10, 200);
1876 	if (ret) {
1877 		value ^= mask;
1878 		writel(value, priv->base + CLK_RST_R(info->resets[id].off));
1879 	}
1880 
1881 	return ret;
1882 }
1883 
rzg2l_cpg_assert(struct reset_controller_dev * rcdev,unsigned long id)1884 static int rzg2l_cpg_assert(struct reset_controller_dev *rcdev,
1885 			    unsigned long id)
1886 {
1887 	return __rzg2l_cpg_assert(rcdev, id, true);
1888 }
1889 
rzg2l_cpg_deassert(struct reset_controller_dev * rcdev,unsigned long id)1890 static int rzg2l_cpg_deassert(struct reset_controller_dev *rcdev,
1891 			      unsigned long id)
1892 {
1893 	return __rzg2l_cpg_assert(rcdev, id, false);
1894 }
1895 
rzg2l_cpg_deassert_crit_resets(struct reset_controller_dev * rcdev,const struct rzg2l_cpg_info * info)1896 static int rzg2l_cpg_deassert_crit_resets(struct reset_controller_dev *rcdev,
1897 					  const struct rzg2l_cpg_info *info)
1898 {
1899 	int ret;
1900 
1901 	for (unsigned int i = 0; i < info->num_crit_resets; i++) {
1902 		ret = rzg2l_cpg_deassert(rcdev, info->crit_resets[i]);
1903 		if (ret)
1904 			return ret;
1905 	}
1906 
1907 	return 0;
1908 }
1909 
rzg2l_cpg_reset(struct reset_controller_dev * rcdev,unsigned long id)1910 static int rzg2l_cpg_reset(struct reset_controller_dev *rcdev,
1911 			   unsigned long id)
1912 {
1913 	int ret;
1914 
1915 	ret = rzg2l_cpg_assert(rcdev, id);
1916 	if (ret)
1917 		return ret;
1918 
1919 	return rzg2l_cpg_deassert(rcdev, id);
1920 }
1921 
rzg2l_cpg_status(struct reset_controller_dev * rcdev,unsigned long id)1922 static int rzg2l_cpg_status(struct reset_controller_dev *rcdev,
1923 			    unsigned long id)
1924 {
1925 	struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
1926 	const struct rzg2l_cpg_info *info = priv->info;
1927 	s8 monbit = info->resets[id].monbit;
1928 	unsigned int reg;
1929 	u32 bitmask;
1930 
1931 	if (info->has_clk_mon_regs) {
1932 		reg = CLK_MRST_R(info->resets[id].off);
1933 		bitmask = BIT(info->resets[id].bit);
1934 	} else if (monbit >= 0) {
1935 		reg = CPG_RST_MON;
1936 		bitmask = BIT(monbit);
1937 	} else {
1938 		return -ENOTSUPP;
1939 	}
1940 
1941 	return !!(readl(priv->base + reg) & bitmask);
1942 }
1943 
1944 static const struct reset_control_ops rzg2l_cpg_reset_ops = {
1945 	.reset = rzg2l_cpg_reset,
1946 	.assert = rzg2l_cpg_assert,
1947 	.deassert = rzg2l_cpg_deassert,
1948 	.status = rzg2l_cpg_status,
1949 };
1950 
rzg2l_cpg_reset_xlate(struct reset_controller_dev * rcdev,const struct of_phandle_args * reset_spec)1951 static int rzg2l_cpg_reset_xlate(struct reset_controller_dev *rcdev,
1952 				 const struct of_phandle_args *reset_spec)
1953 {
1954 	struct rzg2l_cpg_priv *priv = rcdev_to_priv(rcdev);
1955 	const struct rzg2l_cpg_info *info = priv->info;
1956 	unsigned int id = reset_spec->args[0];
1957 
1958 	if (id >= rcdev->nr_resets || !info->resets[id].off) {
1959 		dev_err(rcdev->dev, "Invalid reset index %u\n", id);
1960 		return -EINVAL;
1961 	}
1962 
1963 	return id;
1964 }
1965 
rzg2l_cpg_reset_controller_register(struct rzg2l_cpg_priv * priv)1966 static int rzg2l_cpg_reset_controller_register(struct rzg2l_cpg_priv *priv)
1967 {
1968 	priv->rcdev.ops = &rzg2l_cpg_reset_ops;
1969 	priv->rcdev.of_node = priv->dev->of_node;
1970 	priv->rcdev.dev = priv->dev;
1971 	priv->rcdev.of_reset_n_cells = 1;
1972 	priv->rcdev.of_xlate = rzg2l_cpg_reset_xlate;
1973 	priv->rcdev.nr_resets = priv->num_resets;
1974 
1975 	return devm_reset_controller_register(priv->dev, &priv->rcdev);
1976 }
1977 
rzg2l_cpg_is_pm_clk(struct rzg2l_cpg_priv * priv,const struct of_phandle_args * clkspec)1978 static bool rzg2l_cpg_is_pm_clk(struct rzg2l_cpg_priv *priv,
1979 				const struct of_phandle_args *clkspec)
1980 {
1981 	if (clkspec->np != priv->genpd.dev.of_node || clkspec->args_count != 2)
1982 		return false;
1983 
1984 	switch (clkspec->args[0]) {
1985 	case CPG_MOD: {
1986 		const struct rzg2l_cpg_info *info = priv->info;
1987 		unsigned int id = clkspec->args[1];
1988 
1989 		if (id >= priv->num_mod_clks)
1990 			return false;
1991 
1992 		id += info->num_total_core_clks;
1993 
1994 		for (unsigned int i = 0; i < info->num_no_pm_mod_clks; i++) {
1995 			if (info->no_pm_mod_clks[i] == id)
1996 				return false;
1997 		}
1998 
1999 		return true;
2000 	}
2001 
2002 	case CPG_CORE:
2003 	default:
2004 		return false;
2005 	}
2006 }
2007 
rzg2l_cpg_attach_dev(struct generic_pm_domain * domain,struct device * dev)2008 static int rzg2l_cpg_attach_dev(struct generic_pm_domain *domain, struct device *dev)
2009 {
2010 	struct rzg2l_cpg_priv *priv = container_of(domain, struct rzg2l_cpg_priv, genpd);
2011 	struct device_node *np = dev->of_node;
2012 	struct of_phandle_args clkspec;
2013 	bool once = true;
2014 	struct clk *clk;
2015 	unsigned int i;
2016 	int error;
2017 
2018 	for (i = 0; !of_parse_phandle_with_args(np, "clocks", "#clock-cells", i, &clkspec); i++) {
2019 		if (!rzg2l_cpg_is_pm_clk(priv, &clkspec)) {
2020 			of_node_put(clkspec.np);
2021 			continue;
2022 		}
2023 
2024 		if (once) {
2025 			once = false;
2026 			error = pm_clk_create(dev);
2027 			if (error) {
2028 				of_node_put(clkspec.np);
2029 				goto err;
2030 			}
2031 		}
2032 		clk = of_clk_get_from_provider(&clkspec);
2033 		of_node_put(clkspec.np);
2034 		if (IS_ERR(clk)) {
2035 			error = PTR_ERR(clk);
2036 			goto fail_destroy;
2037 		}
2038 
2039 		error = pm_clk_add_clk(dev, clk);
2040 		if (error) {
2041 			dev_err(dev, "pm_clk_add_clk failed %d\n", error);
2042 			goto fail_put;
2043 		}
2044 	}
2045 
2046 	return 0;
2047 
2048 fail_put:
2049 	clk_put(clk);
2050 
2051 fail_destroy:
2052 	pm_clk_destroy(dev);
2053 err:
2054 	return error;
2055 }
2056 
rzg2l_cpg_detach_dev(struct generic_pm_domain * unused,struct device * dev)2057 static void rzg2l_cpg_detach_dev(struct generic_pm_domain *unused, struct device *dev)
2058 {
2059 	if (!pm_clk_no_clocks(dev))
2060 		pm_clk_destroy(dev);
2061 }
2062 
rzg2l_cpg_genpd_remove(void * data)2063 static void rzg2l_cpg_genpd_remove(void *data)
2064 {
2065 	pm_genpd_remove(data);
2066 }
2067 
rzg2l_cpg_add_clk_domain(struct rzg2l_cpg_priv * priv)2068 static int __init rzg2l_cpg_add_clk_domain(struct rzg2l_cpg_priv *priv)
2069 {
2070 	struct device *dev = priv->dev;
2071 	struct device_node *np = dev->of_node;
2072 	struct generic_pm_domain *genpd = &priv->genpd;
2073 	int ret;
2074 
2075 	genpd->name = np->name;
2076 	genpd->flags = GENPD_FLAG_PM_CLK | GENPD_FLAG_ALWAYS_ON |
2077 		       GENPD_FLAG_ACTIVE_WAKEUP;
2078 	genpd->attach_dev = rzg2l_cpg_attach_dev;
2079 	genpd->detach_dev = rzg2l_cpg_detach_dev;
2080 	ret = pm_genpd_init(genpd, &pm_domain_always_on_gov, false);
2081 	if (ret)
2082 		return ret;
2083 
2084 	ret = devm_add_action_or_reset(dev, rzg2l_cpg_genpd_remove, genpd);
2085 	if (ret)
2086 		return ret;
2087 
2088 	return of_genpd_add_provider_simple(np, genpd);
2089 }
2090 
rzg2l_cpg_probe(struct platform_device * pdev)2091 static int __init rzg2l_cpg_probe(struct platform_device *pdev)
2092 {
2093 	struct device *dev = &pdev->dev;
2094 	struct device_node *np = dev->of_node;
2095 	const struct rzg2l_cpg_info *info;
2096 	struct rzg2l_cpg_priv *priv;
2097 	unsigned int nclks, i;
2098 	struct clk **clks;
2099 	int error;
2100 
2101 	info = of_device_get_match_data(dev);
2102 
2103 	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
2104 	if (!priv)
2105 		return -ENOMEM;
2106 
2107 	priv->dev = dev;
2108 	priv->info = info;
2109 	spin_lock_init(&priv->rmw_lock);
2110 
2111 	priv->base = devm_platform_ioremap_resource(pdev, 0);
2112 	if (IS_ERR(priv->base))
2113 		return PTR_ERR(priv->base);
2114 
2115 	nclks = info->num_total_core_clks + info->num_hw_mod_clks;
2116 	clks = devm_kmalloc_array(dev, nclks, sizeof(*clks), GFP_KERNEL);
2117 	if (!clks)
2118 		return -ENOMEM;
2119 
2120 	dev_set_drvdata(dev, priv);
2121 	priv->clks = clks;
2122 	priv->num_core_clks = info->num_total_core_clks;
2123 	priv->num_mod_clks = info->num_hw_mod_clks;
2124 	priv->num_resets = info->num_resets;
2125 	priv->last_dt_core_clk = info->last_dt_core_clk;
2126 
2127 	for (i = 0; i < nclks; i++)
2128 		clks[i] = ERR_PTR(-ENOENT);
2129 
2130 	for (i = 0; i < info->num_core_clks; i++)
2131 		rzg2l_cpg_register_core_clk(&info->core_clks[i], info, priv);
2132 
2133 	for (i = 0; i < info->num_mod_clks; i++)
2134 		rzg2l_cpg_register_mod_clk(&info->mod_clks[i], info, priv);
2135 
2136 	/*
2137 	 * Initialize MSTOP after all the clocks were registered to avoid
2138 	 * invalid reference counting when multiple clocks (critical,
2139 	 * non-critical) share the same MSTOP.
2140 	 */
2141 	rzg2l_mod_clock_init_mstop(priv);
2142 
2143 	error = of_clk_add_provider(np, rzg2l_cpg_clk_src_twocell_get, priv);
2144 	if (error)
2145 		return error;
2146 
2147 	error = devm_add_action_or_reset(dev, rzg2l_cpg_del_clk_provider, np);
2148 	if (error)
2149 		return error;
2150 
2151 	error = rzg2l_cpg_add_clk_domain(priv);
2152 	if (error)
2153 		return error;
2154 
2155 	error = rzg2l_cpg_reset_controller_register(priv);
2156 	if (error)
2157 		return error;
2158 
2159 	error = rzg2l_cpg_deassert_crit_resets(&priv->rcdev, info);
2160 	if (error)
2161 		return error;
2162 
2163 	debugfs_create_file("mstop", 0444, NULL, priv, &rzg2l_mod_clock_mstop_fops);
2164 	return 0;
2165 }
2166 
rzg2l_cpg_resume(struct device * dev)2167 static int rzg2l_cpg_resume(struct device *dev)
2168 {
2169 	struct rzg2l_cpg_priv *priv = dev_get_drvdata(dev);
2170 	int ret;
2171 
2172 	ret = rzg2l_cpg_deassert_crit_resets(&priv->rcdev, priv->info);
2173 	if (ret)
2174 		return ret;
2175 
2176 	rzg2l_mod_enable_crit_clock_init_mstop(priv);
2177 
2178 	return 0;
2179 }
2180 
2181 static const struct dev_pm_ops rzg2l_cpg_pm_ops = {
2182 	NOIRQ_SYSTEM_SLEEP_PM_OPS(NULL, rzg2l_cpg_resume)
2183 };
2184 
2185 static const struct of_device_id rzg2l_cpg_match[] = {
2186 #ifdef CONFIG_CLK_R9A07G043
2187 	{
2188 		.compatible = "renesas,r9a07g043-cpg",
2189 		.data = &r9a07g043_cpg_info,
2190 	},
2191 #endif
2192 #ifdef CONFIG_CLK_R9A07G044
2193 	{
2194 		.compatible = "renesas,r9a07g044-cpg",
2195 		.data = &r9a07g044_cpg_info,
2196 	},
2197 #endif
2198 #ifdef CONFIG_CLK_R9A07G054
2199 	{
2200 		.compatible = "renesas,r9a07g054-cpg",
2201 		.data = &r9a07g054_cpg_info,
2202 	},
2203 #endif
2204 #ifdef CONFIG_CLK_R9A08G045
2205 	{
2206 		.compatible = "renesas,r9a08g045-cpg",
2207 		.data = &r9a08g045_cpg_info,
2208 	},
2209 #endif
2210 #ifdef CONFIG_CLK_R9A08G046
2211 	{
2212 		.compatible = "renesas,r9a08g046-cpg",
2213 		.data = &r9a08g046_cpg_info,
2214 	},
2215 #endif
2216 #ifdef CONFIG_CLK_R9A09G011
2217 	{
2218 		.compatible = "renesas,r9a09g011-cpg",
2219 		.data = &r9a09g011_cpg_info,
2220 	},
2221 #endif
2222 	{ /* sentinel */ }
2223 };
2224 
2225 static struct platform_driver rzg2l_cpg_driver = {
2226 	.driver		= {
2227 		.name	= "rzg2l-cpg",
2228 		.of_match_table = rzg2l_cpg_match,
2229 		.pm	= pm_sleep_ptr(&rzg2l_cpg_pm_ops),
2230 	},
2231 };
2232 
rzg2l_cpg_init(void)2233 static int __init rzg2l_cpg_init(void)
2234 {
2235 	return platform_driver_probe(&rzg2l_cpg_driver, rzg2l_cpg_probe);
2236 }
2237 
2238 subsys_initcall(rzg2l_cpg_init);
2239 
2240 MODULE_DESCRIPTION("Renesas RZ/G2L CPG Driver");
2241