drm: rp1: rp1-vec: Allow non-standard modes with various crops
[platform/kernel/linux-rpi.git] / drivers / clk / clk-rp1.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2023 Raspberry Pi Ltd.
4  *
5  * Clock driver for RP1 PCIe multifunction chip.
6  */
7
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>
13 #include <linux/io.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>
20
21 #include <asm/div64.h>
22
23 #include <dt-bindings/clock/rp1.h>
24
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
31
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
38
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
45
46 #define CLK_SYS_CTRL                    0x00014
47 #define CLK_SYS_DIV_INT                 0x00018
48 #define CLK_SYS_SEL                     0x00020
49
50 #define CLK_SLOW_SYS_CTRL               0x00024
51 #define CLK_SLOW_SYS_DIV_INT            0x00028
52 #define CLK_SLOW_SYS_SEL                0x00030
53
54 #define CLK_DMA_CTRL                    0x00044
55 #define CLK_DMA_DIV_INT                 0x00048
56 #define CLK_DMA_SEL                     0x00050
57
58 #define CLK_UART_CTRL                   0x00054
59 #define CLK_UART_DIV_INT                0x00058
60 #define CLK_UART_SEL                    0x00060
61
62 #define CLK_ETH_CTRL                    0x00064
63 #define CLK_ETH_DIV_INT                 0x00068
64 #define CLK_ETH_SEL                     0x00070
65
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
70
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
75
76 #define CLK_AUDIO_IN_CTRL               0x00094
77 #define CLK_AUDIO_IN_DIV_INT            0x00098
78 #define CLK_AUDIO_IN_SEL                0x000a0
79
80 #define CLK_AUDIO_OUT_CTRL              0x000a4
81 #define CLK_AUDIO_OUT_DIV_INT           0x000a8
82 #define CLK_AUDIO_OUT_SEL               0x000b0
83
84 #define CLK_I2S_CTRL                    0x000b4
85 #define CLK_I2S_DIV_INT                 0x000b8
86 #define CLK_I2S_SEL                     0x000c0
87
88 #define CLK_MIPI0_CFG_CTRL              0x000c4
89 #define CLK_MIPI0_CFG_DIV_INT           0x000c8
90 #define CLK_MIPI0_CFG_SEL               0x000d0
91
92 #define CLK_MIPI1_CFG_CTRL              0x000d4
93 #define CLK_MIPI1_CFG_DIV_INT           0x000d8
94 #define CLK_MIPI1_CFG_SEL               0x000e0
95
96 #define CLK_PCIE_AUX_CTRL               0x000e4
97 #define CLK_PCIE_AUX_DIV_INT            0x000e8
98 #define CLK_PCIE_AUX_SEL                0x000f0
99
100 #define CLK_USBH0_MICROFRAME_CTRL       0x000f4
101 #define CLK_USBH0_MICROFRAME_DIV_INT    0x000f8
102 #define CLK_USBH0_MICROFRAME_SEL        0x00100
103
104 #define CLK_USBH1_MICROFRAME_CTRL       0x00104
105 #define CLK_USBH1_MICROFRAME_DIV_INT    0x00108
106 #define CLK_USBH1_MICROFRAME_SEL        0x00110
107
108 #define CLK_USBH0_SUSPEND_CTRL          0x00114
109 #define CLK_USBH0_SUSPEND_DIV_INT       0x00118
110 #define CLK_USBH0_SUSPEND_SEL           0x00120
111
112 #define CLK_USBH1_SUSPEND_CTRL          0x00124
113 #define CLK_USBH1_SUSPEND_DIV_INT       0x00128
114 #define CLK_USBH1_SUSPEND_SEL           0x00130
115
116 #define CLK_ETH_TSU_CTRL                0x00134
117 #define CLK_ETH_TSU_DIV_INT             0x00138
118 #define CLK_ETH_TSU_SEL                 0x00140
119
120 #define CLK_ADC_CTRL                    0x00144
121 #define CLK_ADC_DIV_INT                 0x00148
122 #define CLK_ADC_SEL                     0x00150
123
124 #define CLK_SDIO_TIMER_CTRL             0x00154
125 #define CLK_SDIO_TIMER_DIV_INT          0x00158
126 #define CLK_SDIO_TIMER_SEL              0x00160
127
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
131
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
136
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
141
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
146
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
151
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
156
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
161
162 #define CLK_SYS_RESUS_CTRL              0x0020c
163
164 #define CLK_SLOW_SYS_RESUS_CTRL         0x00214
165
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
174 #define FC_SIZE                         0x20
175 #define FC_COUNT                        8
176 #define FC_NUM(idx, off)                ((idx) * 32 + (off))
177
178 #define AUX_SEL                         1
179
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)
195
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 */
199
200 #define FC0_STATUS_DONE                 BIT(4)
201 #define FC0_STATUS_RUNNING              BIT(8)
202 #define FC0_RESULT_FRAC_SHIFT           5
203
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
208
209 #define PLL_SEC_DIV_SHIFT               8
210 #define PLL_SEC_DIV_WIDTH               5
211 #define PLL_SEC_DIV_MASK                0x00001f00
212
213 #define PLL_CS_LOCK                     BIT(31)
214 #define PLL_CS_REFDIV_SHIFT             0
215
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
223
224 #define PLL_SEC_RST                     BIT(16)
225 #define PLL_SEC_IMPL                    BIT(31)
226
227 /* PLL phase output for both PRI and SEC */
228 #define PLL_PH_EN                       BIT(4)
229 #define PLL_PH_PHASE_SHIFT              0
230
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
235
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
242
243 #define KHz                             1000
244 #define MHz                             (KHz * KHz)
245 #define LOCK_TIMEOUT_NS                 100000000
246 #define FC_TIMEOUT_NS                   100000000
247
248 #define MAX_CLK_PARENTS 8
249
250 #define MEASURE_CLOCK_RATE
251 const char * const fc0_ref_clk_name = "clk_slow_sys";
252
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))
255
256 /*
257  * Names of the reference clock for the pll cores.  This name must match
258  * the DT reference clock-output-name.
259  */
260 static const char *const ref_clock = "xosc";
261
262 /*
263  * Secondary PLL channel output divider table.
264  * Divider values range from 8 to 19.
265  * Invalid values default to 19
266  */
267 static const struct clk_div_table pll_sec_div_table[] = {
268         { 0x00, 19 },
269         { 0x01, 19 },
270         { 0x02, 19 },
271         { 0x03, 19 },
272         { 0x04, 19 },
273         { 0x05, 19 },
274         { 0x06, 19 },
275         { 0x07, 19 },
276         { 0x08,  8 },
277         { 0x09,  9 },
278         { 0x0a, 10 },
279         { 0x0b, 11 },
280         { 0x0c, 12 },
281         { 0x0d, 13 },
282         { 0x0e, 14 },
283         { 0x0f, 15 },
284         { 0x10, 16 },
285         { 0x11, 17 },
286         { 0x12, 18 },
287         { 0x13, 19 },
288         { 0x14, 19 },
289         { 0x15, 19 },
290         { 0x16, 19 },
291         { 0x17, 19 },
292         { 0x18, 19 },
293         { 0x19, 19 },
294         { 0x1a, 19 },
295         { 0x1b, 19 },
296         { 0x1c, 19 },
297         { 0x1d, 19 },
298         { 0x1e, 19 },
299         { 0x1f, 19 },
300         { 0 }
301 };
302
303 struct rp1_clockman {
304         struct device *dev;
305         void __iomem *regs;
306         spinlock_t regs_lock; /* spinlock for all clocks */
307
308         /* Must be last */
309         struct clk_hw_onecell_data onecell;
310 };
311
312 struct rp1_pll_core_data {
313         const char *name;
314         u32 cs_reg;
315         u32 pwr_reg;
316         u32 fbdiv_int_reg;
317         u32 fbdiv_frac_reg;
318         unsigned long flags;
319         u32 fc0_src;
320 };
321
322 struct rp1_pll_data {
323         const char *name;
324         const char *source_pll;
325         u32 ctrl_reg;
326         unsigned long flags;
327         u32 fc0_src;
328 };
329
330 struct rp1_pll_ph_data {
331         const char *name;
332         const char *source_pll;
333         unsigned int phase;
334         unsigned int fixed_divider;
335         u32 ph_reg;
336         unsigned long flags;
337         u32 fc0_src;
338 };
339
340 struct rp1_pll_divider_data {
341         const char *name;
342         const char *source_pll;
343         u32 sec_reg;
344         unsigned long flags;
345         u32 fc0_src;
346 };
347
348 struct rp1_clock_data {
349         const char *name;
350         const char *const parents[MAX_CLK_PARENTS];
351         int num_std_parents;
352         int num_aux_parents;
353         unsigned long flags;
354         u32 clk_src_mask;
355         u32 ctrl_reg;
356         u32 div_int_reg;
357         u32 div_frac_reg;
358         u32 sel_reg;
359         u32 div_int_max;
360         u32 fc0_src;
361 };
362
363 struct rp1_pll_core {
364         struct clk_hw hw;
365         struct rp1_clockman *clockman;
366         const struct rp1_pll_core_data *data;
367         unsigned long cached_rate;
368 };
369
370 struct rp1_pll {
371         struct clk_hw hw;
372         struct clk_divider div;
373         struct rp1_clockman *clockman;
374         const struct rp1_pll_data *data;
375         unsigned long cached_rate;
376 };
377
378 struct rp1_pll_ph {
379         struct clk_hw hw;
380         struct rp1_clockman *clockman;
381         const struct rp1_pll_ph_data *data;
382 };
383
384 struct rp1_clock {
385         struct clk_hw hw;
386         struct rp1_clockman *clockman;
387         const struct rp1_clock_data *data;
388         unsigned long cached_rate;
389 };
390
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)
394 {
395         struct debugfs_regset32 *regset;
396
397         regset = devm_kzalloc(clockman->dev, sizeof(*regset), GFP_KERNEL);
398         if (!regset)
399                 return;
400
401         regset->regs = regs;
402         regset->nregs = nregs;
403         regset->base = clockman->regs + base;
404
405         debugfs_create_regset32("regdump", 0444, dentry, regset);
406 }
407
408 static inline u32 set_register_field(u32 reg, u32 val, u32 mask, u32 shift)
409 {
410         reg &= ~mask;
411         reg |= (val << shift) & mask;
412         return reg;
413 }
414
415 static inline
416 void clockman_write(struct rp1_clockman *clockman, u32 reg, u32 val)
417 {
418         writel(val, clockman->regs + reg);
419 }
420
421 static inline u32 clockman_read(struct rp1_clockman *clockman, u32 reg)
422 {
423         return readl(clockman->regs + reg);
424 }
425
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)
430 {
431         struct clk *ref_clk = __clk_lookup(fc0_ref_clk_name);
432         unsigned long result;
433         ktime_t timeout;
434         unsigned int fc_idx, fc_offset, fc_src;
435
436         fc_idx = fc0_src / 32;
437         fc_src = fc0_src % 32;
438
439         /* fc_src == 0 is invalid. */
440         if (!fc_src || fc_idx >= FC_COUNT)
441                 return 0;
442
443         fc_offset = fc_idx * FC_SIZE;
444
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",
450                                 clk_name);
451                         return 0;
452                 }
453                 cpu_relax();
454         }
455
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);
465
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",
471                                 clk_name);
472                         return 0;
473                 }
474                 cpu_relax();
475         }
476
477         result = clockman_read(clockman, fc_offset + FC0_RESULT);
478
479         /* Disable FC0 */
480         spin_lock(&clockman->regs_lock);
481         clockman_write(clockman, fc_offset + FC0_SRC, 0);
482         spin_unlock(&clockman->regs_lock);
483
484         return result;
485 }
486 #endif
487
488 static int rp1_pll_core_is_on(struct clk_hw *hw)
489 {
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);
494
495         return (pwr & PLL_PWR_PD) || (pwr & PLL_PWR_POSTDIVPD);
496 }
497
498 static int rp1_pll_core_on(struct clk_hw *hw)
499 {
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;
503         u32 fbdiv_frac;
504         ktime_t timeout;
505
506         spin_lock(&clockman->regs_lock);
507
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);
514         }
515
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);
520
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));
527                         return -ETIMEDOUT;
528                 }
529                 cpu_relax();
530         }
531
532         return 0;
533 }
534
535 static void rp1_pll_core_off(struct clk_hw *hw)
536 {
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;
540
541         spin_lock(&clockman->regs_lock);
542         clockman_write(clockman, data->pwr_reg, 0);
543         spin_unlock(&clockman->regs_lock);
544 }
545
546 static inline unsigned long get_pll_core_divider(struct clk_hw *hw,
547                                                  unsigned long rate,
548                                                  unsigned long parent_rate,
549                                                  u32 *div_int, u32 *div_frac)
550 {
551         unsigned long calc_rate;
552         u32 fbdiv_int, fbdiv_frac;
553         u64 div_fp64; /* 32.32 fixed point fraction. */
554
555         /* Factor of reference clock to VCO frequency. */
556         div_fp64 = (u64)(rate) << 32;
557         div_fp64 = DIV_U64_NEAREST(div_fp64, parent_rate);
558
559         /* Round the fractional component at 24 bits. */
560         div_fp64 += 1 << (32 - 24 - 1);
561
562         fbdiv_int = div_fp64 >> 32;
563         fbdiv_frac = (div_fp64 >> (32 - 24)) & 0xffffff;
564
565         calc_rate =
566                 ((u64)parent_rate * (((u64)fbdiv_int << 24) + fbdiv_frac) + (1 << 23)) >> 24;
567
568         *div_int = fbdiv_int;
569         *div_frac = fbdiv_frac;
570
571         return calc_rate;
572 }
573
574 static int rp1_pll_core_set_rate(struct clk_hw *hw,
575                                  unsigned long rate, unsigned long parent_rate)
576 {
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;
582
583         // todo: is this needed??
584         //rp1_pll_off(hw);
585
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);
591
592         calc_rate = get_pll_core_divider(hw, rate, parent_rate,
593                                          &fbdiv_int, &fbdiv_frac);
594
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);
600
601         /* Check that reference frequency is no greater than VCO / 16. */
602         BUG_ON(parent_rate > (rate / 16));
603
604         pll_core->cached_rate = calc_rate;
605
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);
612
613         return 0;
614 }
615
616 static unsigned long rp1_pll_core_recalc_rate(struct clk_hw *hw,
617                                               unsigned long parent_rate)
618 {
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;
624
625         fbdiv_int = clockman_read(clockman, data->fbdiv_int_reg);
626         fbdiv_frac = clockman_read(clockman, data->fbdiv_frac_reg);
627         calc_rate =
628                 ((u64)parent_rate * (((u64)fbdiv_int << 24) + fbdiv_frac) + (1 << 23)) >> 24;
629
630         return calc_rate;
631 }
632
633 static long rp1_pll_core_round_rate(struct clk_hw *hw, unsigned long rate,
634                                     unsigned long *parent_rate)
635 {
636         u32 fbdiv_int, fbdiv_frac;
637         long calc_rate;
638
639         calc_rate = get_pll_core_divider(hw, rate, *parent_rate,
640                                          &fbdiv_int, &fbdiv_frac);
641         return calc_rate;
642 }
643
644 static void rp1_pll_core_debug_init(struct clk_hw *hw, struct dentry *dentry)
645 {
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;
650
651         regs = devm_kcalloc(clockman->dev, 4, sizeof(*regs), GFP_KERNEL);
652         if (!regs)
653                 return;
654
655         regs[0].name = "cs";
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;
663
664         rp1_debugfs_regset(clockman, 0, regs, 4, dentry);
665 }
666
667 static void get_pll_prim_dividers(unsigned long rate, unsigned long parent_rate,
668                                   u32 *divider1, u32 *divider2)
669 {
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;
675
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);
680
681                         if (calc_rate == rate) {
682                                 best_div1 = div1;
683                                 best_div2 = div2;
684                                 goto done;
685                         } else if (rate_diff < best_rate_diff) {
686                                 best_div1 = div1;
687                                 best_div2 = div2;
688                                 best_rate_diff = rate_diff;
689                         }
690                 }
691         }
692
693 done:
694         *divider1 = best_div1;
695         *divider2 = best_div2;
696 }
697
698 static int rp1_pll_set_rate(struct clk_hw *hw,
699                             unsigned long rate, unsigned long parent_rate)
700 {
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;
705
706         get_pll_prim_dividers(rate, parent_rate, &prim_div1, &prim_div2);
707
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);
716
717 #ifdef MEASURE_CLOCK_RATE
718         clockman_measure_clock(clockman, data->name, data->fc0_src);
719 #endif
720         return 0;
721 }
722
723 static unsigned long rp1_pll_recalc_rate(struct clk_hw *hw,
724                                          unsigned long parent_rate)
725 {
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;
730
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;
734
735         if (!prim_div1 || !prim_div2) {
736                 dev_err(clockman->dev, "%s: (%s) zero divider value\n",
737                         __func__, data->name);
738                 return 0;
739         }
740
741         return DIV_ROUND_CLOSEST(parent_rate, prim_div1 * prim_div2);
742 }
743
744 static long rp1_pll_round_rate(struct clk_hw *hw, unsigned long rate,
745                                unsigned long *parent_rate)
746 {
747         u32 div1, div2;
748
749         get_pll_prim_dividers(rate, *parent_rate, &div1, &div2);
750
751         return DIV_ROUND_CLOSEST(*parent_rate, div1 * div2);
752 }
753
754 static void rp1_pll_debug_init(struct clk_hw *hw,
755                                struct dentry *dentry)
756 {
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;
761
762         regs = devm_kcalloc(clockman->dev, 1, sizeof(*regs), GFP_KERNEL);
763         if (!regs)
764                 return;
765
766         regs[0].name = "prim";
767         regs[0].offset = data->ctrl_reg;
768
769         rp1_debugfs_regset(clockman, 0, regs, 1, dentry);
770 }
771
772 static int rp1_pll_ph_is_on(struct clk_hw *hw)
773 {
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;
777
778         return !!(clockman_read(clockman, data->ph_reg) & PLL_PH_EN);
779 }
780
781 static int rp1_pll_ph_on(struct clk_hw *hw)
782 {
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;
786         u32 ph_reg;
787
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;
792         ph_reg |= PLL_PH_EN;
793         clockman_write(clockman, data->ph_reg, ph_reg);
794         spin_unlock(&clockman->regs_lock);
795
796 #ifdef MEASURE_CLOCK_RATE
797         clockman_measure_clock(clockman, data->name, data->fc0_src);
798 #endif
799         return 0;
800 }
801
802 static void rp1_pll_ph_off(struct clk_hw *hw)
803 {
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;
807
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);
812 }
813
814 static int rp1_pll_ph_set_rate(struct clk_hw *hw,
815                                unsigned long rate, unsigned long parent_rate)
816 {
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;
820
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);
824
825 #ifdef MEASURE_CLOCK_RATE
826         if (rp1_pll_ph_is_on(hw))
827                 clockman_measure_clock(clockman, data->name, data->fc0_src);
828 #endif
829         return 0;
830 }
831
832 static unsigned long rp1_pll_ph_recalc_rate(struct clk_hw *hw,
833                                             unsigned long parent_rate)
834 {
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;
837
838         return parent_rate / data->fixed_divider;
839 }
840
841 static long rp1_pll_ph_round_rate(struct clk_hw *hw, unsigned long rate,
842                                   unsigned long *parent_rate)
843 {
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;
846
847         return *parent_rate / data->fixed_divider;
848 }
849
850 static void rp1_pll_ph_debug_init(struct clk_hw *hw,
851                                   struct dentry *dentry)
852 {
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;
857
858         regs = devm_kcalloc(clockman->dev, 1, sizeof(*regs), GFP_KERNEL);
859         if (!regs)
860                 return;
861
862         regs[0].name = "ph_reg";
863         regs[0].offset = data->ph_reg;
864
865         rp1_debugfs_regset(clockman, 0, regs, 1, dentry);
866 }
867
868 static int rp1_pll_divider_is_on(struct clk_hw *hw)
869 {
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;
873
874         return !(clockman_read(clockman, data->ctrl_reg) & PLL_SEC_RST);
875 }
876
877 static int rp1_pll_divider_on(struct clk_hw *hw)
878 {
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;
882
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);
889
890 #ifdef MEASURE_CLOCK_RATE
891         clockman_measure_clock(clockman, data->name, data->fc0_src);
892 #endif
893         return 0;
894 }
895
896 static void rp1_pll_divider_off(struct clk_hw *hw)
897 {
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;
901
902         spin_lock(&clockman->regs_lock);
903         clockman_write(clockman, data->ctrl_reg, PLL_SEC_RST);
904         spin_unlock(&clockman->regs_lock);
905 }
906
907 static int rp1_pll_divider_set_rate(struct clk_hw *hw,
908                                     unsigned long rate,
909                                     unsigned long parent_rate)
910 {
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;
914         u32 div, sec;
915
916         div = DIV_ROUND_UP_ULL(parent_rate, rate);
917         div = clamp(div, 8u, 19u);
918
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);
922
923         /* Must keep the divider in reset to change the value. */
924         sec |= PLL_SEC_RST;
925         clockman_write(clockman, data->ctrl_reg, sec);
926
927         // todo: must sleep 10 pll vco cycles
928         sec &= ~PLL_SEC_RST;
929         clockman_write(clockman, data->ctrl_reg, sec);
930         spin_unlock(&clockman->regs_lock);
931
932 #ifdef MEASURE_CLOCK_RATE
933         if (rp1_pll_divider_is_on(hw))
934                 clockman_measure_clock(clockman, data->name, data->fc0_src);
935 #endif
936         return 0;
937 }
938
939 static unsigned long rp1_pll_divider_recalc_rate(struct clk_hw *hw,
940                                                  unsigned long parent_rate)
941 {
942         return clk_divider_ops.recalc_rate(hw, parent_rate);
943 }
944
945 static long rp1_pll_divider_round_rate(struct clk_hw *hw,
946                                        unsigned long rate,
947                                        unsigned long *parent_rate)
948 {
949         return clk_divider_ops.round_rate(hw, rate, parent_rate);
950 }
951
952 static void rp1_pll_divider_debug_init(struct clk_hw *hw, struct dentry *dentry)
953 {
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;
958
959         regs = devm_kcalloc(clockman->dev, 1, sizeof(*regs), GFP_KERNEL);
960         if (!regs)
961                 return;
962
963         regs[0].name = "sec";
964         regs[0].offset = data->ctrl_reg;
965
966         rp1_debugfs_regset(clockman, 0, regs, 1, dentry);
967 }
968
969 static int rp1_clock_is_on(struct clk_hw *hw)
970 {
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;
974
975         return !!(clockman_read(clockman, data->ctrl_reg) & CLK_CTRL_ENABLE);
976 }
977
978 static unsigned long rp1_clock_recalc_rate(struct clk_hw *hw,
979                                            unsigned long parent_rate)
980 {
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;
984         u64 calc_rate;
985         u64 div;
986
987         u32 frac;
988
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;
992
993         /* If the integer portion of the divider is 0, treat it as 2^16 */
994         if (!div)
995                 div = 1 << 16;
996
997         div = (div << CLK_DIV_FRAC_BITS) | (frac >> (32 - CLK_DIV_FRAC_BITS));
998
999         calc_rate = (u64)parent_rate << CLK_DIV_FRAC_BITS;
1000         calc_rate = div64_u64(calc_rate, div);
1001
1002         return calc_rate;
1003 }
1004
1005 static int rp1_clock_on(struct clk_hw *hw)
1006 {
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;
1010
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);
1015
1016 #ifdef MEASURE_CLOCK_RATE
1017         clockman_measure_clock(clockman, data->name, data->fc0_src);
1018 #endif
1019         return 0;
1020 }
1021
1022 static void rp1_clock_off(struct clk_hw *hw)
1023 {
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;
1027
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);
1032 }
1033
1034 static u32 rp1_clock_choose_div(unsigned long rate, unsigned long parent_rate,
1035                                 const struct rp1_clock_data *data)
1036 {
1037         u64 div;
1038
1039         /*
1040          * Due to earlier rounding, calculated parent_rate may differ from
1041          * expected value. Don't fail on a small discrepancy near unity divide.
1042          */
1043         if (!rate || rate > parent_rate + (parent_rate >> CLK_DIV_FRAC_BITS))
1044                 return 0;
1045
1046         /*
1047          * Always express div in fixed-point format for fractional division;
1048          * If no fractional divider is present, the fraction part will be zero.
1049          */
1050         if (data->div_frac_reg) {
1051                 div = (u64)parent_rate << CLK_DIV_FRAC_BITS;
1052                 div = DIV_U64_NEAREST(div, rate);
1053         } else {
1054                 div = DIV_U64_NEAREST(parent_rate, rate);
1055                 div <<= CLK_DIV_FRAC_BITS;
1056         }
1057
1058         div = clamp(div,
1059                     1ull << CLK_DIV_FRAC_BITS,
1060                     (u64)data->div_int_max << CLK_DIV_FRAC_BITS);
1061
1062         return div;
1063 }
1064
1065 static u8 rp1_clock_get_parent(struct clk_hw *hw)
1066 {
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;
1070         u32 sel, ctrl;
1071         u8 parent;
1072
1073         /* Sel is one-hot, so find the first bit set */
1074         sel = clockman_read(clockman, data->sel_reg);
1075         parent = ffs(sel) - 1;
1076
1077         /* sel == 0 implies the parent clock is not enabled yet. */
1078         if (!sel) {
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;
1082         }
1083
1084         if (parent >= data->num_std_parents)
1085                 parent = AUX_SEL;
1086
1087         if (parent == AUX_SEL) {
1088                 /*
1089                  * Clock parent is an auxiliary source, so get the parent from
1090                  * the AUXSRC register field.
1091                  */
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;
1095         }
1096
1097         return parent;
1098 }
1099
1100 static int rp1_clock_set_parent(struct clk_hw *hw, u8 index)
1101 {
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;
1105         u32 ctrl, sel;
1106
1107         spin_lock(&clockman->regs_lock);
1108         ctrl = clockman_read(clockman, data->ctrl_reg);
1109
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)
1113                         return -EINVAL;
1114
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);
1122         } else {
1123                 ctrl = set_register_field(ctrl, index, data->clk_src_mask,
1124                                           CLK_CTRL_SRC_SHIFT);
1125         }
1126
1127         clockman_write(clockman, data->ctrl_reg, ctrl);
1128         spin_unlock(&clockman->regs_lock);
1129
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);
1133
1134         return 0;
1135 }
1136
1137 static int rp1_clock_set_rate_and_parent(struct clk_hw *hw,
1138                                          unsigned long rate,
1139                                          unsigned long parent_rate,
1140                                          u8 parent)
1141 {
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);
1146
1147         WARN(rate > 4000000000ll, "rate is -ve (%d)\n", (int)rate);
1148
1149         if (WARN(!div,
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;
1153
1154         spin_lock(&clockman->regs_lock);
1155
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));
1159
1160         spin_unlock(&clockman->regs_lock);
1161
1162         if (parent != 0xff)
1163                 rp1_clock_set_parent(hw, parent);
1164
1165 #ifdef MEASURE_CLOCK_RATE
1166         if (rp1_clock_is_on(hw))
1167                 clockman_measure_clock(clockman, data->name, data->fc0_src);
1168 #endif
1169         return 0;
1170 }
1171
1172 static int rp1_clock_set_rate(struct clk_hw *hw, unsigned long rate,
1173                               unsigned long parent_rate)
1174 {
1175         return rp1_clock_set_rate_and_parent(hw, rate, parent_rate, 0xff);
1176 }
1177
1178 static void rp1_clock_choose_div_and_prate(struct clk_hw *hw,
1179                                            int parent_idx,
1180                                            unsigned long rate,
1181                                            unsigned long *prate,
1182                                            unsigned long *calc_rate)
1183 {
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;
1187         u32 div;
1188         u64 tmp;
1189
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);
1193
1194         if (!div) {
1195                 *calc_rate = 0;
1196                 return;
1197         }
1198
1199         /* Recalculate to account for rounding errors */
1200         tmp = (u64)*prate << CLK_DIV_FRAC_BITS;
1201         tmp = div_u64(tmp, div);
1202         *calc_rate = tmp;
1203 }
1204
1205 static int rp1_clock_determine_rate(struct clk_hw *hw,
1206                                     struct clk_rate_request *req)
1207 {
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;
1213         size_t i;
1214
1215         /*
1216          * If the NO_REPARENT flag is set, try to use existing parent.
1217          */
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);
1221                 if (parent) {
1222                         rp1_clock_choose_div_and_prate(hw, i, req->rate, &prate,
1223                                                        &calc_rate);
1224                         if (calc_rate > 0) {
1225                                 req->best_parent_hw = parent;
1226                                 req->best_parent_rate = prate;
1227                                 req->rate = calc_rate;
1228                                 return 0;
1229                         }
1230                 }
1231         }
1232
1233         /*
1234          * Select parent clock that results in the closest rate (lower or
1235          * higher)
1236          */
1237         for (i = 0; i < clk_hw_get_num_parents(hw); i++) {
1238                 parent = clk_hw_get_parent_by_index(hw, i);
1239                 if (!parent)
1240                         continue;
1241
1242                 rp1_clock_choose_div_and_prate(hw, i, req->rate, &prate,
1243                                                &calc_rate);
1244
1245                 if (ABS_DIFF(calc_rate, req->rate) < best_rate_diff) {
1246                         best_parent = parent;
1247                         best_prate = prate;
1248                         best_rate = calc_rate;
1249                         best_rate_diff = ABS_DIFF(calc_rate, req->rate);
1250
1251                         if (best_rate_diff == 0)
1252                                 break;
1253                 }
1254         }
1255
1256         if (best_rate == 0)
1257                 return -EINVAL;
1258
1259         req->best_parent_hw = best_parent;
1260         req->best_parent_rate = best_prate;
1261         req->rate = best_rate;
1262
1263         return 0;
1264 }
1265
1266 static void rp1_clk_debug_init(struct clk_hw *hw, struct dentry *dentry)
1267 {
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;
1272         int i;
1273
1274         regs = devm_kcalloc(clockman->dev, 4, sizeof(*regs), GFP_KERNEL);
1275         if (!regs)
1276                 return;
1277
1278         i = 0;
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;
1287
1288         rp1_debugfs_regset(clockman, 0, regs, i, dentry);
1289 }
1290
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,
1299 };
1300
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,
1306 };
1307
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,
1316 };
1317
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,
1326 };
1327
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,
1339 };
1340
1341 static bool rp1_clk_is_claimed(const char *name);
1342
1343 static struct clk_hw *rp1_register_pll_core(struct rp1_clockman *clockman,
1344                                             const void *data)
1345 {
1346         const struct rp1_pll_core_data *pll_core_data = data;
1347         struct rp1_pll_core *pll_core;
1348         struct clk_init_data init;
1349         int ret;
1350
1351         memset(&init, 0, sizeof(init));
1352
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;
1359
1360         pll_core = kzalloc(sizeof(*pll_core), GFP_KERNEL);
1361         if (!pll_core)
1362                 return NULL;
1363
1364         pll_core->clockman = clockman;
1365         pll_core->data = pll_core_data;
1366         pll_core->hw.init = &init;
1367
1368         ret = devm_clk_hw_register(clockman->dev, &pll_core->hw);
1369         if (ret) {
1370                 kfree(pll_core);
1371                 return NULL;
1372         }
1373
1374         return &pll_core->hw;
1375 }
1376
1377 static struct clk_hw *rp1_register_pll(struct rp1_clockman *clockman,
1378                                        const void *data)
1379 {
1380         const struct rp1_pll_data *pll_data = data;
1381         struct rp1_pll *pll;
1382         struct clk_init_data init;
1383         int ret;
1384
1385         memset(&init, 0, sizeof(init));
1386
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;
1392
1393         pll = kzalloc(sizeof(*pll), GFP_KERNEL);
1394         if (!pll)
1395                 return NULL;
1396
1397         pll->clockman = clockman;
1398         pll->data = pll_data;
1399         pll->hw.init = &init;
1400
1401         ret = devm_clk_hw_register(clockman->dev, &pll->hw);
1402         if (ret) {
1403                 kfree(pll);
1404                 return NULL;
1405         }
1406
1407         return &pll->hw;
1408 }
1409
1410 static struct clk_hw *rp1_register_pll_ph(struct rp1_clockman *clockman,
1411                                           const void *data)
1412 {
1413         const struct rp1_pll_ph_data *ph_data = data;
1414         struct rp1_pll_ph *ph;
1415         struct clk_init_data init;
1416         int ret;
1417
1418         memset(&init, 0, sizeof(init));
1419
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;
1426
1427         ph = kzalloc(sizeof(*ph), GFP_KERNEL);
1428         if (!ph)
1429                 return NULL;
1430
1431         ph->clockman = clockman;
1432         ph->data = ph_data;
1433         ph->hw.init = &init;
1434
1435         ret = devm_clk_hw_register(clockman->dev, &ph->hw);
1436         if (ret) {
1437                 kfree(ph);
1438                 return NULL;
1439         }
1440
1441         return &ph->hw;
1442 }
1443
1444 static struct clk_hw *rp1_register_pll_divider(struct rp1_clockman *clockman,
1445                                                const void *data)
1446 {
1447         const struct rp1_pll_data *divider_data = data;
1448         struct rp1_pll *divider;
1449         struct clk_init_data init;
1450         int ret;
1451
1452         memset(&init, 0, sizeof(init));
1453
1454         init.parent_names = &divider_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;
1459
1460         divider = devm_kzalloc(clockman->dev, sizeof(*divider), GFP_KERNEL);
1461         if (!divider)
1462                 return NULL;
1463
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;
1471
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;
1476
1477         divider->clockman = clockman;
1478         divider->data = divider_data;
1479
1480         ret = devm_clk_hw_register(clockman->dev, &divider->div.hw);
1481         if (ret)
1482                 return ERR_PTR(ret);
1483
1484         return &divider->div.hw;
1485 }
1486
1487 static struct clk_hw *rp1_register_clock(struct rp1_clockman *clockman,
1488                                          const void *data)
1489 {
1490         const struct rp1_clock_data *clock_data = data;
1491         struct rp1_clock *clock;
1492         struct clk_init_data init;
1493         int ret;
1494
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]));
1500
1501         memset(&init, 0, sizeof(init));
1502         init.parent_names = clock_data->parents;
1503         init.num_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;
1508
1509         clock = devm_kzalloc(clockman->dev, sizeof(*clock), GFP_KERNEL);
1510         if (!clock)
1511                 return NULL;
1512
1513         clock->clockman = clockman;
1514         clock->data = clock_data;
1515         clock->hw.init = &init;
1516
1517         ret = devm_clk_hw_register(clockman->dev, &clock->hw);
1518         if (ret)
1519                 return ERR_PTR(ret);
1520
1521         return &clock->hw;
1522 }
1523
1524 struct rp1_clk_desc {
1525         struct clk_hw *(*clk_register)(struct rp1_clockman *clockman,
1526                                        const void *data);
1527         const void *data;
1528 };
1529
1530 /* Assignment helper macros for different clock types. */
1531 #define _REGISTER(f, ...) { .clk_register = f, .data = __VA_ARGS__ }
1532
1533 #define REGISTER_PLL_CORE(...)  _REGISTER(&rp1_register_pll_core,       \
1534                                           &(struct rp1_pll_core_data)   \
1535                                           {__VA_ARGS__})
1536
1537 #define REGISTER_PLL(...)       _REGISTER(&rp1_register_pll,            \
1538                                           &(struct rp1_pll_data)                \
1539                                           {__VA_ARGS__})
1540
1541 #define REGISTER_PLL_PH(...)    _REGISTER(&rp1_register_pll_ph,         \
1542                                           &(struct rp1_pll_ph_data)     \
1543                                           {__VA_ARGS__})
1544
1545 #define REGISTER_PLL_DIV(...)   _REGISTER(&rp1_register_pll_divider,    \
1546                                           &(struct rp1_pll_data)        \
1547                                           {__VA_ARGS__})
1548
1549 #define REGISTER_CLK(...)       _REGISTER(&rp1_register_clock,          \
1550                                           &(struct rp1_clock_data)      \
1551                                           {__VA_ARGS__})
1552
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,
1560                                 ),
1561
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,
1568                                 ),
1569
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,
1576                                 ),
1577
1578         [RP1_PLL_SYS] = REGISTER_PLL(
1579                                 .name = "pll_sys",
1580                                 .source_pll = "pll_sys_core",
1581                                 .ctrl_reg = PLL_SYS_PRIM,
1582                                 .fc0_src = FC_NUM(0, 2),
1583                                 ),
1584
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),
1590                                 ),
1591
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),
1597                                 ),
1598
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,
1603                                 .fixed_divider = 2,
1604                                 .phase = RP1_PLL_PHASE_0,
1605                                 .fc0_src = FC_NUM(1, 2),
1606                                 ),
1607
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,
1612                                 .fixed_divider = 2,
1613                                 .phase = RP1_PLL_PHASE_0,
1614                                 .fc0_src = FC_NUM(5, 1),
1615                                 ),
1616
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),
1622                                 ),
1623
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),
1629                                 ),
1630
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),
1636                                 ),
1637
1638         [RP1_CLK_SYS] = REGISTER_CLK(
1639                                 .name = "clk_sys",
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,
1649                                 ),
1650
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,
1662                                 ),
1663
1664         [RP1_CLK_UART] = REGISTER_CLK(
1665                                 .name = "clk_uart",
1666                                 .parents = {"pll_sys_pri_ph",
1667                                             "pll_video",
1668                                             "xosc"},
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),
1676                                 ),
1677
1678         [RP1_CLK_ETH] = REGISTER_CLK(
1679                                 .name = "clk_eth",
1680                                 .parents = {"-"},
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),
1688                                 ),
1689
1690         [RP1_CLK_PWM0] = REGISTER_CLK(
1691                                 .name = "clk_pwm0",
1692                                 .parents = {"pll_audio_pri_ph",
1693                                             "pll_video_sec",
1694                                             "xosc"},
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),
1703                                 ),
1704
1705         [RP1_CLK_PWM1] = REGISTER_CLK(
1706                                 .name = "clk_pwm1",
1707                                 .parents = {"pll_audio_pri_ph",
1708                                             "pll_video_sec",
1709                                             "xosc"},
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),
1718                                 ),
1719
1720         [RP1_CLK_AUDIO_IN] = REGISTER_CLK(
1721                                 .name = "clk_audio_in",
1722                                 .parents = {"-"},
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),
1730                                 ),
1731
1732         [RP1_CLK_AUDIO_OUT] = REGISTER_CLK(
1733                                 .name = "clk_audio_out",
1734                                 .parents = {"-"},
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),
1742                                 ),
1743
1744         [RP1_CLK_I2S] = REGISTER_CLK(
1745                                 .name = "clk_i2s",
1746                                 .parents = {"xosc",
1747                                             "pll_audio",
1748                                             "pll_audio_sec"},
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),
1756                                 ),
1757
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),
1768                                 ),
1769
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,
1778                                 .clk_src_mask = 1,
1779                                 .div_int_max = DIV_INT_8BIT_MAX,
1780                                 .fc0_src = FC_NUM(5, 6),
1781                                 ),
1782
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),
1793                                 ),
1794
1795         [RP1_CLK_ADC] = REGISTER_CLK(
1796                                 .name = "clk_adc",
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),
1805                                 ),
1806
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),
1817                                 ),
1818
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),
1829                                 ),
1830
1831         [RP1_CLK_GP0] = REGISTER_CLK(
1832                                 .name = "clk_gp0",
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),
1842                                 ),
1843
1844         [RP1_CLK_GP1] = REGISTER_CLK(
1845                                 .name = "clk_gp1",
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),
1855                                 ),
1856
1857         [RP1_CLK_GP2] = REGISTER_CLK(
1858                                 .name = "clk_gp2",
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),
1868                                 ),
1869
1870         [RP1_CLK_GP3] = REGISTER_CLK(
1871                                 .name = "clk_gp3",
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),
1881                                 ),
1882
1883         [RP1_CLK_GP4] = REGISTER_CLK(
1884                                 .name = "clk_gp4",
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),
1894                                 ),
1895
1896         [RP1_CLK_GP5] = REGISTER_CLK(
1897                                 .name = "clk_gp5",
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),
1907                                 ),
1908
1909         [RP1_CLK_VEC] = REGISTER_CLK(
1910                                 .name = "clk_vec",
1911                                 .parents = {"pll_sys_pri_ph",
1912                                             "pll_video_sec",
1913                                             "pll_video",
1914                                             "clk_gp0",
1915                                             "clk_gp1",
1916                                             "clk_gp2",
1917                                             "clk_gp3",
1918                                             "clk_gp4"},
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),
1927                                 ),
1928
1929         [RP1_CLK_DPI] = REGISTER_CLK(
1930                                 .name = "clk_dpi",
1931                                 .parents = {"pll_sys",
1932                                             "pll_video_sec",
1933                                             "pll_video",
1934                                             "clk_gp0",
1935                                             "clk_gp1",
1936                                             "clk_gp2",
1937                                             "clk_gp3",
1938                                             "clk_gp4"},
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),
1947                                 ),
1948
1949         [RP1_CLK_MIPI0_DPI] = REGISTER_CLK(
1950                                 .name = "clk_mipi0_dpi",
1951                                 .parents = {"pll_sys",
1952                                             "pll_video_sec",
1953                                             "pll_video",
1954                                             "clksrc_mipi0_dsi_byteclk",
1955                                             "clk_gp0",
1956                                             "clk_gp1",
1957                                             "clk_gp2",
1958                                             "clk_gp3"},
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),
1968                                 ),
1969
1970         [RP1_CLK_MIPI1_DPI] = REGISTER_CLK(
1971                                 .name = "clk_mipi1_dpi",
1972                                 .parents = {"pll_sys",
1973                                             "pll_video_sec",
1974                                             "pll_video",
1975                                             "clksrc_mipi1_dsi_byteclk",
1976                                             "clk_gp0",
1977                                             "clk_gp1",
1978                                             "clk_gp2",
1979                                             "clk_gp3"},
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),
1989                                 ),
1990 };
1991
1992 static bool rp1_clk_claimed[ARRAY_SIZE(clk_desc_array)];
1993
1994 static bool rp1_clk_is_claimed(const char *name)
1995 {
1996         unsigned int i;
1997
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);
2001
2002                         if (!strcmp(name, clk_name))
2003                                 return rp1_clk_claimed[i];
2004                 }
2005         }
2006
2007         return false;
2008 }
2009
2010 static int rp1_clk_probe(struct platform_device *pdev)
2011 {
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;
2019         unsigned int i;
2020         u32 clk_id;
2021         int ret;
2022
2023         clockman = devm_kzalloc(dev, struct_size(clockman, onecell.hws, asize),
2024                                 GFP_KERNEL);
2025         if (!clockman)
2026                 return -ENOMEM;
2027
2028         rp1_get_platform(&chip_id, &platform);
2029
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);
2036
2037         memset(rp1_clk_claimed, 0, sizeof(rp1_clk_claimed));
2038         for (i = 0;
2039              !of_property_read_u32_index(pdev->dev.of_node, "claim-clocks",
2040                                          i, &clk_id);
2041              i++)
2042                 rp1_clk_claimed[clk_id] = true;
2043
2044         platform_set_drvdata(pdev, clockman);
2045
2046         clockman->onecell.num = asize;
2047         hws = clockman->onecell.hws;
2048
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);
2053         }
2054
2055         ret = of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
2056                                      &clockman->onecell);
2057         if (ret)
2058                 return ret;
2059
2060         return 0;
2061 }
2062
2063 static const struct of_device_id rp1_clk_of_match[] = {
2064         { .compatible = "raspberrypi,rp1-clocks" },
2065         {}
2066 };
2067 MODULE_DEVICE_TABLE(of, rp1_clk_of_match);
2068
2069 static struct platform_driver rp1_clk_driver = {
2070         .driver = {
2071                 .name = "rp1-clk",
2072                 .of_match_table = rp1_clk_of_match,
2073         },
2074         .probe = rp1_clk_probe,
2075 };
2076
2077 static int __init __rp1_clk_driver_init(void)
2078 {
2079         return platform_driver_register(&rp1_clk_driver);
2080 }
2081 postcore_initcall(__rp1_clk_driver_init);
2082
2083 MODULE_AUTHOR("Naushir Patuck <naush@raspberrypi.com>");
2084 MODULE_DESCRIPTION("RP1 clock driver");
2085 MODULE_LICENSE("GPL");