52f716e74dd203b867e296ea7b7e35320769b8ee
[openwrt/staging/linusw.git] /
1 From 125afc5cf080b29e9114d89f6052fa4a936a3f19 Mon Sep 17 00:00:00 2001
2 From: Stefan Wahren <wahrenst@gmx.net>
3 Date: Thu, 19 Sep 2019 20:12:15 +0200
4 Subject: [PATCH] clk: bcm2835: Introduce SoC specific clock
5 registration
6
7 commit ee0a5a9013b2b2502571a763c3093d400d18191f upstream.
8
9 In order to support SoC specific clocks (e.g. emmc2 for BCM2711), we
10 extend the description with a SoC support flag. This approach avoids long
11 and mostly redundant lists of clock IDs. Since PLLH is specific to
12 BCM2835, we register only rest of the clocks as common to all SoC.
13
14 Suggested-by: Florian Fainelli <f.fainelli@gmail.com>
15 Signed-off-by: Stefan Wahren <wahrenst@gmx.net>
16 Reviewed-by: Matthias Brugger <mbrugger@suse.com>
17 Acked-by: Eric Anholt <eric@anholt.net>
18 Reviewed-by: Eric Anholt <eric@anholt.net>
19 ---
20 drivers/clk/bcm/clk-bcm2835.c | 115 +++++++++++++++++++++++++++++-----
21 1 file changed, 98 insertions(+), 17 deletions(-)
22
23 --- a/drivers/clk/bcm/clk-bcm2835.c
24 +++ b/drivers/clk/bcm/clk-bcm2835.c
25 @@ -40,7 +40,7 @@
26 #include <linux/debugfs.h>
27 #include <linux/delay.h>
28 #include <linux/module.h>
29 -#include <linux/of.h>
30 +#include <linux/of_device.h>
31 #include <linux/platform_device.h>
32 #include <linux/slab.h>
33 #include <dt-bindings/clock/bcm2835.h>
34 @@ -301,6 +301,9 @@
35
36 #define VCMSG_ID_CORE_CLOCK 4
37
38 +#define SOC_BCM2835 BIT(0)
39 +#define SOC_ALL (SOC_BCM2835)
40 +
41 /*
42 * Names of clocks used within the driver that need to be replaced
43 * with an external parent's name. This array is in the order that
44 @@ -333,6 +336,10 @@ struct bcm2835_cprman {
45 struct clk_hw_onecell_data onecell;
46 };
47
48 +struct cprman_plat_data {
49 + unsigned int soc;
50 +};
51 +
52 static inline void cprman_write(struct bcm2835_cprman *cprman, u32 reg, u32 val)
53 {
54 writel(CM_PASSWORD | val, cprman->regs + reg);
55 @@ -1528,22 +1535,28 @@ typedef struct clk_hw *(*bcm2835_clk_reg
56 const void *data);
57 struct bcm2835_clk_desc {
58 bcm2835_clk_register clk_register;
59 + unsigned int supported;
60 const void *data;
61 };
62
63 /* assignment helper macros for different clock types */
64 -#define _REGISTER(f, ...) { .clk_register = (bcm2835_clk_register)f, \
65 - .data = __VA_ARGS__ }
66 -#define REGISTER_PLL(...) _REGISTER(&bcm2835_register_pll, \
67 +#define _REGISTER(f, s, ...) { .clk_register = (bcm2835_clk_register)f, \
68 + .supported = s, \
69 + .data = __VA_ARGS__ }
70 +#define REGISTER_PLL(s, ...) _REGISTER(&bcm2835_register_pll, \
71 + s, \
72 &(struct bcm2835_pll_data) \
73 {__VA_ARGS__})
74 -#define REGISTER_PLL_DIV(...) _REGISTER(&bcm2835_register_pll_divider, \
75 - &(struct bcm2835_pll_divider_data) \
76 - {__VA_ARGS__})
77 -#define REGISTER_CLK(...) _REGISTER(&bcm2835_register_clock, \
78 +#define REGISTER_PLL_DIV(s, ...) _REGISTER(&bcm2835_register_pll_divider, \
79 + s, \
80 + &(struct bcm2835_pll_divider_data) \
81 + {__VA_ARGS__})
82 +#define REGISTER_CLK(s, ...) _REGISTER(&bcm2835_register_clock, \
83 + s, \
84 &(struct bcm2835_clock_data) \
85 {__VA_ARGS__})
86 -#define REGISTER_GATE(...) _REGISTER(&bcm2835_register_gate, \
87 +#define REGISTER_GATE(s, ...) _REGISTER(&bcm2835_register_gate, \
88 + s, \
89 &(struct bcm2835_gate_data) \
90 {__VA_ARGS__})
91
92 @@ -1557,7 +1570,8 @@ static const char *const bcm2835_clock_o
93 "testdebug1"
94 };
95
96 -#define REGISTER_OSC_CLK(...) REGISTER_CLK( \
97 +#define REGISTER_OSC_CLK(s, ...) REGISTER_CLK( \
98 + s, \
99 .num_mux_parents = ARRAY_SIZE(bcm2835_clock_osc_parents), \
100 .parents = bcm2835_clock_osc_parents, \
101 __VA_ARGS__)
102 @@ -1574,7 +1588,8 @@ static const char *const bcm2835_clock_p
103 "pllh_aux",
104 };
105
106 -#define REGISTER_PER_CLK(...) REGISTER_CLK( \
107 +#define REGISTER_PER_CLK(s, ...) REGISTER_CLK( \
108 + s, \
109 .num_mux_parents = ARRAY_SIZE(bcm2835_clock_per_parents), \
110 .parents = bcm2835_clock_per_parents, \
111 __VA_ARGS__)
112 @@ -1599,7 +1614,8 @@ static const char *const bcm2835_pcm_per
113 "-",
114 };
115
116 -#define REGISTER_PCM_CLK(...) REGISTER_CLK( \
117 +#define REGISTER_PCM_CLK(s, ...) REGISTER_CLK( \
118 + s, \
119 .num_mux_parents = ARRAY_SIZE(bcm2835_pcm_per_parents), \
120 .parents = bcm2835_pcm_per_parents, \
121 __VA_ARGS__)
122 @@ -1618,7 +1634,8 @@ static const char *const bcm2835_clock_v
123 "pllc_core2",
124 };
125
126 -#define REGISTER_VPU_CLK(...) REGISTER_CLK( \
127 +#define REGISTER_VPU_CLK(s, ...) REGISTER_CLK( \
128 + s, \
129 .num_mux_parents = ARRAY_SIZE(bcm2835_clock_vpu_parents), \
130 .parents = bcm2835_clock_vpu_parents, \
131 __VA_ARGS__)
132 @@ -1654,12 +1671,14 @@ static const char *const bcm2835_clock_d
133 "dsi1_byte_inv",
134 };
135
136 -#define REGISTER_DSI0_CLK(...) REGISTER_CLK( \
137 +#define REGISTER_DSI0_CLK(s, ...) REGISTER_CLK( \
138 + s, \
139 .num_mux_parents = ARRAY_SIZE(bcm2835_clock_dsi0_parents), \
140 .parents = bcm2835_clock_dsi0_parents, \
141 __VA_ARGS__)
142
143 -#define REGISTER_DSI1_CLK(...) REGISTER_CLK( \
144 +#define REGISTER_DSI1_CLK(s, ...) REGISTER_CLK( \
145 + s, \
146 .num_mux_parents = ARRAY_SIZE(bcm2835_clock_dsi1_parents), \
147 .parents = bcm2835_clock_dsi1_parents, \
148 __VA_ARGS__)
149 @@ -1679,6 +1698,7 @@ static const struct bcm2835_clk_desc clk
150 * AUDIO domain is on.
151 */
152 [BCM2835_PLLA] = REGISTER_PLL(
153 + SOC_ALL,
154 .name = "plla",
155 .cm_ctrl_reg = CM_PLLA,
156 .a2w_ctrl_reg = A2W_PLLA_CTRL,
157 @@ -1693,6 +1713,7 @@ static const struct bcm2835_clk_desc clk
158 .max_rate = 2400000000u,
159 .max_fb_rate = BCM2835_MAX_FB_RATE),
160 [BCM2835_PLLA_CORE] = REGISTER_PLL_DIV(
161 + SOC_ALL,
162 .name = "plla_core",
163 .source_pll = "plla",
164 .cm_reg = CM_PLLA,
165 @@ -1702,6 +1723,7 @@ static const struct bcm2835_clk_desc clk
166 .fixed_divider = 1,
167 .flags = CLK_SET_RATE_PARENT),
168 [BCM2835_PLLA_PER] = REGISTER_PLL_DIV(
169 + SOC_ALL,
170 .name = "plla_per",
171 .source_pll = "plla",
172 .cm_reg = CM_PLLA,
173 @@ -1711,6 +1733,7 @@ static const struct bcm2835_clk_desc clk
174 .fixed_divider = 1,
175 .flags = CLK_SET_RATE_PARENT),
176 [BCM2835_PLLA_DSI0] = REGISTER_PLL_DIV(
177 + SOC_ALL,
178 .name = "plla_dsi0",
179 .source_pll = "plla",
180 .cm_reg = CM_PLLA,
181 @@ -1719,6 +1742,7 @@ static const struct bcm2835_clk_desc clk
182 .hold_mask = CM_PLLA_HOLDDSI0,
183 .fixed_divider = 1),
184 [BCM2835_PLLA_CCP2] = REGISTER_PLL_DIV(
185 + SOC_ALL,
186 .name = "plla_ccp2",
187 .source_pll = "plla",
188 .cm_reg = CM_PLLA,
189 @@ -1730,6 +1754,7 @@ static const struct bcm2835_clk_desc clk
190
191 /* PLLB is used for the ARM's clock. */
192 [BCM2835_PLLB] = REGISTER_PLL(
193 + SOC_ALL,
194 .name = "pllb",
195 .cm_ctrl_reg = CM_PLLB,
196 .a2w_ctrl_reg = A2W_PLLB_CTRL,
197 @@ -1744,6 +1769,7 @@ static const struct bcm2835_clk_desc clk
198 .max_rate = 3000000000u,
199 .max_fb_rate = BCM2835_MAX_FB_RATE),
200 [BCM2835_PLLB_ARM] = REGISTER_PLL_DIV(
201 + SOC_ALL,
202 .name = "pllb_arm",
203 .source_pll = "pllb",
204 .cm_reg = CM_PLLB,
205 @@ -1760,6 +1786,7 @@ static const struct bcm2835_clk_desc clk
206 * AUDIO domain is on.
207 */
208 [BCM2835_PLLC] = REGISTER_PLL(
209 + SOC_ALL,
210 .name = "pllc",
211 .cm_ctrl_reg = CM_PLLC,
212 .a2w_ctrl_reg = A2W_PLLC_CTRL,
213 @@ -1774,6 +1801,7 @@ static const struct bcm2835_clk_desc clk
214 .max_rate = 3000000000u,
215 .max_fb_rate = BCM2835_MAX_FB_RATE),
216 [BCM2835_PLLC_CORE0] = REGISTER_PLL_DIV(
217 + SOC_ALL,
218 .name = "pllc_core0",
219 .source_pll = "pllc",
220 .cm_reg = CM_PLLC,
221 @@ -1783,6 +1811,7 @@ static const struct bcm2835_clk_desc clk
222 .fixed_divider = 1,
223 .flags = CLK_SET_RATE_PARENT),
224 [BCM2835_PLLC_CORE1] = REGISTER_PLL_DIV(
225 + SOC_ALL,
226 .name = "pllc_core1",
227 .source_pll = "pllc",
228 .cm_reg = CM_PLLC,
229 @@ -1792,6 +1821,7 @@ static const struct bcm2835_clk_desc clk
230 .fixed_divider = 1,
231 .flags = CLK_SET_RATE_PARENT),
232 [BCM2835_PLLC_CORE2] = REGISTER_PLL_DIV(
233 + SOC_ALL,
234 .name = "pllc_core2",
235 .source_pll = "pllc",
236 .cm_reg = CM_PLLC,
237 @@ -1801,6 +1831,7 @@ static const struct bcm2835_clk_desc clk
238 .fixed_divider = 1,
239 .flags = CLK_SET_RATE_PARENT),
240 [BCM2835_PLLC_PER] = REGISTER_PLL_DIV(
241 + SOC_ALL,
242 .name = "pllc_per",
243 .source_pll = "pllc",
244 .cm_reg = CM_PLLC,
245 @@ -1817,6 +1848,7 @@ static const struct bcm2835_clk_desc clk
246 * AUDIO domain is on.
247 */
248 [BCM2835_PLLD] = REGISTER_PLL(
249 + SOC_ALL,
250 .name = "plld",
251 .cm_ctrl_reg = CM_PLLD,
252 .a2w_ctrl_reg = A2W_PLLD_CTRL,
253 @@ -1831,6 +1863,7 @@ static const struct bcm2835_clk_desc clk
254 .max_rate = 2400000000u,
255 .max_fb_rate = BCM2835_MAX_FB_RATE),
256 [BCM2835_PLLD_CORE] = REGISTER_PLL_DIV(
257 + SOC_ALL,
258 .name = "plld_core",
259 .source_pll = "plld",
260 .cm_reg = CM_PLLD,
261 @@ -1840,6 +1873,7 @@ static const struct bcm2835_clk_desc clk
262 .fixed_divider = 1,
263 .flags = CLK_SET_RATE_PARENT),
264 [BCM2835_PLLD_PER] = REGISTER_PLL_DIV(
265 + SOC_ALL,
266 .name = "plld_per",
267 .source_pll = "plld",
268 .cm_reg = CM_PLLD,
269 @@ -1849,6 +1883,7 @@ static const struct bcm2835_clk_desc clk
270 .fixed_divider = 1,
271 .flags = CLK_SET_RATE_PARENT),
272 [BCM2835_PLLD_DSI0] = REGISTER_PLL_DIV(
273 + SOC_ALL,
274 .name = "plld_dsi0",
275 .source_pll = "plld",
276 .cm_reg = CM_PLLD,
277 @@ -1857,6 +1892,7 @@ static const struct bcm2835_clk_desc clk
278 .hold_mask = CM_PLLD_HOLDDSI0,
279 .fixed_divider = 1),
280 [BCM2835_PLLD_DSI1] = REGISTER_PLL_DIV(
281 + SOC_ALL,
282 .name = "plld_dsi1",
283 .source_pll = "plld",
284 .cm_reg = CM_PLLD,
285 @@ -1872,6 +1908,7 @@ static const struct bcm2835_clk_desc clk
286 * It is in the HDMI power domain.
287 */
288 [BCM2835_PLLH] = REGISTER_PLL(
289 + SOC_BCM2835,
290 "pllh",
291 .cm_ctrl_reg = CM_PLLH,
292 .a2w_ctrl_reg = A2W_PLLH_CTRL,
293 @@ -1886,6 +1923,7 @@ static const struct bcm2835_clk_desc clk
294 .max_rate = 3000000000u,
295 .max_fb_rate = BCM2835_MAX_FB_RATE),
296 [BCM2835_PLLH_RCAL] = REGISTER_PLL_DIV(
297 + SOC_BCM2835,
298 .name = "pllh_rcal",
299 .source_pll = "pllh",
300 .cm_reg = CM_PLLH,
301 @@ -1895,6 +1933,7 @@ static const struct bcm2835_clk_desc clk
302 .fixed_divider = 10,
303 .flags = CLK_SET_RATE_PARENT),
304 [BCM2835_PLLH_AUX] = REGISTER_PLL_DIV(
305 + SOC_BCM2835,
306 .name = "pllh_aux",
307 .source_pll = "pllh",
308 .cm_reg = CM_PLLH,
309 @@ -1904,6 +1943,7 @@ static const struct bcm2835_clk_desc clk
310 .fixed_divider = 1,
311 .flags = CLK_SET_RATE_PARENT),
312 [BCM2835_PLLH_PIX] = REGISTER_PLL_DIV(
313 + SOC_BCM2835,
314 .name = "pllh_pix",
315 .source_pll = "pllh",
316 .cm_reg = CM_PLLH,
317 @@ -1919,6 +1959,7 @@ static const struct bcm2835_clk_desc clk
318
319 /* One Time Programmable Memory clock. Maximum 10Mhz. */
320 [BCM2835_CLOCK_OTP] = REGISTER_OSC_CLK(
321 + SOC_ALL,
322 .name = "otp",
323 .ctl_reg = CM_OTPCTL,
324 .div_reg = CM_OTPDIV,
325 @@ -1930,6 +1971,7 @@ static const struct bcm2835_clk_desc clk
326 * bythe watchdog timer and the camera pulse generator.
327 */
328 [BCM2835_CLOCK_TIMER] = REGISTER_OSC_CLK(
329 + SOC_ALL,
330 .name = "timer",
331 .ctl_reg = CM_TIMERCTL,
332 .div_reg = CM_TIMERDIV,
333 @@ -1940,12 +1982,14 @@ static const struct bcm2835_clk_desc clk
334 * Generally run at 2Mhz, max 5Mhz.
335 */
336 [BCM2835_CLOCK_TSENS] = REGISTER_OSC_CLK(
337 + SOC_ALL,
338 .name = "tsens",
339 .ctl_reg = CM_TSENSCTL,
340 .div_reg = CM_TSENSDIV,
341 .int_bits = 5,
342 .frac_bits = 0),
343 [BCM2835_CLOCK_TEC] = REGISTER_OSC_CLK(
344 + SOC_ALL,
345 .name = "tec",
346 .ctl_reg = CM_TECCTL,
347 .div_reg = CM_TECDIV,
348 @@ -1954,6 +1998,7 @@ static const struct bcm2835_clk_desc clk
349
350 /* clocks with vpu parent mux */
351 [BCM2835_CLOCK_H264] = REGISTER_VPU_CLK(
352 + SOC_ALL,
353 .name = "h264",
354 .ctl_reg = CM_H264CTL,
355 .div_reg = CM_H264DIV,
356 @@ -1961,6 +2006,7 @@ static const struct bcm2835_clk_desc clk
357 .frac_bits = 8,
358 .tcnt_mux = 1),
359 [BCM2835_CLOCK_ISP] = REGISTER_VPU_CLK(
360 + SOC_ALL,
361 .name = "isp",
362 .ctl_reg = CM_ISPCTL,
363 .div_reg = CM_ISPDIV,
364 @@ -1973,6 +2019,7 @@ static const struct bcm2835_clk_desc clk
365 * in the SDRAM controller can't be used.
366 */
367 [BCM2835_CLOCK_SDRAM] = REGISTER_VPU_CLK(
368 + SOC_ALL,
369 .name = "sdram",
370 .ctl_reg = CM_SDCCTL,
371 .div_reg = CM_SDCDIV,
372 @@ -1980,6 +2027,7 @@ static const struct bcm2835_clk_desc clk
373 .frac_bits = 0,
374 .tcnt_mux = 3),
375 [BCM2835_CLOCK_V3D] = REGISTER_VPU_CLK(
376 + SOC_ALL,
377 .name = "v3d",
378 .ctl_reg = CM_V3DCTL,
379 .div_reg = CM_V3DDIV,
380 @@ -1993,6 +2041,7 @@ static const struct bcm2835_clk_desc clk
381 * in various hardware documentation.
382 */
383 [BCM2835_CLOCK_VPU] = REGISTER_VPU_CLK(
384 + SOC_ALL,
385 .name = "vpu",
386 .ctl_reg = CM_VPUCTL,
387 .div_reg = CM_VPUDIV,
388 @@ -2004,6 +2053,7 @@ static const struct bcm2835_clk_desc clk
389
390 /* clocks with per parent mux */
391 [BCM2835_CLOCK_AVEO] = REGISTER_PER_CLK(
392 + SOC_ALL,
393 .name = "aveo",
394 .ctl_reg = CM_AVEOCTL,
395 .div_reg = CM_AVEODIV,
396 @@ -2011,6 +2061,7 @@ static const struct bcm2835_clk_desc clk
397 .frac_bits = 0,
398 .tcnt_mux = 38),
399 [BCM2835_CLOCK_CAM0] = REGISTER_PER_CLK(
400 + SOC_ALL,
401 .name = "cam0",
402 .ctl_reg = CM_CAM0CTL,
403 .div_reg = CM_CAM0DIV,
404 @@ -2018,6 +2069,7 @@ static const struct bcm2835_clk_desc clk
405 .frac_bits = 8,
406 .tcnt_mux = 14),
407 [BCM2835_CLOCK_CAM1] = REGISTER_PER_CLK(
408 + SOC_ALL,
409 .name = "cam1",
410 .ctl_reg = CM_CAM1CTL,
411 .div_reg = CM_CAM1DIV,
412 @@ -2025,12 +2077,14 @@ static const struct bcm2835_clk_desc clk
413 .frac_bits = 8,
414 .tcnt_mux = 15),
415 [BCM2835_CLOCK_DFT] = REGISTER_PER_CLK(
416 + SOC_ALL,
417 .name = "dft",
418 .ctl_reg = CM_DFTCTL,
419 .div_reg = CM_DFTDIV,
420 .int_bits = 5,
421 .frac_bits = 0),
422 [BCM2835_CLOCK_DPI] = REGISTER_PER_CLK(
423 + SOC_ALL,
424 .name = "dpi",
425 .ctl_reg = CM_DPICTL,
426 .div_reg = CM_DPIDIV,
427 @@ -2040,6 +2094,7 @@ static const struct bcm2835_clk_desc clk
428
429 /* Arasan EMMC clock */
430 [BCM2835_CLOCK_EMMC] = REGISTER_PER_CLK(
431 + SOC_ALL,
432 .name = "emmc",
433 .ctl_reg = CM_EMMCCTL,
434 .div_reg = CM_EMMCDIV,
435 @@ -2049,6 +2104,7 @@ static const struct bcm2835_clk_desc clk
436
437 /* General purpose (GPIO) clocks */
438 [BCM2835_CLOCK_GP0] = REGISTER_PER_CLK(
439 + SOC_ALL,
440 .name = "gp0",
441 .ctl_reg = CM_GP0CTL,
442 .div_reg = CM_GP0DIV,
443 @@ -2057,6 +2113,7 @@ static const struct bcm2835_clk_desc clk
444 .is_mash_clock = true,
445 .tcnt_mux = 20),
446 [BCM2835_CLOCK_GP1] = REGISTER_PER_CLK(
447 + SOC_ALL,
448 .name = "gp1",
449 .ctl_reg = CM_GP1CTL,
450 .div_reg = CM_GP1DIV,
451 @@ -2066,6 +2123,7 @@ static const struct bcm2835_clk_desc clk
452 .is_mash_clock = true,
453 .tcnt_mux = 21),
454 [BCM2835_CLOCK_GP2] = REGISTER_PER_CLK(
455 + SOC_ALL,
456 .name = "gp2",
457 .ctl_reg = CM_GP2CTL,
458 .div_reg = CM_GP2DIV,
459 @@ -2075,6 +2133,7 @@ static const struct bcm2835_clk_desc clk
460
461 /* HDMI state machine */
462 [BCM2835_CLOCK_HSM] = REGISTER_PER_CLK(
463 + SOC_ALL,
464 .name = "hsm",
465 .ctl_reg = CM_HSMCTL,
466 .div_reg = CM_HSMDIV,
467 @@ -2082,6 +2141,7 @@ static const struct bcm2835_clk_desc clk
468 .frac_bits = 8,
469 .tcnt_mux = 22),
470 [BCM2835_CLOCK_PCM] = REGISTER_PCM_CLK(
471 + SOC_ALL,
472 .name = "pcm",
473 .ctl_reg = CM_PCMCTL,
474 .div_reg = CM_PCMDIV,
475 @@ -2091,6 +2151,7 @@ static const struct bcm2835_clk_desc clk
476 .low_jitter = true,
477 .tcnt_mux = 23),
478 [BCM2835_CLOCK_PWM] = REGISTER_PER_CLK(
479 + SOC_ALL,
480 .name = "pwm",
481 .ctl_reg = CM_PWMCTL,
482 .div_reg = CM_PWMDIV,
483 @@ -2099,6 +2160,7 @@ static const struct bcm2835_clk_desc clk
484 .is_mash_clock = true,
485 .tcnt_mux = 24),
486 [BCM2835_CLOCK_SLIM] = REGISTER_PER_CLK(
487 + SOC_ALL,
488 .name = "slim",
489 .ctl_reg = CM_SLIMCTL,
490 .div_reg = CM_SLIMDIV,
491 @@ -2107,6 +2169,7 @@ static const struct bcm2835_clk_desc clk
492 .is_mash_clock = true,
493 .tcnt_mux = 25),
494 [BCM2835_CLOCK_SMI] = REGISTER_PER_CLK(
495 + SOC_ALL,
496 .name = "smi",
497 .ctl_reg = CM_SMICTL,
498 .div_reg = CM_SMIDIV,
499 @@ -2114,6 +2177,7 @@ static const struct bcm2835_clk_desc clk
500 .frac_bits = 8,
501 .tcnt_mux = 27),
502 [BCM2835_CLOCK_UART] = REGISTER_PER_CLK(
503 + SOC_ALL,
504 .name = "uart",
505 .ctl_reg = CM_UARTCTL,
506 .div_reg = CM_UARTDIV,
507 @@ -2123,6 +2187,7 @@ static const struct bcm2835_clk_desc clk
508
509 /* TV encoder clock. Only operating frequency is 108Mhz. */
510 [BCM2835_CLOCK_VEC] = REGISTER_PER_CLK(
511 + SOC_ALL,
512 .name = "vec",
513 .ctl_reg = CM_VECCTL,
514 .div_reg = CM_VECDIV,
515 @@ -2137,6 +2202,7 @@ static const struct bcm2835_clk_desc clk
516
517 /* dsi clocks */
518 [BCM2835_CLOCK_DSI0E] = REGISTER_PER_CLK(
519 + SOC_ALL,
520 .name = "dsi0e",
521 .ctl_reg = CM_DSI0ECTL,
522 .div_reg = CM_DSI0EDIV,
523 @@ -2144,6 +2210,7 @@ static const struct bcm2835_clk_desc clk
524 .frac_bits = 8,
525 .tcnt_mux = 18),
526 [BCM2835_CLOCK_DSI1E] = REGISTER_PER_CLK(
527 + SOC_ALL,
528 .name = "dsi1e",
529 .ctl_reg = CM_DSI1ECTL,
530 .div_reg = CM_DSI1EDIV,
531 @@ -2151,6 +2218,7 @@ static const struct bcm2835_clk_desc clk
532 .frac_bits = 8,
533 .tcnt_mux = 19),
534 [BCM2835_CLOCK_DSI0P] = REGISTER_DSI0_CLK(
535 + SOC_ALL,
536 .name = "dsi0p",
537 .ctl_reg = CM_DSI0PCTL,
538 .div_reg = CM_DSI0PDIV,
539 @@ -2158,6 +2226,7 @@ static const struct bcm2835_clk_desc clk
540 .frac_bits = 0,
541 .tcnt_mux = 12),
542 [BCM2835_CLOCK_DSI1P] = REGISTER_DSI1_CLK(
543 + SOC_ALL,
544 .name = "dsi1p",
545 .ctl_reg = CM_DSI1PCTL,
546 .div_reg = CM_DSI1PDIV,
547 @@ -2174,6 +2243,7 @@ static const struct bcm2835_clk_desc clk
548 * non-stop vpu clock.
549 */
550 [BCM2835_CLOCK_PERI_IMAGE] = REGISTER_GATE(
551 + SOC_ALL,
552 .name = "peri_image",
553 .parent = "vpu",
554 .ctl_reg = CM_PERIICTL),
555 @@ -2221,11 +2291,16 @@ static int bcm2835_clk_probe(struct plat
556 struct resource *res;
557 const struct bcm2835_clk_desc *desc;
558 const size_t asize = ARRAY_SIZE(clk_desc_array);
559 + const struct cprman_plat_data *pdata;
560 struct device_node *fw_node;
561 size_t i;
562 u32 clk_id;
563 int ret;
564
565 + pdata = of_device_get_match_data(&pdev->dev);
566 + if (!pdata)
567 + return -ENODEV;
568 +
569 cprman = devm_kzalloc(dev,
570 struct_size(cprman, onecell.hws, asize),
571 GFP_KERNEL);
572 @@ -2276,8 +2351,10 @@ static int bcm2835_clk_probe(struct plat
573
574 for (i = 0; i < asize; i++) {
575 desc = &clk_desc_array[i];
576 - if (desc->clk_register && desc->data)
577 + if (desc->clk_register && desc->data &&
578 + (desc->supported & pdata->soc)) {
579 hws[i] = desc->clk_register(cprman, desc->data);
580 + }
581 }
582
583 ret = bcm2835_mark_sdc_parent_critical(hws[BCM2835_CLOCK_SDRAM]->clk);
584 @@ -2295,8 +2372,12 @@ static int bcm2835_clk_probe(struct plat
585 return 0;
586 }
587
588 +static const struct cprman_plat_data cprman_bcm2835_plat_data = {
589 + .soc = SOC_BCM2835,
590 +};
591 +
592 static const struct of_device_id bcm2835_clk_of_match[] = {
593 - { .compatible = "brcm,bcm2835-cprman", },
594 + { .compatible = "brcm,bcm2835-cprman", .data = &cprman_bcm2835_plat_data },
595 {}
596 };
597 MODULE_DEVICE_TABLE(of, bcm2835_clk_of_match);