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, ¶ms, 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, ¶ms, 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