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