1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2023 Raspberry Pi Ltd.
5 * Clock driver for RP1 PCIe multifunction chip.
8 #include <linux/clk-provider.h>
9 #include <linux/clkdev.h>
10 #include <linux/clk.h>
11 #include <linux/debugfs.h>
12 #include <linux/delay.h>
14 #include <linux/math64.h>
15 #include <linux/module.h>
16 #include <linux/of_device.h>
17 #include <linux/platform_device.h>
18 #include <linux/rp1_platform.h>
19 #include <linux/slab.h>
21 #include <asm/div64.h>
23 #include <dt-bindings/clock/rp1.h>
25 #define PLL_SYS_CS 0x08000
26 #define PLL_SYS_PWR 0x08004
27 #define PLL_SYS_FBDIV_INT 0x08008
28 #define PLL_SYS_FBDIV_FRAC 0x0800c
29 #define PLL_SYS_PRIM 0x08010
30 #define PLL_SYS_SEC 0x08014
32 #define PLL_AUDIO_CS 0x0c000
33 #define PLL_AUDIO_PWR 0x0c004
34 #define PLL_AUDIO_FBDIV_INT 0x0c008
35 #define PLL_AUDIO_FBDIV_FRAC 0x0c00c
36 #define PLL_AUDIO_PRIM 0x0c010
37 #define PLL_AUDIO_SEC 0x0c014
39 #define PLL_VIDEO_CS 0x10000
40 #define PLL_VIDEO_PWR 0x10004
41 #define PLL_VIDEO_FBDIV_INT 0x10008
42 #define PLL_VIDEO_FBDIV_FRAC 0x1000c
43 #define PLL_VIDEO_PRIM 0x10010
44 #define PLL_VIDEO_SEC 0x10014
46 #define CLK_SYS_CTRL 0x00014
47 #define CLK_SYS_DIV_INT 0x00018
48 #define CLK_SYS_SEL 0x00020
50 #define CLK_SLOW_SYS_CTRL 0x00024
51 #define CLK_SLOW_SYS_DIV_INT 0x00028
52 #define CLK_SLOW_SYS_SEL 0x00030
54 #define CLK_DMA_CTRL 0x00044
55 #define CLK_DMA_DIV_INT 0x00048
56 #define CLK_DMA_SEL 0x00050
58 #define CLK_UART_CTRL 0x00054
59 #define CLK_UART_DIV_INT 0x00058
60 #define CLK_UART_SEL 0x00060
62 #define CLK_ETH_CTRL 0x00064
63 #define CLK_ETH_DIV_INT 0x00068
64 #define CLK_ETH_SEL 0x00070
66 #define CLK_PWM0_CTRL 0x00074
67 #define CLK_PWM0_DIV_INT 0x00078
68 #define CLK_PWM0_DIV_FRAC 0x0007c
69 #define CLK_PWM0_SEL 0x00080
71 #define CLK_PWM1_CTRL 0x00084
72 #define CLK_PWM1_DIV_INT 0x00088
73 #define CLK_PWM1_DIV_FRAC 0x0008c
74 #define CLK_PWM1_SEL 0x00090
76 #define CLK_AUDIO_IN_CTRL 0x00094
77 #define CLK_AUDIO_IN_DIV_INT 0x00098
78 #define CLK_AUDIO_IN_SEL 0x000a0
80 #define CLK_AUDIO_OUT_CTRL 0x000a4
81 #define CLK_AUDIO_OUT_DIV_INT 0x000a8
82 #define CLK_AUDIO_OUT_SEL 0x000b0
84 #define CLK_I2S_CTRL 0x000b4
85 #define CLK_I2S_DIV_INT 0x000b8
86 #define CLK_I2S_SEL 0x000c0
88 #define CLK_MIPI0_CFG_CTRL 0x000c4
89 #define CLK_MIPI0_CFG_DIV_INT 0x000c8
90 #define CLK_MIPI0_CFG_SEL 0x000d0
92 #define CLK_MIPI1_CFG_CTRL 0x000d4
93 #define CLK_MIPI1_CFG_DIV_INT 0x000d8
94 #define CLK_MIPI1_CFG_SEL 0x000e0
96 #define CLK_PCIE_AUX_CTRL 0x000e4
97 #define CLK_PCIE_AUX_DIV_INT 0x000e8
98 #define CLK_PCIE_AUX_SEL 0x000f0
100 #define CLK_USBH0_MICROFRAME_CTRL 0x000f4
101 #define CLK_USBH0_MICROFRAME_DIV_INT 0x000f8
102 #define CLK_USBH0_MICROFRAME_SEL 0x00100
104 #define CLK_USBH1_MICROFRAME_CTRL 0x00104
105 #define CLK_USBH1_MICROFRAME_DIV_INT 0x00108
106 #define CLK_USBH1_MICROFRAME_SEL 0x00110
108 #define CLK_USBH0_SUSPEND_CTRL 0x00114
109 #define CLK_USBH0_SUSPEND_DIV_INT 0x00118
110 #define CLK_USBH0_SUSPEND_SEL 0x00120
112 #define CLK_USBH1_SUSPEND_CTRL 0x00124
113 #define CLK_USBH1_SUSPEND_DIV_INT 0x00128
114 #define CLK_USBH1_SUSPEND_SEL 0x00130
116 #define CLK_ETH_TSU_CTRL 0x00134
117 #define CLK_ETH_TSU_DIV_INT 0x00138
118 #define CLK_ETH_TSU_SEL 0x00140
120 #define CLK_ADC_CTRL 0x00144
121 #define CLK_ADC_DIV_INT 0x00148
122 #define CLK_ADC_SEL 0x00150
124 #define CLK_SDIO_TIMER_CTRL 0x00154
125 #define CLK_SDIO_TIMER_DIV_INT 0x00158
126 #define CLK_SDIO_TIMER_SEL 0x00160
128 #define CLK_SDIO_ALT_SRC_CTRL 0x00164
129 #define CLK_SDIO_ALT_SRC_DIV_INT 0x00168
130 #define CLK_SDIO_ALT_SRC_SEL 0x00170
132 #define CLK_GP0_CTRL 0x00174
133 #define CLK_GP0_DIV_INT 0x00178
134 #define CLK_GP0_DIV_FRAC 0x0017c
135 #define CLK_GP0_SEL 0x00180
137 #define CLK_GP1_CTRL 0x00184
138 #define CLK_GP1_DIV_INT 0x00188
139 #define CLK_GP1_DIV_FRAC 0x0018c
140 #define CLK_GP1_SEL 0x00190
142 #define CLK_GP2_CTRL 0x00194
143 #define CLK_GP2_DIV_INT 0x00198
144 #define CLK_GP2_DIV_FRAC 0x0019c
145 #define CLK_GP2_SEL 0x001a0
147 #define CLK_GP3_CTRL 0x001a4
148 #define CLK_GP3_DIV_INT 0x001a8
149 #define CLK_GP3_DIV_FRAC 0x001ac
150 #define CLK_GP3_SEL 0x001b0
152 #define CLK_GP4_CTRL 0x001b4
153 #define CLK_GP4_DIV_INT 0x001b8
154 #define CLK_GP4_DIV_FRAC 0x001bc
155 #define CLK_GP4_SEL 0x001c0
157 #define CLK_GP5_CTRL 0x001c4
158 #define CLK_GP5_DIV_INT 0x001c8
159 #define CLK_GP5_DIV_FRAC 0x001cc
160 #define CLK_GP5_SEL 0x001d0
162 #define CLK_SYS_RESUS_CTRL 0x0020c
164 #define CLK_SLOW_SYS_RESUS_CTRL 0x00214
166 #define FC0_REF_KHZ 0x0021c
167 #define FC0_MIN_KHZ 0x00220
168 #define FC0_MAX_KHZ 0x00224
169 #define FC0_DELAY 0x00228
170 #define FC0_INTERVAL 0x0022c
171 #define FC0_SRC 0x00230
172 #define FC0_STATUS 0x00234
173 #define FC0_RESULT 0x00238
176 #define FC_NUM(idx, off) ((idx) * 32 + (off))
180 #define VIDEO_CLOCKS_OFFSET 0x4000
181 #define VIDEO_CLK_VEC_CTRL (VIDEO_CLOCKS_OFFSET + 0x0000)
182 #define VIDEO_CLK_VEC_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0004)
183 #define VIDEO_CLK_VEC_SEL (VIDEO_CLOCKS_OFFSET + 0x000c)
184 #define VIDEO_CLK_DPI_CTRL (VIDEO_CLOCKS_OFFSET + 0x0010)
185 #define VIDEO_CLK_DPI_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0014)
186 #define VIDEO_CLK_DPI_SEL (VIDEO_CLOCKS_OFFSET + 0x001c)
187 #define VIDEO_CLK_MIPI0_DPI_CTRL (VIDEO_CLOCKS_OFFSET + 0x0020)
188 #define VIDEO_CLK_MIPI0_DPI_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0024)
189 #define VIDEO_CLK_MIPI0_DPI_DIV_FRAC (VIDEO_CLOCKS_OFFSET + 0x0028)
190 #define VIDEO_CLK_MIPI0_DPI_SEL (VIDEO_CLOCKS_OFFSET + 0x002c)
191 #define VIDEO_CLK_MIPI1_DPI_CTRL (VIDEO_CLOCKS_OFFSET + 0x0030)
192 #define VIDEO_CLK_MIPI1_DPI_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0034)
193 #define VIDEO_CLK_MIPI1_DPI_DIV_FRAC (VIDEO_CLOCKS_OFFSET + 0x0038)
194 #define VIDEO_CLK_MIPI1_DPI_SEL (VIDEO_CLOCKS_OFFSET + 0x003c)
196 #define DIV_INT_8BIT_MAX 0x000000ffu /* max divide for most clocks */
197 #define DIV_INT_16BIT_MAX 0x0000ffffu /* max divide for GPx, PWM */
198 #define DIV_INT_24BIT_MAX 0x00ffffffu /* max divide for CLK_SYS */
200 #define FC0_STATUS_DONE BIT(4)
201 #define FC0_STATUS_RUNNING BIT(8)
202 #define FC0_RESULT_FRAC_SHIFT 5
204 #define PLL_PRIM_DIV1_SHIFT 16
205 #define PLL_PRIM_DIV1_MASK 0x00070000
206 #define PLL_PRIM_DIV2_SHIFT 12
207 #define PLL_PRIM_DIV2_MASK 0x00007000
209 #define PLL_SEC_DIV_SHIFT 8
210 #define PLL_SEC_DIV_WIDTH 5
211 #define PLL_SEC_DIV_MASK 0x00001f00
213 #define PLL_CS_LOCK BIT(31)
214 #define PLL_CS_REFDIV_SHIFT 0
216 #define PLL_PWR_PD BIT(0)
217 #define PLL_PWR_DACPD BIT(1)
218 #define PLL_PWR_DSMPD BIT(2)
219 #define PLL_PWR_POSTDIVPD BIT(3)
220 #define PLL_PWR_4PHASEPD BIT(4)
221 #define PLL_PWR_VCOPD BIT(5)
222 #define PLL_PWR_MASK 0x0000003f
224 #define PLL_SEC_RST BIT(16)
225 #define PLL_SEC_IMPL BIT(31)
227 /* PLL phase output for both PRI and SEC */
228 #define PLL_PH_EN BIT(4)
229 #define PLL_PH_PHASE_SHIFT 0
231 #define RP1_PLL_PHASE_0 0
232 #define RP1_PLL_PHASE_90 1
233 #define RP1_PLL_PHASE_180 2
234 #define RP1_PLL_PHASE_270 3
236 /* Clock fields for all clocks */
237 #define CLK_CTRL_ENABLE BIT(11)
238 #define CLK_CTRL_AUXSRC_MASK 0x000003e0
239 #define CLK_CTRL_AUXSRC_SHIFT 5
240 #define CLK_CTRL_SRC_SHIFT 0
241 #define CLK_DIV_FRAC_BITS 16
244 #define MHz (KHz * KHz)
245 #define LOCK_TIMEOUT_NS 100000000
246 #define FC_TIMEOUT_NS 100000000
248 #define MAX_CLK_PARENTS 8
250 #define MEASURE_CLOCK_RATE
251 const char * const fc0_ref_clk_name = "clk_slow_sys";
253 #define ABS_DIFF(a, b) ((a) > (b) ? (a) - (b) : (b) - (a))
254 #define DIV_U64_NEAREST(a, b) div_u64(((a) + ((b) >> 1)), (b))
257 * Names of the reference clock for the pll cores. This name must match
258 * the DT reference clock-output-name.
260 static const char *const ref_clock = "xosc";
263 * Secondary PLL channel output divider table.
264 * Divider values range from 8 to 19.
265 * Invalid values default to 19
267 static const struct clk_div_table pll_sec_div_table[] = {
303 struct rp1_clockman {
306 spinlock_t regs_lock; /* spinlock for all clocks */
309 struct clk_hw_onecell_data onecell;
312 struct rp1_pll_core_data {
322 struct rp1_pll_data {
324 const char *source_pll;
330 struct rp1_pll_ph_data {
332 const char *source_pll;
334 unsigned int fixed_divider;
340 struct rp1_pll_divider_data {
342 const char *source_pll;
348 struct rp1_clock_data {
350 const char *const parents[MAX_CLK_PARENTS];
363 struct rp1_pll_core {
365 struct rp1_clockman *clockman;
366 const struct rp1_pll_core_data *data;
367 unsigned long cached_rate;
372 struct clk_divider div;
373 struct rp1_clockman *clockman;
374 const struct rp1_pll_data *data;
375 unsigned long cached_rate;
380 struct rp1_clockman *clockman;
381 const struct rp1_pll_ph_data *data;
386 struct rp1_clockman *clockman;
387 const struct rp1_clock_data *data;
388 unsigned long cached_rate;
391 static void rp1_debugfs_regset(struct rp1_clockman *clockman, u32 base,
392 const struct debugfs_reg32 *regs,
393 size_t nregs, struct dentry *dentry)
395 struct debugfs_regset32 *regset;
397 regset = devm_kzalloc(clockman->dev, sizeof(*regset), GFP_KERNEL);
402 regset->nregs = nregs;
403 regset->base = clockman->regs + base;
405 debugfs_create_regset32("regdump", 0444, dentry, regset);
408 static inline u32 set_register_field(u32 reg, u32 val, u32 mask, u32 shift)
411 reg |= (val << shift) & mask;
416 void clockman_write(struct rp1_clockman *clockman, u32 reg, u32 val)
418 writel(val, clockman->regs + reg);
421 static inline u32 clockman_read(struct rp1_clockman *clockman, u32 reg)
423 return readl(clockman->regs + reg);
426 #ifdef MEASURE_CLOCK_RATE
427 static unsigned long clockman_measure_clock(struct rp1_clockman *clockman,
428 const char *clk_name,
429 unsigned int fc0_src)
431 struct clk *ref_clk = __clk_lookup(fc0_ref_clk_name);
432 unsigned long result;
434 unsigned int fc_idx, fc_offset, fc_src;
436 fc_idx = fc0_src / 32;
437 fc_src = fc0_src % 32;
439 /* fc_src == 0 is invalid. */
440 if (!fc_src || fc_idx >= FC_COUNT)
443 fc_offset = fc_idx * FC_SIZE;
445 /* Ensure the frequency counter is idle. */
446 timeout = ktime_add_ns(ktime_get(), FC_TIMEOUT_NS);
447 while (clockman_read(clockman, fc_offset + FC0_STATUS) & FC0_STATUS_RUNNING) {
448 if (ktime_after(ktime_get(), timeout)) {
449 dev_err(clockman->dev, "%s: FC0 busy timeout\n",
456 spin_lock(&clockman->regs_lock);
457 clockman_write(clockman, fc_offset + FC0_REF_KHZ,
458 clk_get_rate(ref_clk) / KHz);
459 clockman_write(clockman, fc_offset + FC0_MIN_KHZ, 0);
460 clockman_write(clockman, fc_offset + FC0_MAX_KHZ, 0x1ffffff);
461 clockman_write(clockman, fc_offset + FC0_INTERVAL, 8);
462 clockman_write(clockman, fc_offset + FC0_DELAY, 7);
463 clockman_write(clockman, fc_offset + FC0_SRC, fc_src);
464 spin_unlock(&clockman->regs_lock);
466 /* Ensure the frequency counter is idle. */
467 timeout = ktime_add_ns(ktime_get(), FC_TIMEOUT_NS);
468 while (!(clockman_read(clockman, fc_offset + FC0_STATUS) & FC0_STATUS_DONE)) {
469 if (ktime_after(ktime_get(), timeout)) {
470 dev_err(clockman->dev, "%s: FC0 wait timeout\n",
477 result = clockman_read(clockman, fc_offset + FC0_RESULT);
480 spin_lock(&clockman->regs_lock);
481 clockman_write(clockman, fc_offset + FC0_SRC, 0);
482 spin_unlock(&clockman->regs_lock);
488 static int rp1_pll_core_is_on(struct clk_hw *hw)
490 struct rp1_pll_core *pll_core = container_of(hw, struct rp1_pll_core, hw);
491 struct rp1_clockman *clockman = pll_core->clockman;
492 const struct rp1_pll_core_data *data = pll_core->data;
493 u32 pwr = clockman_read(clockman, data->pwr_reg);
495 return (pwr & PLL_PWR_PD) || (pwr & PLL_PWR_POSTDIVPD);
498 static int rp1_pll_core_on(struct clk_hw *hw)
500 struct rp1_pll_core *pll_core = container_of(hw, struct rp1_pll_core, hw);
501 struct rp1_clockman *clockman = pll_core->clockman;
502 const struct rp1_pll_core_data *data = pll_core->data;
506 spin_lock(&clockman->regs_lock);
508 if (!(clockman_read(clockman, data->cs_reg) & PLL_CS_LOCK)) {
509 /* Reset to a known state. */
510 clockman_write(clockman, data->pwr_reg, PLL_PWR_MASK);
511 clockman_write(clockman, data->fbdiv_int_reg, 20);
512 clockman_write(clockman, data->fbdiv_frac_reg, 0);
513 clockman_write(clockman, data->cs_reg, 1 << PLL_CS_REFDIV_SHIFT);
516 /* Come out of reset. */
517 fbdiv_frac = clockman_read(clockman, data->fbdiv_frac_reg);
518 clockman_write(clockman, data->pwr_reg, fbdiv_frac ? 0 : PLL_PWR_DSMPD);
519 spin_unlock(&clockman->regs_lock);
521 /* Wait for the PLL to lock. */
522 timeout = ktime_add_ns(ktime_get(), LOCK_TIMEOUT_NS);
523 while (!(clockman_read(clockman, data->cs_reg) & PLL_CS_LOCK)) {
524 if (ktime_after(ktime_get(), timeout)) {
525 dev_err(clockman->dev, "%s: can't lock PLL\n",
526 clk_hw_get_name(hw));
535 static void rp1_pll_core_off(struct clk_hw *hw)
537 struct rp1_pll_core *pll_core = container_of(hw, struct rp1_pll_core, hw);
538 struct rp1_clockman *clockman = pll_core->clockman;
539 const struct rp1_pll_core_data *data = pll_core->data;
541 spin_lock(&clockman->regs_lock);
542 clockman_write(clockman, data->pwr_reg, 0);
543 spin_unlock(&clockman->regs_lock);
546 static inline unsigned long get_pll_core_divider(struct clk_hw *hw,
548 unsigned long parent_rate,
549 u32 *div_int, u32 *div_frac)
551 unsigned long calc_rate;
552 u32 fbdiv_int, fbdiv_frac;
553 u64 div_fp64; /* 32.32 fixed point fraction. */
555 /* Factor of reference clock to VCO frequency. */
556 div_fp64 = (u64)(rate) << 32;
557 div_fp64 = DIV_U64_NEAREST(div_fp64, parent_rate);
559 /* Round the fractional component at 24 bits. */
560 div_fp64 += 1 << (32 - 24 - 1);
562 fbdiv_int = div_fp64 >> 32;
563 fbdiv_frac = (div_fp64 >> (32 - 24)) & 0xffffff;
566 ((u64)parent_rate * (((u64)fbdiv_int << 24) + fbdiv_frac) + (1 << 23)) >> 24;
568 *div_int = fbdiv_int;
569 *div_frac = fbdiv_frac;
574 static int rp1_pll_core_set_rate(struct clk_hw *hw,
575 unsigned long rate, unsigned long parent_rate)
577 struct rp1_pll_core *pll_core = container_of(hw, struct rp1_pll_core, hw);
578 struct rp1_clockman *clockman = pll_core->clockman;
579 const struct rp1_pll_core_data *data = pll_core->data;
580 unsigned long calc_rate;
581 u32 fbdiv_int, fbdiv_frac;
583 // todo: is this needed??
586 /* Disable dividers to start with. */
587 spin_lock(&clockman->regs_lock);
588 clockman_write(clockman, data->fbdiv_int_reg, 0);
589 clockman_write(clockman, data->fbdiv_frac_reg, 0);
590 spin_unlock(&clockman->regs_lock);
592 calc_rate = get_pll_core_divider(hw, rate, parent_rate,
593 &fbdiv_int, &fbdiv_frac);
595 spin_lock(&clockman->regs_lock);
596 clockman_write(clockman, data->pwr_reg, fbdiv_frac ? 0 : PLL_PWR_DSMPD);
597 clockman_write(clockman, data->fbdiv_int_reg, fbdiv_int);
598 clockman_write(clockman, data->fbdiv_frac_reg, fbdiv_frac);
599 spin_unlock(&clockman->regs_lock);
601 /* Check that reference frequency is no greater than VCO / 16. */
602 BUG_ON(parent_rate > (rate / 16));
604 pll_core->cached_rate = calc_rate;
606 spin_lock(&clockman->regs_lock);
607 /* Don't need to divide ref unless parent_rate > (output freq / 16) */
608 clockman_write(clockman, data->cs_reg,
609 clockman_read(clockman, data->cs_reg) |
610 (1 << PLL_CS_REFDIV_SHIFT));
611 spin_unlock(&clockman->regs_lock);
616 static unsigned long rp1_pll_core_recalc_rate(struct clk_hw *hw,
617 unsigned long parent_rate)
619 struct rp1_pll_core *pll_core = container_of(hw, struct rp1_pll_core, hw);
620 struct rp1_clockman *clockman = pll_core->clockman;
621 const struct rp1_pll_core_data *data = pll_core->data;
622 u32 fbdiv_int, fbdiv_frac;
623 unsigned long calc_rate;
625 fbdiv_int = clockman_read(clockman, data->fbdiv_int_reg);
626 fbdiv_frac = clockman_read(clockman, data->fbdiv_frac_reg);
628 ((u64)parent_rate * (((u64)fbdiv_int << 24) + fbdiv_frac) + (1 << 23)) >> 24;
633 static long rp1_pll_core_round_rate(struct clk_hw *hw, unsigned long rate,
634 unsigned long *parent_rate)
636 u32 fbdiv_int, fbdiv_frac;
639 calc_rate = get_pll_core_divider(hw, rate, *parent_rate,
640 &fbdiv_int, &fbdiv_frac);
644 static void rp1_pll_core_debug_init(struct clk_hw *hw, struct dentry *dentry)
646 struct rp1_pll_core *pll_core = container_of(hw, struct rp1_pll_core, hw);
647 struct rp1_clockman *clockman = pll_core->clockman;
648 const struct rp1_pll_core_data *data = pll_core->data;
649 struct debugfs_reg32 *regs;
651 regs = devm_kcalloc(clockman->dev, 4, sizeof(*regs), GFP_KERNEL);
656 regs[0].offset = data->cs_reg;
657 regs[1].name = "pwr";
658 regs[1].offset = data->pwr_reg;
659 regs[2].name = "fbdiv_int";
660 regs[2].offset = data->fbdiv_int_reg;
661 regs[3].name = "fbdiv_frac";
662 regs[3].offset = data->fbdiv_frac_reg;
664 rp1_debugfs_regset(clockman, 0, regs, 4, dentry);
667 static void get_pll_prim_dividers(unsigned long rate, unsigned long parent_rate,
668 u32 *divider1, u32 *divider2)
670 unsigned int div1, div2;
671 unsigned int best_div1 = 7, best_div2 = 7;
672 unsigned long best_rate_diff =
673 ABS_DIFF(DIV_ROUND_CLOSEST(parent_rate, best_div1 * best_div2), rate);
674 long rate_diff, calc_rate;
676 for (div1 = 1; div1 <= 7; div1++) {
677 for (div2 = 1; div2 <= div1; div2++) {
678 calc_rate = DIV_ROUND_CLOSEST(parent_rate, div1 * div2);
679 rate_diff = ABS_DIFF(calc_rate, rate);
681 if (calc_rate == rate) {
685 } else if (rate_diff < best_rate_diff) {
688 best_rate_diff = rate_diff;
694 *divider1 = best_div1;
695 *divider2 = best_div2;
698 static int rp1_pll_set_rate(struct clk_hw *hw,
699 unsigned long rate, unsigned long parent_rate)
701 struct rp1_pll *pll = container_of(hw, struct rp1_pll, hw);
702 struct rp1_clockman *clockman = pll->clockman;
703 const struct rp1_pll_data *data = pll->data;
704 u32 prim, prim_div1, prim_div2;
706 get_pll_prim_dividers(rate, parent_rate, &prim_div1, &prim_div2);
708 spin_lock(&clockman->regs_lock);
709 prim = clockman_read(clockman, data->ctrl_reg);
710 prim = set_register_field(prim, prim_div1, PLL_PRIM_DIV1_MASK,
711 PLL_PRIM_DIV1_SHIFT);
712 prim = set_register_field(prim, prim_div2, PLL_PRIM_DIV2_MASK,
713 PLL_PRIM_DIV2_SHIFT);
714 clockman_write(clockman, data->ctrl_reg, prim);
715 spin_unlock(&clockman->regs_lock);
717 #ifdef MEASURE_CLOCK_RATE
718 clockman_measure_clock(clockman, data->name, data->fc0_src);
723 static unsigned long rp1_pll_recalc_rate(struct clk_hw *hw,
724 unsigned long parent_rate)
726 struct rp1_pll *pll = container_of(hw, struct rp1_pll, hw);
727 struct rp1_clockman *clockman = pll->clockman;
728 const struct rp1_pll_data *data = pll->data;
729 u32 prim, prim_div1, prim_div2;
731 prim = clockman_read(clockman, data->ctrl_reg);
732 prim_div1 = (prim & PLL_PRIM_DIV1_MASK) >> PLL_PRIM_DIV1_SHIFT;
733 prim_div2 = (prim & PLL_PRIM_DIV2_MASK) >> PLL_PRIM_DIV2_SHIFT;
735 if (!prim_div1 || !prim_div2) {
736 dev_err(clockman->dev, "%s: (%s) zero divider value\n",
737 __func__, data->name);
741 return DIV_ROUND_CLOSEST(parent_rate, prim_div1 * prim_div2);
744 static long rp1_pll_round_rate(struct clk_hw *hw, unsigned long rate,
745 unsigned long *parent_rate)
749 get_pll_prim_dividers(rate, *parent_rate, &div1, &div2);
751 return DIV_ROUND_CLOSEST(*parent_rate, div1 * div2);
754 static void rp1_pll_debug_init(struct clk_hw *hw,
755 struct dentry *dentry)
757 struct rp1_pll *pll = container_of(hw, struct rp1_pll, hw);
758 struct rp1_clockman *clockman = pll->clockman;
759 const struct rp1_pll_data *data = pll->data;
760 struct debugfs_reg32 *regs;
762 regs = devm_kcalloc(clockman->dev, 1, sizeof(*regs), GFP_KERNEL);
766 regs[0].name = "prim";
767 regs[0].offset = data->ctrl_reg;
769 rp1_debugfs_regset(clockman, 0, regs, 1, dentry);
772 static int rp1_pll_ph_is_on(struct clk_hw *hw)
774 struct rp1_pll_ph *pll = container_of(hw, struct rp1_pll_ph, hw);
775 struct rp1_clockman *clockman = pll->clockman;
776 const struct rp1_pll_ph_data *data = pll->data;
778 return !!(clockman_read(clockman, data->ph_reg) & PLL_PH_EN);
781 static int rp1_pll_ph_on(struct clk_hw *hw)
783 struct rp1_pll_ph *pll_ph = container_of(hw, struct rp1_pll_ph, hw);
784 struct rp1_clockman *clockman = pll_ph->clockman;
785 const struct rp1_pll_ph_data *data = pll_ph->data;
788 /* todo: ensure pri/sec is enabled! */
789 spin_lock(&clockman->regs_lock);
790 ph_reg = clockman_read(clockman, data->ph_reg);
791 ph_reg |= data->phase << PLL_PH_PHASE_SHIFT;
793 clockman_write(clockman, data->ph_reg, ph_reg);
794 spin_unlock(&clockman->regs_lock);
796 #ifdef MEASURE_CLOCK_RATE
797 clockman_measure_clock(clockman, data->name, data->fc0_src);
802 static void rp1_pll_ph_off(struct clk_hw *hw)
804 struct rp1_pll_ph *pll_ph = container_of(hw, struct rp1_pll_ph, hw);
805 struct rp1_clockman *clockman = pll_ph->clockman;
806 const struct rp1_pll_ph_data *data = pll_ph->data;
808 spin_lock(&clockman->regs_lock);
809 clockman_write(clockman, data->ph_reg,
810 clockman_read(clockman, data->ph_reg) & ~PLL_PH_EN);
811 spin_unlock(&clockman->regs_lock);
814 static int rp1_pll_ph_set_rate(struct clk_hw *hw,
815 unsigned long rate, unsigned long parent_rate)
817 struct rp1_pll_ph *pll_ph = container_of(hw, struct rp1_pll_ph, hw);
818 const struct rp1_pll_ph_data *data = pll_ph->data;
819 struct rp1_clockman *clockman = pll_ph->clockman;
821 /* Nothing really to do here! */
822 WARN_ON(data->fixed_divider != 1 && data->fixed_divider != 2);
823 WARN_ON(rate != parent_rate / data->fixed_divider);
825 #ifdef MEASURE_CLOCK_RATE
826 if (rp1_pll_ph_is_on(hw))
827 clockman_measure_clock(clockman, data->name, data->fc0_src);
832 static unsigned long rp1_pll_ph_recalc_rate(struct clk_hw *hw,
833 unsigned long parent_rate)
835 struct rp1_pll_ph *pll_ph = container_of(hw, struct rp1_pll_ph, hw);
836 const struct rp1_pll_ph_data *data = pll_ph->data;
838 return parent_rate / data->fixed_divider;
841 static long rp1_pll_ph_round_rate(struct clk_hw *hw, unsigned long rate,
842 unsigned long *parent_rate)
844 struct rp1_pll_ph *pll_ph = container_of(hw, struct rp1_pll_ph, hw);
845 const struct rp1_pll_ph_data *data = pll_ph->data;
847 return *parent_rate / data->fixed_divider;
850 static void rp1_pll_ph_debug_init(struct clk_hw *hw,
851 struct dentry *dentry)
853 struct rp1_pll_ph *pll_ph = container_of(hw, struct rp1_pll_ph, hw);
854 const struct rp1_pll_ph_data *data = pll_ph->data;
855 struct rp1_clockman *clockman = pll_ph->clockman;
856 struct debugfs_reg32 *regs;
858 regs = devm_kcalloc(clockman->dev, 1, sizeof(*regs), GFP_KERNEL);
862 regs[0].name = "ph_reg";
863 regs[0].offset = data->ph_reg;
865 rp1_debugfs_regset(clockman, 0, regs, 1, dentry);
868 static int rp1_pll_divider_is_on(struct clk_hw *hw)
870 struct rp1_pll *divider = container_of(hw, struct rp1_pll, div.hw);
871 struct rp1_clockman *clockman = divider->clockman;
872 const struct rp1_pll_data *data = divider->data;
874 return !(clockman_read(clockman, data->ctrl_reg) & PLL_SEC_RST);
877 static int rp1_pll_divider_on(struct clk_hw *hw)
879 struct rp1_pll *divider = container_of(hw, struct rp1_pll, div.hw);
880 struct rp1_clockman *clockman = divider->clockman;
881 const struct rp1_pll_data *data = divider->data;
883 spin_lock(&clockman->regs_lock);
884 /* Check the implementation bit is set! */
885 WARN_ON(!(clockman_read(clockman, data->ctrl_reg) & PLL_SEC_IMPL));
886 clockman_write(clockman, data->ctrl_reg,
887 clockman_read(clockman, data->ctrl_reg) & ~PLL_SEC_RST);
888 spin_unlock(&clockman->regs_lock);
890 #ifdef MEASURE_CLOCK_RATE
891 clockman_measure_clock(clockman, data->name, data->fc0_src);
896 static void rp1_pll_divider_off(struct clk_hw *hw)
898 struct rp1_pll *divider = container_of(hw, struct rp1_pll, div.hw);
899 struct rp1_clockman *clockman = divider->clockman;
900 const struct rp1_pll_data *data = divider->data;
902 spin_lock(&clockman->regs_lock);
903 clockman_write(clockman, data->ctrl_reg, PLL_SEC_RST);
904 spin_unlock(&clockman->regs_lock);
907 static int rp1_pll_divider_set_rate(struct clk_hw *hw,
909 unsigned long parent_rate)
911 struct rp1_pll *divider = container_of(hw, struct rp1_pll, div.hw);
912 struct rp1_clockman *clockman = divider->clockman;
913 const struct rp1_pll_data *data = divider->data;
916 div = DIV_ROUND_UP_ULL(parent_rate, rate);
917 div = clamp(div, 8u, 19u);
919 spin_lock(&clockman->regs_lock);
920 sec = clockman_read(clockman, data->ctrl_reg);
921 sec = set_register_field(sec, div, PLL_SEC_DIV_MASK, PLL_SEC_DIV_SHIFT);
923 /* Must keep the divider in reset to change the value. */
925 clockman_write(clockman, data->ctrl_reg, sec);
927 // todo: must sleep 10 pll vco cycles
929 clockman_write(clockman, data->ctrl_reg, sec);
930 spin_unlock(&clockman->regs_lock);
932 #ifdef MEASURE_CLOCK_RATE
933 if (rp1_pll_divider_is_on(hw))
934 clockman_measure_clock(clockman, data->name, data->fc0_src);
939 static unsigned long rp1_pll_divider_recalc_rate(struct clk_hw *hw,
940 unsigned long parent_rate)
942 return clk_divider_ops.recalc_rate(hw, parent_rate);
945 static long rp1_pll_divider_round_rate(struct clk_hw *hw,
947 unsigned long *parent_rate)
949 return clk_divider_ops.round_rate(hw, rate, parent_rate);
952 static void rp1_pll_divider_debug_init(struct clk_hw *hw, struct dentry *dentry)
954 struct rp1_pll *divider = container_of(hw, struct rp1_pll, div.hw);
955 struct rp1_clockman *clockman = divider->clockman;
956 const struct rp1_pll_data *data = divider->data;
957 struct debugfs_reg32 *regs;
959 regs = devm_kcalloc(clockman->dev, 1, sizeof(*regs), GFP_KERNEL);
963 regs[0].name = "sec";
964 regs[0].offset = data->ctrl_reg;
966 rp1_debugfs_regset(clockman, 0, regs, 1, dentry);
969 static int rp1_clock_is_on(struct clk_hw *hw)
971 struct rp1_clock *clock = container_of(hw, struct rp1_clock, hw);
972 struct rp1_clockman *clockman = clock->clockman;
973 const struct rp1_clock_data *data = clock->data;
975 return !!(clockman_read(clockman, data->ctrl_reg) & CLK_CTRL_ENABLE);
978 static unsigned long rp1_clock_recalc_rate(struct clk_hw *hw,
979 unsigned long parent_rate)
981 struct rp1_clock *clock = container_of(hw, struct rp1_clock, hw);
982 struct rp1_clockman *clockman = clock->clockman;
983 const struct rp1_clock_data *data = clock->data;
989 div = clockman_read(clockman, data->div_int_reg);
990 frac = (data->div_frac_reg != 0) ?
991 clockman_read(clockman, data->div_frac_reg) : 0;
993 /* If the integer portion of the divider is 0, treat it as 2^16 */
997 div = (div << CLK_DIV_FRAC_BITS) | (frac >> (32 - CLK_DIV_FRAC_BITS));
999 calc_rate = (u64)parent_rate << CLK_DIV_FRAC_BITS;
1000 calc_rate = div64_u64(calc_rate, div);
1005 static int rp1_clock_on(struct clk_hw *hw)
1007 struct rp1_clock *clock = container_of(hw, struct rp1_clock, hw);
1008 struct rp1_clockman *clockman = clock->clockman;
1009 const struct rp1_clock_data *data = clock->data;
1011 spin_lock(&clockman->regs_lock);
1012 clockman_write(clockman, data->ctrl_reg,
1013 clockman_read(clockman, data->ctrl_reg) | CLK_CTRL_ENABLE);
1014 spin_unlock(&clockman->regs_lock);
1016 #ifdef MEASURE_CLOCK_RATE
1017 clockman_measure_clock(clockman, data->name, data->fc0_src);
1022 static void rp1_clock_off(struct clk_hw *hw)
1024 struct rp1_clock *clock = container_of(hw, struct rp1_clock, hw);
1025 struct rp1_clockman *clockman = clock->clockman;
1026 const struct rp1_clock_data *data = clock->data;
1028 spin_lock(&clockman->regs_lock);
1029 clockman_write(clockman, data->ctrl_reg,
1030 clockman_read(clockman, data->ctrl_reg) & ~CLK_CTRL_ENABLE);
1031 spin_unlock(&clockman->regs_lock);
1034 static u32 rp1_clock_choose_div(unsigned long rate, unsigned long parent_rate,
1035 const struct rp1_clock_data *data)
1040 * Due to earlier rounding, calculated parent_rate may differ from
1041 * expected value. Don't fail on a small discrepancy near unity divide.
1043 if (!rate || rate > parent_rate + (parent_rate >> CLK_DIV_FRAC_BITS))
1047 * Always express div in fixed-point format for fractional division;
1048 * If no fractional divider is present, the fraction part will be zero.
1050 if (data->div_frac_reg) {
1051 div = (u64)parent_rate << CLK_DIV_FRAC_BITS;
1052 div = DIV_U64_NEAREST(div, rate);
1054 div = DIV_U64_NEAREST(parent_rate, rate);
1055 div <<= CLK_DIV_FRAC_BITS;
1059 1ull << CLK_DIV_FRAC_BITS,
1060 (u64)data->div_int_max << CLK_DIV_FRAC_BITS);
1065 static u8 rp1_clock_get_parent(struct clk_hw *hw)
1067 struct rp1_clock *clock = container_of(hw, struct rp1_clock, hw);
1068 struct rp1_clockman *clockman = clock->clockman;
1069 const struct rp1_clock_data *data = clock->data;
1073 /* Sel is one-hot, so find the first bit set */
1074 sel = clockman_read(clockman, data->sel_reg);
1075 parent = ffs(sel) - 1;
1077 /* sel == 0 implies the parent clock is not enabled yet. */
1079 /* Read the clock src from the CTRL register instead */
1080 ctrl = clockman_read(clockman, data->ctrl_reg);
1081 parent = (ctrl & data->clk_src_mask) >> CLK_CTRL_SRC_SHIFT;
1084 if (parent >= data->num_std_parents)
1087 if (parent == AUX_SEL) {
1089 * Clock parent is an auxiliary source, so get the parent from
1090 * the AUXSRC register field.
1092 ctrl = clockman_read(clockman, data->ctrl_reg);
1093 parent = (ctrl & CLK_CTRL_AUXSRC_MASK) >> CLK_CTRL_AUXSRC_SHIFT;
1094 parent += data->num_std_parents;
1100 static int rp1_clock_set_parent(struct clk_hw *hw, u8 index)
1102 struct rp1_clock *clock = container_of(hw, struct rp1_clock, hw);
1103 struct rp1_clockman *clockman = clock->clockman;
1104 const struct rp1_clock_data *data = clock->data;
1107 spin_lock(&clockman->regs_lock);
1108 ctrl = clockman_read(clockman, data->ctrl_reg);
1110 if (index >= data->num_std_parents) {
1111 /* This is an aux source request */
1112 if (index >= data->num_std_parents + data->num_aux_parents)
1115 /* Select parent from aux list */
1116 ctrl = set_register_field(ctrl, index - data->num_std_parents,
1117 CLK_CTRL_AUXSRC_MASK,
1118 CLK_CTRL_AUXSRC_SHIFT);
1119 /* Set src to aux list */
1120 ctrl = set_register_field(ctrl, AUX_SEL, data->clk_src_mask,
1121 CLK_CTRL_SRC_SHIFT);
1123 ctrl = set_register_field(ctrl, index, data->clk_src_mask,
1124 CLK_CTRL_SRC_SHIFT);
1127 clockman_write(clockman, data->ctrl_reg, ctrl);
1128 spin_unlock(&clockman->regs_lock);
1130 sel = rp1_clock_get_parent(hw);
1131 WARN(sel != index, "(%s): Parent index req %u returned back %u\n",
1132 data->name, index, sel);
1137 static int rp1_clock_set_rate_and_parent(struct clk_hw *hw,
1139 unsigned long parent_rate,
1142 struct rp1_clock *clock = container_of(hw, struct rp1_clock, hw);
1143 struct rp1_clockman *clockman = clock->clockman;
1144 const struct rp1_clock_data *data = clock->data;
1145 u32 div = rp1_clock_choose_div(rate, parent_rate, data);
1147 WARN(rate > 4000000000ll, "rate is -ve (%d)\n", (int)rate);
1150 "clk divider calculated as 0! (%s, rate %ld, parent rate %ld)\n",
1151 data->name, rate, parent_rate))
1152 div = 1 << CLK_DIV_FRAC_BITS;
1154 spin_lock(&clockman->regs_lock);
1156 clockman_write(clockman, data->div_int_reg, div >> CLK_DIV_FRAC_BITS);
1157 if (data->div_frac_reg)
1158 clockman_write(clockman, data->div_frac_reg, div << (32 - CLK_DIV_FRAC_BITS));
1160 spin_unlock(&clockman->regs_lock);
1163 rp1_clock_set_parent(hw, parent);
1165 #ifdef MEASURE_CLOCK_RATE
1166 if (rp1_clock_is_on(hw))
1167 clockman_measure_clock(clockman, data->name, data->fc0_src);
1172 static int rp1_clock_set_rate(struct clk_hw *hw, unsigned long rate,
1173 unsigned long parent_rate)
1175 return rp1_clock_set_rate_and_parent(hw, rate, parent_rate, 0xff);
1178 static void rp1_clock_choose_div_and_prate(struct clk_hw *hw,
1181 unsigned long *prate,
1182 unsigned long *calc_rate)
1184 struct rp1_clock *clock = container_of(hw, struct rp1_clock, hw);
1185 const struct rp1_clock_data *data = clock->data;
1186 struct clk_hw *parent;
1190 parent = clk_hw_get_parent_by_index(hw, parent_idx);
1191 *prate = clk_hw_get_rate(parent);
1192 div = rp1_clock_choose_div(rate, *prate, data);
1199 /* Recalculate to account for rounding errors */
1200 tmp = (u64)*prate << CLK_DIV_FRAC_BITS;
1201 tmp = div_u64(tmp, div);
1205 static int rp1_clock_determine_rate(struct clk_hw *hw,
1206 struct clk_rate_request *req)
1208 struct clk_hw *parent, *best_parent = NULL;
1209 unsigned long best_rate = 0;
1210 unsigned long best_prate = 0;
1211 unsigned long best_rate_diff = ULONG_MAX;
1212 unsigned long prate, calc_rate;
1216 * If the NO_REPARENT flag is set, try to use existing parent.
1218 if ((clk_hw_get_flags(hw) & CLK_SET_RATE_NO_REPARENT)) {
1219 i = rp1_clock_get_parent(hw);
1220 parent = clk_hw_get_parent_by_index(hw, i);
1222 rp1_clock_choose_div_and_prate(hw, i, req->rate, &prate,
1224 if (calc_rate > 0) {
1225 req->best_parent_hw = parent;
1226 req->best_parent_rate = prate;
1227 req->rate = calc_rate;
1234 * Select parent clock that results in the closest rate (lower or
1237 for (i = 0; i < clk_hw_get_num_parents(hw); i++) {
1238 parent = clk_hw_get_parent_by_index(hw, i);
1242 rp1_clock_choose_div_and_prate(hw, i, req->rate, &prate,
1245 if (ABS_DIFF(calc_rate, req->rate) < best_rate_diff) {
1246 best_parent = parent;
1248 best_rate = calc_rate;
1249 best_rate_diff = ABS_DIFF(calc_rate, req->rate);
1251 if (best_rate_diff == 0)
1259 req->best_parent_hw = best_parent;
1260 req->best_parent_rate = best_prate;
1261 req->rate = best_rate;
1266 static void rp1_clk_debug_init(struct clk_hw *hw, struct dentry *dentry)
1268 struct rp1_clock *clock = container_of(hw, struct rp1_clock, hw);
1269 struct rp1_clockman *clockman = clock->clockman;
1270 const struct rp1_clock_data *data = clock->data;
1271 struct debugfs_reg32 *regs;
1274 regs = devm_kcalloc(clockman->dev, 4, sizeof(*regs), GFP_KERNEL);
1279 regs[i].name = "ctrl";
1280 regs[i++].offset = data->ctrl_reg;
1281 regs[i].name = "div_int";
1282 regs[i++].offset = data->div_int_reg;
1283 regs[i].name = "div_frac";
1284 regs[i++].offset = data->div_frac_reg;
1285 regs[i].name = "sel";
1286 regs[i++].offset = data->sel_reg;
1288 rp1_debugfs_regset(clockman, 0, regs, i, dentry);
1291 static const struct clk_ops rp1_pll_core_ops = {
1292 .is_prepared = rp1_pll_core_is_on,
1293 .prepare = rp1_pll_core_on,
1294 .unprepare = rp1_pll_core_off,
1295 .set_rate = rp1_pll_core_set_rate,
1296 .recalc_rate = rp1_pll_core_recalc_rate,
1297 .round_rate = rp1_pll_core_round_rate,
1298 .debug_init = rp1_pll_core_debug_init,
1301 static const struct clk_ops rp1_pll_ops = {
1302 .set_rate = rp1_pll_set_rate,
1303 .recalc_rate = rp1_pll_recalc_rate,
1304 .round_rate = rp1_pll_round_rate,
1305 .debug_init = rp1_pll_debug_init,
1308 static const struct clk_ops rp1_pll_ph_ops = {
1309 .is_prepared = rp1_pll_ph_is_on,
1310 .prepare = rp1_pll_ph_on,
1311 .unprepare = rp1_pll_ph_off,
1312 .set_rate = rp1_pll_ph_set_rate,
1313 .recalc_rate = rp1_pll_ph_recalc_rate,
1314 .round_rate = rp1_pll_ph_round_rate,
1315 .debug_init = rp1_pll_ph_debug_init,
1318 static const struct clk_ops rp1_pll_divider_ops = {
1319 .is_prepared = rp1_pll_divider_is_on,
1320 .prepare = rp1_pll_divider_on,
1321 .unprepare = rp1_pll_divider_off,
1322 .set_rate = rp1_pll_divider_set_rate,
1323 .recalc_rate = rp1_pll_divider_recalc_rate,
1324 .round_rate = rp1_pll_divider_round_rate,
1325 .debug_init = rp1_pll_divider_debug_init,
1328 static const struct clk_ops rp1_clk_ops = {
1329 .is_prepared = rp1_clock_is_on,
1330 .prepare = rp1_clock_on,
1331 .unprepare = rp1_clock_off,
1332 .recalc_rate = rp1_clock_recalc_rate,
1333 .get_parent = rp1_clock_get_parent,
1334 .set_parent = rp1_clock_set_parent,
1335 .set_rate_and_parent = rp1_clock_set_rate_and_parent,
1336 .set_rate = rp1_clock_set_rate,
1337 .determine_rate = rp1_clock_determine_rate,
1338 .debug_init = rp1_clk_debug_init,
1341 static bool rp1_clk_is_claimed(const char *name);
1343 static struct clk_hw *rp1_register_pll_core(struct rp1_clockman *clockman,
1346 const struct rp1_pll_core_data *pll_core_data = data;
1347 struct rp1_pll_core *pll_core;
1348 struct clk_init_data init;
1351 memset(&init, 0, sizeof(init));
1353 /* All of the PLL cores derive from the external oscillator. */
1354 init.parent_names = &ref_clock;
1355 init.num_parents = 1;
1356 init.name = pll_core_data->name;
1357 init.ops = &rp1_pll_core_ops;
1358 init.flags = pll_core_data->flags | CLK_IGNORE_UNUSED | CLK_IS_CRITICAL;
1360 pll_core = kzalloc(sizeof(*pll_core), GFP_KERNEL);
1364 pll_core->clockman = clockman;
1365 pll_core->data = pll_core_data;
1366 pll_core->hw.init = &init;
1368 ret = devm_clk_hw_register(clockman->dev, &pll_core->hw);
1374 return &pll_core->hw;
1377 static struct clk_hw *rp1_register_pll(struct rp1_clockman *clockman,
1380 const struct rp1_pll_data *pll_data = data;
1381 struct rp1_pll *pll;
1382 struct clk_init_data init;
1385 memset(&init, 0, sizeof(init));
1387 init.parent_names = &pll_data->source_pll;
1388 init.num_parents = 1;
1389 init.name = pll_data->name;
1390 init.ops = &rp1_pll_ops;
1391 init.flags = pll_data->flags | CLK_IGNORE_UNUSED | CLK_IS_CRITICAL;
1393 pll = kzalloc(sizeof(*pll), GFP_KERNEL);
1397 pll->clockman = clockman;
1398 pll->data = pll_data;
1399 pll->hw.init = &init;
1401 ret = devm_clk_hw_register(clockman->dev, &pll->hw);
1410 static struct clk_hw *rp1_register_pll_ph(struct rp1_clockman *clockman,
1413 const struct rp1_pll_ph_data *ph_data = data;
1414 struct rp1_pll_ph *ph;
1415 struct clk_init_data init;
1418 memset(&init, 0, sizeof(init));
1420 /* All of the PLLs derive from the external oscillator. */
1421 init.parent_names = &ph_data->source_pll;
1422 init.num_parents = 1;
1423 init.name = ph_data->name;
1424 init.ops = &rp1_pll_ph_ops;
1425 init.flags = ph_data->flags | CLK_IGNORE_UNUSED;
1427 ph = kzalloc(sizeof(*ph), GFP_KERNEL);
1431 ph->clockman = clockman;
1433 ph->hw.init = &init;
1435 ret = devm_clk_hw_register(clockman->dev, &ph->hw);
1444 static struct clk_hw *rp1_register_pll_divider(struct rp1_clockman *clockman,
1447 const struct rp1_pll_data *divider_data = data;
1448 struct rp1_pll *divider;
1449 struct clk_init_data init;
1452 memset(&init, 0, sizeof(init));
1454 init.parent_names = ÷r_data->source_pll;
1455 init.num_parents = 1;
1456 init.name = divider_data->name;
1457 init.ops = &rp1_pll_divider_ops;
1458 init.flags = divider_data->flags | CLK_IGNORE_UNUSED;
1460 divider = devm_kzalloc(clockman->dev, sizeof(*divider), GFP_KERNEL);
1464 divider->div.reg = clockman->regs + divider_data->ctrl_reg;
1465 divider->div.shift = PLL_SEC_DIV_SHIFT;
1466 divider->div.width = PLL_SEC_DIV_WIDTH;
1467 divider->div.flags = CLK_DIVIDER_ROUND_CLOSEST;
1468 divider->div.lock = &clockman->regs_lock;
1469 divider->div.hw.init = &init;
1470 divider->div.table = pll_sec_div_table;
1472 if (!rp1_clk_is_claimed(divider_data->source_pll))
1473 init.flags |= CLK_IS_CRITICAL;
1474 if (!rp1_clk_is_claimed(divider_data->name))
1475 divider->div.flags |= CLK_IS_CRITICAL;
1477 divider->clockman = clockman;
1478 divider->data = divider_data;
1480 ret = devm_clk_hw_register(clockman->dev, ÷r->div.hw);
1482 return ERR_PTR(ret);
1484 return ÷r->div.hw;
1487 static struct clk_hw *rp1_register_clock(struct rp1_clockman *clockman,
1490 const struct rp1_clock_data *clock_data = data;
1491 struct rp1_clock *clock;
1492 struct clk_init_data init;
1495 BUG_ON(MAX_CLK_PARENTS <
1496 clock_data->num_std_parents + clock_data->num_aux_parents);
1497 /* There must be a gap for the AUX selector */
1498 BUG_ON((clock_data->num_std_parents > AUX_SEL) &&
1499 strcmp("-", clock_data->parents[AUX_SEL]));
1501 memset(&init, 0, sizeof(init));
1502 init.parent_names = clock_data->parents;
1504 clock_data->num_std_parents + clock_data->num_aux_parents;
1505 init.name = clock_data->name;
1506 init.flags = clock_data->flags | CLK_IGNORE_UNUSED;
1507 init.ops = &rp1_clk_ops;
1509 clock = devm_kzalloc(clockman->dev, sizeof(*clock), GFP_KERNEL);
1513 clock->clockman = clockman;
1514 clock->data = clock_data;
1515 clock->hw.init = &init;
1517 ret = devm_clk_hw_register(clockman->dev, &clock->hw);
1519 return ERR_PTR(ret);
1524 struct rp1_clk_desc {
1525 struct clk_hw *(*clk_register)(struct rp1_clockman *clockman,
1530 /* Assignment helper macros for different clock types. */
1531 #define _REGISTER(f, ...) { .clk_register = f, .data = __VA_ARGS__ }
1533 #define REGISTER_PLL_CORE(...) _REGISTER(&rp1_register_pll_core, \
1534 &(struct rp1_pll_core_data) \
1537 #define REGISTER_PLL(...) _REGISTER(&rp1_register_pll, \
1538 &(struct rp1_pll_data) \
1541 #define REGISTER_PLL_PH(...) _REGISTER(&rp1_register_pll_ph, \
1542 &(struct rp1_pll_ph_data) \
1545 #define REGISTER_PLL_DIV(...) _REGISTER(&rp1_register_pll_divider, \
1546 &(struct rp1_pll_data) \
1549 #define REGISTER_CLK(...) _REGISTER(&rp1_register_clock, \
1550 &(struct rp1_clock_data) \
1553 static const struct rp1_clk_desc clk_desc_array[] = {
1554 [RP1_PLL_SYS_CORE] = REGISTER_PLL_CORE(
1555 .name = "pll_sys_core",
1556 .cs_reg = PLL_SYS_CS,
1557 .pwr_reg = PLL_SYS_PWR,
1558 .fbdiv_int_reg = PLL_SYS_FBDIV_INT,
1559 .fbdiv_frac_reg = PLL_SYS_FBDIV_FRAC,
1562 [RP1_PLL_AUDIO_CORE] = REGISTER_PLL_CORE(
1563 .name = "pll_audio_core",
1564 .cs_reg = PLL_AUDIO_CS,
1565 .pwr_reg = PLL_AUDIO_PWR,
1566 .fbdiv_int_reg = PLL_AUDIO_FBDIV_INT,
1567 .fbdiv_frac_reg = PLL_AUDIO_FBDIV_FRAC,
1570 [RP1_PLL_VIDEO_CORE] = REGISTER_PLL_CORE(
1571 .name = "pll_video_core",
1572 .cs_reg = PLL_VIDEO_CS,
1573 .pwr_reg = PLL_VIDEO_PWR,
1574 .fbdiv_int_reg = PLL_VIDEO_FBDIV_INT,
1575 .fbdiv_frac_reg = PLL_VIDEO_FBDIV_FRAC,
1578 [RP1_PLL_SYS] = REGISTER_PLL(
1580 .source_pll = "pll_sys_core",
1581 .ctrl_reg = PLL_SYS_PRIM,
1582 .fc0_src = FC_NUM(0, 2),
1585 [RP1_PLL_AUDIO] = REGISTER_PLL(
1586 .name = "pll_audio",
1587 .source_pll = "pll_audio_core",
1588 .ctrl_reg = PLL_AUDIO_PRIM,
1589 .fc0_src = FC_NUM(4, 2),
1592 [RP1_PLL_VIDEO] = REGISTER_PLL(
1593 .name = "pll_video",
1594 .source_pll = "pll_video_core",
1595 .ctrl_reg = PLL_VIDEO_PRIM,
1596 .fc0_src = FC_NUM(3, 2),
1599 [RP1_PLL_SYS_PRI_PH] = REGISTER_PLL_PH(
1600 .name = "pll_sys_pri_ph",
1601 .source_pll = "pll_sys",
1602 .ph_reg = PLL_SYS_PRIM,
1604 .phase = RP1_PLL_PHASE_0,
1605 .fc0_src = FC_NUM(1, 2),
1608 [RP1_PLL_AUDIO_PRI_PH] = REGISTER_PLL_PH(
1609 .name = "pll_audio_pri_ph",
1610 .source_pll = "pll_audio",
1611 .ph_reg = PLL_AUDIO_PRIM,
1613 .phase = RP1_PLL_PHASE_0,
1614 .fc0_src = FC_NUM(5, 1),
1617 [RP1_PLL_SYS_SEC] = REGISTER_PLL_DIV(
1618 .name = "pll_sys_sec",
1619 .source_pll = "pll_sys_core",
1620 .ctrl_reg = PLL_SYS_SEC,
1621 .fc0_src = FC_NUM(2, 2),
1624 [RP1_PLL_AUDIO_SEC] = REGISTER_PLL_DIV(
1625 .name = "pll_audio_sec",
1626 .source_pll = "pll_audio_core",
1627 .ctrl_reg = PLL_AUDIO_SEC,
1628 .fc0_src = FC_NUM(6, 2),
1631 [RP1_PLL_VIDEO_SEC] = REGISTER_PLL_DIV(
1632 .name = "pll_video_sec",
1633 .source_pll = "pll_video_core",
1634 .ctrl_reg = PLL_VIDEO_SEC,
1635 .fc0_src = FC_NUM(5, 3),
1638 [RP1_CLK_SYS] = REGISTER_CLK(
1640 .parents = {"xosc", "-", "pll_sys"},
1641 .num_std_parents = 3,
1642 .num_aux_parents = 0,
1643 .ctrl_reg = CLK_SYS_CTRL,
1644 .div_int_reg = CLK_SYS_DIV_INT,
1645 .sel_reg = CLK_SYS_SEL,
1646 .div_int_max = DIV_INT_24BIT_MAX,
1647 .fc0_src = FC_NUM(0, 4),
1648 .clk_src_mask = 0x3,
1651 [RP1_CLK_SLOW_SYS] = REGISTER_CLK(
1652 .name = "clk_slow_sys",
1653 .parents = {"xosc"},
1654 .num_std_parents = 1,
1655 .num_aux_parents = 0,
1656 .ctrl_reg = CLK_SLOW_SYS_CTRL,
1657 .div_int_reg = CLK_SLOW_SYS_DIV_INT,
1658 .sel_reg = CLK_SLOW_SYS_SEL,
1659 .div_int_max = DIV_INT_8BIT_MAX,
1660 .fc0_src = FC_NUM(1, 4),
1661 .clk_src_mask = 0x1,
1664 [RP1_CLK_UART] = REGISTER_CLK(
1666 .parents = {"pll_sys_pri_ph",
1669 .num_std_parents = 0,
1670 .num_aux_parents = 3,
1671 .ctrl_reg = CLK_UART_CTRL,
1672 .div_int_reg = CLK_UART_DIV_INT,
1673 .sel_reg = CLK_UART_SEL,
1674 .div_int_max = DIV_INT_8BIT_MAX,
1675 .fc0_src = FC_NUM(6, 7),
1678 [RP1_CLK_ETH] = REGISTER_CLK(
1681 .num_std_parents = 1,
1682 .num_aux_parents = 0,
1683 .ctrl_reg = CLK_ETH_CTRL,
1684 .div_int_reg = CLK_ETH_DIV_INT,
1685 .sel_reg = CLK_ETH_SEL,
1686 .div_int_max = DIV_INT_8BIT_MAX,
1687 .fc0_src = FC_NUM(4, 6),
1690 [RP1_CLK_PWM0] = REGISTER_CLK(
1692 .parents = {"pll_audio_pri_ph",
1695 .num_std_parents = 0,
1696 .num_aux_parents = 3,
1697 .ctrl_reg = CLK_PWM0_CTRL,
1698 .div_int_reg = CLK_PWM0_DIV_INT,
1699 .div_frac_reg = CLK_PWM0_DIV_FRAC,
1700 .sel_reg = CLK_PWM0_SEL,
1701 .div_int_max = DIV_INT_16BIT_MAX,
1702 .fc0_src = FC_NUM(0, 5),
1705 [RP1_CLK_PWM1] = REGISTER_CLK(
1707 .parents = {"pll_audio_pri_ph",
1710 .num_std_parents = 0,
1711 .num_aux_parents = 3,
1712 .ctrl_reg = CLK_PWM1_CTRL,
1713 .div_int_reg = CLK_PWM1_DIV_INT,
1714 .div_frac_reg = CLK_PWM1_DIV_FRAC,
1715 .sel_reg = CLK_PWM1_SEL,
1716 .div_int_max = DIV_INT_16BIT_MAX,
1717 .fc0_src = FC_NUM(1, 5),
1720 [RP1_CLK_AUDIO_IN] = REGISTER_CLK(
1721 .name = "clk_audio_in",
1723 .num_std_parents = 1,
1724 .num_aux_parents = 0,
1725 .ctrl_reg = CLK_AUDIO_IN_CTRL,
1726 .div_int_reg = CLK_AUDIO_IN_DIV_INT,
1727 .sel_reg = CLK_AUDIO_IN_SEL,
1728 .div_int_max = DIV_INT_8BIT_MAX,
1729 .fc0_src = FC_NUM(2, 5),
1732 [RP1_CLK_AUDIO_OUT] = REGISTER_CLK(
1733 .name = "clk_audio_out",
1735 .num_std_parents = 1,
1736 .num_aux_parents = 0,
1737 .ctrl_reg = CLK_AUDIO_OUT_CTRL,
1738 .div_int_reg = CLK_AUDIO_OUT_DIV_INT,
1739 .sel_reg = CLK_AUDIO_OUT_SEL,
1740 .div_int_max = DIV_INT_8BIT_MAX,
1741 .fc0_src = FC_NUM(3, 5),
1744 [RP1_CLK_I2S] = REGISTER_CLK(
1749 .num_std_parents = 0,
1750 .num_aux_parents = 3,
1751 .ctrl_reg = CLK_I2S_CTRL,
1752 .div_int_reg = CLK_I2S_DIV_INT,
1753 .sel_reg = CLK_I2S_SEL,
1754 .div_int_max = DIV_INT_8BIT_MAX,
1755 .fc0_src = FC_NUM(4, 4),
1758 [RP1_CLK_MIPI0_CFG] = REGISTER_CLK(
1759 .name = "clk_mipi0_cfg",
1760 .parents = {"xosc"},
1761 .num_std_parents = 0,
1762 .num_aux_parents = 1,
1763 .ctrl_reg = CLK_MIPI0_CFG_CTRL,
1764 .div_int_reg = CLK_MIPI0_CFG_DIV_INT,
1765 .sel_reg = CLK_MIPI0_CFG_SEL,
1766 .div_int_max = DIV_INT_8BIT_MAX,
1767 .fc0_src = FC_NUM(4, 5),
1770 [RP1_CLK_MIPI1_CFG] = REGISTER_CLK(
1771 .name = "clk_mipi1_cfg",
1772 .parents = {"xosc"},
1773 .num_std_parents = 0,
1774 .num_aux_parents = 1,
1775 .ctrl_reg = CLK_MIPI1_CFG_CTRL,
1776 .div_int_reg = CLK_MIPI1_CFG_DIV_INT,
1777 .sel_reg = CLK_MIPI1_CFG_SEL,
1779 .div_int_max = DIV_INT_8BIT_MAX,
1780 .fc0_src = FC_NUM(5, 6),
1783 [RP1_CLK_ETH_TSU] = REGISTER_CLK(
1784 .name = "clk_eth_tsu",
1785 .parents = {"xosc"},
1786 .num_std_parents = 0,
1787 .num_aux_parents = 1,
1788 .ctrl_reg = CLK_ETH_TSU_CTRL,
1789 .div_int_reg = CLK_ETH_TSU_DIV_INT,
1790 .sel_reg = CLK_ETH_TSU_SEL,
1791 .div_int_max = DIV_INT_8BIT_MAX,
1792 .fc0_src = FC_NUM(5, 7),
1795 [RP1_CLK_ADC] = REGISTER_CLK(
1797 .parents = {"xosc"},
1798 .num_std_parents = 0,
1799 .num_aux_parents = 1,
1800 .ctrl_reg = CLK_ADC_CTRL,
1801 .div_int_reg = CLK_ADC_DIV_INT,
1802 .sel_reg = CLK_ADC_SEL,
1803 .div_int_max = DIV_INT_8BIT_MAX,
1804 .fc0_src = FC_NUM(5, 5),
1807 [RP1_CLK_SDIO_TIMER] = REGISTER_CLK(
1808 .name = "clk_sdio_timer",
1809 .parents = {"xosc"},
1810 .num_std_parents = 0,
1811 .num_aux_parents = 1,
1812 .ctrl_reg = CLK_SDIO_TIMER_CTRL,
1813 .div_int_reg = CLK_SDIO_TIMER_DIV_INT,
1814 .sel_reg = CLK_SDIO_TIMER_SEL,
1815 .div_int_max = DIV_INT_8BIT_MAX,
1816 .fc0_src = FC_NUM(3, 4),
1819 [RP1_CLK_SDIO_ALT_SRC] = REGISTER_CLK(
1820 .name = "clk_sdio_alt_src",
1821 .parents = {"pll_sys"},
1822 .num_std_parents = 0,
1823 .num_aux_parents = 1,
1824 .ctrl_reg = CLK_SDIO_ALT_SRC_CTRL,
1825 .div_int_reg = CLK_SDIO_ALT_SRC_DIV_INT,
1826 .sel_reg = CLK_SDIO_ALT_SRC_SEL,
1827 .div_int_max = DIV_INT_8BIT_MAX,
1828 .fc0_src = FC_NUM(5, 4),
1831 [RP1_CLK_GP0] = REGISTER_CLK(
1833 .parents = {"xosc"},
1834 .num_std_parents = 0,
1835 .num_aux_parents = 1,
1836 .ctrl_reg = CLK_GP0_CTRL,
1837 .div_int_reg = CLK_GP0_DIV_INT,
1838 .div_frac_reg = CLK_GP0_DIV_FRAC,
1839 .sel_reg = CLK_GP0_SEL,
1840 .div_int_max = DIV_INT_16BIT_MAX,
1841 .fc0_src = FC_NUM(0, 1),
1844 [RP1_CLK_GP1] = REGISTER_CLK(
1846 .parents = {"xosc"},
1847 .num_std_parents = 0,
1848 .num_aux_parents = 1,
1849 .ctrl_reg = CLK_GP1_CTRL,
1850 .div_int_reg = CLK_GP1_DIV_INT,
1851 .div_frac_reg = CLK_GP1_DIV_FRAC,
1852 .sel_reg = CLK_GP1_SEL,
1853 .div_int_max = DIV_INT_16BIT_MAX,
1854 .fc0_src = FC_NUM(1, 1),
1857 [RP1_CLK_GP2] = REGISTER_CLK(
1859 .parents = {"xosc"},
1860 .num_std_parents = 0,
1861 .num_aux_parents = 1,
1862 .ctrl_reg = CLK_GP2_CTRL,
1863 .div_int_reg = CLK_GP2_DIV_INT,
1864 .div_frac_reg = CLK_GP2_DIV_FRAC,
1865 .sel_reg = CLK_GP2_SEL,
1866 .div_int_max = DIV_INT_16BIT_MAX,
1867 .fc0_src = FC_NUM(2, 1),
1870 [RP1_CLK_GP3] = REGISTER_CLK(
1872 .parents = {"xosc"},
1873 .num_std_parents = 0,
1874 .num_aux_parents = 1,
1875 .ctrl_reg = CLK_GP3_CTRL,
1876 .div_int_reg = CLK_GP3_DIV_INT,
1877 .div_frac_reg = CLK_GP3_DIV_FRAC,
1878 .sel_reg = CLK_GP3_SEL,
1879 .div_int_max = DIV_INT_16BIT_MAX,
1880 .fc0_src = FC_NUM(3, 1),
1883 [RP1_CLK_GP4] = REGISTER_CLK(
1885 .parents = {"xosc"},
1886 .num_std_parents = 0,
1887 .num_aux_parents = 1,
1888 .ctrl_reg = CLK_GP4_CTRL,
1889 .div_int_reg = CLK_GP4_DIV_INT,
1890 .div_frac_reg = CLK_GP4_DIV_FRAC,
1891 .sel_reg = CLK_GP4_SEL,
1892 .div_int_max = DIV_INT_16BIT_MAX,
1893 .fc0_src = FC_NUM(4, 1),
1896 [RP1_CLK_GP5] = REGISTER_CLK(
1898 .parents = {"xosc"},
1899 .num_std_parents = 0,
1900 .num_aux_parents = 1,
1901 .ctrl_reg = CLK_GP5_CTRL,
1902 .div_int_reg = CLK_GP5_DIV_INT,
1903 .div_frac_reg = CLK_GP5_DIV_FRAC,
1904 .sel_reg = CLK_GP5_SEL,
1905 .div_int_max = DIV_INT_16BIT_MAX,
1906 .fc0_src = FC_NUM(5, 1),
1909 [RP1_CLK_VEC] = REGISTER_CLK(
1911 .parents = {"pll_sys_pri_ph",
1919 .num_std_parents = 0,
1920 .num_aux_parents = 8, /* XXX in fact there are more than 8 */
1921 .ctrl_reg = VIDEO_CLK_VEC_CTRL,
1922 .div_int_reg = VIDEO_CLK_VEC_DIV_INT,
1923 .sel_reg = VIDEO_CLK_VEC_SEL,
1924 .flags = CLK_SET_RATE_NO_REPARENT, /* Let VEC driver set parent */
1925 .div_int_max = DIV_INT_8BIT_MAX,
1926 .fc0_src = FC_NUM(0, 6),
1929 [RP1_CLK_DPI] = REGISTER_CLK(
1931 .parents = {"pll_sys",
1939 .num_std_parents = 0,
1940 .num_aux_parents = 8, /* XXX in fact there are more than 8 */
1941 .ctrl_reg = VIDEO_CLK_DPI_CTRL,
1942 .div_int_reg = VIDEO_CLK_DPI_DIV_INT,
1943 .sel_reg = VIDEO_CLK_DPI_SEL,
1944 .flags = CLK_SET_RATE_NO_REPARENT, /* Let DPI driver set parent */
1945 .div_int_max = DIV_INT_8BIT_MAX,
1946 .fc0_src = FC_NUM(1, 6),
1949 [RP1_CLK_MIPI0_DPI] = REGISTER_CLK(
1950 .name = "clk_mipi0_dpi",
1951 .parents = {"pll_sys",
1954 "clksrc_mipi0_dsi_byteclk",
1959 .num_std_parents = 0,
1960 .num_aux_parents = 8, /* XXX in fact there are more than 8 */
1961 .ctrl_reg = VIDEO_CLK_MIPI0_DPI_CTRL,
1962 .div_int_reg = VIDEO_CLK_MIPI0_DPI_DIV_INT,
1963 .div_frac_reg = VIDEO_CLK_MIPI0_DPI_DIV_FRAC,
1964 .sel_reg = VIDEO_CLK_MIPI0_DPI_SEL,
1965 .flags = CLK_SET_RATE_NO_REPARENT, /* Let DSI driver set parent */
1966 .div_int_max = DIV_INT_8BIT_MAX,
1967 .fc0_src = FC_NUM(2, 6),
1970 [RP1_CLK_MIPI1_DPI] = REGISTER_CLK(
1971 .name = "clk_mipi1_dpi",
1972 .parents = {"pll_sys",
1975 "clksrc_mipi1_dsi_byteclk",
1980 .num_std_parents = 0,
1981 .num_aux_parents = 8, /* XXX in fact there are more than 8 */
1982 .ctrl_reg = VIDEO_CLK_MIPI1_DPI_CTRL,
1983 .div_int_reg = VIDEO_CLK_MIPI1_DPI_DIV_INT,
1984 .div_frac_reg = VIDEO_CLK_MIPI1_DPI_DIV_FRAC,
1985 .sel_reg = VIDEO_CLK_MIPI1_DPI_SEL,
1986 .flags = CLK_SET_RATE_NO_REPARENT, /* Let DSI driver set parent */
1987 .div_int_max = DIV_INT_8BIT_MAX,
1988 .fc0_src = FC_NUM(3, 6),
1992 static bool rp1_clk_claimed[ARRAY_SIZE(clk_desc_array)];
1994 static bool rp1_clk_is_claimed(const char *name)
1998 for (i = 0; i < ARRAY_SIZE(clk_desc_array); i++) {
1999 if (clk_desc_array[i].data) {
2000 const char *clk_name = *(const char **)(clk_desc_array[i].data);
2002 if (!strcmp(name, clk_name))
2003 return rp1_clk_claimed[i];
2010 static int rp1_clk_probe(struct platform_device *pdev)
2012 const struct rp1_clk_desc *desc;
2013 struct device *dev = &pdev->dev;
2014 struct rp1_clockman *clockman;
2015 struct resource *res;
2016 struct clk_hw **hws;
2017 const size_t asize = ARRAY_SIZE(clk_desc_array);
2018 u32 chip_id, platform;
2023 clockman = devm_kzalloc(dev, struct_size(clockman, onecell.hws, asize),
2028 rp1_get_platform(&chip_id, &platform);
2030 spin_lock_init(&clockman->regs_lock);
2031 clockman->dev = dev;
2032 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2033 clockman->regs = devm_ioremap_resource(&pdev->dev, res);
2034 if (IS_ERR(clockman->regs))
2035 return PTR_ERR(clockman->regs);
2037 memset(rp1_clk_claimed, 0, sizeof(rp1_clk_claimed));
2039 !of_property_read_u32_index(pdev->dev.of_node, "claim-clocks",
2042 rp1_clk_claimed[clk_id] = true;
2044 platform_set_drvdata(pdev, clockman);
2046 clockman->onecell.num = asize;
2047 hws = clockman->onecell.hws;
2049 for (i = 0; i < asize; i++) {
2050 desc = &clk_desc_array[i];
2051 if (desc->clk_register && desc->data)
2052 hws[i] = desc->clk_register(clockman, desc->data);
2055 ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
2056 &clockman->onecell);
2063 static const struct of_device_id rp1_clk_of_match[] = {
2064 { .compatible = "raspberrypi,rp1-clocks" },
2067 MODULE_DEVICE_TABLE(of, rp1_clk_of_match);
2069 static struct platform_driver rp1_clk_driver = {
2072 .of_match_table = rp1_clk_of_match,
2074 .probe = rp1_clk_probe,
2077 static int __init __rp1_clk_driver_init(void)
2079 return platform_driver_register(&rp1_clk_driver);
2081 postcore_initcall(__rp1_clk_driver_init);
2083 MODULE_AUTHOR("Naushir Patuck <naush@raspberrypi.com>");
2084 MODULE_DESCRIPTION("RP1 clock driver");
2085 MODULE_LICENSE("GPL");