mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 15:32:33 +00:00
7d7aa2fd92
This change makes the names of Broadcom targets consistent by using the common notation based on SoC/CPU ID (which is used internally anyway), bcmXXXX instead of brcmXXXX. This is even used for target TITLE in make menuconfig already, only the short target name used brcm so far. Despite, since subtargets range from bcm2708 to bcm2711, it seems appropriate to use bcm27xx instead of bcm2708 (again, as already done for BOARDNAME). This also renames the packages brcm2708-userland and brcm2708-gpu-fw. Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de> Acked-by: Álvaro Fernández Rojas <noltari@gmail.com>
598 lines
18 KiB
Diff
598 lines
18 KiB
Diff
From 125afc5cf080b29e9114d89f6052fa4a936a3f19 Mon Sep 17 00:00:00 2001
|
|
From: Stefan Wahren <wahrenst@gmx.net>
|
|
Date: Thu, 19 Sep 2019 20:12:15 +0200
|
|
Subject: [PATCH] clk: bcm2835: Introduce SoC specific clock
|
|
registration
|
|
|
|
commit ee0a5a9013b2b2502571a763c3093d400d18191f upstream.
|
|
|
|
In order to support SoC specific clocks (e.g. emmc2 for BCM2711), we
|
|
extend the description with a SoC support flag. This approach avoids long
|
|
and mostly redundant lists of clock IDs. Since PLLH is specific to
|
|
BCM2835, we register only rest of the clocks as common to all SoC.
|
|
|
|
Suggested-by: Florian Fainelli <f.fainelli@gmail.com>
|
|
Signed-off-by: Stefan Wahren <wahrenst@gmx.net>
|
|
Reviewed-by: Matthias Brugger <mbrugger@suse.com>
|
|
Acked-by: Eric Anholt <eric@anholt.net>
|
|
Reviewed-by: Eric Anholt <eric@anholt.net>
|
|
---
|
|
drivers/clk/bcm/clk-bcm2835.c | 115 +++++++++++++++++++++++++++++-----
|
|
1 file changed, 98 insertions(+), 17 deletions(-)
|
|
|
|
--- a/drivers/clk/bcm/clk-bcm2835.c
|
|
+++ b/drivers/clk/bcm/clk-bcm2835.c
|
|
@@ -40,7 +40,7 @@
|
|
#include <linux/debugfs.h>
|
|
#include <linux/delay.h>
|
|
#include <linux/module.h>
|
|
-#include <linux/of.h>
|
|
+#include <linux/of_device.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/slab.h>
|
|
#include <dt-bindings/clock/bcm2835.h>
|
|
@@ -301,6 +301,9 @@
|
|
|
|
#define VCMSG_ID_CORE_CLOCK 4
|
|
|
|
+#define SOC_BCM2835 BIT(0)
|
|
+#define SOC_ALL (SOC_BCM2835)
|
|
+
|
|
/*
|
|
* Names of clocks used within the driver that need to be replaced
|
|
* with an external parent's name. This array is in the order that
|
|
@@ -333,6 +336,10 @@ struct bcm2835_cprman {
|
|
struct clk_hw_onecell_data onecell;
|
|
};
|
|
|
|
+struct cprman_plat_data {
|
|
+ unsigned int soc;
|
|
+};
|
|
+
|
|
static inline void cprman_write(struct bcm2835_cprman *cprman, u32 reg, u32 val)
|
|
{
|
|
writel(CM_PASSWORD | val, cprman->regs + reg);
|
|
@@ -1528,22 +1535,28 @@ typedef struct clk_hw *(*bcm2835_clk_reg
|
|
const void *data);
|
|
struct bcm2835_clk_desc {
|
|
bcm2835_clk_register clk_register;
|
|
+ unsigned int supported;
|
|
const void *data;
|
|
};
|
|
|
|
/* assignment helper macros for different clock types */
|
|
-#define _REGISTER(f, ...) { .clk_register = (bcm2835_clk_register)f, \
|
|
- .data = __VA_ARGS__ }
|
|
-#define REGISTER_PLL(...) _REGISTER(&bcm2835_register_pll, \
|
|
+#define _REGISTER(f, s, ...) { .clk_register = (bcm2835_clk_register)f, \
|
|
+ .supported = s, \
|
|
+ .data = __VA_ARGS__ }
|
|
+#define REGISTER_PLL(s, ...) _REGISTER(&bcm2835_register_pll, \
|
|
+ s, \
|
|
&(struct bcm2835_pll_data) \
|
|
{__VA_ARGS__})
|
|
-#define REGISTER_PLL_DIV(...) _REGISTER(&bcm2835_register_pll_divider, \
|
|
- &(struct bcm2835_pll_divider_data) \
|
|
- {__VA_ARGS__})
|
|
-#define REGISTER_CLK(...) _REGISTER(&bcm2835_register_clock, \
|
|
+#define REGISTER_PLL_DIV(s, ...) _REGISTER(&bcm2835_register_pll_divider, \
|
|
+ s, \
|
|
+ &(struct bcm2835_pll_divider_data) \
|
|
+ {__VA_ARGS__})
|
|
+#define REGISTER_CLK(s, ...) _REGISTER(&bcm2835_register_clock, \
|
|
+ s, \
|
|
&(struct bcm2835_clock_data) \
|
|
{__VA_ARGS__})
|
|
-#define REGISTER_GATE(...) _REGISTER(&bcm2835_register_gate, \
|
|
+#define REGISTER_GATE(s, ...) _REGISTER(&bcm2835_register_gate, \
|
|
+ s, \
|
|
&(struct bcm2835_gate_data) \
|
|
{__VA_ARGS__})
|
|
|
|
@@ -1557,7 +1570,8 @@ static const char *const bcm2835_clock_o
|
|
"testdebug1"
|
|
};
|
|
|
|
-#define REGISTER_OSC_CLK(...) REGISTER_CLK( \
|
|
+#define REGISTER_OSC_CLK(s, ...) REGISTER_CLK( \
|
|
+ s, \
|
|
.num_mux_parents = ARRAY_SIZE(bcm2835_clock_osc_parents), \
|
|
.parents = bcm2835_clock_osc_parents, \
|
|
__VA_ARGS__)
|
|
@@ -1574,7 +1588,8 @@ static const char *const bcm2835_clock_p
|
|
"pllh_aux",
|
|
};
|
|
|
|
-#define REGISTER_PER_CLK(...) REGISTER_CLK( \
|
|
+#define REGISTER_PER_CLK(s, ...) REGISTER_CLK( \
|
|
+ s, \
|
|
.num_mux_parents = ARRAY_SIZE(bcm2835_clock_per_parents), \
|
|
.parents = bcm2835_clock_per_parents, \
|
|
__VA_ARGS__)
|
|
@@ -1599,7 +1614,8 @@ static const char *const bcm2835_pcm_per
|
|
"-",
|
|
};
|
|
|
|
-#define REGISTER_PCM_CLK(...) REGISTER_CLK( \
|
|
+#define REGISTER_PCM_CLK(s, ...) REGISTER_CLK( \
|
|
+ s, \
|
|
.num_mux_parents = ARRAY_SIZE(bcm2835_pcm_per_parents), \
|
|
.parents = bcm2835_pcm_per_parents, \
|
|
__VA_ARGS__)
|
|
@@ -1618,7 +1634,8 @@ static const char *const bcm2835_clock_v
|
|
"pllc_core2",
|
|
};
|
|
|
|
-#define REGISTER_VPU_CLK(...) REGISTER_CLK( \
|
|
+#define REGISTER_VPU_CLK(s, ...) REGISTER_CLK( \
|
|
+ s, \
|
|
.num_mux_parents = ARRAY_SIZE(bcm2835_clock_vpu_parents), \
|
|
.parents = bcm2835_clock_vpu_parents, \
|
|
__VA_ARGS__)
|
|
@@ -1654,12 +1671,14 @@ static const char *const bcm2835_clock_d
|
|
"dsi1_byte_inv",
|
|
};
|
|
|
|
-#define REGISTER_DSI0_CLK(...) REGISTER_CLK( \
|
|
+#define REGISTER_DSI0_CLK(s, ...) REGISTER_CLK( \
|
|
+ s, \
|
|
.num_mux_parents = ARRAY_SIZE(bcm2835_clock_dsi0_parents), \
|
|
.parents = bcm2835_clock_dsi0_parents, \
|
|
__VA_ARGS__)
|
|
|
|
-#define REGISTER_DSI1_CLK(...) REGISTER_CLK( \
|
|
+#define REGISTER_DSI1_CLK(s, ...) REGISTER_CLK( \
|
|
+ s, \
|
|
.num_mux_parents = ARRAY_SIZE(bcm2835_clock_dsi1_parents), \
|
|
.parents = bcm2835_clock_dsi1_parents, \
|
|
__VA_ARGS__)
|
|
@@ -1679,6 +1698,7 @@ static const struct bcm2835_clk_desc clk
|
|
* AUDIO domain is on.
|
|
*/
|
|
[BCM2835_PLLA] = REGISTER_PLL(
|
|
+ SOC_ALL,
|
|
.name = "plla",
|
|
.cm_ctrl_reg = CM_PLLA,
|
|
.a2w_ctrl_reg = A2W_PLLA_CTRL,
|
|
@@ -1693,6 +1713,7 @@ static const struct bcm2835_clk_desc clk
|
|
.max_rate = 2400000000u,
|
|
.max_fb_rate = BCM2835_MAX_FB_RATE),
|
|
[BCM2835_PLLA_CORE] = REGISTER_PLL_DIV(
|
|
+ SOC_ALL,
|
|
.name = "plla_core",
|
|
.source_pll = "plla",
|
|
.cm_reg = CM_PLLA,
|
|
@@ -1702,6 +1723,7 @@ static const struct bcm2835_clk_desc clk
|
|
.fixed_divider = 1,
|
|
.flags = CLK_SET_RATE_PARENT),
|
|
[BCM2835_PLLA_PER] = REGISTER_PLL_DIV(
|
|
+ SOC_ALL,
|
|
.name = "plla_per",
|
|
.source_pll = "plla",
|
|
.cm_reg = CM_PLLA,
|
|
@@ -1711,6 +1733,7 @@ static const struct bcm2835_clk_desc clk
|
|
.fixed_divider = 1,
|
|
.flags = CLK_SET_RATE_PARENT),
|
|
[BCM2835_PLLA_DSI0] = REGISTER_PLL_DIV(
|
|
+ SOC_ALL,
|
|
.name = "plla_dsi0",
|
|
.source_pll = "plla",
|
|
.cm_reg = CM_PLLA,
|
|
@@ -1719,6 +1742,7 @@ static const struct bcm2835_clk_desc clk
|
|
.hold_mask = CM_PLLA_HOLDDSI0,
|
|
.fixed_divider = 1),
|
|
[BCM2835_PLLA_CCP2] = REGISTER_PLL_DIV(
|
|
+ SOC_ALL,
|
|
.name = "plla_ccp2",
|
|
.source_pll = "plla",
|
|
.cm_reg = CM_PLLA,
|
|
@@ -1730,6 +1754,7 @@ static const struct bcm2835_clk_desc clk
|
|
|
|
/* PLLB is used for the ARM's clock. */
|
|
[BCM2835_PLLB] = REGISTER_PLL(
|
|
+ SOC_ALL,
|
|
.name = "pllb",
|
|
.cm_ctrl_reg = CM_PLLB,
|
|
.a2w_ctrl_reg = A2W_PLLB_CTRL,
|
|
@@ -1744,6 +1769,7 @@ static const struct bcm2835_clk_desc clk
|
|
.max_rate = 3000000000u,
|
|
.max_fb_rate = BCM2835_MAX_FB_RATE),
|
|
[BCM2835_PLLB_ARM] = REGISTER_PLL_DIV(
|
|
+ SOC_ALL,
|
|
.name = "pllb_arm",
|
|
.source_pll = "pllb",
|
|
.cm_reg = CM_PLLB,
|
|
@@ -1760,6 +1786,7 @@ static const struct bcm2835_clk_desc clk
|
|
* AUDIO domain is on.
|
|
*/
|
|
[BCM2835_PLLC] = REGISTER_PLL(
|
|
+ SOC_ALL,
|
|
.name = "pllc",
|
|
.cm_ctrl_reg = CM_PLLC,
|
|
.a2w_ctrl_reg = A2W_PLLC_CTRL,
|
|
@@ -1774,6 +1801,7 @@ static const struct bcm2835_clk_desc clk
|
|
.max_rate = 3000000000u,
|
|
.max_fb_rate = BCM2835_MAX_FB_RATE),
|
|
[BCM2835_PLLC_CORE0] = REGISTER_PLL_DIV(
|
|
+ SOC_ALL,
|
|
.name = "pllc_core0",
|
|
.source_pll = "pllc",
|
|
.cm_reg = CM_PLLC,
|
|
@@ -1783,6 +1811,7 @@ static const struct bcm2835_clk_desc clk
|
|
.fixed_divider = 1,
|
|
.flags = CLK_SET_RATE_PARENT),
|
|
[BCM2835_PLLC_CORE1] = REGISTER_PLL_DIV(
|
|
+ SOC_ALL,
|
|
.name = "pllc_core1",
|
|
.source_pll = "pllc",
|
|
.cm_reg = CM_PLLC,
|
|
@@ -1792,6 +1821,7 @@ static const struct bcm2835_clk_desc clk
|
|
.fixed_divider = 1,
|
|
.flags = CLK_SET_RATE_PARENT),
|
|
[BCM2835_PLLC_CORE2] = REGISTER_PLL_DIV(
|
|
+ SOC_ALL,
|
|
.name = "pllc_core2",
|
|
.source_pll = "pllc",
|
|
.cm_reg = CM_PLLC,
|
|
@@ -1801,6 +1831,7 @@ static const struct bcm2835_clk_desc clk
|
|
.fixed_divider = 1,
|
|
.flags = CLK_SET_RATE_PARENT),
|
|
[BCM2835_PLLC_PER] = REGISTER_PLL_DIV(
|
|
+ SOC_ALL,
|
|
.name = "pllc_per",
|
|
.source_pll = "pllc",
|
|
.cm_reg = CM_PLLC,
|
|
@@ -1817,6 +1848,7 @@ static const struct bcm2835_clk_desc clk
|
|
* AUDIO domain is on.
|
|
*/
|
|
[BCM2835_PLLD] = REGISTER_PLL(
|
|
+ SOC_ALL,
|
|
.name = "plld",
|
|
.cm_ctrl_reg = CM_PLLD,
|
|
.a2w_ctrl_reg = A2W_PLLD_CTRL,
|
|
@@ -1831,6 +1863,7 @@ static const struct bcm2835_clk_desc clk
|
|
.max_rate = 2400000000u,
|
|
.max_fb_rate = BCM2835_MAX_FB_RATE),
|
|
[BCM2835_PLLD_CORE] = REGISTER_PLL_DIV(
|
|
+ SOC_ALL,
|
|
.name = "plld_core",
|
|
.source_pll = "plld",
|
|
.cm_reg = CM_PLLD,
|
|
@@ -1840,6 +1873,7 @@ static const struct bcm2835_clk_desc clk
|
|
.fixed_divider = 1,
|
|
.flags = CLK_SET_RATE_PARENT),
|
|
[BCM2835_PLLD_PER] = REGISTER_PLL_DIV(
|
|
+ SOC_ALL,
|
|
.name = "plld_per",
|
|
.source_pll = "plld",
|
|
.cm_reg = CM_PLLD,
|
|
@@ -1849,6 +1883,7 @@ static const struct bcm2835_clk_desc clk
|
|
.fixed_divider = 1,
|
|
.flags = CLK_SET_RATE_PARENT),
|
|
[BCM2835_PLLD_DSI0] = REGISTER_PLL_DIV(
|
|
+ SOC_ALL,
|
|
.name = "plld_dsi0",
|
|
.source_pll = "plld",
|
|
.cm_reg = CM_PLLD,
|
|
@@ -1857,6 +1892,7 @@ static const struct bcm2835_clk_desc clk
|
|
.hold_mask = CM_PLLD_HOLDDSI0,
|
|
.fixed_divider = 1),
|
|
[BCM2835_PLLD_DSI1] = REGISTER_PLL_DIV(
|
|
+ SOC_ALL,
|
|
.name = "plld_dsi1",
|
|
.source_pll = "plld",
|
|
.cm_reg = CM_PLLD,
|
|
@@ -1872,6 +1908,7 @@ static const struct bcm2835_clk_desc clk
|
|
* It is in the HDMI power domain.
|
|
*/
|
|
[BCM2835_PLLH] = REGISTER_PLL(
|
|
+ SOC_BCM2835,
|
|
"pllh",
|
|
.cm_ctrl_reg = CM_PLLH,
|
|
.a2w_ctrl_reg = A2W_PLLH_CTRL,
|
|
@@ -1886,6 +1923,7 @@ static const struct bcm2835_clk_desc clk
|
|
.max_rate = 3000000000u,
|
|
.max_fb_rate = BCM2835_MAX_FB_RATE),
|
|
[BCM2835_PLLH_RCAL] = REGISTER_PLL_DIV(
|
|
+ SOC_BCM2835,
|
|
.name = "pllh_rcal",
|
|
.source_pll = "pllh",
|
|
.cm_reg = CM_PLLH,
|
|
@@ -1895,6 +1933,7 @@ static const struct bcm2835_clk_desc clk
|
|
.fixed_divider = 10,
|
|
.flags = CLK_SET_RATE_PARENT),
|
|
[BCM2835_PLLH_AUX] = REGISTER_PLL_DIV(
|
|
+ SOC_BCM2835,
|
|
.name = "pllh_aux",
|
|
.source_pll = "pllh",
|
|
.cm_reg = CM_PLLH,
|
|
@@ -1904,6 +1943,7 @@ static const struct bcm2835_clk_desc clk
|
|
.fixed_divider = 1,
|
|
.flags = CLK_SET_RATE_PARENT),
|
|
[BCM2835_PLLH_PIX] = REGISTER_PLL_DIV(
|
|
+ SOC_BCM2835,
|
|
.name = "pllh_pix",
|
|
.source_pll = "pllh",
|
|
.cm_reg = CM_PLLH,
|
|
@@ -1919,6 +1959,7 @@ static const struct bcm2835_clk_desc clk
|
|
|
|
/* One Time Programmable Memory clock. Maximum 10Mhz. */
|
|
[BCM2835_CLOCK_OTP] = REGISTER_OSC_CLK(
|
|
+ SOC_ALL,
|
|
.name = "otp",
|
|
.ctl_reg = CM_OTPCTL,
|
|
.div_reg = CM_OTPDIV,
|
|
@@ -1930,6 +1971,7 @@ static const struct bcm2835_clk_desc clk
|
|
* bythe watchdog timer and the camera pulse generator.
|
|
*/
|
|
[BCM2835_CLOCK_TIMER] = REGISTER_OSC_CLK(
|
|
+ SOC_ALL,
|
|
.name = "timer",
|
|
.ctl_reg = CM_TIMERCTL,
|
|
.div_reg = CM_TIMERDIV,
|
|
@@ -1940,12 +1982,14 @@ static const struct bcm2835_clk_desc clk
|
|
* Generally run at 2Mhz, max 5Mhz.
|
|
*/
|
|
[BCM2835_CLOCK_TSENS] = REGISTER_OSC_CLK(
|
|
+ SOC_ALL,
|
|
.name = "tsens",
|
|
.ctl_reg = CM_TSENSCTL,
|
|
.div_reg = CM_TSENSDIV,
|
|
.int_bits = 5,
|
|
.frac_bits = 0),
|
|
[BCM2835_CLOCK_TEC] = REGISTER_OSC_CLK(
|
|
+ SOC_ALL,
|
|
.name = "tec",
|
|
.ctl_reg = CM_TECCTL,
|
|
.div_reg = CM_TECDIV,
|
|
@@ -1954,6 +1998,7 @@ static const struct bcm2835_clk_desc clk
|
|
|
|
/* clocks with vpu parent mux */
|
|
[BCM2835_CLOCK_H264] = REGISTER_VPU_CLK(
|
|
+ SOC_ALL,
|
|
.name = "h264",
|
|
.ctl_reg = CM_H264CTL,
|
|
.div_reg = CM_H264DIV,
|
|
@@ -1961,6 +2006,7 @@ static const struct bcm2835_clk_desc clk
|
|
.frac_bits = 8,
|
|
.tcnt_mux = 1),
|
|
[BCM2835_CLOCK_ISP] = REGISTER_VPU_CLK(
|
|
+ SOC_ALL,
|
|
.name = "isp",
|
|
.ctl_reg = CM_ISPCTL,
|
|
.div_reg = CM_ISPDIV,
|
|
@@ -1973,6 +2019,7 @@ static const struct bcm2835_clk_desc clk
|
|
* in the SDRAM controller can't be used.
|
|
*/
|
|
[BCM2835_CLOCK_SDRAM] = REGISTER_VPU_CLK(
|
|
+ SOC_ALL,
|
|
.name = "sdram",
|
|
.ctl_reg = CM_SDCCTL,
|
|
.div_reg = CM_SDCDIV,
|
|
@@ -1980,6 +2027,7 @@ static const struct bcm2835_clk_desc clk
|
|
.frac_bits = 0,
|
|
.tcnt_mux = 3),
|
|
[BCM2835_CLOCK_V3D] = REGISTER_VPU_CLK(
|
|
+ SOC_ALL,
|
|
.name = "v3d",
|
|
.ctl_reg = CM_V3DCTL,
|
|
.div_reg = CM_V3DDIV,
|
|
@@ -1993,6 +2041,7 @@ static const struct bcm2835_clk_desc clk
|
|
* in various hardware documentation.
|
|
*/
|
|
[BCM2835_CLOCK_VPU] = REGISTER_VPU_CLK(
|
|
+ SOC_ALL,
|
|
.name = "vpu",
|
|
.ctl_reg = CM_VPUCTL,
|
|
.div_reg = CM_VPUDIV,
|
|
@@ -2004,6 +2053,7 @@ static const struct bcm2835_clk_desc clk
|
|
|
|
/* clocks with per parent mux */
|
|
[BCM2835_CLOCK_AVEO] = REGISTER_PER_CLK(
|
|
+ SOC_ALL,
|
|
.name = "aveo",
|
|
.ctl_reg = CM_AVEOCTL,
|
|
.div_reg = CM_AVEODIV,
|
|
@@ -2011,6 +2061,7 @@ static const struct bcm2835_clk_desc clk
|
|
.frac_bits = 0,
|
|
.tcnt_mux = 38),
|
|
[BCM2835_CLOCK_CAM0] = REGISTER_PER_CLK(
|
|
+ SOC_ALL,
|
|
.name = "cam0",
|
|
.ctl_reg = CM_CAM0CTL,
|
|
.div_reg = CM_CAM0DIV,
|
|
@@ -2018,6 +2069,7 @@ static const struct bcm2835_clk_desc clk
|
|
.frac_bits = 8,
|
|
.tcnt_mux = 14),
|
|
[BCM2835_CLOCK_CAM1] = REGISTER_PER_CLK(
|
|
+ SOC_ALL,
|
|
.name = "cam1",
|
|
.ctl_reg = CM_CAM1CTL,
|
|
.div_reg = CM_CAM1DIV,
|
|
@@ -2025,12 +2077,14 @@ static const struct bcm2835_clk_desc clk
|
|
.frac_bits = 8,
|
|
.tcnt_mux = 15),
|
|
[BCM2835_CLOCK_DFT] = REGISTER_PER_CLK(
|
|
+ SOC_ALL,
|
|
.name = "dft",
|
|
.ctl_reg = CM_DFTCTL,
|
|
.div_reg = CM_DFTDIV,
|
|
.int_bits = 5,
|
|
.frac_bits = 0),
|
|
[BCM2835_CLOCK_DPI] = REGISTER_PER_CLK(
|
|
+ SOC_ALL,
|
|
.name = "dpi",
|
|
.ctl_reg = CM_DPICTL,
|
|
.div_reg = CM_DPIDIV,
|
|
@@ -2040,6 +2094,7 @@ static const struct bcm2835_clk_desc clk
|
|
|
|
/* Arasan EMMC clock */
|
|
[BCM2835_CLOCK_EMMC] = REGISTER_PER_CLK(
|
|
+ SOC_ALL,
|
|
.name = "emmc",
|
|
.ctl_reg = CM_EMMCCTL,
|
|
.div_reg = CM_EMMCDIV,
|
|
@@ -2049,6 +2104,7 @@ static const struct bcm2835_clk_desc clk
|
|
|
|
/* General purpose (GPIO) clocks */
|
|
[BCM2835_CLOCK_GP0] = REGISTER_PER_CLK(
|
|
+ SOC_ALL,
|
|
.name = "gp0",
|
|
.ctl_reg = CM_GP0CTL,
|
|
.div_reg = CM_GP0DIV,
|
|
@@ -2057,6 +2113,7 @@ static const struct bcm2835_clk_desc clk
|
|
.is_mash_clock = true,
|
|
.tcnt_mux = 20),
|
|
[BCM2835_CLOCK_GP1] = REGISTER_PER_CLK(
|
|
+ SOC_ALL,
|
|
.name = "gp1",
|
|
.ctl_reg = CM_GP1CTL,
|
|
.div_reg = CM_GP1DIV,
|
|
@@ -2066,6 +2123,7 @@ static const struct bcm2835_clk_desc clk
|
|
.is_mash_clock = true,
|
|
.tcnt_mux = 21),
|
|
[BCM2835_CLOCK_GP2] = REGISTER_PER_CLK(
|
|
+ SOC_ALL,
|
|
.name = "gp2",
|
|
.ctl_reg = CM_GP2CTL,
|
|
.div_reg = CM_GP2DIV,
|
|
@@ -2075,6 +2133,7 @@ static const struct bcm2835_clk_desc clk
|
|
|
|
/* HDMI state machine */
|
|
[BCM2835_CLOCK_HSM] = REGISTER_PER_CLK(
|
|
+ SOC_ALL,
|
|
.name = "hsm",
|
|
.ctl_reg = CM_HSMCTL,
|
|
.div_reg = CM_HSMDIV,
|
|
@@ -2082,6 +2141,7 @@ static const struct bcm2835_clk_desc clk
|
|
.frac_bits = 8,
|
|
.tcnt_mux = 22),
|
|
[BCM2835_CLOCK_PCM] = REGISTER_PCM_CLK(
|
|
+ SOC_ALL,
|
|
.name = "pcm",
|
|
.ctl_reg = CM_PCMCTL,
|
|
.div_reg = CM_PCMDIV,
|
|
@@ -2091,6 +2151,7 @@ static const struct bcm2835_clk_desc clk
|
|
.low_jitter = true,
|
|
.tcnt_mux = 23),
|
|
[BCM2835_CLOCK_PWM] = REGISTER_PER_CLK(
|
|
+ SOC_ALL,
|
|
.name = "pwm",
|
|
.ctl_reg = CM_PWMCTL,
|
|
.div_reg = CM_PWMDIV,
|
|
@@ -2099,6 +2160,7 @@ static const struct bcm2835_clk_desc clk
|
|
.is_mash_clock = true,
|
|
.tcnt_mux = 24),
|
|
[BCM2835_CLOCK_SLIM] = REGISTER_PER_CLK(
|
|
+ SOC_ALL,
|
|
.name = "slim",
|
|
.ctl_reg = CM_SLIMCTL,
|
|
.div_reg = CM_SLIMDIV,
|
|
@@ -2107,6 +2169,7 @@ static const struct bcm2835_clk_desc clk
|
|
.is_mash_clock = true,
|
|
.tcnt_mux = 25),
|
|
[BCM2835_CLOCK_SMI] = REGISTER_PER_CLK(
|
|
+ SOC_ALL,
|
|
.name = "smi",
|
|
.ctl_reg = CM_SMICTL,
|
|
.div_reg = CM_SMIDIV,
|
|
@@ -2114,6 +2177,7 @@ static const struct bcm2835_clk_desc clk
|
|
.frac_bits = 8,
|
|
.tcnt_mux = 27),
|
|
[BCM2835_CLOCK_UART] = REGISTER_PER_CLK(
|
|
+ SOC_ALL,
|
|
.name = "uart",
|
|
.ctl_reg = CM_UARTCTL,
|
|
.div_reg = CM_UARTDIV,
|
|
@@ -2123,6 +2187,7 @@ static const struct bcm2835_clk_desc clk
|
|
|
|
/* TV encoder clock. Only operating frequency is 108Mhz. */
|
|
[BCM2835_CLOCK_VEC] = REGISTER_PER_CLK(
|
|
+ SOC_ALL,
|
|
.name = "vec",
|
|
.ctl_reg = CM_VECCTL,
|
|
.div_reg = CM_VECDIV,
|
|
@@ -2137,6 +2202,7 @@ static const struct bcm2835_clk_desc clk
|
|
|
|
/* dsi clocks */
|
|
[BCM2835_CLOCK_DSI0E] = REGISTER_PER_CLK(
|
|
+ SOC_ALL,
|
|
.name = "dsi0e",
|
|
.ctl_reg = CM_DSI0ECTL,
|
|
.div_reg = CM_DSI0EDIV,
|
|
@@ -2144,6 +2210,7 @@ static const struct bcm2835_clk_desc clk
|
|
.frac_bits = 8,
|
|
.tcnt_mux = 18),
|
|
[BCM2835_CLOCK_DSI1E] = REGISTER_PER_CLK(
|
|
+ SOC_ALL,
|
|
.name = "dsi1e",
|
|
.ctl_reg = CM_DSI1ECTL,
|
|
.div_reg = CM_DSI1EDIV,
|
|
@@ -2151,6 +2218,7 @@ static const struct bcm2835_clk_desc clk
|
|
.frac_bits = 8,
|
|
.tcnt_mux = 19),
|
|
[BCM2835_CLOCK_DSI0P] = REGISTER_DSI0_CLK(
|
|
+ SOC_ALL,
|
|
.name = "dsi0p",
|
|
.ctl_reg = CM_DSI0PCTL,
|
|
.div_reg = CM_DSI0PDIV,
|
|
@@ -2158,6 +2226,7 @@ static const struct bcm2835_clk_desc clk
|
|
.frac_bits = 0,
|
|
.tcnt_mux = 12),
|
|
[BCM2835_CLOCK_DSI1P] = REGISTER_DSI1_CLK(
|
|
+ SOC_ALL,
|
|
.name = "dsi1p",
|
|
.ctl_reg = CM_DSI1PCTL,
|
|
.div_reg = CM_DSI1PDIV,
|
|
@@ -2174,6 +2243,7 @@ static const struct bcm2835_clk_desc clk
|
|
* non-stop vpu clock.
|
|
*/
|
|
[BCM2835_CLOCK_PERI_IMAGE] = REGISTER_GATE(
|
|
+ SOC_ALL,
|
|
.name = "peri_image",
|
|
.parent = "vpu",
|
|
.ctl_reg = CM_PERIICTL),
|
|
@@ -2221,11 +2291,16 @@ static int bcm2835_clk_probe(struct plat
|
|
struct resource *res;
|
|
const struct bcm2835_clk_desc *desc;
|
|
const size_t asize = ARRAY_SIZE(clk_desc_array);
|
|
+ const struct cprman_plat_data *pdata;
|
|
struct device_node *fw_node;
|
|
size_t i;
|
|
u32 clk_id;
|
|
int ret;
|
|
|
|
+ pdata = of_device_get_match_data(&pdev->dev);
|
|
+ if (!pdata)
|
|
+ return -ENODEV;
|
|
+
|
|
cprman = devm_kzalloc(dev,
|
|
struct_size(cprman, onecell.hws, asize),
|
|
GFP_KERNEL);
|
|
@@ -2276,8 +2351,10 @@ static int bcm2835_clk_probe(struct plat
|
|
|
|
for (i = 0; i < asize; i++) {
|
|
desc = &clk_desc_array[i];
|
|
- if (desc->clk_register && desc->data)
|
|
+ if (desc->clk_register && desc->data &&
|
|
+ (desc->supported & pdata->soc)) {
|
|
hws[i] = desc->clk_register(cprman, desc->data);
|
|
+ }
|
|
}
|
|
|
|
ret = bcm2835_mark_sdc_parent_critical(hws[BCM2835_CLOCK_SDRAM]->clk);
|
|
@@ -2295,8 +2372,12 @@ static int bcm2835_clk_probe(struct plat
|
|
return 0;
|
|
}
|
|
|
|
+static const struct cprman_plat_data cprman_bcm2835_plat_data = {
|
|
+ .soc = SOC_BCM2835,
|
|
+};
|
|
+
|
|
static const struct of_device_id bcm2835_clk_of_match[] = {
|
|
- { .compatible = "brcm,bcm2835-cprman", },
|
|
+ { .compatible = "brcm,bcm2835-cprman", .data = &cprman_bcm2835_plat_data },
|
|
{}
|
|
};
|
|
MODULE_DEVICE_TABLE(of, bcm2835_clk_of_match);
|