blob: 7fce1f70d13805fff452b60ce6ec16e4439e28d0 [file] [log] [blame]
Paul Barker132d7ea2023-10-16 10:25:29 +01001// SPDX-License-Identifier: GPL-2.0
2/*
3 * RZ/G2L Clock Pulse Generator
4 *
5 * Copyright (C) 2021-2023 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
Paul Barker132d7ea2023-10-16 10:25:29 +010014#include <asm/io.h>
15#include <clk-uclass.h>
16#include <dm.h>
17#include <dm/device-internal.h>
18#include <dm/device_compat.h>
19#include <dm/devres.h>
20#include <dm/lists.h>
21#include <dt-bindings/clock/renesas-cpg-mssr.h>
22#include <linux/clk-provider.h>
23#include <linux/iopoll.h>
24#include <reset-uclass.h>
25#include <reset.h>
Paul Barker2fcb4962024-02-27 20:40:28 +000026#include <wait_bit.h>
Paul Barker132d7ea2023-10-16 10:25:29 +010027
28#include "rzg2l-cpg.h"
29
Paul Barker2fcb4962024-02-27 20:40:28 +000030/*
31 * Monitor registers for both clock and reset signals are offset by 0x180 from
32 * the corresponding control registers.
33 */
Paul Barker132d7ea2023-10-16 10:25:29 +010034#define CLK_MON_R(reg) (0x180 + (reg))
Paul Barker2fcb4962024-02-27 20:40:28 +000035#define RST_MON_R(reg) (0x180 + (reg))
36
37#define CPG_TIMEOUT_MSEC 100
Paul Barker132d7ea2023-10-16 10:25:29 +010038
39static ulong rzg2l_cpg_clk_get_rate_by_id(struct udevice *dev, unsigned int id);
40static ulong rzg2l_cpg_clk_get_rate_by_name(struct udevice *dev, const char *name);
41
42struct rzg2l_cpg_data {
43 void __iomem *base;
44 struct rzg2l_cpg_info *info;
45};
46
47/*
48 * The top 16 bits of the clock ID are used to identify if it is a core clock or
49 * a module clock.
50 */
51#define CPG_CLK_TYPE_SHIFT 16
52#define CPG_CLK_ID_MASK 0xffff
53#define CPG_CLK_ID(x) ((x) & CPG_CLK_ID_MASK)
54#define CPG_CLK_PACK(type, id) (((type) << CPG_CLK_TYPE_SHIFT) | CPG_CLK_ID(id))
55
56static inline bool is_mod_clk(unsigned int id)
57{
58 return (id >> CPG_CLK_TYPE_SHIFT) == CPG_MOD;
59}
60
61static int rzg2l_cpg_clk_set(struct clk *clk, bool enable)
62{
63 struct rzg2l_cpg_data *data =
64 (struct rzg2l_cpg_data *)dev_get_driver_data(clk->dev);
65 const unsigned int cpg_clk_id = CPG_CLK_ID(clk->id);
66 const struct rzg2l_mod_clk *mod_clk = NULL;
67 u32 value;
68 unsigned int i;
69
70 dev_dbg(clk->dev, "%s %s clock %u\n", enable ? "enable" : "disable",
71 is_mod_clk(clk->id) ? "module" : "core", cpg_clk_id);
Paul Barkerba9ab162024-11-19 19:36:26 +000072
Paul Barker1ec39e12025-03-04 19:44:35 +000073 /*
74 * Non-module clocks are always on. Ignore attempts to enable or disable
75 * them.
76 */
77 if (!is_mod_clk(clk->id))
78 return 0;
Paul Barker132d7ea2023-10-16 10:25:29 +010079
80 for (i = 0; i < data->info->num_mod_clks; i++) {
81 if (data->info->mod_clks[i].id == cpg_clk_id) {
82 mod_clk = &data->info->mod_clks[i];
83 break;
84 }
85 }
86
87 if (!mod_clk) {
88 dev_err(clk->dev, "Module clock %u not found\n", cpg_clk_id);
89 return -ENODEV;
90 }
91
92 value = BIT(mod_clk->bit) << 16;
93 if (enable)
94 value |= BIT(mod_clk->bit);
95 writel(value, data->base + mod_clk->off);
96
Paul Barker2fcb4962024-02-27 20:40:28 +000097 if (enable && wait_for_bit_32(data->base + CLK_MON_R(mod_clk->off),
98 BIT(mod_clk->bit), enable,
99 CPG_TIMEOUT_MSEC, false)) {
Paul Barker132d7ea2023-10-16 10:25:29 +0100100 dev_err(clk->dev, "Timeout\n");
101 return -ETIMEDOUT;
102 }
103
104 return 0;
105}
106
107static int rzg2l_cpg_clk_enable(struct clk *clk)
108{
109 return rzg2l_cpg_clk_set(clk, true);
110}
111
112static int rzg2l_cpg_clk_disable(struct clk *clk)
113{
114 return rzg2l_cpg_clk_set(clk, false);
115}
116
117static int rzg2l_cpg_clk_of_xlate(struct clk *clk,
118 struct ofnode_phandle_args *args)
119{
120 struct rzg2l_cpg_data *data =
121 (struct rzg2l_cpg_data *)dev_get_driver_data(clk->dev);
122 u32 cpg_clk_type, cpg_clk_id;
123 bool found = false;
124 unsigned int i;
125
126 if (args->args_count != 2) {
127 dev_dbg(clk->dev, "Invalid args_count: %d\n", args->args_count);
128 return -EINVAL;
129 }
130
131 cpg_clk_type = args->args[0];
132 cpg_clk_id = args->args[1];
133
134 switch (cpg_clk_type) {
135 case CPG_CORE:
136 for (i = 0; i < data->info->num_core_clks; i++) {
137 if (data->info->core_clks[i].id == cpg_clk_id) {
138 found = true;
139 break;
140 }
141 }
142 if (!found) {
143 dev_dbg(clk->dev,
144 "Invalid second argument %u: Must be a valid core clock ID\n",
145 cpg_clk_id);
146 return -EINVAL;
147 }
148 break;
149 case CPG_MOD:
150 for (i = 0; i < data->info->num_mod_clks; i++) {
151 if (data->info->mod_clks[i].id == cpg_clk_id) {
152 found = true;
153 break;
154 }
155 }
156 if (!found) {
157 dev_dbg(clk->dev,
158 "Invalid second argument %u: Must be a valid module clock ID\n",
159 cpg_clk_id);
160 return -EINVAL;
161 }
162 break;
163 default:
164 dev_dbg(clk->dev,
165 "Invalid first argument %u: Must be CPG_CORE or CPG_MOD\n",
166 cpg_clk_type);
167 return -EINVAL;
168 }
169
170 clk->id = CPG_CLK_PACK(cpg_clk_type, cpg_clk_id);
171
172 return 0;
173}
174
175static ulong rzg2l_sdhi_clk_get_rate(struct udevice *dev, const struct cpg_core_clk *cc)
176{
177 struct rzg2l_cpg_data *data =
178 (struct rzg2l_cpg_data *)dev_get_driver_data(dev);
179 const ulong offset = CPG_CONF_OFFSET(cc->conf);
180 const int shift = CPG_CONF_BITPOS(cc->conf);
181 const u32 mask = CPG_CONF_BITMASK(cc->conf);
182 unsigned int sel;
183
184 sel = (readl(data->base + offset) >> shift) & mask;
185
186 if (!sel || sel > cc->num_parents) {
187 dev_err(dev, "Invalid SEL_SDHI%d_SET value %u\n", shift / 4, sel);
188 return -EIO;
189 }
190 return rzg2l_cpg_clk_get_rate_by_name(dev, cc->parent_names[sel - 1]);
191}
192
193static ulong rzg2l_div_clk_get_rate(struct udevice *dev, const struct cpg_core_clk *cc)
194{
195 struct rzg2l_cpg_data *data =
196 (struct rzg2l_cpg_data *)dev_get_driver_data(dev);
197 const ulong offset = CPG_CONF_OFFSET(cc->conf);
198 const int shift = CPG_CONF_BITPOS(cc->conf);
199 const u32 mask = CPG_CONF_BITMASK(cc->conf);
200 unsigned int sel, i;
201
202 sel = (readl(data->base + offset) >> shift) & mask;
203
204 for (i = 0; cc->dtable[i].div; i++) {
205 if (cc->dtable[i].val == sel)
206 return rzg2l_cpg_clk_get_rate_by_id(dev, cc->parent) / cc->dtable[i].div;
207 }
208 dev_err(dev, "Invalid selector value %u for clock %s\n", sel, cc->name);
209 return -EINVAL;
210}
211
212static ulong rzg2l_core_clk_get_rate(struct udevice *dev, const struct cpg_core_clk *cc)
213{
214 switch (cc->type) {
215 case CLK_TYPE_FF:
216 const ulong parent_rate = rzg2l_cpg_clk_get_rate_by_id(dev, cc->parent);
217 return parent_rate * cc->mult / cc->div;
218 case CLK_TYPE_IN:
219 struct clk clk_in;
220 clk_get_by_name(dev, cc->name, &clk_in);
221 return clk_get_rate(&clk_in);
222 case CLK_TYPE_SD_MUX:
223 return rzg2l_sdhi_clk_get_rate(dev, cc);
224 case CLK_TYPE_DIV:
225 return rzg2l_div_clk_get_rate(dev, cc);
226 default:
227 dev_err(dev, "get_rate needed for clock %u, type %d\n", cc->id, cc->type);
228 return -ENOSYS;
229 }
230}
231
232static ulong rzg2l_cpg_clk_get_rate_by_id(struct udevice *dev, unsigned int id)
233{
234 struct rzg2l_cpg_data *data =
235 (struct rzg2l_cpg_data *)dev_get_driver_data(dev);
236 const unsigned int cpg_clk_id = CPG_CLK_ID(id);
237 unsigned int i;
238
239 if (is_mod_clk(id)) {
240 for (i = 0; i < data->info->num_mod_clks; i++) {
241 if (data->info->mod_clks[i].id == cpg_clk_id)
242 return rzg2l_cpg_clk_get_rate_by_id(dev,
243 data->info->mod_clks[i].parent);
244 }
245
246 dev_err(dev, "Module clock ID %u not found\n", cpg_clk_id);
247 return -ENODEV;
248 }
249
250 for (i = 0; i < data->info->num_core_clks; i++) {
251 if (data->info->core_clks[i].id == cpg_clk_id)
252 return rzg2l_core_clk_get_rate(dev, &data->info->core_clks[i]);
253 }
254
255 dev_err(dev, "Core clock ID %u not found\n", cpg_clk_id);
256 return -ENODEV;
257}
258
259static ulong rzg2l_cpg_clk_get_rate_by_name(struct udevice *dev, const char *name)
260{
261 struct rzg2l_cpg_data *data =
262 (struct rzg2l_cpg_data *)dev_get_driver_data(dev);
263 unsigned int i;
264
265 for (i = 0; i < data->info->num_mod_clks; i++) {
266 if (!strcmp(name, data->info->mod_clks[i].name))
267 return rzg2l_cpg_clk_get_rate_by_id(dev, data->info->mod_clks[i].parent);
268 }
269 for (i = 0; i < data->info->num_core_clks; i++) {
270 if (!strcmp(name, data->info->core_clks[i].name))
271 return rzg2l_core_clk_get_rate(dev, &data->info->core_clks[i]);
272 }
273
274 dev_err(dev, "Clock name %s not found\n", name);
275 return -EINVAL;
276}
277
278static ulong rzg2l_cpg_clk_get_rate(struct clk *clk)
279{
280 return rzg2l_cpg_clk_get_rate_by_id(clk->dev, clk->id);
281}
282
283static ulong rzg2l_sdhi_clk_set_rate(struct udevice *dev, const struct cpg_core_clk *cc, ulong rate)
284{
285 struct rzg2l_cpg_data *data =
286 (struct rzg2l_cpg_data *)dev_get_driver_data(dev);
287 const ulong offset = CPG_CONF_OFFSET(cc->conf);
288 const int shift = CPG_CONF_BITPOS(cc->conf);
289 int channel, new_sel, prev_sel;
290 ulong target_rate;
291 unsigned int i;
292 u32 value;
293
294 prev_sel = (readl(data->base + offset) >> shift) & 0x3;
295 channel = shift / 4;
296
297 /*
298 * Round the requested rate down, unless it is below the minimum
299 * supported rate. Assume that the parent clock names are listed in
300 * order of descending rate.
301 */
302 for (i = 0; i < cc->num_parents; i++) {
303 target_rate = rzg2l_cpg_clk_get_rate_by_name(dev, cc->parent_names[i]);
304 if (rate >= target_rate) {
305 new_sel = i + 1;
306 break;
307 }
308 }
309 if (!new_sel)
310 new_sel = cc->num_parents - 1;
311
312 if (new_sel == prev_sel)
313 return target_rate;
314 dev_dbg(dev, "sdhi set_rate rate=%lu target_rate=%lu sel=%d\n",
315 rate, target_rate, new_sel);
316
317 /*
318 * As per the HW manual, we should not directly switch from 533 MHz to
Michal Simekcc046dc2024-04-16 08:55:19 +0200319 * 400 MHz and vice versa. To change the setting from 2'b01 (533 MHz)
320 * to 2'b10 (400 MHz) or vice versa, Switch to 2'b11 (266 MHz) first,
321 * and then switch to the target setting (2'b01 (533 MHz) or 2'b10
Paul Barker132d7ea2023-10-16 10:25:29 +0100322 * (400 MHz)).
323 */
324 if (new_sel != SEL_SDHI_266MHz && prev_sel != SEL_SDHI_266MHz) {
325 u32 waitbit;
326 int ret;
327
328 dev_dbg(dev, "sdhi set_rate via 266MHz\n");
329 value = (SEL_SDHI_WRITE_ENABLE | SEL_SDHI_266MHz) << shift;
330 writel(value, data->base + offset);
331
332 /* Wait for the switch to complete. */
333 waitbit = channel ? CPG_CLKSTATUS_SELSDHI1_STS : CPG_CLKSTATUS_SELSDHI0_STS;
334 ret = readl_poll_timeout(data->base + CPG_CLKSTATUS, value,
335 !(value & waitbit),
336 CPG_SDHI_CLK_SWITCH_STATUS_TIMEOUT_US);
337 if (ret) {
338 dev_err(dev, "Failed to switch SDHI%d clock source\n", channel);
339 return -EIO;
340 }
341 }
342
343 value = (SEL_SDHI_WRITE_ENABLE | new_sel) << shift;
344 writel(value, data->base + offset);
345
346 return target_rate;
347}
348
349static ulong rzg2l_core_clk_set_rate(struct udevice *dev, const struct cpg_core_clk *cc, ulong rate)
350{
351 if (cc->type == CLK_TYPE_SD_MUX)
352 return rzg2l_sdhi_clk_set_rate(dev, cc, rate);
353
354 /*
355 * The sdhi driver calls clk_set_rate for SD0_DIV4 and SD1_DIV4, even
356 * though they're in a fixed relationship with SD0 and SD1 respectively.
357 * To allow the driver to proceed, simply return the current rates
358 * without making any change.
359 */
360 if (cc->id == CLK_SD0_DIV4 || cc->id == CLK_SD1_DIV4)
361 return rzg2l_core_clk_get_rate(dev, cc);
362
363 dev_err(dev, "set_rate needed for clock %u, type %d\n", cc->id, cc->type);
364 return -ENOSYS;
365}
366
367static ulong rzg2l_cpg_clk_set_rate_by_id(struct udevice *dev, unsigned int id, ulong rate)
368{
369 struct rzg2l_cpg_data *data =
370 (struct rzg2l_cpg_data *)dev_get_driver_data(dev);
371 const unsigned int cpg_clk_id = CPG_CLK_ID(id);
372 unsigned int i;
373
374 if (is_mod_clk(id)) {
375 for (i = 0; i < data->info->num_mod_clks; i++) {
376 if (data->info->mod_clks[i].id == cpg_clk_id)
377 return rzg2l_cpg_clk_set_rate_by_id(dev,
378 data->info->mod_clks[i].parent,
379 rate);
380 }
381
382 dev_err(dev, "Module clock ID %u not found\n", cpg_clk_id);
383 return -ENODEV;
384 }
385
386 for (i = 0; i < data->info->num_core_clks; i++) {
387 if (data->info->core_clks[i].id == cpg_clk_id)
388 return rzg2l_core_clk_set_rate(dev, &data->info->core_clks[i], rate);
389 }
390
391 dev_err(dev, "Core clock ID %u not found\n", cpg_clk_id);
392 return -ENODEV;
393}
394
395static ulong rzg2l_cpg_clk_set_rate(struct clk *clk, ulong rate)
396{
397 return rzg2l_cpg_clk_set_rate_by_id(clk->dev, clk->id, rate);
398}
399
400static const struct clk_ops rzg2l_cpg_clk_ops = {
401 .enable = rzg2l_cpg_clk_enable,
402 .disable = rzg2l_cpg_clk_disable,
403 .of_xlate = rzg2l_cpg_clk_of_xlate,
404 .get_rate = rzg2l_cpg_clk_get_rate,
405 .set_rate = rzg2l_cpg_clk_set_rate,
406};
407
408U_BOOT_DRIVER(rzg2l_cpg_clk) = {
409 .name = "rzg2l-cpg-clk",
410 .id = UCLASS_CLK,
411 .ops = &rzg2l_cpg_clk_ops,
412 .flags = DM_FLAG_VITAL,
413};
414
415static int rzg2l_cpg_rst_set(struct reset_ctl *reset_ctl, bool asserted)
416{
417 struct rzg2l_cpg_data *data =
418 (struct rzg2l_cpg_data *)dev_get_driver_data(reset_ctl->dev);
419 const struct rzg2l_reset *rst;
420 u32 value;
421
422 dev_dbg(reset_ctl->dev, "%s %lu\n", asserted ? "assert" : "deassert", reset_ctl->id);
423 if (reset_ctl->id >= data->info->num_resets) {
424 dev_err(reset_ctl->dev, "Invalid reset id %lu\n", reset_ctl->id);
425 return -EINVAL;
426 }
427 rst = &data->info->resets[reset_ctl->id];
428
429 value = BIT(rst->bit) << 16;
430 if (!asserted)
431 value |= BIT(rst->bit);
432 writel(value, data->base + rst->off);
433
Paul Barker2fcb4962024-02-27 20:40:28 +0000434 return wait_for_bit_32(data->base + RST_MON_R(rst->off), BIT(rst->bit),
435 asserted, CPG_TIMEOUT_MSEC, false);
Paul Barker132d7ea2023-10-16 10:25:29 +0100436}
437
438static int rzg2l_cpg_rst_assert(struct reset_ctl *reset_ctl)
439{
440 return rzg2l_cpg_rst_set(reset_ctl, true);
441}
442
443static int rzg2l_cpg_rst_deassert(struct reset_ctl *reset_ctl)
444{
445 return rzg2l_cpg_rst_set(reset_ctl, false);
446}
447
448static int rzg2l_cpg_rst_of_xlate(struct reset_ctl *reset_ctl,
449 struct ofnode_phandle_args *args)
450{
451 struct rzg2l_cpg_data *data =
452 (struct rzg2l_cpg_data *)dev_get_driver_data(reset_ctl->dev);
453
454 if (args->args[0] >= data->info->num_resets)
455 return -EINVAL;
456
457 reset_ctl->id = args->args[0];
458 return 0;
459}
460
461static const struct reset_ops rzg2l_cpg_rst_ops = {
462 .rst_assert = rzg2l_cpg_rst_assert,
463 .rst_deassert = rzg2l_cpg_rst_deassert,
464 .of_xlate = rzg2l_cpg_rst_of_xlate,
465};
466
467U_BOOT_DRIVER(rzg2l_cpg_rst) = {
468 .name = "rzg2l-cpg-rst",
469 .id = UCLASS_RESET,
470 .ops = &rzg2l_cpg_rst_ops,
471 .flags = DM_FLAG_VITAL,
472};
473
474int rzg2l_cpg_bind(struct udevice *parent)
475{
476 struct udevice *cdev, *rdev;
477 struct rzg2l_cpg_data *data;
478 struct driver *drv;
479 int ret;
480
481 data = devm_kmalloc(parent, sizeof(*data), 0);
482 if (!data)
483 return -ENOMEM;
484
485 data->base = dev_read_addr_ptr(parent);
486 if (!data->base)
487 return -EINVAL;
488
489 data->info = (struct rzg2l_cpg_info *)dev_get_driver_data(parent);
490 if (!data->info)
491 return -EINVAL;
492
493 drv = lists_driver_lookup_name("rzg2l-cpg-clk");
494 if (!drv)
495 return -ENOENT;
496
497 ret = device_bind_with_driver_data(parent, drv, parent->name,
498 (ulong)data, dev_ofnode(parent),
499 &cdev);
500 if (ret)
501 return ret;
502
503 drv = lists_driver_lookup_name("rzg2l-cpg-rst");
504 if (!drv) {
505 device_unbind(cdev);
506 return -ENOENT;
507 }
508
509 ret = device_bind_with_driver_data(parent, drv, parent->name,
510 (ulong)data, dev_ofnode(parent),
511 &rdev);
512 if (ret)
513 device_unbind(cdev);
514
515 return ret;
516}