brcm2708: update to latest patches from RPi foundation
[openwrt/staging/dedeckeh.git] / target / linux / brcm2708 / patches-4.19 / 950-0714-clk-bcm2835-Introduce-SoC-specific-clock-registratio.patch
diff --git a/target/linux/brcm2708/patches-4.19/950-0714-clk-bcm2835-Introduce-SoC-specific-clock-registratio.patch b/target/linux/brcm2708/patches-4.19/950-0714-clk-bcm2835-Introduce-SoC-specific-clock-registratio.patch
new file mode 100644 (file)
index 0000000..52f716e
--- /dev/null
@@ -0,0 +1,597 @@
+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);