blob: 8ee0f0b28ea33fd70c78b91333ec44db88852b14 [file] [log] [blame]
Simon Arlott75fabc32012-09-10 23:26:15 -06001/*
Eric Anholt41691b82015-10-08 18:37:24 -07002 * Copyright (C) 2010,2015 Broadcom
Simon Arlott75fabc32012-09-10 23:26:15 -06003 * Copyright (C) 2012 Stephen Warren
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
Simon Arlott75fabc32012-09-10 23:26:15 -060015 */
16
Eric Anholt41691b82015-10-08 18:37:24 -070017/**
18 * DOC: BCM2835 CPRMAN (clock manager for the "audio" domain)
19 *
20 * The clock tree on the 2835 has several levels. There's a root
21 * oscillator running at 19.2Mhz. After the oscillator there are 5
22 * PLLs, roughly divided as "camera", "ARM", "core", "DSI displays",
23 * and "HDMI displays". Those 5 PLLs each can divide their output to
24 * produce up to 4 channels. Finally, there is the level of clocks to
25 * be consumed by other hardware components (like "H264" or "HDMI
26 * state machine"), which divide off of some subset of the PLL
27 * channels.
28 *
29 * All of the clocks in the tree are exposed in the DT, because the DT
30 * may want to make assignments of the final layer of clocks to the
31 * PLL channels, and some components of the hardware will actually
32 * skip layers of the tree (for example, the pixel clock comes
33 * directly from the PLLH PIX channel without using a CM_*CTL clock
34 * generator).
35 */
36
Simon Arlott75fabc32012-09-10 23:26:15 -060037#include <linux/clk-provider.h>
38#include <linux/clkdev.h>
Eric Anholt9e400c52016-06-01 12:05:35 -070039#include <linux/clk.h>
Simon Arlott75fabc32012-09-10 23:26:15 -060040#include <linux/clk/bcm2835.h>
Martin Sperl96bf9c62016-02-29 14:20:15 +000041#include <linux/debugfs.h>
Eric Anholt3f919582017-01-18 07:31:57 +110042#include <linux/delay.h>
Eric Anholt41691b82015-10-08 18:37:24 -070043#include <linux/module.h>
Stephen Warren526d2392012-12-24 21:55:01 -070044#include <linux/of.h>
Eric Anholt41691b82015-10-08 18:37:24 -070045#include <linux/platform_device.h>
46#include <linux/slab.h>
47#include <dt-bindings/clock/bcm2835.h>
48
49#define CM_PASSWORD 0x5a000000
50
51#define CM_GNRICCTL 0x000
52#define CM_GNRICDIV 0x004
53# define CM_DIV_FRAC_BITS 12
Martin Sperl959ca922016-02-29 11:39:21 +000054# define CM_DIV_FRAC_MASK GENMASK(CM_DIV_FRAC_BITS - 1, 0)
Eric Anholt41691b82015-10-08 18:37:24 -070055
56#define CM_VPUCTL 0x008
57#define CM_VPUDIV 0x00c
58#define CM_SYSCTL 0x010
59#define CM_SYSDIV 0x014
60#define CM_PERIACTL 0x018
61#define CM_PERIADIV 0x01c
62#define CM_PERIICTL 0x020
63#define CM_PERIIDIV 0x024
64#define CM_H264CTL 0x028
65#define CM_H264DIV 0x02c
66#define CM_ISPCTL 0x030
67#define CM_ISPDIV 0x034
68#define CM_V3DCTL 0x038
69#define CM_V3DDIV 0x03c
70#define CM_CAM0CTL 0x040
71#define CM_CAM0DIV 0x044
72#define CM_CAM1CTL 0x048
73#define CM_CAM1DIV 0x04c
74#define CM_CCP2CTL 0x050
75#define CM_CCP2DIV 0x054
76#define CM_DSI0ECTL 0x058
77#define CM_DSI0EDIV 0x05c
78#define CM_DSI0PCTL 0x060
79#define CM_DSI0PDIV 0x064
80#define CM_DPICTL 0x068
81#define CM_DPIDIV 0x06c
82#define CM_GP0CTL 0x070
83#define CM_GP0DIV 0x074
84#define CM_GP1CTL 0x078
85#define CM_GP1DIV 0x07c
86#define CM_GP2CTL 0x080
87#define CM_GP2DIV 0x084
88#define CM_HSMCTL 0x088
89#define CM_HSMDIV 0x08c
90#define CM_OTPCTL 0x090
91#define CM_OTPDIV 0x094
Martin Sperl2103a212015-12-22 20:13:08 +000092#define CM_PCMCTL 0x098
93#define CM_PCMDIV 0x09c
Eric Anholt41691b82015-10-08 18:37:24 -070094#define CM_PWMCTL 0x0a0
95#define CM_PWMDIV 0x0a4
Martin Sperl2103a212015-12-22 20:13:08 +000096#define CM_SLIMCTL 0x0a8
97#define CM_SLIMDIV 0x0ac
Eric Anholt41691b82015-10-08 18:37:24 -070098#define CM_SMICTL 0x0b0
99#define CM_SMIDIV 0x0b4
Martin Sperl2103a212015-12-22 20:13:08 +0000100/* no definition for 0x0b8 and 0x0bc */
101#define CM_TCNTCTL 0x0c0
Eric Anholt3f919582017-01-18 07:31:57 +1100102# define CM_TCNT_SRC1_SHIFT 12
103#define CM_TCNTCNT 0x0c4
Martin Sperl2103a212015-12-22 20:13:08 +0000104#define CM_TECCTL 0x0c8
105#define CM_TECDIV 0x0cc
106#define CM_TD0CTL 0x0d0
107#define CM_TD0DIV 0x0d4
108#define CM_TD1CTL 0x0d8
109#define CM_TD1DIV 0x0dc
Eric Anholt41691b82015-10-08 18:37:24 -0700110#define CM_TSENSCTL 0x0e0
111#define CM_TSENSDIV 0x0e4
112#define CM_TIMERCTL 0x0e8
113#define CM_TIMERDIV 0x0ec
114#define CM_UARTCTL 0x0f0
115#define CM_UARTDIV 0x0f4
116#define CM_VECCTL 0x0f8
117#define CM_VECDIV 0x0fc
118#define CM_PULSECTL 0x190
119#define CM_PULSEDIV 0x194
120#define CM_SDCCTL 0x1a8
121#define CM_SDCDIV 0x1ac
122#define CM_ARMCTL 0x1b0
Martin Sperld3d6f152016-02-29 15:43:57 +0000123#define CM_AVEOCTL 0x1b8
124#define CM_AVEODIV 0x1bc
Eric Anholt41691b82015-10-08 18:37:24 -0700125#define CM_EMMCCTL 0x1c0
126#define CM_EMMCDIV 0x1c4
127
128/* General bits for the CM_*CTL regs */
129# define CM_ENABLE BIT(4)
130# define CM_KILL BIT(5)
131# define CM_GATE_BIT 6
132# define CM_GATE BIT(CM_GATE_BIT)
133# define CM_BUSY BIT(7)
134# define CM_BUSYD BIT(8)
Martin Sperl959ca922016-02-29 11:39:21 +0000135# define CM_FRAC BIT(9)
Eric Anholt41691b82015-10-08 18:37:24 -0700136# define CM_SRC_SHIFT 0
137# define CM_SRC_BITS 4
138# define CM_SRC_MASK 0xf
139# define CM_SRC_GND 0
140# define CM_SRC_OSC 1
141# define CM_SRC_TESTDEBUG0 2
142# define CM_SRC_TESTDEBUG1 3
143# define CM_SRC_PLLA_CORE 4
144# define CM_SRC_PLLA_PER 4
145# define CM_SRC_PLLC_CORE0 5
146# define CM_SRC_PLLC_PER 5
147# define CM_SRC_PLLC_CORE1 8
148# define CM_SRC_PLLD_CORE 6
149# define CM_SRC_PLLD_PER 6
150# define CM_SRC_PLLH_AUX 7
151# define CM_SRC_PLLC_CORE1 8
152# define CM_SRC_PLLC_CORE2 9
153
154#define CM_OSCCOUNT 0x100
155
156#define CM_PLLA 0x104
157# define CM_PLL_ANARST BIT(8)
158# define CM_PLLA_HOLDPER BIT(7)
159# define CM_PLLA_LOADPER BIT(6)
160# define CM_PLLA_HOLDCORE BIT(5)
161# define CM_PLLA_LOADCORE BIT(4)
162# define CM_PLLA_HOLDCCP2 BIT(3)
163# define CM_PLLA_LOADCCP2 BIT(2)
164# define CM_PLLA_HOLDDSI0 BIT(1)
165# define CM_PLLA_LOADDSI0 BIT(0)
166
167#define CM_PLLC 0x108
168# define CM_PLLC_HOLDPER BIT(7)
169# define CM_PLLC_LOADPER BIT(6)
170# define CM_PLLC_HOLDCORE2 BIT(5)
171# define CM_PLLC_LOADCORE2 BIT(4)
172# define CM_PLLC_HOLDCORE1 BIT(3)
173# define CM_PLLC_LOADCORE1 BIT(2)
174# define CM_PLLC_HOLDCORE0 BIT(1)
175# define CM_PLLC_LOADCORE0 BIT(0)
176
177#define CM_PLLD 0x10c
178# define CM_PLLD_HOLDPER BIT(7)
179# define CM_PLLD_LOADPER BIT(6)
180# define CM_PLLD_HOLDCORE BIT(5)
181# define CM_PLLD_LOADCORE BIT(4)
182# define CM_PLLD_HOLDDSI1 BIT(3)
183# define CM_PLLD_LOADDSI1 BIT(2)
184# define CM_PLLD_HOLDDSI0 BIT(1)
185# define CM_PLLD_LOADDSI0 BIT(0)
186
187#define CM_PLLH 0x110
188# define CM_PLLH_LOADRCAL BIT(2)
189# define CM_PLLH_LOADAUX BIT(1)
190# define CM_PLLH_LOADPIX BIT(0)
191
192#define CM_LOCK 0x114
193# define CM_LOCK_FLOCKH BIT(12)
194# define CM_LOCK_FLOCKD BIT(11)
195# define CM_LOCK_FLOCKC BIT(10)
196# define CM_LOCK_FLOCKB BIT(9)
197# define CM_LOCK_FLOCKA BIT(8)
198
199#define CM_EVENT 0x118
200#define CM_DSI1ECTL 0x158
201#define CM_DSI1EDIV 0x15c
202#define CM_DSI1PCTL 0x160
203#define CM_DSI1PDIV 0x164
204#define CM_DFTCTL 0x168
205#define CM_DFTDIV 0x16c
206
207#define CM_PLLB 0x170
208# define CM_PLLB_HOLDARM BIT(1)
209# define CM_PLLB_LOADARM BIT(0)
210
211#define A2W_PLLA_CTRL 0x1100
212#define A2W_PLLC_CTRL 0x1120
213#define A2W_PLLD_CTRL 0x1140
214#define A2W_PLLH_CTRL 0x1160
215#define A2W_PLLB_CTRL 0x11e0
216# define A2W_PLL_CTRL_PRST_DISABLE BIT(17)
217# define A2W_PLL_CTRL_PWRDN BIT(16)
218# define A2W_PLL_CTRL_PDIV_MASK 0x000007000
219# define A2W_PLL_CTRL_PDIV_SHIFT 12
220# define A2W_PLL_CTRL_NDIV_MASK 0x0000003ff
221# define A2W_PLL_CTRL_NDIV_SHIFT 0
222
223#define A2W_PLLA_ANA0 0x1010
224#define A2W_PLLC_ANA0 0x1030
225#define A2W_PLLD_ANA0 0x1050
226#define A2W_PLLH_ANA0 0x1070
227#define A2W_PLLB_ANA0 0x10f0
228
229#define A2W_PLL_KA_SHIFT 7
230#define A2W_PLL_KA_MASK GENMASK(9, 7)
231#define A2W_PLL_KI_SHIFT 19
232#define A2W_PLL_KI_MASK GENMASK(21, 19)
233#define A2W_PLL_KP_SHIFT 15
234#define A2W_PLL_KP_MASK GENMASK(18, 15)
235
236#define A2W_PLLH_KA_SHIFT 19
237#define A2W_PLLH_KA_MASK GENMASK(21, 19)
238#define A2W_PLLH_KI_LOW_SHIFT 22
239#define A2W_PLLH_KI_LOW_MASK GENMASK(23, 22)
240#define A2W_PLLH_KI_HIGH_SHIFT 0
241#define A2W_PLLH_KI_HIGH_MASK GENMASK(0, 0)
242#define A2W_PLLH_KP_SHIFT 1
243#define A2W_PLLH_KP_MASK GENMASK(4, 1)
244
245#define A2W_XOSC_CTRL 0x1190
246# define A2W_XOSC_CTRL_PLLB_ENABLE BIT(7)
247# define A2W_XOSC_CTRL_PLLA_ENABLE BIT(6)
248# define A2W_XOSC_CTRL_PLLD_ENABLE BIT(5)
249# define A2W_XOSC_CTRL_DDR_ENABLE BIT(4)
250# define A2W_XOSC_CTRL_CPR1_ENABLE BIT(3)
251# define A2W_XOSC_CTRL_USB_ENABLE BIT(2)
252# define A2W_XOSC_CTRL_HDMI_ENABLE BIT(1)
253# define A2W_XOSC_CTRL_PLLC_ENABLE BIT(0)
254
255#define A2W_PLLA_FRAC 0x1200
256#define A2W_PLLC_FRAC 0x1220
257#define A2W_PLLD_FRAC 0x1240
258#define A2W_PLLH_FRAC 0x1260
259#define A2W_PLLB_FRAC 0x12e0
260# define A2W_PLL_FRAC_MASK ((1 << A2W_PLL_FRAC_BITS) - 1)
261# define A2W_PLL_FRAC_BITS 20
262
263#define A2W_PLL_CHANNEL_DISABLE BIT(8)
264#define A2W_PLL_DIV_BITS 8
265#define A2W_PLL_DIV_SHIFT 0
266
267#define A2W_PLLA_DSI0 0x1300
268#define A2W_PLLA_CORE 0x1400
269#define A2W_PLLA_PER 0x1500
270#define A2W_PLLA_CCP2 0x1600
271
272#define A2W_PLLC_CORE2 0x1320
273#define A2W_PLLC_CORE1 0x1420
274#define A2W_PLLC_PER 0x1520
275#define A2W_PLLC_CORE0 0x1620
276
277#define A2W_PLLD_DSI0 0x1340
278#define A2W_PLLD_CORE 0x1440
279#define A2W_PLLD_PER 0x1540
280#define A2W_PLLD_DSI1 0x1640
281
282#define A2W_PLLH_AUX 0x1360
283#define A2W_PLLH_RCAL 0x1460
284#define A2W_PLLH_PIX 0x1560
285#define A2W_PLLH_STS 0x1660
286
287#define A2W_PLLH_CTRLR 0x1960
288#define A2W_PLLH_FRACR 0x1a60
289#define A2W_PLLH_AUXR 0x1b60
290#define A2W_PLLH_RCALR 0x1c60
291#define A2W_PLLH_PIXR 0x1d60
292#define A2W_PLLH_STSR 0x1e60
293
294#define A2W_PLLB_ARM 0x13e0
295#define A2W_PLLB_SP0 0x14e0
296#define A2W_PLLB_SP1 0x15e0
297#define A2W_PLLB_SP2 0x16e0
298
299#define LOCK_TIMEOUT_NS 100000000
300#define BCM2835_MAX_FB_RATE 1750000000u
301
Eric Anholt8a39e9f2017-01-18 07:31:56 +1100302/*
303 * Names of clocks used within the driver that need to be replaced
304 * with an external parent's name. This array is in the order that
305 * the clocks node in the DT references external clocks.
306 */
307static const char *const cprman_parent_names[] = {
308 "xosc",
309 "dsi0_byte",
310 "dsi0_ddr2",
311 "dsi0_ddr",
312 "dsi1_byte",
313 "dsi1_ddr2",
314 "dsi1_ddr",
315};
316
Eric Anholt41691b82015-10-08 18:37:24 -0700317struct bcm2835_cprman {
318 struct device *dev;
319 void __iomem *regs;
Martin Sperl6e1e60d2016-02-29 11:39:22 +0000320 spinlock_t regs_lock; /* spinlock for all clocks */
Eric Anholt8a39e9f2017-01-18 07:31:56 +1100321
322 /*
323 * Real names of cprman clock parents looked up through
324 * of_clk_get_parent_name(), which will be used in the
325 * parent_names[] arrays for clock registration.
326 */
327 const char *real_parent_names[ARRAY_SIZE(cprman_parent_names)];
Eric Anholt41691b82015-10-08 18:37:24 -0700328
Stephen Boydb19f0092016-06-01 16:15:03 -0700329 /* Must be last */
330 struct clk_hw_onecell_data onecell;
Eric Anholt41691b82015-10-08 18:37:24 -0700331};
332
333static inline void cprman_write(struct bcm2835_cprman *cprman, u32 reg, u32 val)
334{
335 writel(CM_PASSWORD | val, cprman->regs + reg);
336}
337
338static inline u32 cprman_read(struct bcm2835_cprman *cprman, u32 reg)
339{
340 return readl(cprman->regs + reg);
341}
Stephen Warren526d2392012-12-24 21:55:01 -0700342
Eric Anholt3f919582017-01-18 07:31:57 +1100343/* Does a cycle of measuring a clock through the TCNT clock, which may
344 * source from many other clocks in the system.
345 */
346static unsigned long bcm2835_measure_tcnt_mux(struct bcm2835_cprman *cprman,
347 u32 tcnt_mux)
348{
349 u32 osccount = 19200; /* 1ms */
350 u32 count;
351 ktime_t timeout;
352
353 spin_lock(&cprman->regs_lock);
354
355 cprman_write(cprman, CM_TCNTCTL, CM_KILL);
356
357 cprman_write(cprman, CM_TCNTCTL,
358 (tcnt_mux & CM_SRC_MASK) |
359 (tcnt_mux >> CM_SRC_BITS) << CM_TCNT_SRC1_SHIFT);
360
361 cprman_write(cprman, CM_OSCCOUNT, osccount);
362
363 /* do a kind delay at the start */
364 mdelay(1);
365
366 /* Finish off whatever is left of OSCCOUNT */
367 timeout = ktime_add_ns(ktime_get(), LOCK_TIMEOUT_NS);
368 while (cprman_read(cprman, CM_OSCCOUNT)) {
369 if (ktime_after(ktime_get(), timeout)) {
370 dev_err(cprman->dev, "timeout waiting for OSCCOUNT\n");
371 count = 0;
372 goto out;
373 }
374 cpu_relax();
375 }
376
377 /* Wait for BUSY to clear. */
378 timeout = ktime_add_ns(ktime_get(), LOCK_TIMEOUT_NS);
379 while (cprman_read(cprman, CM_TCNTCTL) & CM_BUSY) {
380 if (ktime_after(ktime_get(), timeout)) {
381 dev_err(cprman->dev, "timeout waiting for !BUSY\n");
382 count = 0;
383 goto out;
384 }
385 cpu_relax();
386 }
387
388 count = cprman_read(cprman, CM_TCNTCNT);
389
390 cprman_write(cprman, CM_TCNTCTL, 0);
391
392out:
393 spin_unlock(&cprman->regs_lock);
394
395 return count * 1000;
396}
397
Martin Sperl96bf9c62016-02-29 14:20:15 +0000398static int bcm2835_debugfs_regset(struct bcm2835_cprman *cprman, u32 base,
399 struct debugfs_reg32 *regs, size_t nregs,
400 struct dentry *dentry)
401{
402 struct dentry *regdump;
403 struct debugfs_regset32 *regset;
404
405 regset = devm_kzalloc(cprman->dev, sizeof(*regset), GFP_KERNEL);
406 if (!regset)
407 return -ENOMEM;
408
409 regset->regs = regs;
410 regset->nregs = nregs;
411 regset->base = cprman->regs + base;
412
413 regdump = debugfs_create_regset32("regdump", S_IRUGO, dentry,
414 regset);
415
416 return regdump ? 0 : -ENOMEM;
417}
418
Simon Arlott75fabc32012-09-10 23:26:15 -0600419/*
420 * These are fixed clocks. They're probably not all root clocks and it may
421 * be possible to turn them on and off but until this is mapped out better
422 * it's the only way they can be used.
423 */
424void __init bcm2835_init_clocks(void)
425{
Stephen Boydb19f0092016-06-01 16:15:03 -0700426 struct clk_hw *hw;
Simon Arlott75fabc32012-09-10 23:26:15 -0600427 int ret;
428
Stephen Boydb19f0092016-06-01 16:15:03 -0700429 hw = clk_hw_register_fixed_rate(NULL, "apb_pclk", NULL, 0, 126000000);
430 if (IS_ERR(hw))
Simon Arlott75fabc32012-09-10 23:26:15 -0600431 pr_err("apb_pclk not registered\n");
432
Stephen Boydb19f0092016-06-01 16:15:03 -0700433 hw = clk_hw_register_fixed_rate(NULL, "uart0_pclk", NULL, 0, 3000000);
434 if (IS_ERR(hw))
Simon Arlott75fabc32012-09-10 23:26:15 -0600435 pr_err("uart0_pclk not registered\n");
Stephen Boydb19f0092016-06-01 16:15:03 -0700436 ret = clk_hw_register_clkdev(hw, NULL, "20201000.uart");
Simon Arlott75fabc32012-09-10 23:26:15 -0600437 if (ret)
438 pr_err("uart0_pclk alias not registered\n");
439
Stephen Boydb19f0092016-06-01 16:15:03 -0700440 hw = clk_hw_register_fixed_rate(NULL, "uart1_pclk", NULL, 0, 125000000);
441 if (IS_ERR(hw))
Simon Arlott75fabc32012-09-10 23:26:15 -0600442 pr_err("uart1_pclk not registered\n");
Stephen Boydb19f0092016-06-01 16:15:03 -0700443 ret = clk_hw_register_clkdev(hw, NULL, "20215000.uart");
Simon Arlott75fabc32012-09-10 23:26:15 -0600444 if (ret)
Domenico Andreoli686ea582012-10-20 03:35:28 +0200445 pr_err("uart1_pclk alias not registered\n");
Simon Arlott75fabc32012-09-10 23:26:15 -0600446}
Eric Anholt41691b82015-10-08 18:37:24 -0700447
448struct bcm2835_pll_data {
449 const char *name;
450 u32 cm_ctrl_reg;
451 u32 a2w_ctrl_reg;
452 u32 frac_reg;
453 u32 ana_reg_base;
454 u32 reference_enable_mask;
455 /* Bit in CM_LOCK to indicate when the PLL has locked. */
456 u32 lock_mask;
457
458 const struct bcm2835_pll_ana_bits *ana;
459
460 unsigned long min_rate;
461 unsigned long max_rate;
462 /*
463 * Highest rate for the VCO before we have to use the
464 * pre-divide-by-2.
465 */
466 unsigned long max_fb_rate;
467};
468
469struct bcm2835_pll_ana_bits {
470 u32 mask0;
471 u32 set0;
472 u32 mask1;
473 u32 set1;
474 u32 mask3;
475 u32 set3;
476 u32 fb_prediv_mask;
477};
478
479static const struct bcm2835_pll_ana_bits bcm2835_ana_default = {
480 .mask0 = 0,
481 .set0 = 0,
Eric Anholt286259e2016-04-13 13:05:02 -0700482 .mask1 = (u32)~(A2W_PLL_KI_MASK | A2W_PLL_KP_MASK),
Eric Anholt41691b82015-10-08 18:37:24 -0700483 .set1 = (2 << A2W_PLL_KI_SHIFT) | (8 << A2W_PLL_KP_SHIFT),
Eric Anholt286259e2016-04-13 13:05:02 -0700484 .mask3 = (u32)~A2W_PLL_KA_MASK,
Eric Anholt41691b82015-10-08 18:37:24 -0700485 .set3 = (2 << A2W_PLL_KA_SHIFT),
486 .fb_prediv_mask = BIT(14),
487};
488
489static const struct bcm2835_pll_ana_bits bcm2835_ana_pllh = {
Eric Anholt286259e2016-04-13 13:05:02 -0700490 .mask0 = (u32)~(A2W_PLLH_KA_MASK | A2W_PLLH_KI_LOW_MASK),
Eric Anholt41691b82015-10-08 18:37:24 -0700491 .set0 = (2 << A2W_PLLH_KA_SHIFT) | (2 << A2W_PLLH_KI_LOW_SHIFT),
Eric Anholt286259e2016-04-13 13:05:02 -0700492 .mask1 = (u32)~(A2W_PLLH_KI_HIGH_MASK | A2W_PLLH_KP_MASK),
Eric Anholt41691b82015-10-08 18:37:24 -0700493 .set1 = (6 << A2W_PLLH_KP_SHIFT),
494 .mask3 = 0,
495 .set3 = 0,
496 .fb_prediv_mask = BIT(11),
497};
498
Eric Anholt41691b82015-10-08 18:37:24 -0700499struct bcm2835_pll_divider_data {
500 const char *name;
Martin Sperl3b15afe2016-02-29 12:51:42 +0000501 const char *source_pll;
502
Eric Anholt41691b82015-10-08 18:37:24 -0700503 u32 cm_reg;
504 u32 a2w_reg;
505
506 u32 load_mask;
507 u32 hold_mask;
508 u32 fixed_divider;
Eric Anholt55486092017-01-18 07:31:55 +1100509 u32 flags;
Eric Anholt41691b82015-10-08 18:37:24 -0700510};
511
Eric Anholt41691b82015-10-08 18:37:24 -0700512struct bcm2835_clock_data {
513 const char *name;
514
515 const char *const *parents;
516 int num_mux_parents;
517
Boris Brezillon155e8b32016-12-01 22:00:19 +0100518 /* Bitmap encoding which parents accept rate change propagation. */
519 unsigned int set_rate_parent;
520
Eric Anholt41691b82015-10-08 18:37:24 -0700521 u32 ctl_reg;
522 u32 div_reg;
523
524 /* Number of integer bits in the divider */
525 u32 int_bits;
526 /* Number of fractional bits in the divider */
527 u32 frac_bits;
528
Eric Anholte69fdcc2016-06-01 12:05:33 -0700529 u32 flags;
530
Eric Anholt41691b82015-10-08 18:37:24 -0700531 bool is_vpu_clock;
Martin Sperl959ca922016-02-29 11:39:21 +0000532 bool is_mash_clock;
Eric Anholt3f919582017-01-18 07:31:57 +1100533
534 u32 tcnt_mux;
Eric Anholt41691b82015-10-08 18:37:24 -0700535};
536
Martin Sperl56eb3a22016-02-29 12:51:41 +0000537struct bcm2835_gate_data {
538 const char *name;
539 const char *parent;
540
541 u32 ctl_reg;
542};
543
Eric Anholt41691b82015-10-08 18:37:24 -0700544struct bcm2835_pll {
545 struct clk_hw hw;
546 struct bcm2835_cprman *cprman;
547 const struct bcm2835_pll_data *data;
548};
549
550static int bcm2835_pll_is_on(struct clk_hw *hw)
551{
552 struct bcm2835_pll *pll = container_of(hw, struct bcm2835_pll, hw);
553 struct bcm2835_cprman *cprman = pll->cprman;
554 const struct bcm2835_pll_data *data = pll->data;
555
556 return cprman_read(cprman, data->a2w_ctrl_reg) &
557 A2W_PLL_CTRL_PRST_DISABLE;
558}
559
560static void bcm2835_pll_choose_ndiv_and_fdiv(unsigned long rate,
561 unsigned long parent_rate,
562 u32 *ndiv, u32 *fdiv)
563{
564 u64 div;
565
566 div = (u64)rate << A2W_PLL_FRAC_BITS;
567 do_div(div, parent_rate);
568
569 *ndiv = div >> A2W_PLL_FRAC_BITS;
570 *fdiv = div & ((1 << A2W_PLL_FRAC_BITS) - 1);
571}
572
573static long bcm2835_pll_rate_from_divisors(unsigned long parent_rate,
574 u32 ndiv, u32 fdiv, u32 pdiv)
575{
576 u64 rate;
577
578 if (pdiv == 0)
579 return 0;
580
581 rate = (u64)parent_rate * ((ndiv << A2W_PLL_FRAC_BITS) + fdiv);
582 do_div(rate, pdiv);
583 return rate >> A2W_PLL_FRAC_BITS;
584}
585
586static long bcm2835_pll_round_rate(struct clk_hw *hw, unsigned long rate,
587 unsigned long *parent_rate)
588{
Eric Anholtc4e634c2016-09-30 10:07:27 -0700589 struct bcm2835_pll *pll = container_of(hw, struct bcm2835_pll, hw);
590 const struct bcm2835_pll_data *data = pll->data;
Eric Anholt41691b82015-10-08 18:37:24 -0700591 u32 ndiv, fdiv;
592
Eric Anholtc4e634c2016-09-30 10:07:27 -0700593 rate = clamp(rate, data->min_rate, data->max_rate);
594
Eric Anholt41691b82015-10-08 18:37:24 -0700595 bcm2835_pll_choose_ndiv_and_fdiv(rate, *parent_rate, &ndiv, &fdiv);
596
597 return bcm2835_pll_rate_from_divisors(*parent_rate, ndiv, fdiv, 1);
598}
599
600static unsigned long bcm2835_pll_get_rate(struct clk_hw *hw,
601 unsigned long parent_rate)
602{
603 struct bcm2835_pll *pll = container_of(hw, struct bcm2835_pll, hw);
604 struct bcm2835_cprman *cprman = pll->cprman;
605 const struct bcm2835_pll_data *data = pll->data;
606 u32 a2wctrl = cprman_read(cprman, data->a2w_ctrl_reg);
607 u32 ndiv, pdiv, fdiv;
608 bool using_prediv;
609
610 if (parent_rate == 0)
611 return 0;
612
613 fdiv = cprman_read(cprman, data->frac_reg) & A2W_PLL_FRAC_MASK;
614 ndiv = (a2wctrl & A2W_PLL_CTRL_NDIV_MASK) >> A2W_PLL_CTRL_NDIV_SHIFT;
615 pdiv = (a2wctrl & A2W_PLL_CTRL_PDIV_MASK) >> A2W_PLL_CTRL_PDIV_SHIFT;
616 using_prediv = cprman_read(cprman, data->ana_reg_base + 4) &
617 data->ana->fb_prediv_mask;
618
Phil Elwelle45098d2017-05-15 10:35:04 -0700619 if (using_prediv) {
Eric Anholt41691b82015-10-08 18:37:24 -0700620 ndiv *= 2;
Phil Elwelle45098d2017-05-15 10:35:04 -0700621 fdiv *= 2;
622 }
Eric Anholt41691b82015-10-08 18:37:24 -0700623
624 return bcm2835_pll_rate_from_divisors(parent_rate, ndiv, fdiv, pdiv);
625}
626
627static void bcm2835_pll_off(struct clk_hw *hw)
628{
629 struct bcm2835_pll *pll = container_of(hw, struct bcm2835_pll, hw);
630 struct bcm2835_cprman *cprman = pll->cprman;
631 const struct bcm2835_pll_data *data = pll->data;
632
Martin Sperl6727f082016-02-29 11:39:17 +0000633 spin_lock(&cprman->regs_lock);
634 cprman_write(cprman, data->cm_ctrl_reg,
635 cprman_read(cprman, data->cm_ctrl_reg) |
636 CM_PLL_ANARST);
637 cprman_write(cprman, data->a2w_ctrl_reg,
638 cprman_read(cprman, data->a2w_ctrl_reg) |
639 A2W_PLL_CTRL_PWRDN);
640 spin_unlock(&cprman->regs_lock);
Eric Anholt41691b82015-10-08 18:37:24 -0700641}
642
643static int bcm2835_pll_on(struct clk_hw *hw)
644{
645 struct bcm2835_pll *pll = container_of(hw, struct bcm2835_pll, hw);
646 struct bcm2835_cprman *cprman = pll->cprman;
647 const struct bcm2835_pll_data *data = pll->data;
648 ktime_t timeout;
649
Eric Anholte708b382016-04-13 13:05:03 -0700650 cprman_write(cprman, data->a2w_ctrl_reg,
651 cprman_read(cprman, data->a2w_ctrl_reg) &
652 ~A2W_PLL_CTRL_PWRDN);
653
Eric Anholt41691b82015-10-08 18:37:24 -0700654 /* Take the PLL out of reset. */
655 cprman_write(cprman, data->cm_ctrl_reg,
656 cprman_read(cprman, data->cm_ctrl_reg) & ~CM_PLL_ANARST);
657
658 /* Wait for the PLL to lock. */
659 timeout = ktime_add_ns(ktime_get(), LOCK_TIMEOUT_NS);
660 while (!(cprman_read(cprman, CM_LOCK) & data->lock_mask)) {
661 if (ktime_after(ktime_get(), timeout)) {
662 dev_err(cprman->dev, "%s: couldn't lock PLL\n",
663 clk_hw_get_name(hw));
664 return -ETIMEDOUT;
665 }
666
667 cpu_relax();
668 }
669
670 return 0;
671}
672
673static void
674bcm2835_pll_write_ana(struct bcm2835_cprman *cprman, u32 ana_reg_base, u32 *ana)
675{
676 int i;
677
678 /*
679 * ANA register setup is done as a series of writes to
680 * ANA3-ANA0, in that order. This lets us write all 4
681 * registers as a single cycle of the serdes interface (taking
682 * 100 xosc clocks), whereas if we were to update ana0, 1, and
683 * 3 individually through their partial-write registers, each
684 * would be their own serdes cycle.
685 */
686 for (i = 3; i >= 0; i--)
687 cprman_write(cprman, ana_reg_base + i * 4, ana[i]);
688}
689
690static int bcm2835_pll_set_rate(struct clk_hw *hw,
691 unsigned long rate, unsigned long parent_rate)
692{
693 struct bcm2835_pll *pll = container_of(hw, struct bcm2835_pll, hw);
694 struct bcm2835_cprman *cprman = pll->cprman;
695 const struct bcm2835_pll_data *data = pll->data;
696 bool was_using_prediv, use_fb_prediv, do_ana_setup_first;
697 u32 ndiv, fdiv, a2w_ctl;
698 u32 ana[4];
699 int i;
700
Eric Anholt41691b82015-10-08 18:37:24 -0700701 if (rate > data->max_fb_rate) {
702 use_fb_prediv = true;
703 rate /= 2;
704 } else {
705 use_fb_prediv = false;
706 }
707
708 bcm2835_pll_choose_ndiv_and_fdiv(rate, parent_rate, &ndiv, &fdiv);
709
710 for (i = 3; i >= 0; i--)
711 ana[i] = cprman_read(cprman, data->ana_reg_base + i * 4);
712
713 was_using_prediv = ana[1] & data->ana->fb_prediv_mask;
714
715 ana[0] &= ~data->ana->mask0;
716 ana[0] |= data->ana->set0;
717 ana[1] &= ~data->ana->mask1;
718 ana[1] |= data->ana->set1;
719 ana[3] &= ~data->ana->mask3;
720 ana[3] |= data->ana->set3;
721
722 if (was_using_prediv && !use_fb_prediv) {
723 ana[1] &= ~data->ana->fb_prediv_mask;
724 do_ana_setup_first = true;
725 } else if (!was_using_prediv && use_fb_prediv) {
726 ana[1] |= data->ana->fb_prediv_mask;
727 do_ana_setup_first = false;
728 } else {
729 do_ana_setup_first = true;
730 }
731
732 /* Unmask the reference clock from the oscillator. */
733 cprman_write(cprman, A2W_XOSC_CTRL,
734 cprman_read(cprman, A2W_XOSC_CTRL) |
735 data->reference_enable_mask);
736
737 if (do_ana_setup_first)
738 bcm2835_pll_write_ana(cprman, data->ana_reg_base, ana);
739
740 /* Set the PLL multiplier from the oscillator. */
741 cprman_write(cprman, data->frac_reg, fdiv);
742
743 a2w_ctl = cprman_read(cprman, data->a2w_ctrl_reg);
744 a2w_ctl &= ~A2W_PLL_CTRL_NDIV_MASK;
745 a2w_ctl |= ndiv << A2W_PLL_CTRL_NDIV_SHIFT;
746 a2w_ctl &= ~A2W_PLL_CTRL_PDIV_MASK;
747 a2w_ctl |= 1 << A2W_PLL_CTRL_PDIV_SHIFT;
748 cprman_write(cprman, data->a2w_ctrl_reg, a2w_ctl);
749
750 if (!do_ana_setup_first)
751 bcm2835_pll_write_ana(cprman, data->ana_reg_base, ana);
752
753 return 0;
754}
755
Martin Sperl96bf9c62016-02-29 14:20:15 +0000756static int bcm2835_pll_debug_init(struct clk_hw *hw,
757 struct dentry *dentry)
758{
759 struct bcm2835_pll *pll = container_of(hw, struct bcm2835_pll, hw);
760 struct bcm2835_cprman *cprman = pll->cprman;
761 const struct bcm2835_pll_data *data = pll->data;
762 struct debugfs_reg32 *regs;
763
764 regs = devm_kzalloc(cprman->dev, 7 * sizeof(*regs), GFP_KERNEL);
765 if (!regs)
766 return -ENOMEM;
767
768 regs[0].name = "cm_ctrl";
769 regs[0].offset = data->cm_ctrl_reg;
770 regs[1].name = "a2w_ctrl";
771 regs[1].offset = data->a2w_ctrl_reg;
772 regs[2].name = "frac";
773 regs[2].offset = data->frac_reg;
774 regs[3].name = "ana0";
775 regs[3].offset = data->ana_reg_base + 0 * 4;
776 regs[4].name = "ana1";
777 regs[4].offset = data->ana_reg_base + 1 * 4;
778 regs[5].name = "ana2";
779 regs[5].offset = data->ana_reg_base + 2 * 4;
780 regs[6].name = "ana3";
781 regs[6].offset = data->ana_reg_base + 3 * 4;
782
783 return bcm2835_debugfs_regset(cprman, 0, regs, 7, dentry);
784}
785
Eric Anholt41691b82015-10-08 18:37:24 -0700786static const struct clk_ops bcm2835_pll_clk_ops = {
787 .is_prepared = bcm2835_pll_is_on,
788 .prepare = bcm2835_pll_on,
789 .unprepare = bcm2835_pll_off,
790 .recalc_rate = bcm2835_pll_get_rate,
791 .set_rate = bcm2835_pll_set_rate,
792 .round_rate = bcm2835_pll_round_rate,
Martin Sperl96bf9c62016-02-29 14:20:15 +0000793 .debug_init = bcm2835_pll_debug_init,
Eric Anholt41691b82015-10-08 18:37:24 -0700794};
795
796struct bcm2835_pll_divider {
797 struct clk_divider div;
798 struct bcm2835_cprman *cprman;
799 const struct bcm2835_pll_divider_data *data;
800};
801
802static struct bcm2835_pll_divider *
803bcm2835_pll_divider_from_hw(struct clk_hw *hw)
804{
805 return container_of(hw, struct bcm2835_pll_divider, div.hw);
806}
807
808static int bcm2835_pll_divider_is_on(struct clk_hw *hw)
809{
810 struct bcm2835_pll_divider *divider = bcm2835_pll_divider_from_hw(hw);
811 struct bcm2835_cprman *cprman = divider->cprman;
812 const struct bcm2835_pll_divider_data *data = divider->data;
813
814 return !(cprman_read(cprman, data->a2w_reg) & A2W_PLL_CHANNEL_DISABLE);
815}
816
817static long bcm2835_pll_divider_round_rate(struct clk_hw *hw,
818 unsigned long rate,
819 unsigned long *parent_rate)
820{
821 return clk_divider_ops.round_rate(hw, rate, parent_rate);
822}
823
824static unsigned long bcm2835_pll_divider_get_rate(struct clk_hw *hw,
825 unsigned long parent_rate)
826{
Eric Anholt79c1e2f2016-02-15 19:03:58 -0800827 return clk_divider_ops.recalc_rate(hw, parent_rate);
Eric Anholt41691b82015-10-08 18:37:24 -0700828}
829
830static void bcm2835_pll_divider_off(struct clk_hw *hw)
831{
832 struct bcm2835_pll_divider *divider = bcm2835_pll_divider_from_hw(hw);
833 struct bcm2835_cprman *cprman = divider->cprman;
834 const struct bcm2835_pll_divider_data *data = divider->data;
835
Martin Sperlec36a5c2016-02-29 11:39:18 +0000836 spin_lock(&cprman->regs_lock);
Eric Anholt41691b82015-10-08 18:37:24 -0700837 cprman_write(cprman, data->cm_reg,
838 (cprman_read(cprman, data->cm_reg) &
839 ~data->load_mask) | data->hold_mask);
Boris Brezillon68af4fa2016-12-01 20:27:21 +0100840 cprman_write(cprman, data->a2w_reg,
841 cprman_read(cprman, data->a2w_reg) |
842 A2W_PLL_CHANNEL_DISABLE);
Martin Sperlec36a5c2016-02-29 11:39:18 +0000843 spin_unlock(&cprman->regs_lock);
Eric Anholt41691b82015-10-08 18:37:24 -0700844}
845
846static int bcm2835_pll_divider_on(struct clk_hw *hw)
847{
848 struct bcm2835_pll_divider *divider = bcm2835_pll_divider_from_hw(hw);
849 struct bcm2835_cprman *cprman = divider->cprman;
850 const struct bcm2835_pll_divider_data *data = divider->data;
851
Martin Sperlec36a5c2016-02-29 11:39:18 +0000852 spin_lock(&cprman->regs_lock);
Eric Anholt41691b82015-10-08 18:37:24 -0700853 cprman_write(cprman, data->a2w_reg,
854 cprman_read(cprman, data->a2w_reg) &
855 ~A2W_PLL_CHANNEL_DISABLE);
856
857 cprman_write(cprman, data->cm_reg,
858 cprman_read(cprman, data->cm_reg) & ~data->hold_mask);
Martin Sperlec36a5c2016-02-29 11:39:18 +0000859 spin_unlock(&cprman->regs_lock);
Eric Anholt41691b82015-10-08 18:37:24 -0700860
861 return 0;
862}
863
864static int bcm2835_pll_divider_set_rate(struct clk_hw *hw,
865 unsigned long rate,
866 unsigned long parent_rate)
867{
868 struct bcm2835_pll_divider *divider = bcm2835_pll_divider_from_hw(hw);
869 struct bcm2835_cprman *cprman = divider->cprman;
870 const struct bcm2835_pll_divider_data *data = divider->data;
Eric Anholt773b3962016-02-15 19:03:57 -0800871 u32 cm, div, max_div = 1 << A2W_PLL_DIV_BITS;
Eric Anholt41691b82015-10-08 18:37:24 -0700872
Eric Anholt773b3962016-02-15 19:03:57 -0800873 div = DIV_ROUND_UP_ULL(parent_rate, rate);
Eric Anholt41691b82015-10-08 18:37:24 -0700874
Eric Anholt773b3962016-02-15 19:03:57 -0800875 div = min(div, max_div);
876 if (div == max_div)
877 div = 0;
878
879 cprman_write(cprman, data->a2w_reg, div);
Eric Anholt41691b82015-10-08 18:37:24 -0700880 cm = cprman_read(cprman, data->cm_reg);
881 cprman_write(cprman, data->cm_reg, cm | data->load_mask);
882 cprman_write(cprman, data->cm_reg, cm & ~data->load_mask);
883
884 return 0;
885}
886
Martin Sperl96bf9c62016-02-29 14:20:15 +0000887static int bcm2835_pll_divider_debug_init(struct clk_hw *hw,
888 struct dentry *dentry)
889{
890 struct bcm2835_pll_divider *divider = bcm2835_pll_divider_from_hw(hw);
891 struct bcm2835_cprman *cprman = divider->cprman;
892 const struct bcm2835_pll_divider_data *data = divider->data;
893 struct debugfs_reg32 *regs;
894
895 regs = devm_kzalloc(cprman->dev, 7 * sizeof(*regs), GFP_KERNEL);
896 if (!regs)
897 return -ENOMEM;
898
899 regs[0].name = "cm";
900 regs[0].offset = data->cm_reg;
901 regs[1].name = "a2w";
902 regs[1].offset = data->a2w_reg;
903
904 return bcm2835_debugfs_regset(cprman, 0, regs, 2, dentry);
905}
906
Eric Anholt41691b82015-10-08 18:37:24 -0700907static const struct clk_ops bcm2835_pll_divider_clk_ops = {
908 .is_prepared = bcm2835_pll_divider_is_on,
909 .prepare = bcm2835_pll_divider_on,
910 .unprepare = bcm2835_pll_divider_off,
911 .recalc_rate = bcm2835_pll_divider_get_rate,
912 .set_rate = bcm2835_pll_divider_set_rate,
913 .round_rate = bcm2835_pll_divider_round_rate,
Martin Sperl96bf9c62016-02-29 14:20:15 +0000914 .debug_init = bcm2835_pll_divider_debug_init,
Eric Anholt41691b82015-10-08 18:37:24 -0700915};
916
917/*
918 * The CM dividers do fixed-point division, so we can't use the
919 * generic integer divider code like the PLL dividers do (and we can't
920 * fake it by having some fixed shifts preceding it in the clock tree,
921 * because we'd run out of bits in a 32-bit unsigned long).
922 */
923struct bcm2835_clock {
924 struct clk_hw hw;
925 struct bcm2835_cprman *cprman;
926 const struct bcm2835_clock_data *data;
927};
928
929static struct bcm2835_clock *bcm2835_clock_from_hw(struct clk_hw *hw)
930{
931 return container_of(hw, struct bcm2835_clock, hw);
932}
933
934static int bcm2835_clock_is_on(struct clk_hw *hw)
935{
936 struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
937 struct bcm2835_cprman *cprman = clock->cprman;
938 const struct bcm2835_clock_data *data = clock->data;
939
940 return (cprman_read(cprman, data->ctl_reg) & CM_ENABLE) != 0;
941}
942
943static u32 bcm2835_clock_choose_div(struct clk_hw *hw,
944 unsigned long rate,
Remi Pommarel9c95b322015-12-06 17:22:46 +0100945 unsigned long parent_rate,
946 bool round_up)
Eric Anholt41691b82015-10-08 18:37:24 -0700947{
948 struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
949 const struct bcm2835_clock_data *data = clock->data;
Remi Pommarel9c95b322015-12-06 17:22:46 +0100950 u32 unused_frac_mask =
951 GENMASK(CM_DIV_FRAC_BITS - data->frac_bits, 0) >> 1;
Eric Anholt41691b82015-10-08 18:37:24 -0700952 u64 temp = (u64)parent_rate << CM_DIV_FRAC_BITS;
Remi Pommarel9c95b322015-12-06 17:22:46 +0100953 u64 rem;
Martin Sperl959ca922016-02-29 11:39:21 +0000954 u32 div, mindiv, maxdiv;
Eric Anholt41691b82015-10-08 18:37:24 -0700955
Remi Pommarel9c95b322015-12-06 17:22:46 +0100956 rem = do_div(temp, rate);
Eric Anholt41691b82015-10-08 18:37:24 -0700957 div = temp;
958
Remi Pommarel9c95b322015-12-06 17:22:46 +0100959 /* Round up and mask off the unused bits */
960 if (round_up && ((div & unused_frac_mask) != 0 || rem != 0))
961 div += unused_frac_mask + 1;
962 div &= ~unused_frac_mask;
Eric Anholt41691b82015-10-08 18:37:24 -0700963
Martin Sperl959ca922016-02-29 11:39:21 +0000964 /* different clamping limits apply for a mash clock */
965 if (data->is_mash_clock) {
966 /* clamp to min divider of 2 */
967 mindiv = 2 << CM_DIV_FRAC_BITS;
968 /* clamp to the highest possible integer divider */
969 maxdiv = (BIT(data->int_bits) - 1) << CM_DIV_FRAC_BITS;
970 } else {
971 /* clamp to min divider of 1 */
972 mindiv = 1 << CM_DIV_FRAC_BITS;
973 /* clamp to the highest possible fractional divider */
974 maxdiv = GENMASK(data->int_bits + CM_DIV_FRAC_BITS - 1,
975 CM_DIV_FRAC_BITS - data->frac_bits);
976 }
977
978 /* apply the clamping limits */
979 div = max_t(u32, div, mindiv);
980 div = min_t(u32, div, maxdiv);
Eric Anholt41691b82015-10-08 18:37:24 -0700981
982 return div;
983}
984
985static long bcm2835_clock_rate_from_divisor(struct bcm2835_clock *clock,
986 unsigned long parent_rate,
987 u32 div)
988{
989 const struct bcm2835_clock_data *data = clock->data;
990 u64 temp;
991
Eric Anholt8a39e9f2017-01-18 07:31:56 +1100992 if (data->int_bits == 0 && data->frac_bits == 0)
993 return parent_rate;
994
Eric Anholt41691b82015-10-08 18:37:24 -0700995 /*
996 * The divisor is a 12.12 fixed point field, but only some of
997 * the bits are populated in any given clock.
998 */
999 div >>= CM_DIV_FRAC_BITS - data->frac_bits;
1000 div &= (1 << (data->int_bits + data->frac_bits)) - 1;
1001
1002 if (div == 0)
1003 return 0;
1004
1005 temp = (u64)parent_rate << data->frac_bits;
1006
1007 do_div(temp, div);
1008
1009 return temp;
1010}
1011
Eric Anholt41691b82015-10-08 18:37:24 -07001012static unsigned long bcm2835_clock_get_rate(struct clk_hw *hw,
1013 unsigned long parent_rate)
1014{
1015 struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
1016 struct bcm2835_cprman *cprman = clock->cprman;
1017 const struct bcm2835_clock_data *data = clock->data;
Eric Anholt8a39e9f2017-01-18 07:31:56 +11001018 u32 div;
1019
1020 if (data->int_bits == 0 && data->frac_bits == 0)
1021 return parent_rate;
1022
1023 div = cprman_read(cprman, data->div_reg);
Eric Anholt41691b82015-10-08 18:37:24 -07001024
1025 return bcm2835_clock_rate_from_divisor(clock, parent_rate, div);
1026}
1027
1028static void bcm2835_clock_wait_busy(struct bcm2835_clock *clock)
1029{
1030 struct bcm2835_cprman *cprman = clock->cprman;
1031 const struct bcm2835_clock_data *data = clock->data;
1032 ktime_t timeout = ktime_add_ns(ktime_get(), LOCK_TIMEOUT_NS);
1033
1034 while (cprman_read(cprman, data->ctl_reg) & CM_BUSY) {
1035 if (ktime_after(ktime_get(), timeout)) {
1036 dev_err(cprman->dev, "%s: couldn't lock PLL\n",
1037 clk_hw_get_name(&clock->hw));
1038 return;
1039 }
1040 cpu_relax();
1041 }
1042}
1043
1044static void bcm2835_clock_off(struct clk_hw *hw)
1045{
1046 struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
1047 struct bcm2835_cprman *cprman = clock->cprman;
1048 const struct bcm2835_clock_data *data = clock->data;
1049
1050 spin_lock(&cprman->regs_lock);
1051 cprman_write(cprman, data->ctl_reg,
1052 cprman_read(cprman, data->ctl_reg) & ~CM_ENABLE);
1053 spin_unlock(&cprman->regs_lock);
1054
1055 /* BUSY will remain high until the divider completes its cycle. */
1056 bcm2835_clock_wait_busy(clock);
1057}
1058
1059static int bcm2835_clock_on(struct clk_hw *hw)
1060{
1061 struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
1062 struct bcm2835_cprman *cprman = clock->cprman;
1063 const struct bcm2835_clock_data *data = clock->data;
1064
1065 spin_lock(&cprman->regs_lock);
1066 cprman_write(cprman, data->ctl_reg,
1067 cprman_read(cprman, data->ctl_reg) |
1068 CM_ENABLE |
1069 CM_GATE);
1070 spin_unlock(&cprman->regs_lock);
1071
Eric Anholt3f919582017-01-18 07:31:57 +11001072 /* Debug code to measure the clock once it's turned on to see
1073 * if it's ticking at the rate we expect.
1074 */
1075 if (data->tcnt_mux && false) {
1076 dev_info(cprman->dev,
1077 "clk %s: rate %ld, measure %ld\n",
1078 data->name,
1079 clk_hw_get_rate(hw),
1080 bcm2835_measure_tcnt_mux(cprman, data->tcnt_mux));
1081 }
1082
Eric Anholt41691b82015-10-08 18:37:24 -07001083 return 0;
1084}
1085
1086static int bcm2835_clock_set_rate(struct clk_hw *hw,
1087 unsigned long rate, unsigned long parent_rate)
1088{
1089 struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
1090 struct bcm2835_cprman *cprman = clock->cprman;
1091 const struct bcm2835_clock_data *data = clock->data;
Remi Pommarel9c95b322015-12-06 17:22:46 +01001092 u32 div = bcm2835_clock_choose_div(hw, rate, parent_rate, false);
Martin Sperl959ca922016-02-29 11:39:21 +00001093 u32 ctl;
1094
1095 spin_lock(&cprman->regs_lock);
1096
1097 /*
1098 * Setting up frac support
1099 *
1100 * In principle it is recommended to stop/start the clock first,
1101 * but as we set CLK_SET_RATE_GATE during registration of the
1102 * clock this requirement should be take care of by the
1103 * clk-framework.
1104 */
1105 ctl = cprman_read(cprman, data->ctl_reg) & ~CM_FRAC;
1106 ctl |= (div & CM_DIV_FRAC_MASK) ? CM_FRAC : 0;
1107 cprman_write(cprman, data->ctl_reg, ctl);
Eric Anholt41691b82015-10-08 18:37:24 -07001108
1109 cprman_write(cprman, data->div_reg, div);
1110
Martin Sperl959ca922016-02-29 11:39:21 +00001111 spin_unlock(&cprman->regs_lock);
1112
Eric Anholt41691b82015-10-08 18:37:24 -07001113 return 0;
1114}
1115
Eric Anholt67615c52016-06-01 12:05:36 -07001116static bool
1117bcm2835_clk_is_pllc(struct clk_hw *hw)
1118{
1119 if (!hw)
1120 return false;
1121
1122 return strncmp(clk_hw_get_name(hw), "pllc", 4) == 0;
1123}
1124
Boris Brezillon155e8b32016-12-01 22:00:19 +01001125static unsigned long bcm2835_clock_choose_div_and_prate(struct clk_hw *hw,
1126 int parent_idx,
1127 unsigned long rate,
1128 u32 *div,
1129 unsigned long *prate)
1130{
1131 struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
1132 struct bcm2835_cprman *cprman = clock->cprman;
1133 const struct bcm2835_clock_data *data = clock->data;
Boris Brezillon2aab7a22016-12-12 09:00:53 +01001134 unsigned long best_rate = 0;
Boris Brezillon155e8b32016-12-01 22:00:19 +01001135 u32 curdiv, mindiv, maxdiv;
1136 struct clk_hw *parent;
1137
1138 parent = clk_hw_get_parent_by_index(hw, parent_idx);
1139
1140 if (!(BIT(parent_idx) & data->set_rate_parent)) {
1141 *prate = clk_hw_get_rate(parent);
1142 *div = bcm2835_clock_choose_div(hw, rate, *prate, true);
1143
1144 return bcm2835_clock_rate_from_divisor(clock, *prate,
1145 *div);
1146 }
1147
1148 if (data->frac_bits)
1149 dev_warn(cprman->dev,
1150 "frac bits are not used when propagating rate change");
1151
1152 /* clamp to min divider of 2 if we're dealing with a mash clock */
1153 mindiv = data->is_mash_clock ? 2 : 1;
1154 maxdiv = BIT(data->int_bits) - 1;
1155
1156 /* TODO: Be smart, and only test a subset of the available divisors. */
1157 for (curdiv = mindiv; curdiv <= maxdiv; curdiv++) {
1158 unsigned long tmp_rate;
1159
1160 tmp_rate = clk_hw_round_rate(parent, rate * curdiv);
1161 tmp_rate /= curdiv;
1162 if (curdiv == mindiv ||
1163 (tmp_rate > best_rate && tmp_rate <= rate))
1164 best_rate = tmp_rate;
1165
1166 if (best_rate == rate)
1167 break;
1168 }
1169
1170 *div = curdiv << CM_DIV_FRAC_BITS;
1171 *prate = curdiv * best_rate;
1172
1173 return best_rate;
1174}
1175
Remi Pommarel6d18b8a2015-12-06 17:22:47 +01001176static int bcm2835_clock_determine_rate(struct clk_hw *hw,
Martin Sperl6e1e60d2016-02-29 11:39:22 +00001177 struct clk_rate_request *req)
Remi Pommarel6d18b8a2015-12-06 17:22:47 +01001178{
Remi Pommarel6d18b8a2015-12-06 17:22:47 +01001179 struct clk_hw *parent, *best_parent = NULL;
Eric Anholt67615c52016-06-01 12:05:36 -07001180 bool current_parent_is_pllc;
Remi Pommarel6d18b8a2015-12-06 17:22:47 +01001181 unsigned long rate, best_rate = 0;
1182 unsigned long prate, best_prate = 0;
1183 size_t i;
1184 u32 div;
1185
Eric Anholt67615c52016-06-01 12:05:36 -07001186 current_parent_is_pllc = bcm2835_clk_is_pllc(clk_hw_get_parent(hw));
1187
Remi Pommarel6d18b8a2015-12-06 17:22:47 +01001188 /*
1189 * Select parent clock that results in the closest but lower rate
1190 */
1191 for (i = 0; i < clk_hw_get_num_parents(hw); ++i) {
1192 parent = clk_hw_get_parent_by_index(hw, i);
1193 if (!parent)
1194 continue;
Eric Anholt67615c52016-06-01 12:05:36 -07001195
1196 /*
1197 * Don't choose a PLLC-derived clock as our parent
1198 * unless it had been manually set that way. PLLC's
1199 * frequency gets adjusted by the firmware due to
1200 * over-temp or under-voltage conditions, without
1201 * prior notification to our clock consumer.
1202 */
1203 if (bcm2835_clk_is_pllc(parent) && !current_parent_is_pllc)
1204 continue;
1205
Boris Brezillon155e8b32016-12-01 22:00:19 +01001206 rate = bcm2835_clock_choose_div_and_prate(hw, i, req->rate,
1207 &div, &prate);
Remi Pommarel6d18b8a2015-12-06 17:22:47 +01001208 if (rate > best_rate && rate <= req->rate) {
1209 best_parent = parent;
1210 best_prate = prate;
1211 best_rate = rate;
1212 }
1213 }
1214
1215 if (!best_parent)
1216 return -EINVAL;
1217
1218 req->best_parent_hw = best_parent;
1219 req->best_parent_rate = best_prate;
1220
1221 req->rate = best_rate;
1222
1223 return 0;
1224}
1225
1226static int bcm2835_clock_set_parent(struct clk_hw *hw, u8 index)
1227{
1228 struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
1229 struct bcm2835_cprman *cprman = clock->cprman;
1230 const struct bcm2835_clock_data *data = clock->data;
1231 u8 src = (index << CM_SRC_SHIFT) & CM_SRC_MASK;
1232
1233 cprman_write(cprman, data->ctl_reg, src);
1234 return 0;
1235}
1236
1237static u8 bcm2835_clock_get_parent(struct clk_hw *hw)
1238{
1239 struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
1240 struct bcm2835_cprman *cprman = clock->cprman;
1241 const struct bcm2835_clock_data *data = clock->data;
1242 u32 src = cprman_read(cprman, data->ctl_reg);
1243
1244 return (src & CM_SRC_MASK) >> CM_SRC_SHIFT;
1245}
1246
Martin Sperl96bf9c62016-02-29 14:20:15 +00001247static struct debugfs_reg32 bcm2835_debugfs_clock_reg32[] = {
1248 {
1249 .name = "ctl",
1250 .offset = 0,
1251 },
1252 {
1253 .name = "div",
1254 .offset = 4,
1255 },
1256};
1257
1258static int bcm2835_clock_debug_init(struct clk_hw *hw,
1259 struct dentry *dentry)
1260{
1261 struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
1262 struct bcm2835_cprman *cprman = clock->cprman;
1263 const struct bcm2835_clock_data *data = clock->data;
1264
1265 return bcm2835_debugfs_regset(
1266 cprman, data->ctl_reg,
1267 bcm2835_debugfs_clock_reg32,
1268 ARRAY_SIZE(bcm2835_debugfs_clock_reg32),
1269 dentry);
1270}
1271
Eric Anholt41691b82015-10-08 18:37:24 -07001272static const struct clk_ops bcm2835_clock_clk_ops = {
1273 .is_prepared = bcm2835_clock_is_on,
1274 .prepare = bcm2835_clock_on,
1275 .unprepare = bcm2835_clock_off,
1276 .recalc_rate = bcm2835_clock_get_rate,
1277 .set_rate = bcm2835_clock_set_rate,
Remi Pommarel6d18b8a2015-12-06 17:22:47 +01001278 .determine_rate = bcm2835_clock_determine_rate,
1279 .set_parent = bcm2835_clock_set_parent,
1280 .get_parent = bcm2835_clock_get_parent,
Martin Sperl96bf9c62016-02-29 14:20:15 +00001281 .debug_init = bcm2835_clock_debug_init,
Eric Anholt41691b82015-10-08 18:37:24 -07001282};
1283
1284static int bcm2835_vpu_clock_is_on(struct clk_hw *hw)
1285{
1286 return true;
1287}
1288
1289/*
1290 * The VPU clock can never be disabled (it doesn't have an ENABLE
1291 * bit), so it gets its own set of clock ops.
1292 */
1293static const struct clk_ops bcm2835_vpu_clock_clk_ops = {
1294 .is_prepared = bcm2835_vpu_clock_is_on,
1295 .recalc_rate = bcm2835_clock_get_rate,
1296 .set_rate = bcm2835_clock_set_rate,
Remi Pommarel6d18b8a2015-12-06 17:22:47 +01001297 .determine_rate = bcm2835_clock_determine_rate,
1298 .set_parent = bcm2835_clock_set_parent,
1299 .get_parent = bcm2835_clock_get_parent,
Martin Sperl96bf9c62016-02-29 14:20:15 +00001300 .debug_init = bcm2835_clock_debug_init,
Eric Anholt41691b82015-10-08 18:37:24 -07001301};
1302
Stephen Boydb19f0092016-06-01 16:15:03 -07001303static struct clk_hw *bcm2835_register_pll(struct bcm2835_cprman *cprman,
1304 const struct bcm2835_pll_data *data)
Eric Anholt41691b82015-10-08 18:37:24 -07001305{
1306 struct bcm2835_pll *pll;
1307 struct clk_init_data init;
Stephen Boydb19f0092016-06-01 16:15:03 -07001308 int ret;
Eric Anholt41691b82015-10-08 18:37:24 -07001309
1310 memset(&init, 0, sizeof(init));
1311
1312 /* All of the PLLs derive from the external oscillator. */
Eric Anholt8a39e9f2017-01-18 07:31:56 +11001313 init.parent_names = &cprman->real_parent_names[0];
Eric Anholt41691b82015-10-08 18:37:24 -07001314 init.num_parents = 1;
1315 init.name = data->name;
1316 init.ops = &bcm2835_pll_clk_ops;
1317 init.flags = CLK_IGNORE_UNUSED;
1318
1319 pll = kzalloc(sizeof(*pll), GFP_KERNEL);
1320 if (!pll)
1321 return NULL;
1322
1323 pll->cprman = cprman;
1324 pll->data = data;
1325 pll->hw.init = &init;
1326
Stephen Boydb19f0092016-06-01 16:15:03 -07001327 ret = devm_clk_hw_register(cprman->dev, &pll->hw);
1328 if (ret)
1329 return NULL;
1330 return &pll->hw;
Eric Anholt41691b82015-10-08 18:37:24 -07001331}
1332
Stephen Boydb19f0092016-06-01 16:15:03 -07001333static struct clk_hw *
Eric Anholt41691b82015-10-08 18:37:24 -07001334bcm2835_register_pll_divider(struct bcm2835_cprman *cprman,
1335 const struct bcm2835_pll_divider_data *data)
1336{
1337 struct bcm2835_pll_divider *divider;
1338 struct clk_init_data init;
Eric Anholt41691b82015-10-08 18:37:24 -07001339 const char *divider_name;
Stephen Boydb19f0092016-06-01 16:15:03 -07001340 int ret;
Eric Anholt41691b82015-10-08 18:37:24 -07001341
1342 if (data->fixed_divider != 1) {
1343 divider_name = devm_kasprintf(cprman->dev, GFP_KERNEL,
1344 "%s_prediv", data->name);
1345 if (!divider_name)
1346 return NULL;
1347 } else {
1348 divider_name = data->name;
1349 }
1350
1351 memset(&init, 0, sizeof(init));
1352
Martin Sperl3b15afe2016-02-29 12:51:42 +00001353 init.parent_names = &data->source_pll;
Eric Anholt41691b82015-10-08 18:37:24 -07001354 init.num_parents = 1;
1355 init.name = divider_name;
1356 init.ops = &bcm2835_pll_divider_clk_ops;
Eric Anholt55486092017-01-18 07:31:55 +11001357 init.flags = data->flags | CLK_IGNORE_UNUSED;
Eric Anholt41691b82015-10-08 18:37:24 -07001358
1359 divider = devm_kzalloc(cprman->dev, sizeof(*divider), GFP_KERNEL);
1360 if (!divider)
1361 return NULL;
1362
1363 divider->div.reg = cprman->regs + data->a2w_reg;
1364 divider->div.shift = A2W_PLL_DIV_SHIFT;
1365 divider->div.width = A2W_PLL_DIV_BITS;
Eric Anholt79c1e2f2016-02-15 19:03:58 -08001366 divider->div.flags = CLK_DIVIDER_MAX_AT_ZERO;
Eric Anholt41691b82015-10-08 18:37:24 -07001367 divider->div.lock = &cprman->regs_lock;
1368 divider->div.hw.init = &init;
1369 divider->div.table = NULL;
1370
1371 divider->cprman = cprman;
1372 divider->data = data;
1373
Stephen Boydb19f0092016-06-01 16:15:03 -07001374 ret = devm_clk_hw_register(cprman->dev, &divider->div.hw);
1375 if (ret)
1376 return ERR_PTR(ret);
Eric Anholt41691b82015-10-08 18:37:24 -07001377
1378 /*
1379 * PLLH's channels have a fixed divide by 10 afterwards, which
1380 * is what our consumers are actually using.
1381 */
1382 if (data->fixed_divider != 1) {
Stephen Boydb19f0092016-06-01 16:15:03 -07001383 return clk_hw_register_fixed_factor(cprman->dev, data->name,
1384 divider_name,
1385 CLK_SET_RATE_PARENT,
1386 1,
1387 data->fixed_divider);
Eric Anholt41691b82015-10-08 18:37:24 -07001388 }
1389
Stephen Boydb19f0092016-06-01 16:15:03 -07001390 return &divider->div.hw;
Eric Anholt41691b82015-10-08 18:37:24 -07001391}
1392
Stephen Boydb19f0092016-06-01 16:15:03 -07001393static struct clk_hw *bcm2835_register_clock(struct bcm2835_cprman *cprman,
Eric Anholt41691b82015-10-08 18:37:24 -07001394 const struct bcm2835_clock_data *data)
1395{
1396 struct bcm2835_clock *clock;
1397 struct clk_init_data init;
Remi Pommarel6d18b8a2015-12-06 17:22:47 +01001398 const char *parents[1 << CM_SRC_BITS];
Eric Anholt8a39e9f2017-01-18 07:31:56 +11001399 size_t i, j;
Stephen Boydb19f0092016-06-01 16:15:03 -07001400 int ret;
Eric Anholt41691b82015-10-08 18:37:24 -07001401
1402 /*
Eric Anholt8a39e9f2017-01-18 07:31:56 +11001403 * Replace our strings referencing parent clocks with the
1404 * actual clock-output-name of the parent.
Eric Anholt41691b82015-10-08 18:37:24 -07001405 */
Remi Pommarel6d18b8a2015-12-06 17:22:47 +01001406 for (i = 0; i < data->num_mux_parents; i++) {
Eric Anholt8a39e9f2017-01-18 07:31:56 +11001407 parents[i] = data->parents[i];
1408
1409 for (j = 0; j < ARRAY_SIZE(cprman_parent_names); j++) {
1410 if (strcmp(parents[i], cprman_parent_names[j]) == 0) {
1411 parents[i] = cprman->real_parent_names[j];
1412 break;
1413 }
1414 }
Eric Anholt41691b82015-10-08 18:37:24 -07001415 }
1416
1417 memset(&init, 0, sizeof(init));
Remi Pommarel6d18b8a2015-12-06 17:22:47 +01001418 init.parent_names = parents;
1419 init.num_parents = data->num_mux_parents;
Eric Anholt41691b82015-10-08 18:37:24 -07001420 init.name = data->name;
Eric Anholte69fdcc2016-06-01 12:05:33 -07001421 init.flags = data->flags | CLK_IGNORE_UNUSED;
Eric Anholt41691b82015-10-08 18:37:24 -07001422
Boris Brezillon155e8b32016-12-01 22:00:19 +01001423 /*
1424 * Pass the CLK_SET_RATE_PARENT flag if we are allowed to propagate
1425 * rate changes on at least of the parents.
1426 */
1427 if (data->set_rate_parent)
1428 init.flags |= CLK_SET_RATE_PARENT;
1429
Eric Anholt41691b82015-10-08 18:37:24 -07001430 if (data->is_vpu_clock) {
1431 init.ops = &bcm2835_vpu_clock_clk_ops;
1432 } else {
1433 init.ops = &bcm2835_clock_clk_ops;
1434 init.flags |= CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE;
Eric Anholteddcbe832016-06-01 12:05:34 -07001435
1436 /* If the clock wasn't actually enabled at boot, it's not
1437 * critical.
1438 */
1439 if (!(cprman_read(cprman, data->ctl_reg) & CM_ENABLE))
1440 init.flags &= ~CLK_IS_CRITICAL;
Eric Anholt41691b82015-10-08 18:37:24 -07001441 }
1442
1443 clock = devm_kzalloc(cprman->dev, sizeof(*clock), GFP_KERNEL);
1444 if (!clock)
1445 return NULL;
1446
1447 clock->cprman = cprman;
1448 clock->data = data;
1449 clock->hw.init = &init;
1450
Stephen Boydb19f0092016-06-01 16:15:03 -07001451 ret = devm_clk_hw_register(cprman->dev, &clock->hw);
1452 if (ret)
1453 return ERR_PTR(ret);
1454 return &clock->hw;
Eric Anholt41691b82015-10-08 18:37:24 -07001455}
1456
Martin Sperl56eb3a22016-02-29 12:51:41 +00001457static struct clk *bcm2835_register_gate(struct bcm2835_cprman *cprman,
1458 const struct bcm2835_gate_data *data)
1459{
1460 return clk_register_gate(cprman->dev, data->name, data->parent,
1461 CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE,
1462 cprman->regs + data->ctl_reg,
1463 CM_GATE_BIT, 0, &cprman->regs_lock);
1464}
1465
Stephen Boydb19f0092016-06-01 16:15:03 -07001466typedef struct clk_hw *(*bcm2835_clk_register)(struct bcm2835_cprman *cprman,
1467 const void *data);
Martin Sperl56eb3a22016-02-29 12:51:41 +00001468struct bcm2835_clk_desc {
1469 bcm2835_clk_register clk_register;
1470 const void *data;
1471};
1472
Martin Sperl3b15afe2016-02-29 12:51:42 +00001473/* assignment helper macros for different clock types */
1474#define _REGISTER(f, ...) { .clk_register = (bcm2835_clk_register)f, \
1475 .data = __VA_ARGS__ }
1476#define REGISTER_PLL(...) _REGISTER(&bcm2835_register_pll, \
1477 &(struct bcm2835_pll_data) \
1478 {__VA_ARGS__})
1479#define REGISTER_PLL_DIV(...) _REGISTER(&bcm2835_register_pll_divider, \
1480 &(struct bcm2835_pll_divider_data) \
1481 {__VA_ARGS__})
1482#define REGISTER_CLK(...) _REGISTER(&bcm2835_register_clock, \
1483 &(struct bcm2835_clock_data) \
1484 {__VA_ARGS__})
1485#define REGISTER_GATE(...) _REGISTER(&bcm2835_register_gate, \
1486 &(struct bcm2835_gate_data) \
1487 {__VA_ARGS__})
Martin Sperl56eb3a22016-02-29 12:51:41 +00001488
Martin Sperl3b15afe2016-02-29 12:51:42 +00001489/* parent mux arrays plus helper macros */
1490
1491/* main oscillator parent mux */
1492static const char *const bcm2835_clock_osc_parents[] = {
1493 "gnd",
1494 "xosc",
1495 "testdebug0",
1496 "testdebug1"
1497};
1498
1499#define REGISTER_OSC_CLK(...) REGISTER_CLK( \
1500 .num_mux_parents = ARRAY_SIZE(bcm2835_clock_osc_parents), \
1501 .parents = bcm2835_clock_osc_parents, \
1502 __VA_ARGS__)
1503
1504/* main peripherial parent mux */
1505static const char *const bcm2835_clock_per_parents[] = {
1506 "gnd",
1507 "xosc",
1508 "testdebug0",
1509 "testdebug1",
1510 "plla_per",
1511 "pllc_per",
1512 "plld_per",
1513 "pllh_aux",
1514};
1515
1516#define REGISTER_PER_CLK(...) REGISTER_CLK( \
1517 .num_mux_parents = ARRAY_SIZE(bcm2835_clock_per_parents), \
1518 .parents = bcm2835_clock_per_parents, \
1519 __VA_ARGS__)
1520
Phil Elwell8c0de582017-06-01 15:14:16 +01001521/*
1522 * Restrict clock sources for the PCM peripheral to the oscillator and
1523 * PLLD_PER because other source may have varying rates or be switched
1524 * off.
1525 *
1526 * Prevent other sources from being selected by replacing their names in
1527 * the list of potential parents with dummy entries (entry index is
1528 * significant).
1529 */
1530static const char *const bcm2835_pcm_per_parents[] = {
1531 "-",
1532 "xosc",
1533 "-",
1534 "-",
1535 "-",
1536 "-",
1537 "plld_per",
1538 "-",
1539};
1540
1541#define REGISTER_PCM_CLK(...) REGISTER_CLK( \
1542 .num_mux_parents = ARRAY_SIZE(bcm2835_pcm_per_parents), \
1543 .parents = bcm2835_pcm_per_parents, \
1544 __VA_ARGS__)
1545
Martin Sperl3b15afe2016-02-29 12:51:42 +00001546/* main vpu parent mux */
1547static const char *const bcm2835_clock_vpu_parents[] = {
1548 "gnd",
1549 "xosc",
1550 "testdebug0",
1551 "testdebug1",
1552 "plla_core",
1553 "pllc_core0",
1554 "plld_core",
1555 "pllh_aux",
1556 "pllc_core1",
1557 "pllc_core2",
1558};
1559
1560#define REGISTER_VPU_CLK(...) REGISTER_CLK( \
1561 .num_mux_parents = ARRAY_SIZE(bcm2835_clock_vpu_parents), \
1562 .parents = bcm2835_clock_vpu_parents, \
1563 __VA_ARGS__)
1564
1565/*
Eric Anholt8a39e9f2017-01-18 07:31:56 +11001566 * DSI parent clocks. The DSI byte/DDR/DDR2 clocks come from the DSI
1567 * analog PHY. The _inv variants are generated internally to cprman,
1568 * but we don't use them so they aren't hooked up.
1569 */
1570static const char *const bcm2835_clock_dsi0_parents[] = {
1571 "gnd",
1572 "xosc",
1573 "testdebug0",
1574 "testdebug1",
1575 "dsi0_ddr",
1576 "dsi0_ddr_inv",
1577 "dsi0_ddr2",
1578 "dsi0_ddr2_inv",
1579 "dsi0_byte",
1580 "dsi0_byte_inv",
1581};
1582
1583static const char *const bcm2835_clock_dsi1_parents[] = {
1584 "gnd",
1585 "xosc",
1586 "testdebug0",
1587 "testdebug1",
1588 "dsi1_ddr",
1589 "dsi1_ddr_inv",
1590 "dsi1_ddr2",
1591 "dsi1_ddr2_inv",
1592 "dsi1_byte",
1593 "dsi1_byte_inv",
1594};
1595
1596#define REGISTER_DSI0_CLK(...) REGISTER_CLK( \
1597 .num_mux_parents = ARRAY_SIZE(bcm2835_clock_dsi0_parents), \
1598 .parents = bcm2835_clock_dsi0_parents, \
1599 __VA_ARGS__)
1600
1601#define REGISTER_DSI1_CLK(...) REGISTER_CLK( \
1602 .num_mux_parents = ARRAY_SIZE(bcm2835_clock_dsi1_parents), \
1603 .parents = bcm2835_clock_dsi1_parents, \
1604 __VA_ARGS__)
1605
1606/*
Martin Sperl3b15afe2016-02-29 12:51:42 +00001607 * the real definition of all the pll, pll_dividers and clocks
1608 * these make use of the above REGISTER_* macros
1609 */
Martin Sperl56eb3a22016-02-29 12:51:41 +00001610static const struct bcm2835_clk_desc clk_desc_array[] = {
Martin Sperl3b15afe2016-02-29 12:51:42 +00001611 /* the PLL + PLL dividers */
1612
1613 /*
1614 * PLLA is the auxiliary PLL, used to drive the CCP2
1615 * (Compact Camera Port 2) transmitter clock.
1616 *
1617 * It is in the PX LDO power domain, which is on when the
1618 * AUDIO domain is on.
1619 */
1620 [BCM2835_PLLA] = REGISTER_PLL(
1621 .name = "plla",
1622 .cm_ctrl_reg = CM_PLLA,
1623 .a2w_ctrl_reg = A2W_PLLA_CTRL,
1624 .frac_reg = A2W_PLLA_FRAC,
1625 .ana_reg_base = A2W_PLLA_ANA0,
1626 .reference_enable_mask = A2W_XOSC_CTRL_PLLA_ENABLE,
1627 .lock_mask = CM_LOCK_FLOCKA,
1628
1629 .ana = &bcm2835_ana_default,
1630
1631 .min_rate = 600000000u,
1632 .max_rate = 2400000000u,
1633 .max_fb_rate = BCM2835_MAX_FB_RATE),
1634 [BCM2835_PLLA_CORE] = REGISTER_PLL_DIV(
1635 .name = "plla_core",
1636 .source_pll = "plla",
1637 .cm_reg = CM_PLLA,
1638 .a2w_reg = A2W_PLLA_CORE,
1639 .load_mask = CM_PLLA_LOADCORE,
1640 .hold_mask = CM_PLLA_HOLDCORE,
Eric Anholt55486092017-01-18 07:31:55 +11001641 .fixed_divider = 1,
1642 .flags = CLK_SET_RATE_PARENT),
Martin Sperl3b15afe2016-02-29 12:51:42 +00001643 [BCM2835_PLLA_PER] = REGISTER_PLL_DIV(
1644 .name = "plla_per",
1645 .source_pll = "plla",
1646 .cm_reg = CM_PLLA,
1647 .a2w_reg = A2W_PLLA_PER,
1648 .load_mask = CM_PLLA_LOADPER,
1649 .hold_mask = CM_PLLA_HOLDPER,
Eric Anholt55486092017-01-18 07:31:55 +11001650 .fixed_divider = 1,
1651 .flags = CLK_SET_RATE_PARENT),
Martin Sperl72843692016-02-29 15:43:56 +00001652 [BCM2835_PLLA_DSI0] = REGISTER_PLL_DIV(
1653 .name = "plla_dsi0",
1654 .source_pll = "plla",
1655 .cm_reg = CM_PLLA,
1656 .a2w_reg = A2W_PLLA_DSI0,
1657 .load_mask = CM_PLLA_LOADDSI0,
1658 .hold_mask = CM_PLLA_HOLDDSI0,
1659 .fixed_divider = 1),
1660 [BCM2835_PLLA_CCP2] = REGISTER_PLL_DIV(
1661 .name = "plla_ccp2",
1662 .source_pll = "plla",
1663 .cm_reg = CM_PLLA,
1664 .a2w_reg = A2W_PLLA_CCP2,
1665 .load_mask = CM_PLLA_LOADCCP2,
1666 .hold_mask = CM_PLLA_HOLDCCP2,
Eric Anholt55486092017-01-18 07:31:55 +11001667 .fixed_divider = 1,
1668 .flags = CLK_SET_RATE_PARENT),
Martin Sperl3b15afe2016-02-29 12:51:42 +00001669
1670 /* PLLB is used for the ARM's clock. */
1671 [BCM2835_PLLB] = REGISTER_PLL(
1672 .name = "pllb",
1673 .cm_ctrl_reg = CM_PLLB,
1674 .a2w_ctrl_reg = A2W_PLLB_CTRL,
1675 .frac_reg = A2W_PLLB_FRAC,
1676 .ana_reg_base = A2W_PLLB_ANA0,
1677 .reference_enable_mask = A2W_XOSC_CTRL_PLLB_ENABLE,
1678 .lock_mask = CM_LOCK_FLOCKB,
1679
1680 .ana = &bcm2835_ana_default,
1681
1682 .min_rate = 600000000u,
1683 .max_rate = 3000000000u,
1684 .max_fb_rate = BCM2835_MAX_FB_RATE),
1685 [BCM2835_PLLB_ARM] = REGISTER_PLL_DIV(
1686 .name = "pllb_arm",
1687 .source_pll = "pllb",
1688 .cm_reg = CM_PLLB,
1689 .a2w_reg = A2W_PLLB_ARM,
1690 .load_mask = CM_PLLB_LOADARM,
1691 .hold_mask = CM_PLLB_HOLDARM,
Eric Anholt55486092017-01-18 07:31:55 +11001692 .fixed_divider = 1,
1693 .flags = CLK_SET_RATE_PARENT),
Martin Sperl3b15afe2016-02-29 12:51:42 +00001694
1695 /*
1696 * PLLC is the core PLL, used to drive the core VPU clock.
1697 *
1698 * It is in the PX LDO power domain, which is on when the
1699 * AUDIO domain is on.
1700 */
1701 [BCM2835_PLLC] = REGISTER_PLL(
1702 .name = "pllc",
1703 .cm_ctrl_reg = CM_PLLC,
1704 .a2w_ctrl_reg = A2W_PLLC_CTRL,
1705 .frac_reg = A2W_PLLC_FRAC,
1706 .ana_reg_base = A2W_PLLC_ANA0,
1707 .reference_enable_mask = A2W_XOSC_CTRL_PLLC_ENABLE,
1708 .lock_mask = CM_LOCK_FLOCKC,
1709
1710 .ana = &bcm2835_ana_default,
1711
1712 .min_rate = 600000000u,
1713 .max_rate = 3000000000u,
1714 .max_fb_rate = BCM2835_MAX_FB_RATE),
1715 [BCM2835_PLLC_CORE0] = REGISTER_PLL_DIV(
1716 .name = "pllc_core0",
1717 .source_pll = "pllc",
1718 .cm_reg = CM_PLLC,
1719 .a2w_reg = A2W_PLLC_CORE0,
1720 .load_mask = CM_PLLC_LOADCORE0,
1721 .hold_mask = CM_PLLC_HOLDCORE0,
Eric Anholt55486092017-01-18 07:31:55 +11001722 .fixed_divider = 1,
1723 .flags = CLK_SET_RATE_PARENT),
Martin Sperl3b15afe2016-02-29 12:51:42 +00001724 [BCM2835_PLLC_CORE1] = REGISTER_PLL_DIV(
1725 .name = "pllc_core1",
1726 .source_pll = "pllc",
1727 .cm_reg = CM_PLLC,
1728 .a2w_reg = A2W_PLLC_CORE1,
1729 .load_mask = CM_PLLC_LOADCORE1,
1730 .hold_mask = CM_PLLC_HOLDCORE1,
Eric Anholt55486092017-01-18 07:31:55 +11001731 .fixed_divider = 1,
1732 .flags = CLK_SET_RATE_PARENT),
Martin Sperl3b15afe2016-02-29 12:51:42 +00001733 [BCM2835_PLLC_CORE2] = REGISTER_PLL_DIV(
1734 .name = "pllc_core2",
1735 .source_pll = "pllc",
1736 .cm_reg = CM_PLLC,
1737 .a2w_reg = A2W_PLLC_CORE2,
1738 .load_mask = CM_PLLC_LOADCORE2,
1739 .hold_mask = CM_PLLC_HOLDCORE2,
Eric Anholt55486092017-01-18 07:31:55 +11001740 .fixed_divider = 1,
1741 .flags = CLK_SET_RATE_PARENT),
Martin Sperl3b15afe2016-02-29 12:51:42 +00001742 [BCM2835_PLLC_PER] = REGISTER_PLL_DIV(
1743 .name = "pllc_per",
1744 .source_pll = "pllc",
1745 .cm_reg = CM_PLLC,
1746 .a2w_reg = A2W_PLLC_PER,
1747 .load_mask = CM_PLLC_LOADPER,
1748 .hold_mask = CM_PLLC_HOLDPER,
Eric Anholt55486092017-01-18 07:31:55 +11001749 .fixed_divider = 1,
1750 .flags = CLK_SET_RATE_PARENT),
Martin Sperl3b15afe2016-02-29 12:51:42 +00001751
1752 /*
1753 * PLLD is the display PLL, used to drive DSI display panels.
1754 *
1755 * It is in the PX LDO power domain, which is on when the
1756 * AUDIO domain is on.
1757 */
1758 [BCM2835_PLLD] = REGISTER_PLL(
1759 .name = "plld",
1760 .cm_ctrl_reg = CM_PLLD,
1761 .a2w_ctrl_reg = A2W_PLLD_CTRL,
1762 .frac_reg = A2W_PLLD_FRAC,
1763 .ana_reg_base = A2W_PLLD_ANA0,
1764 .reference_enable_mask = A2W_XOSC_CTRL_DDR_ENABLE,
1765 .lock_mask = CM_LOCK_FLOCKD,
1766
1767 .ana = &bcm2835_ana_default,
1768
1769 .min_rate = 600000000u,
1770 .max_rate = 2400000000u,
1771 .max_fb_rate = BCM2835_MAX_FB_RATE),
1772 [BCM2835_PLLD_CORE] = REGISTER_PLL_DIV(
1773 .name = "plld_core",
1774 .source_pll = "plld",
1775 .cm_reg = CM_PLLD,
1776 .a2w_reg = A2W_PLLD_CORE,
1777 .load_mask = CM_PLLD_LOADCORE,
1778 .hold_mask = CM_PLLD_HOLDCORE,
Eric Anholt55486092017-01-18 07:31:55 +11001779 .fixed_divider = 1,
1780 .flags = CLK_SET_RATE_PARENT),
Martin Sperl3b15afe2016-02-29 12:51:42 +00001781 [BCM2835_PLLD_PER] = REGISTER_PLL_DIV(
1782 .name = "plld_per",
1783 .source_pll = "plld",
1784 .cm_reg = CM_PLLD,
1785 .a2w_reg = A2W_PLLD_PER,
1786 .load_mask = CM_PLLD_LOADPER,
1787 .hold_mask = CM_PLLD_HOLDPER,
Eric Anholt55486092017-01-18 07:31:55 +11001788 .fixed_divider = 1,
1789 .flags = CLK_SET_RATE_PARENT),
Martin Sperl72843692016-02-29 15:43:56 +00001790 [BCM2835_PLLD_DSI0] = REGISTER_PLL_DIV(
1791 .name = "plld_dsi0",
1792 .source_pll = "plld",
1793 .cm_reg = CM_PLLD,
1794 .a2w_reg = A2W_PLLD_DSI0,
1795 .load_mask = CM_PLLD_LOADDSI0,
1796 .hold_mask = CM_PLLD_HOLDDSI0,
1797 .fixed_divider = 1),
1798 [BCM2835_PLLD_DSI1] = REGISTER_PLL_DIV(
1799 .name = "plld_dsi1",
1800 .source_pll = "plld",
1801 .cm_reg = CM_PLLD,
1802 .a2w_reg = A2W_PLLD_DSI1,
1803 .load_mask = CM_PLLD_LOADDSI1,
1804 .hold_mask = CM_PLLD_HOLDDSI1,
1805 .fixed_divider = 1),
Martin Sperl3b15afe2016-02-29 12:51:42 +00001806
1807 /*
1808 * PLLH is used to supply the pixel clock or the AUX clock for the
1809 * TV encoder.
1810 *
1811 * It is in the HDMI power domain.
1812 */
1813 [BCM2835_PLLH] = REGISTER_PLL(
1814 "pllh",
1815 .cm_ctrl_reg = CM_PLLH,
1816 .a2w_ctrl_reg = A2W_PLLH_CTRL,
1817 .frac_reg = A2W_PLLH_FRAC,
1818 .ana_reg_base = A2W_PLLH_ANA0,
1819 .reference_enable_mask = A2W_XOSC_CTRL_PLLC_ENABLE,
1820 .lock_mask = CM_LOCK_FLOCKH,
1821
1822 .ana = &bcm2835_ana_pllh,
1823
1824 .min_rate = 600000000u,
1825 .max_rate = 3000000000u,
1826 .max_fb_rate = BCM2835_MAX_FB_RATE),
1827 [BCM2835_PLLH_RCAL] = REGISTER_PLL_DIV(
1828 .name = "pllh_rcal",
1829 .source_pll = "pllh",
1830 .cm_reg = CM_PLLH,
1831 .a2w_reg = A2W_PLLH_RCAL,
1832 .load_mask = CM_PLLH_LOADRCAL,
1833 .hold_mask = 0,
Eric Anholt55486092017-01-18 07:31:55 +11001834 .fixed_divider = 10,
1835 .flags = CLK_SET_RATE_PARENT),
Martin Sperl3b15afe2016-02-29 12:51:42 +00001836 [BCM2835_PLLH_AUX] = REGISTER_PLL_DIV(
1837 .name = "pllh_aux",
1838 .source_pll = "pllh",
1839 .cm_reg = CM_PLLH,
1840 .a2w_reg = A2W_PLLH_AUX,
1841 .load_mask = CM_PLLH_LOADAUX,
1842 .hold_mask = 0,
Eric Anholt55486092017-01-18 07:31:55 +11001843 .fixed_divider = 1,
1844 .flags = CLK_SET_RATE_PARENT),
Martin Sperl3b15afe2016-02-29 12:51:42 +00001845 [BCM2835_PLLH_PIX] = REGISTER_PLL_DIV(
1846 .name = "pllh_pix",
1847 .source_pll = "pllh",
1848 .cm_reg = CM_PLLH,
1849 .a2w_reg = A2W_PLLH_PIX,
1850 .load_mask = CM_PLLH_LOADPIX,
1851 .hold_mask = 0,
Eric Anholt55486092017-01-18 07:31:55 +11001852 .fixed_divider = 10,
1853 .flags = CLK_SET_RATE_PARENT),
Martin Sperl3b15afe2016-02-29 12:51:42 +00001854
Martin Sperl56eb3a22016-02-29 12:51:41 +00001855 /* the clocks */
Martin Sperl3b15afe2016-02-29 12:51:42 +00001856
1857 /* clocks with oscillator parent mux */
1858
1859 /* One Time Programmable Memory clock. Maximum 10Mhz. */
1860 [BCM2835_CLOCK_OTP] = REGISTER_OSC_CLK(
1861 .name = "otp",
1862 .ctl_reg = CM_OTPCTL,
1863 .div_reg = CM_OTPDIV,
1864 .int_bits = 4,
Eric Anholt3f919582017-01-18 07:31:57 +11001865 .frac_bits = 0,
1866 .tcnt_mux = 6),
Martin Sperl3b15afe2016-02-29 12:51:42 +00001867 /*
1868 * Used for a 1Mhz clock for the system clocksource, and also used
1869 * bythe watchdog timer and the camera pulse generator.
1870 */
1871 [BCM2835_CLOCK_TIMER] = REGISTER_OSC_CLK(
1872 .name = "timer",
1873 .ctl_reg = CM_TIMERCTL,
1874 .div_reg = CM_TIMERDIV,
1875 .int_bits = 6,
1876 .frac_bits = 12),
1877 /*
1878 * Clock for the temperature sensor.
1879 * Generally run at 2Mhz, max 5Mhz.
1880 */
1881 [BCM2835_CLOCK_TSENS] = REGISTER_OSC_CLK(
1882 .name = "tsens",
1883 .ctl_reg = CM_TSENSCTL,
1884 .div_reg = CM_TSENSDIV,
1885 .int_bits = 5,
1886 .frac_bits = 0),
Martin Sperld3d6f152016-02-29 15:43:57 +00001887 [BCM2835_CLOCK_TEC] = REGISTER_OSC_CLK(
1888 .name = "tec",
1889 .ctl_reg = CM_TECCTL,
1890 .div_reg = CM_TECDIV,
1891 .int_bits = 6,
1892 .frac_bits = 0),
Martin Sperl3b15afe2016-02-29 12:51:42 +00001893
1894 /* clocks with vpu parent mux */
1895 [BCM2835_CLOCK_H264] = REGISTER_VPU_CLK(
1896 .name = "h264",
1897 .ctl_reg = CM_H264CTL,
1898 .div_reg = CM_H264DIV,
1899 .int_bits = 4,
Eric Anholt3f919582017-01-18 07:31:57 +11001900 .frac_bits = 8,
1901 .tcnt_mux = 1),
Martin Sperl3b15afe2016-02-29 12:51:42 +00001902 [BCM2835_CLOCK_ISP] = REGISTER_VPU_CLK(
1903 .name = "isp",
1904 .ctl_reg = CM_ISPCTL,
1905 .div_reg = CM_ISPDIV,
1906 .int_bits = 4,
Eric Anholt3f919582017-01-18 07:31:57 +11001907 .frac_bits = 8,
1908 .tcnt_mux = 2),
Martin Sperld3d6f152016-02-29 15:43:57 +00001909
Martin Sperl3b15afe2016-02-29 12:51:42 +00001910 /*
1911 * Secondary SDRAM clock. Used for low-voltage modes when the PLL
1912 * in the SDRAM controller can't be used.
1913 */
1914 [BCM2835_CLOCK_SDRAM] = REGISTER_VPU_CLK(
1915 .name = "sdram",
1916 .ctl_reg = CM_SDCCTL,
1917 .div_reg = CM_SDCDIV,
1918 .int_bits = 6,
Eric Anholt3f919582017-01-18 07:31:57 +11001919 .frac_bits = 0,
1920 .tcnt_mux = 3),
Martin Sperl3b15afe2016-02-29 12:51:42 +00001921 [BCM2835_CLOCK_V3D] = REGISTER_VPU_CLK(
1922 .name = "v3d",
1923 .ctl_reg = CM_V3DCTL,
1924 .div_reg = CM_V3DDIV,
1925 .int_bits = 4,
Eric Anholt3f919582017-01-18 07:31:57 +11001926 .frac_bits = 8,
1927 .tcnt_mux = 4),
Martin Sperl3b15afe2016-02-29 12:51:42 +00001928 /*
1929 * VPU clock. This doesn't have an enable bit, since it drives
1930 * the bus for everything else, and is special so it doesn't need
1931 * to be gated for rate changes. It is also known as "clk_audio"
1932 * in various hardware documentation.
1933 */
1934 [BCM2835_CLOCK_VPU] = REGISTER_VPU_CLK(
1935 .name = "vpu",
1936 .ctl_reg = CM_VPUCTL,
1937 .div_reg = CM_VPUDIV,
1938 .int_bits = 12,
1939 .frac_bits = 8,
Eric Anholte69fdcc2016-06-01 12:05:33 -07001940 .flags = CLK_IS_CRITICAL,
Eric Anholt3f919582017-01-18 07:31:57 +11001941 .is_vpu_clock = true,
1942 .tcnt_mux = 5),
Martin Sperl3b15afe2016-02-29 12:51:42 +00001943
1944 /* clocks with per parent mux */
Martin Sperld3d6f152016-02-29 15:43:57 +00001945 [BCM2835_CLOCK_AVEO] = REGISTER_PER_CLK(
1946 .name = "aveo",
1947 .ctl_reg = CM_AVEOCTL,
1948 .div_reg = CM_AVEODIV,
1949 .int_bits = 4,
Eric Anholt3f919582017-01-18 07:31:57 +11001950 .frac_bits = 0,
1951 .tcnt_mux = 38),
Martin Sperld3d6f152016-02-29 15:43:57 +00001952 [BCM2835_CLOCK_CAM0] = REGISTER_PER_CLK(
1953 .name = "cam0",
1954 .ctl_reg = CM_CAM0CTL,
1955 .div_reg = CM_CAM0DIV,
1956 .int_bits = 4,
Eric Anholt3f919582017-01-18 07:31:57 +11001957 .frac_bits = 8,
1958 .tcnt_mux = 14),
Martin Sperld3d6f152016-02-29 15:43:57 +00001959 [BCM2835_CLOCK_CAM1] = REGISTER_PER_CLK(
1960 .name = "cam1",
1961 .ctl_reg = CM_CAM1CTL,
1962 .div_reg = CM_CAM1DIV,
1963 .int_bits = 4,
Eric Anholt3f919582017-01-18 07:31:57 +11001964 .frac_bits = 8,
1965 .tcnt_mux = 15),
Martin Sperld3d6f152016-02-29 15:43:57 +00001966 [BCM2835_CLOCK_DFT] = REGISTER_PER_CLK(
1967 .name = "dft",
1968 .ctl_reg = CM_DFTCTL,
1969 .div_reg = CM_DFTDIV,
1970 .int_bits = 5,
1971 .frac_bits = 0),
1972 [BCM2835_CLOCK_DPI] = REGISTER_PER_CLK(
1973 .name = "dpi",
1974 .ctl_reg = CM_DPICTL,
1975 .div_reg = CM_DPIDIV,
1976 .int_bits = 4,
Eric Anholt3f919582017-01-18 07:31:57 +11001977 .frac_bits = 8,
1978 .tcnt_mux = 17),
Martin Sperl3b15afe2016-02-29 12:51:42 +00001979
1980 /* Arasan EMMC clock */
1981 [BCM2835_CLOCK_EMMC] = REGISTER_PER_CLK(
1982 .name = "emmc",
1983 .ctl_reg = CM_EMMCCTL,
1984 .div_reg = CM_EMMCDIV,
1985 .int_bits = 4,
Eric Anholt3f919582017-01-18 07:31:57 +11001986 .frac_bits = 8,
1987 .tcnt_mux = 39),
Martin Sperld3d6f152016-02-29 15:43:57 +00001988
1989 /* General purpose (GPIO) clocks */
1990 [BCM2835_CLOCK_GP0] = REGISTER_PER_CLK(
1991 .name = "gp0",
1992 .ctl_reg = CM_GP0CTL,
1993 .div_reg = CM_GP0DIV,
1994 .int_bits = 12,
1995 .frac_bits = 12,
Eric Anholt3f919582017-01-18 07:31:57 +11001996 .is_mash_clock = true,
1997 .tcnt_mux = 20),
Martin Sperld3d6f152016-02-29 15:43:57 +00001998 [BCM2835_CLOCK_GP1] = REGISTER_PER_CLK(
1999 .name = "gp1",
2000 .ctl_reg = CM_GP1CTL,
2001 .div_reg = CM_GP1DIV,
2002 .int_bits = 12,
2003 .frac_bits = 12,
Eric Anholteddcbe832016-06-01 12:05:34 -07002004 .flags = CLK_IS_CRITICAL,
Eric Anholt3f919582017-01-18 07:31:57 +11002005 .is_mash_clock = true,
2006 .tcnt_mux = 21),
Martin Sperld3d6f152016-02-29 15:43:57 +00002007 [BCM2835_CLOCK_GP2] = REGISTER_PER_CLK(
2008 .name = "gp2",
2009 .ctl_reg = CM_GP2CTL,
2010 .div_reg = CM_GP2DIV,
2011 .int_bits = 12,
Eric Anholteddcbe832016-06-01 12:05:34 -07002012 .frac_bits = 12,
2013 .flags = CLK_IS_CRITICAL),
Martin Sperld3d6f152016-02-29 15:43:57 +00002014
Martin Sperl3b15afe2016-02-29 12:51:42 +00002015 /* HDMI state machine */
2016 [BCM2835_CLOCK_HSM] = REGISTER_PER_CLK(
2017 .name = "hsm",
2018 .ctl_reg = CM_HSMCTL,
2019 .div_reg = CM_HSMDIV,
2020 .int_bits = 4,
Eric Anholt3f919582017-01-18 07:31:57 +11002021 .frac_bits = 8,
2022 .tcnt_mux = 22),
Phil Elwell8c0de582017-06-01 15:14:16 +01002023 [BCM2835_CLOCK_PCM] = REGISTER_PCM_CLK(
Martin Sperl33b68962016-02-29 12:51:43 +00002024 .name = "pcm",
2025 .ctl_reg = CM_PCMCTL,
2026 .div_reg = CM_PCMDIV,
2027 .int_bits = 12,
2028 .frac_bits = 12,
Eric Anholt3f919582017-01-18 07:31:57 +11002029 .is_mash_clock = true,
2030 .tcnt_mux = 23),
Martin Sperl3b15afe2016-02-29 12:51:42 +00002031 [BCM2835_CLOCK_PWM] = REGISTER_PER_CLK(
2032 .name = "pwm",
2033 .ctl_reg = CM_PWMCTL,
2034 .div_reg = CM_PWMDIV,
2035 .int_bits = 12,
2036 .frac_bits = 12,
Eric Anholt3f919582017-01-18 07:31:57 +11002037 .is_mash_clock = true,
2038 .tcnt_mux = 24),
Martin Sperld3d6f152016-02-29 15:43:57 +00002039 [BCM2835_CLOCK_SLIM] = REGISTER_PER_CLK(
2040 .name = "slim",
2041 .ctl_reg = CM_SLIMCTL,
2042 .div_reg = CM_SLIMDIV,
2043 .int_bits = 12,
2044 .frac_bits = 12,
Eric Anholt3f919582017-01-18 07:31:57 +11002045 .is_mash_clock = true,
2046 .tcnt_mux = 25),
Martin Sperld3d6f152016-02-29 15:43:57 +00002047 [BCM2835_CLOCK_SMI] = REGISTER_PER_CLK(
2048 .name = "smi",
2049 .ctl_reg = CM_SMICTL,
2050 .div_reg = CM_SMIDIV,
2051 .int_bits = 4,
Eric Anholt3f919582017-01-18 07:31:57 +11002052 .frac_bits = 8,
2053 .tcnt_mux = 27),
Martin Sperl3b15afe2016-02-29 12:51:42 +00002054 [BCM2835_CLOCK_UART] = REGISTER_PER_CLK(
2055 .name = "uart",
2056 .ctl_reg = CM_UARTCTL,
2057 .div_reg = CM_UARTDIV,
2058 .int_bits = 10,
Eric Anholt3f919582017-01-18 07:31:57 +11002059 .frac_bits = 12,
2060 .tcnt_mux = 28),
Martin Sperld3d6f152016-02-29 15:43:57 +00002061
Martin Sperl3b15afe2016-02-29 12:51:42 +00002062 /* TV encoder clock. Only operating frequency is 108Mhz. */
2063 [BCM2835_CLOCK_VEC] = REGISTER_PER_CLK(
2064 .name = "vec",
2065 .ctl_reg = CM_VECCTL,
2066 .div_reg = CM_VECDIV,
2067 .int_bits = 4,
Boris Brezillond86d46a2016-12-01 22:00:20 +01002068 .frac_bits = 0,
2069 /*
2070 * Allow rate change propagation only on PLLH_AUX which is
2071 * assigned index 7 in the parent array.
2072 */
Eric Anholt3f919582017-01-18 07:31:57 +11002073 .set_rate_parent = BIT(7),
2074 .tcnt_mux = 29),
Martin Sperl3b15afe2016-02-29 12:51:42 +00002075
Martin Sperld3d6f152016-02-29 15:43:57 +00002076 /* dsi clocks */
2077 [BCM2835_CLOCK_DSI0E] = REGISTER_PER_CLK(
2078 .name = "dsi0e",
2079 .ctl_reg = CM_DSI0ECTL,
2080 .div_reg = CM_DSI0EDIV,
2081 .int_bits = 4,
Eric Anholt3f919582017-01-18 07:31:57 +11002082 .frac_bits = 8,
2083 .tcnt_mux = 18),
Martin Sperld3d6f152016-02-29 15:43:57 +00002084 [BCM2835_CLOCK_DSI1E] = REGISTER_PER_CLK(
2085 .name = "dsi1e",
2086 .ctl_reg = CM_DSI1ECTL,
2087 .div_reg = CM_DSI1EDIV,
2088 .int_bits = 4,
Eric Anholt3f919582017-01-18 07:31:57 +11002089 .frac_bits = 8,
2090 .tcnt_mux = 19),
Eric Anholt8a39e9f2017-01-18 07:31:56 +11002091 [BCM2835_CLOCK_DSI0P] = REGISTER_DSI0_CLK(
2092 .name = "dsi0p",
2093 .ctl_reg = CM_DSI0PCTL,
2094 .div_reg = CM_DSI0PDIV,
2095 .int_bits = 0,
Eric Anholt3f919582017-01-18 07:31:57 +11002096 .frac_bits = 0,
2097 .tcnt_mux = 12),
Eric Anholt8a39e9f2017-01-18 07:31:56 +11002098 [BCM2835_CLOCK_DSI1P] = REGISTER_DSI1_CLK(
2099 .name = "dsi1p",
2100 .ctl_reg = CM_DSI1PCTL,
2101 .div_reg = CM_DSI1PDIV,
2102 .int_bits = 0,
Eric Anholt3f919582017-01-18 07:31:57 +11002103 .frac_bits = 0,
2104 .tcnt_mux = 13),
Martin Sperld3d6f152016-02-29 15:43:57 +00002105
Martin Sperl56eb3a22016-02-29 12:51:41 +00002106 /* the gates */
Martin Sperl3b15afe2016-02-29 12:51:42 +00002107
2108 /*
2109 * CM_PERIICTL (and CM_PERIACTL, CM_SYSCTL and CM_VPUCTL if
2110 * you have the debug bit set in the power manager, which we
2111 * don't bother exposing) are individual gates off of the
2112 * non-stop vpu clock.
2113 */
Martin Sperl56eb3a22016-02-29 12:51:41 +00002114 [BCM2835_CLOCK_PERI_IMAGE] = REGISTER_GATE(
Martin Sperl3b15afe2016-02-29 12:51:42 +00002115 .name = "peri_image",
2116 .parent = "vpu",
2117 .ctl_reg = CM_PERIICTL),
Martin Sperl56eb3a22016-02-29 12:51:41 +00002118};
2119
Eric Anholt9e400c52016-06-01 12:05:35 -07002120/*
2121 * Permanently take a reference on the parent of the SDRAM clock.
2122 *
2123 * While the SDRAM is being driven by its dedicated PLL most of the
2124 * time, there is a little loop running in the firmware that
2125 * periodically switches the SDRAM to using our CM clock to do PVT
2126 * recalibration, with the assumption that the previously configured
2127 * SDRAM parent is still enabled and running.
2128 */
2129static int bcm2835_mark_sdc_parent_critical(struct clk *sdc)
2130{
2131 struct clk *parent = clk_get_parent(sdc);
2132
2133 if (IS_ERR(parent))
2134 return PTR_ERR(parent);
2135
2136 return clk_prepare_enable(parent);
2137}
2138
Eric Anholt41691b82015-10-08 18:37:24 -07002139static int bcm2835_clk_probe(struct platform_device *pdev)
2140{
2141 struct device *dev = &pdev->dev;
Stephen Boydb19f0092016-06-01 16:15:03 -07002142 struct clk_hw **hws;
Eric Anholt41691b82015-10-08 18:37:24 -07002143 struct bcm2835_cprman *cprman;
2144 struct resource *res;
Martin Sperl56eb3a22016-02-29 12:51:41 +00002145 const struct bcm2835_clk_desc *desc;
2146 const size_t asize = ARRAY_SIZE(clk_desc_array);
2147 size_t i;
Eric Anholt9e400c52016-06-01 12:05:35 -07002148 int ret;
Eric Anholt41691b82015-10-08 18:37:24 -07002149
Stephen Boydb19f0092016-06-01 16:15:03 -07002150 cprman = devm_kzalloc(dev, sizeof(*cprman) +
2151 sizeof(*cprman->onecell.hws) * asize,
Martin Sperl56eb3a22016-02-29 12:51:41 +00002152 GFP_KERNEL);
Eric Anholt41691b82015-10-08 18:37:24 -07002153 if (!cprman)
2154 return -ENOMEM;
2155
2156 spin_lock_init(&cprman->regs_lock);
2157 cprman->dev = dev;
2158 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2159 cprman->regs = devm_ioremap_resource(dev, res);
2160 if (IS_ERR(cprman->regs))
2161 return PTR_ERR(cprman->regs);
2162
Eric Anholt8a39e9f2017-01-18 07:31:56 +11002163 memcpy(cprman->real_parent_names, cprman_parent_names,
2164 sizeof(cprman_parent_names));
2165 of_clk_parent_fill(dev->of_node, cprman->real_parent_names,
2166 ARRAY_SIZE(cprman_parent_names));
2167
2168 /*
2169 * Make sure the external oscillator has been registered.
2170 *
2171 * The other (DSI) clocks are not present on older device
2172 * trees, which we still need to support for backwards
2173 * compatibility.
2174 */
2175 if (!cprman->real_parent_names[0])
Eric Anholt41691b82015-10-08 18:37:24 -07002176 return -ENODEV;
2177
2178 platform_set_drvdata(pdev, cprman);
2179
Stephen Boydb19f0092016-06-01 16:15:03 -07002180 cprman->onecell.num = asize;
2181 hws = cprman->onecell.hws;
Eric Anholt41691b82015-10-08 18:37:24 -07002182
Martin Sperl56eb3a22016-02-29 12:51:41 +00002183 for (i = 0; i < asize; i++) {
2184 desc = &clk_desc_array[i];
2185 if (desc->clk_register && desc->data)
Stephen Boydb19f0092016-06-01 16:15:03 -07002186 hws[i] = desc->clk_register(cprman, desc->data);
Martin Sperl56eb3a22016-02-29 12:51:41 +00002187 }
Remi Pommarelcfbab8f2015-12-06 17:22:48 +01002188
Stephen Boydb19f0092016-06-01 16:15:03 -07002189 ret = bcm2835_mark_sdc_parent_critical(hws[BCM2835_CLOCK_SDRAM]->clk);
Eric Anholt9e400c52016-06-01 12:05:35 -07002190 if (ret)
2191 return ret;
2192
Stephen Boydb19f0092016-06-01 16:15:03 -07002193 return of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
2194 &cprman->onecell);
Eric Anholt41691b82015-10-08 18:37:24 -07002195}
2196
2197static const struct of_device_id bcm2835_clk_of_match[] = {
2198 { .compatible = "brcm,bcm2835-cprman", },
2199 {}
2200};
2201MODULE_DEVICE_TABLE(of, bcm2835_clk_of_match);
2202
2203static struct platform_driver bcm2835_clk_driver = {
2204 .driver = {
2205 .name = "bcm2835-clk",
2206 .of_match_table = bcm2835_clk_of_match,
2207 },
2208 .probe = bcm2835_clk_probe,
2209};
2210
2211builtin_platform_driver(bcm2835_clk_driver);
2212
2213MODULE_AUTHOR("Eric Anholt <eric@anholt.net>");
2214MODULE_DESCRIPTION("BCM2835 clock driver");
2215MODULE_LICENSE("GPL v2");