Merge 'clk-notify' into clk-next
authorStephen Boyd <sboyd@codeaurora.org>
Wed, 29 Jun 2016 17:54:13 +0000 (10:54 -0700)
committerStephen Boyd <sboyd@codeaurora.org>
Wed, 29 Jun 2016 17:54:13 +0000 (10:54 -0700)
* clk-notify:
  clk: Provide notifier stubs when !COMMON_CLK

67 files changed:
Documentation/devicetree/bindings/clock/amlogic,gxbb-clkc.txt [new file with mode: 0644]
Documentation/devicetree/bindings/clock/renesas,cpg-mssr.txt
Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt
Documentation/devicetree/bindings/clock/renesas,rcar-gen2-cpg-clocks.txt
MAINTAINERS
arch/arm/mach-vexpress/spc.c
arch/powerpc/platforms/512x/clock-commonclk.c
drivers/clk/Kconfig
drivers/clk/Makefile
drivers/clk/at91/clk-generated.c
drivers/clk/bcm/clk-iproc-armpll.c
drivers/clk/clk-multiplier.c
drivers/clk/clk-oxnas.c
drivers/clk/clk-vt8500.c
drivers/clk/clk.c
drivers/clk/hisilicon/clkdivider-hi6220.c
drivers/clk/meson/Kconfig [new file with mode: 0644]
drivers/clk/meson/Makefile
drivers/clk/meson/clk-cpu.c
drivers/clk/meson/clk-mpll.c [new file with mode: 0644]
drivers/clk/meson/clk-pll.c
drivers/clk/meson/clkc.c [deleted file]
drivers/clk/meson/clkc.h
drivers/clk/meson/gxbb.c [new file with mode: 0644]
drivers/clk/meson/gxbb.h [new file with mode: 0644]
drivers/clk/meson/meson8b-clkc.c
drivers/clk/microchip/clk-pic32mzda.c
drivers/clk/qcom/gcc-msm8996.c
drivers/clk/renesas/Kconfig
drivers/clk/renesas/Makefile
drivers/clk/renesas/r8a7795-cpg-mssr.c
drivers/clk/renesas/r8a7796-cpg-mssr.c [new file with mode: 0644]
drivers/clk/renesas/rcar-gen3-cpg.c [new file with mode: 0644]
drivers/clk/renesas/rcar-gen3-cpg.h [new file with mode: 0644]
drivers/clk/renesas/renesas-cpg-mssr.c
drivers/clk/renesas/renesas-cpg-mssr.h
drivers/clk/rockchip/clk-cpu.c
drivers/clk/rockchip/clk-mmc-phase.c
drivers/clk/rockchip/clk-rk3399.c
drivers/clk/samsung/clk-cpu.c
drivers/clk/samsung/clk-cpu.h
drivers/clk/samsung/clk-exynos-clkout.c
drivers/clk/samsung/clk-exynos3250.c
drivers/clk/samsung/clk-exynos4.c
drivers/clk/samsung/clk-exynos4415.c
drivers/clk/samsung/clk-exynos5250.c
drivers/clk/samsung/clk-exynos5260.c
drivers/clk/samsung/clk-exynos5410.c
drivers/clk/samsung/clk-exynos5420.c
drivers/clk/samsung/clk-exynos5433.c
drivers/clk/samsung/clk-exynos5440.c
drivers/clk/samsung/clk-exynos7.c
drivers/clk/samsung/clk-pll.c
drivers/clk/samsung/clk-s3c2410-dclk.c
drivers/clk/samsung/clk-s3c2410.c
drivers/clk/samsung/clk-s3c2412.c
drivers/clk/samsung/clk-s3c2443.c
drivers/clk/samsung/clk-s3c64xx.c
drivers/clk/samsung/clk-s5pv210.c
drivers/clk/samsung/clk.c
drivers/clk/samsung/clk.h
include/dt-bindings/clock/exynos5410.h
include/dt-bindings/clock/exynos5433.h
include/dt-bindings/clock/gxbb-clkc.h [new file with mode: 0644]
include/dt-bindings/clock/meson8b-clkc.h
include/dt-bindings/clock/r8a7796-cpg-mssr.h [new file with mode: 0644]
include/linux/clk-provider.h

diff --git a/Documentation/devicetree/bindings/clock/amlogic,gxbb-clkc.txt b/Documentation/devicetree/bindings/clock/amlogic,gxbb-clkc.txt
new file mode 100644 (file)
index 0000000..ce06435
--- /dev/null
@@ -0,0 +1,36 @@
+* Amlogic GXBB Clock and Reset Unit
+
+The Amlogic GXBB clock controller generates and supplies clock to various
+controllers within the SoC.
+
+Required Properties:
+
+- compatible: should be "amlogic,gxbb-clkc"
+- reg: physical base address of the clock controller and length of memory
+       mapped region.
+
+- #clock-cells: should be 1.
+
+Each clock is assigned an identifier and client nodes can use this identifier
+to specify the clock which they consume. All available clocks are defined as
+preprocessor macros in the dt-bindings/clock/gxbb-clkc.h header and can be
+used in device tree sources.
+
+Example: Clock controller node:
+
+       clkc: clock-controller@c883c000 {
+               #clock-cells = <1>;
+               compatible = "amlogic,gxbb-clkc";
+               reg = <0x0 0xc883c000 0x0 0x3db>;
+       };
+
+Example: UART controller node that consumes the clock generated by the clock
+  controller:
+
+       uart_AO: serial@c81004c0 {
+               compatible = "amlogic,meson-uart";
+               reg = <0xc81004c0 0x14>;
+               interrupts = <0 90 1>;
+               clocks = <&clkc CLKID_CLK81>;
+               status = "disabled";
+       };
index fefb8023020f1a543b61fb230c9de2985c3cfb03..394d725ac7e0baa3bf8ba8429409ba5d0c017d4c 100644 (file)
@@ -13,7 +13,8 @@ They provide the following functionalities:
 
 Required Properties:
   - compatible: Must be one of:
-      - "renesas,r8a7795-cpg-mssr" for the r8a7795 SoC
+      - "renesas,r8a7795-cpg-mssr" for the r8a7795 SoC (R-Car H3)
+      - "renesas,r8a7796-cpg-mssr" for the r8a7796 SoC (R-Car M3-W)
 
   - reg: Base address and length of the memory resource used by the CPG/MSSR
     block
@@ -21,8 +22,8 @@ Required Properties:
   - clocks: References to external parent clocks, one entry for each entry in
     clock-names
   - clock-names: List of external parent clock names. Valid names are:
-      - "extal" (r8a7795)
-      - "extalr" (r8a7795)
+      - "extal" (r8a7795, r8a7796)
+      - "extalr" (r8a7795, r8a7796)
 
   - #clock-cells: Must be 2
       - For CPG core clocks, the two clock specifier cells must be "CPG_CORE"
index 16ed18155160f58c9ce17dce42f50f1527261f72..da578ebdda2889fc1dad50c671bc274af7d38169 100644 (file)
@@ -17,6 +17,7 @@ Required Properties:
     - "renesas,r8a7779-mstp-clocks" for R8A7779 (R-Car H1) MSTP gate clocks
     - "renesas,r8a7790-mstp-clocks" for R8A7790 (R-Car H2) MSTP gate clocks
     - "renesas,r8a7791-mstp-clocks" for R8A7791 (R-Car M2-W) MSTP gate clocks
+    - "renesas,r8a7792-mstp-clocks" for R8A7792 (R-Car V2H) MSTP gate clocks
     - "renesas,r8a7793-mstp-clocks" for R8A7793 (R-Car M2-N) MSTP gate clocks
     - "renesas,r8a7794-mstp-clocks" for R8A7794 (R-Car E2) MSTP gate clocks
     - "renesas,sh73a0-mstp-clocks" for SH73A0 (SH-MobileAG5) MSTP gate clocks
index 2a9a8edc8f3547b051a35b341abce912c41c427f..f8c05bb4116eae54b663c821476f2eeaa6bb9415 100644 (file)
@@ -10,6 +10,7 @@ Required Properties:
   - compatible: Must be one of
     - "renesas,r8a7790-cpg-clocks" for the r8a7790 CPG
     - "renesas,r8a7791-cpg-clocks" for the r8a7791 CPG
+    - "renesas,r8a7792-cpg-clocks" for the r8a7792 CPG
     - "renesas,r8a7793-cpg-clocks" for the r8a7793 CPG
     - "renesas,r8a7794-cpg-clocks" for the r8a7794 CPG
     and "renesas,rcar-gen2-cpg-clocks" as a fallback.
index 7304d2e37a9827988f8c816c9d7922adb8a00d9b..2334995860b8fc73b1ef2ec28db8b85f75f85e29 100644 (file)
@@ -3086,6 +3086,7 @@ M:        Stephen Boyd <sboyd@codeaurora.org>
 L:     linux-clk@vger.kernel.org
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git
 S:     Maintained
+F:     Documentation/devicetree/bindings/clock/
 F:     drivers/clk/
 X:     drivers/clk/clkdev.c
 F:     include/linux/clk-pr*
index 5766ce2be32bbd28452c95ea9e43e92de0f4dcb0..8409cab3f760cc798a14cadc5f017feab53d1b65 100644 (file)
@@ -547,7 +547,7 @@ static struct clk *ve_spc_clk_register(struct device *cpu_dev)
 
        init.name = dev_name(cpu_dev);
        init.ops = &clk_spc_ops;
-       init.flags = CLK_IS_ROOT | CLK_GET_RATE_NOCACHE;
+       init.flags = CLK_GET_RATE_NOCACHE;
        init.num_parents = 0;
 
        return devm_clk_register(cpu_dev, &spc->hw);
index c50ea76ba66ceb95c99555f7391b75c0744a1b96..6081fbd75330b8a936a6e590b7fcb9604c4a23cb 100644 (file)
@@ -221,7 +221,7 @@ static bool soc_has_mclk_mux0_canin(void)
 /* convenience wrappers around the common clk API */
 static inline struct clk *mpc512x_clk_fixed(const char *name, int rate)
 {
-       return clk_register_fixed_rate(NULL, name, NULL, CLK_IS_ROOT, rate);
+       return clk_register_fixed_rate(NULL, name, NULL, 0, rate);
 }
 
 static inline struct clk *mpc512x_clk_factor(
index 53ddba26578ce341eb3f488001a9cc267342eeda..bfaad3d72233c61cb612f79a534b6569ee924529 100644 (file)
@@ -175,6 +175,7 @@ config COMMON_CLK_KEYSTONE
 config COMMON_CLK_NXP
        def_bool COMMON_CLK && (ARCH_LPC18XX || ARCH_LPC32XX)
        select REGMAP_MMIO if ARCH_LPC32XX
+       select MFD_SYSCON if ARCH_LPC18XX
        ---help---
          Support for clock providers on NXP platforms.
 
@@ -208,6 +209,7 @@ config COMMON_CLK_OXNAS
 
 source "drivers/clk/bcm/Kconfig"
 source "drivers/clk/hisilicon/Kconfig"
+source "drivers/clk/meson/Kconfig"
 source "drivers/clk/mvebu/Kconfig"
 source "drivers/clk/qcom/Kconfig"
 source "drivers/clk/renesas/Kconfig"
index dcc5e698ff6dd4d61255dd274dafadb1af239161..af03eb2f6c05a37e7bcdebb0da796d6ea506ba56 100644 (file)
@@ -65,7 +65,7 @@ ifeq ($(CONFIG_COMMON_CLK), y)
 obj-$(CONFIG_ARCH_MMP)                 += mmp/
 endif
 obj-y                                  += mvebu/
-obj-$(CONFIG_ARCH_MESON)               += meson/
+obj-$(CONFIG_COMMON_CLK_AMLOGIC)       += meson/
 obj-$(CONFIG_ARCH_MXS)                 += mxs/
 obj-$(CONFIG_MACH_PISTACHIO)           += pistachio/
 obj-$(CONFIG_COMMON_CLK_NXP)           += nxp/
index e1aa210dd7aa6a6bf3ca40bb76f31f36407eb116..7f6bec8837eaa755934f3a4f5c2bc503813b16b6 100644 (file)
@@ -267,7 +267,7 @@ at91_clk_register_generated(struct regmap *regmap,  spinlock_t *lock, const char
        return clk;
 }
 
-void __init of_sama5d2_clk_generated_setup(struct device_node *np)
+static void __init of_sama5d2_clk_generated_setup(struct device_node *np)
 {
        int num;
        u32 id;
index a196ee28a17ae63f42e03a1f10714405254b52e2..698c507921f17e0a0af9d85e51094b8bcd114712 100644 (file)
@@ -20,6 +20,8 @@
 #include <linux/clkdev.h>
 #include <linux/of_address.h>
 
+#include "clk-iproc.h"
+
 #define IPROC_CLK_MAX_FREQ_POLICY                    0x3
 #define IPROC_CLK_POLICY_FREQ_OFFSET                 0x008
 #define IPROC_CLK_POLICY_FREQ_POLICY_FREQ_SHIFT      8
index 9e449c7b751c328e23b074186e1bebf426172087..dc037c957acd8a1dc1f74f3c0407567a09fa66cd 100644 (file)
@@ -52,14 +52,28 @@ static unsigned long __bestmult(struct clk_hw *hw, unsigned long rate,
                                unsigned long *best_parent_rate,
                                u8 width, unsigned long flags)
 {
+       struct clk_multiplier *mult = to_clk_multiplier(hw);
        unsigned long orig_parent_rate = *best_parent_rate;
        unsigned long parent_rate, current_rate, best_rate = ~0;
        unsigned int i, bestmult = 0;
+       unsigned int maxmult = (1 << width) - 1;
+
+       if (!(clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT)) {
+               bestmult = rate / orig_parent_rate;
+
+               /* Make sure we don't end up with a 0 multiplier */
+               if ((bestmult == 0) &&
+                   !(mult->flags & CLK_MULTIPLIER_ZERO_BYPASS))
+                       bestmult = 1;
 
-       if (!(clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT))
-               return rate / *best_parent_rate;
+               /* Make sure we don't overflow the multiplier */
+               if (bestmult > maxmult)
+                       bestmult = maxmult;
+
+               return bestmult;
+       }
 
-       for (i = 1; i < ((1 << width) - 1); i++) {
+       for (i = 1; i < maxmult; i++) {
                if (rate == orig_parent_rate * i) {
                        /*
                         * This is the best case for us if we have a
index efba7d4dbcfc4134a88dff1efa5309f0551a8ea6..79bcb2e4206048c74add49b88f9efe97d11622ff 100644 (file)
@@ -144,9 +144,9 @@ static int oxnas_stdclk_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        regmap = syscon_node_to_regmap(of_get_parent(np));
-       if (!regmap) {
+       if (IS_ERR(regmap)) {
                dev_err(&pdev->dev, "failed to have parent regmap\n");
-               return -EINVAL;
+               return PTR_ERR(regmap);
        }
 
        for (i = 0; i < ARRAY_SIZE(clk_oxnas_init); i++) {
index b0f76a84f1e9fec9d3f2bcc7ec0f41eec37fbf93..37368a399ff9d8faa370ba727bb06b472b338354 100644 (file)
@@ -383,51 +383,49 @@ static int vt8500_find_pll_bits(unsigned long rate, unsigned long parent_rate,
        return 0;
 }
 
-static int wm8650_find_pll_bits(unsigned long rate, unsigned long parent_rate,
-                               u32 *multiplier, u32 *divisor1, u32 *divisor2)
+/*
+ * M * parent [O1] => / P [O2] => / D [O3]
+ * Where O1 is 900MHz...3GHz;
+ * O2 is 600MHz >= (M * parent) / P >= 300MHz;
+ * M is 36...120 [25MHz parent]; D is 1 or 2 or 4 or 8.
+ * Possible ranges (O3):
+ * D = 8: 37,5MHz...75MHz
+ * D = 4: 75MHz...150MHz
+ * D = 2: 150MHz...300MHz
+ * D = 1: 300MHz...600MHz
+ */
+static int wm8650_find_pll_bits(unsigned long rate,
+       unsigned long parent_rate, u32 *multiplier, u32 *divisor1,
+       u32 *divisor2)
 {
-       u32 mul, div1;
-       int div2;
-       u32 best_mul, best_div1, best_div2;
-       unsigned long tclk, rate_err, best_err;
-
-       best_err = (unsigned long)-1;
+       unsigned long O1, min_err, rate_err;
 
-       /* Find the closest match (lower or equal to requested) */
-       for (div1 = 5; div1 >= 3; div1--)
-               for (div2 = 3; div2 >= 0; div2--)
-                       for (mul = 3; mul <= 1023; mul++) {
-                               tclk = parent_rate * mul / (div1 * (1 << div2));
-                               if (tclk > rate)
-                                       continue;
-                               /* error will always be +ve */
-                               rate_err = rate - tclk;
-                               if (rate_err == 0) {
-                                       *multiplier = mul;
-                                       *divisor1 = div1;
-                                       *divisor2 = div2;
-                                       return 0;
-                               }
+       if (!parent_rate || (rate < 37500000) || (rate > 600000000))
+               return -EINVAL;
 
-                               if (rate_err < best_err) {
-                                       best_err = rate_err;
-                                       best_mul = mul;
-                                       best_div1 = div1;
-                                       best_div2 = div2;
-                               }
-                       }
+       *divisor2 = rate <= 75000000 ? 3 : rate <= 150000000 ? 2 :
+                                          rate <= 300000000 ? 1 : 0;
+       /*
+        * Divisor P cannot be calculated. Test all divisors and find where M
+        * will be as close as possible to the requested rate.
+        */
+       min_err = ULONG_MAX;
+       for (*divisor1 = 5; *divisor1 >= 3; (*divisor1)--) {
+               O1 = rate * *divisor1 * (1 << (*divisor2));
+               rate_err = O1 % parent_rate;
+               if (rate_err < min_err) {
+                       *multiplier = O1 / parent_rate;
+                       if (rate_err == 0)
+                               return 0;
+
+                       min_err = rate_err;
+               }
+       }
 
-       if (best_err == (unsigned long)-1) {
-               pr_warn("%s: impossible rate %lu\n", __func__, rate);
+       if ((*multiplier < 3) || (*multiplier > 1023))
                return -EINVAL;
-       }
 
-       /* if we got here, it wasn't an exact match */
-       pr_warn("%s: requested rate %lu, found rate %lu\n", __func__, rate,
-                                                       rate - best_err);
-       *multiplier = best_mul;
-       *divisor1 = best_div1;
-       *divisor2 = best_div2;
+       pr_warn("%s: rate error is %lu\n", __func__, min_err);
 
        return 0;
 }
@@ -464,7 +462,6 @@ static int wm8750_find_pll_bits(unsigned long rate, unsigned long parent_rate,
 {
        u32 mul;
        int div1, div2;
-       u32 best_mul, best_div1, best_div2;
        unsigned long tclk, rate_err, best_err;
 
        best_err = (unsigned long)-1;
@@ -488,9 +485,9 @@ static int wm8750_find_pll_bits(unsigned long rate, unsigned long parent_rate,
 
                                if (rate_err < best_err) {
                                        best_err = rate_err;
-                                       best_mul = mul;
-                                       best_div1 = div1;
-                                       best_div2 = div2;
+                                       *multiplier = mul;
+                                       *divisor1 = div1;
+                                       *divisor2 = div2;
                                }
                        }
 
@@ -503,10 +500,7 @@ static int wm8750_find_pll_bits(unsigned long rate, unsigned long parent_rate,
        pr_warn("%s: requested rate %lu, found rate %lu\n", __func__, rate,
                                                        rate - best_err);
 
-       *filter = wm8750_get_filter(parent_rate, best_div1);
-       *multiplier = best_mul;
-       *divisor1 = best_div1;
-       *divisor2 = best_div2;
+       *filter = wm8750_get_filter(parent_rate, *divisor1);
 
        return 0;
 }
@@ -516,7 +510,6 @@ static int wm8850_find_pll_bits(unsigned long rate, unsigned long parent_rate,
 {
        u32 mul;
        int div1, div2;
-       u32 best_mul, best_div1, best_div2;
        unsigned long tclk, rate_err, best_err;
 
        best_err = (unsigned long)-1;
@@ -540,9 +533,9 @@ static int wm8850_find_pll_bits(unsigned long rate, unsigned long parent_rate,
 
                                if (rate_err < best_err) {
                                        best_err = rate_err;
-                                       best_mul = mul;
-                                       best_div1 = div1;
-                                       best_div2 = div2;
+                                       *multiplier = mul;
+                                       *divisor1 = div1;
+                                       *divisor2 = div2;
                                }
                        }
 
@@ -555,10 +548,6 @@ static int wm8850_find_pll_bits(unsigned long rate, unsigned long parent_rate,
        pr_warn("%s: requested rate %lu, found rate %lu\n", __func__, rate,
                                                        rate - best_err);
 
-       *multiplier = best_mul;
-       *divisor1 = best_div1;
-       *divisor2 = best_div2;
-
        return 0;
 }
 
index d584004f7af7d193d5f2646b482f26ce442deeef..95b80aeb8c9d40fc80d129bf2990b9755da7010c 100644 (file)
@@ -688,12 +688,12 @@ static void clk_core_disable(struct clk_core *core)
        if (--core->enable_count > 0)
                return;
 
-       trace_clk_disable(core);
+       trace_clk_disable_rcuidle(core);
 
        if (core->ops->disable)
                core->ops->disable(core->hw);
 
-       trace_clk_disable_complete(core);
+       trace_clk_disable_complete_rcuidle(core);
 
        clk_core_disable(core->parent);
 }
@@ -741,12 +741,12 @@ static int clk_core_enable(struct clk_core *core)
                if (ret)
                        return ret;
 
-               trace_clk_enable(core);
+               trace_clk_enable_rcuidle(core);
 
                if (core->ops->enable)
                        ret = core->ops->enable(core->hw);
 
-               trace_clk_enable_complete(core);
+               trace_clk_enable_complete_rcuidle(core);
 
                if (ret) {
                        clk_core_disable(core->parent);
@@ -828,9 +828,7 @@ static int clk_core_round_rate_nolock(struct clk_core *core,
 /**
  * __clk_determine_rate - get the closest rate actually supported by a clock
  * @hw: determine the rate of this clock
- * @rate: target rate
- * @min_rate: returned rate must be greater than this rate
- * @max_rate: returned rate must be less than this rate
+ * @req: target rate request
  *
  * Useful for clk_ops such as .set_rate and .determine_rate.
  */
@@ -1501,7 +1499,6 @@ static int clk_core_set_rate_nolock(struct clk_core *core,
 {
        struct clk_core *top, *fail_clk;
        unsigned long rate = req_rate;
-       int ret = 0;
 
        if (!core)
                return 0;
@@ -1532,7 +1529,7 @@ static int clk_core_set_rate_nolock(struct clk_core *core,
 
        core->req_rate = req_rate;
 
-       return ret;
+       return 0;
 }
 
 /**
index 113eee8ed23a04f90d00518c6436259f1bc58649..a1c1f684ad585bbc5d64f3b7954473d442197398 100644 (file)
@@ -18,6 +18,8 @@
 #include <linux/err.h>
 #include <linux/spinlock.h>
 
+#include "clk.h"
+
 #define div_mask(width)        ((1 << (width)) - 1)
 
 /**
diff --git a/drivers/clk/meson/Kconfig b/drivers/clk/meson/Kconfig
new file mode 100644 (file)
index 0000000..19480bc
--- /dev/null
@@ -0,0 +1,19 @@
+config COMMON_CLK_AMLOGIC
+       bool
+       depends on OF
+       depends on ARCH_MESON || COMPILE_TEST
+
+config COMMON_CLK_MESON8B
+       bool
+       depends on COMMON_CLK_AMLOGIC
+       help
+         Support for the clock controller on AmLogic S805 devices, aka
+         meson8b. Say Y if you want peripherals and CPU frequency scaling to
+         work.
+
+config COMMON_CLK_GXBB
+       bool
+       depends on COMMON_CLK_AMLOGIC
+       help
+         Support for the clock controller on AmLogic S905 devices, aka gxbb.
+         Say Y if you want peripherals and CPU frequency scaling to work.
index 6d45531df9abf1355ca437511f9d580aff5d7f7f..197e40175166831a97a4a9f55f38fb571b306d99 100644 (file)
@@ -2,5 +2,6 @@
 # Makefile for Meson specific clk
 #
 
-obj-y += clkc.o clk-pll.o clk-cpu.o
-obj-y += meson8b-clkc.o
+obj-$(CONFIG_COMMON_CLK_AMLOGIC) += clk-pll.o clk-cpu.o clk-mpll.o
+obj-$(CONFIG_COMMON_CLK_MESON8B) += meson8b-clkc.o
+obj-$(CONFIG_COMMON_CLK_GXBB)   += gxbb.o
index f7c30ea54ca8d85625b8bc33c5c772dd2700e0dd..f8b2b7efd0161ee2cea918ee395fdd9c7e49522c 100644 (file)
 
 #include "clkc.h"
 
-struct meson_clk_cpu {
-       struct notifier_block           clk_nb;
-       const struct clk_div_table      *div_table;
-       struct clk_hw                   hw;
-       void __iomem                    *base;
-       u16                             reg_off;
-};
 #define to_meson_clk_cpu_hw(_hw) container_of(_hw, struct meson_clk_cpu, hw)
 #define to_meson_clk_cpu_nb(_nb) container_of(_nb, struct meson_clk_cpu, clk_nb)
 
@@ -119,6 +112,7 @@ static unsigned long meson_clk_cpu_recalc_rate(struct clk_hw *hw,
        return parent_rate / div;
 }
 
+/* FIXME MUX1 & MUX2 should be struct clk_hw objects */
 static int meson_clk_cpu_pre_rate_change(struct meson_clk_cpu *clk_cpu,
                                         struct clk_notifier_data *ndata)
 {
@@ -140,6 +134,7 @@ static int meson_clk_cpu_pre_rate_change(struct meson_clk_cpu *clk_cpu,
        return 0;
 }
 
+/* FIXME MUX1 & MUX2 should be struct clk_hw objects */
 static int meson_clk_cpu_post_rate_change(struct meson_clk_cpu *clk_cpu,
                                          struct clk_notifier_data *ndata)
 {
@@ -161,7 +156,7 @@ static int meson_clk_cpu_post_rate_change(struct meson_clk_cpu *clk_cpu,
  * PLL clock is to be changed. We use the xtal input as temporary parent
  * while the PLL frequency is stabilized.
  */
-static int meson_clk_cpu_notifier_cb(struct notifier_block *nb,
+int meson_clk_cpu_notifier_cb(struct notifier_block *nb,
                                     unsigned long event, void *data)
 {
        struct clk_notifier_data *ndata = data;
@@ -176,68 +171,8 @@ static int meson_clk_cpu_notifier_cb(struct notifier_block *nb,
        return notifier_from_errno(ret);
 }
 
-static const struct clk_ops meson_clk_cpu_ops = {
+const struct clk_ops meson_clk_cpu_ops = {
        .recalc_rate    = meson_clk_cpu_recalc_rate,
        .round_rate     = meson_clk_cpu_round_rate,
        .set_rate       = meson_clk_cpu_set_rate,
 };
-
-struct clk *meson_clk_register_cpu(const struct clk_conf *clk_conf,
-                                  void __iomem *reg_base,
-                                  spinlock_t *lock)
-{
-       struct clk *clk;
-       struct clk *pclk;
-       struct meson_clk_cpu *clk_cpu;
-       struct clk_init_data init;
-       int ret;
-
-       clk_cpu = kzalloc(sizeof(*clk_cpu), GFP_KERNEL);
-       if (!clk_cpu)
-               return ERR_PTR(-ENOMEM);
-
-       clk_cpu->base = reg_base;
-       clk_cpu->reg_off = clk_conf->reg_off;
-       clk_cpu->div_table = clk_conf->conf.div_table;
-       clk_cpu->clk_nb.notifier_call = meson_clk_cpu_notifier_cb;
-
-       init.name = clk_conf->clk_name;
-       init.ops = &meson_clk_cpu_ops;
-       init.flags = clk_conf->flags | CLK_GET_RATE_NOCACHE;
-       init.flags |= CLK_SET_RATE_PARENT;
-       init.parent_names = clk_conf->clks_parent;
-       init.num_parents = 1;
-
-       clk_cpu->hw.init = &init;
-
-       pclk = __clk_lookup(clk_conf->clks_parent[0]);
-       if (!pclk) {
-               pr_err("%s: could not lookup parent clock %s\n",
-                               __func__, clk_conf->clks_parent[0]);
-               ret = -EINVAL;
-               goto free_clk;
-       }
-
-       ret = clk_notifier_register(pclk, &clk_cpu->clk_nb);
-       if (ret) {
-               pr_err("%s: failed to register clock notifier for %s\n",
-                               __func__, clk_conf->clk_name);
-               goto free_clk;
-       }
-
-       clk = clk_register(NULL, &clk_cpu->hw);
-       if (IS_ERR(clk)) {
-               ret = PTR_ERR(clk);
-               goto unregister_clk_nb;
-       }
-
-       return clk;
-
-unregister_clk_nb:
-       clk_notifier_unregister(pclk, &clk_cpu->clk_nb);
-free_clk:
-       kfree(clk_cpu);
-
-       return ERR_PTR(ret);
-}
-
diff --git a/drivers/clk/meson/clk-mpll.c b/drivers/clk/meson/clk-mpll.c
new file mode 100644 (file)
index 0000000..03af790
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * This file is provided under a dual BSD/GPLv2 license.  When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * GPL LICENSE SUMMARY
+ *
+ * Copyright (c) 2016 AmLogic, Inc.
+ * Author: Michael Turquette <mturquette@baylibre.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ * The full GNU General Public License is included in this distribution
+ * in the file called COPYING
+ *
+ * BSD LICENSE
+ *
+ * Copyright (c) 2016 AmLogic, Inc.
+ * Author: Michael Turquette <mturquette@baylibre.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *   * Neither the name of Intel Corporation nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * MultiPhase Locked Loops are outputs from a PLL with additional frequency
+ * scaling capabilities. MPLL rates are calculated as:
+ *
+ * f(N2_integer, SDM_IN ) = 2.0G/(N2_integer + SDM_IN/16384)
+ */
+
+#include <linux/clk-provider.h>
+#include "clkc.h"
+
+#define SDM_MAX 16384
+
+#define to_meson_clk_mpll(_hw) container_of(_hw, struct meson_clk_mpll, hw)
+
+static unsigned long mpll_recalc_rate(struct clk_hw *hw,
+               unsigned long parent_rate)
+{
+       struct meson_clk_mpll *mpll = to_meson_clk_mpll(hw);
+       struct parm *p;
+       unsigned long rate = 0;
+       unsigned long reg, sdm, n2;
+
+       p = &mpll->sdm;
+       reg = readl(mpll->base + p->reg_off);
+       sdm = PARM_GET(p->width, p->shift, reg);
+
+       p = &mpll->n2;
+       reg = readl(mpll->base + p->reg_off);
+       n2 = PARM_GET(p->width, p->shift, reg);
+
+       rate = (parent_rate * SDM_MAX) / ((SDM_MAX * n2) + sdm);
+
+       return rate;
+}
+
+const struct clk_ops meson_clk_mpll_ro_ops = {
+       .recalc_rate = mpll_recalc_rate,
+};
index 664edf0708ea712ad677415904e3361ae5026e6e..4adc1e89212c9a944587117ee8d1a8b9eae63d4d 100644 (file)
 #define MESON_PLL_RESET                                BIT(29)
 #define MESON_PLL_LOCK                         BIT(31)
 
-struct meson_clk_pll {
-       struct clk_hw   hw;
-       void __iomem    *base;
-       struct pll_conf *conf;
-       unsigned int    rate_count;
-       spinlock_t      *lock;
-};
 #define to_meson_clk_pll(_hw) container_of(_hw, struct meson_clk_pll, hw)
 
 static unsigned long meson_clk_pll_recalc_rate(struct clk_hw *hw,
@@ -60,22 +53,36 @@ static unsigned long meson_clk_pll_recalc_rate(struct clk_hw *hw,
        struct parm *p;
        unsigned long parent_rate_mhz = parent_rate / 1000000;
        unsigned long rate_mhz;
-       u16 n, m, od;
+       u16 n, m, frac = 0, od, od2 = 0;
        u32 reg;
 
-       p = &pll->conf->n;
+       p = &pll->n;
        reg = readl(pll->base + p->reg_off);
        n = PARM_GET(p->width, p->shift, reg);
 
-       p = &pll->conf->m;
+       p = &pll->m;
        reg = readl(pll->base + p->reg_off);
        m = PARM_GET(p->width, p->shift, reg);
 
-       p = &pll->conf->od;
+       p = &pll->od;
        reg = readl(pll->base + p->reg_off);
        od = PARM_GET(p->width, p->shift, reg);
 
-       rate_mhz = (parent_rate_mhz * m / n) >> od;
+       p = &pll->od2;
+       if (p->width) {
+               reg = readl(pll->base + p->reg_off);
+               od2 = PARM_GET(p->width, p->shift, reg);
+       }
+
+       p = &pll->frac;
+       if (p->width) {
+               reg = readl(pll->base + p->reg_off);
+               frac = PARM_GET(p->width, p->shift, reg);
+               rate_mhz = (parent_rate_mhz * m + \
+                               (parent_rate_mhz * frac >> 12)) * 2 / n;
+               rate_mhz = rate_mhz >> od >> od2;
+       } else
+               rate_mhz = (parent_rate_mhz * m / n) >> od >> od2;
 
        return rate_mhz * 1000000;
 }
@@ -84,7 +91,7 @@ static long meson_clk_pll_round_rate(struct clk_hw *hw, unsigned long rate,
                                     unsigned long *parent_rate)
 {
        struct meson_clk_pll *pll = to_meson_clk_pll(hw);
-       const struct pll_rate_table *rate_table = pll->conf->rate_table;
+       const struct pll_rate_table *rate_table = pll->rate_table;
        int i;
 
        for (i = 0; i < pll->rate_count; i++) {
@@ -99,7 +106,7 @@ static long meson_clk_pll_round_rate(struct clk_hw *hw, unsigned long rate,
 static const struct pll_rate_table *meson_clk_get_pll_settings(struct meson_clk_pll *pll,
                                                               unsigned long rate)
 {
-       const struct pll_rate_table *rate_table = pll->conf->rate_table;
+       const struct pll_rate_table *rate_table = pll->rate_table;
        int i;
 
        for (i = 0; i < pll->rate_count; i++) {
@@ -145,24 +152,38 @@ static int meson_clk_pll_set_rate(struct clk_hw *hw, unsigned long rate,
                return -EINVAL;
 
        /* PLL reset */
-       p = &pll->conf->n;
+       p = &pll->n;
        reg = readl(pll->base + p->reg_off);
        writel(reg | MESON_PLL_RESET, pll->base + p->reg_off);
 
        reg = PARM_SET(p->width, p->shift, reg, rate_set->n);
        writel(reg, pll->base + p->reg_off);
 
-       p = &pll->conf->m;
+       p = &pll->m;
        reg = readl(pll->base + p->reg_off);
        reg = PARM_SET(p->width, p->shift, reg, rate_set->m);
        writel(reg, pll->base + p->reg_off);
 
-       p = &pll->conf->od;
+       p = &pll->od;
        reg = readl(pll->base + p->reg_off);
        reg = PARM_SET(p->width, p->shift, reg, rate_set->od);
        writel(reg, pll->base + p->reg_off);
 
-       p = &pll->conf->n;
+       p = &pll->od2;
+       if (p->width) {
+               reg = readl(pll->base + p->reg_off);
+               reg = PARM_SET(p->width, p->shift, reg, rate_set->od2);
+               writel(reg, pll->base + p->reg_off);
+       }
+
+       p = &pll->frac;
+       if (p->width) {
+               reg = readl(pll->base + p->reg_off);
+               reg = PARM_SET(p->width, p->shift, reg, rate_set->frac);
+               writel(reg, pll->base + p->reg_off);
+       }
+
+       p = &pll->n;
        ret = meson_clk_pll_wait_lock(pll, p);
        if (ret) {
                pr_warn("%s: pll did not lock, trying to restore old rate %lu\n",
@@ -173,55 +194,12 @@ static int meson_clk_pll_set_rate(struct clk_hw *hw, unsigned long rate,
        return ret;
 }
 
-static const struct clk_ops meson_clk_pll_ops = {
+const struct clk_ops meson_clk_pll_ops = {
        .recalc_rate    = meson_clk_pll_recalc_rate,
        .round_rate     = meson_clk_pll_round_rate,
        .set_rate       = meson_clk_pll_set_rate,
 };
 
-static const struct clk_ops meson_clk_pll_ro_ops = {
+const struct clk_ops meson_clk_pll_ro_ops = {
        .recalc_rate    = meson_clk_pll_recalc_rate,
 };
-
-struct clk *meson_clk_register_pll(const struct clk_conf *clk_conf,
-                                  void __iomem *reg_base,
-                                  spinlock_t *lock)
-{
-       struct clk *clk;
-       struct meson_clk_pll *clk_pll;
-       struct clk_init_data init;
-
-       clk_pll = kzalloc(sizeof(*clk_pll), GFP_KERNEL);
-       if (!clk_pll)
-               return ERR_PTR(-ENOMEM);
-
-       clk_pll->base = reg_base + clk_conf->reg_off;
-       clk_pll->lock = lock;
-       clk_pll->conf = clk_conf->conf.pll;
-
-       init.name = clk_conf->clk_name;
-       init.flags = clk_conf->flags | CLK_GET_RATE_NOCACHE;
-
-       init.parent_names = &clk_conf->clks_parent[0];
-       init.num_parents = 1;
-       init.ops = &meson_clk_pll_ro_ops;
-
-       /* If no rate_table is specified we assume the PLL is read-only */
-       if (clk_pll->conf->rate_table) {
-               int len;
-
-               for (len = 0; clk_pll->conf->rate_table[len].rate != 0; )
-                       len++;
-
-                clk_pll->rate_count = len;
-                init.ops = &meson_clk_pll_ops;
-       }
-
-       clk_pll->hw.init = &init;
-
-       clk = clk_register(NULL, &clk_pll->hw);
-       if (IS_ERR(clk))
-               kfree(clk_pll);
-
-       return clk;
-}
diff --git a/drivers/clk/meson/clkc.c b/drivers/clk/meson/clkc.c
deleted file mode 100644 (file)
index d920d41..0000000
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * Copyright (c) 2015 Endless Mobile, Inc.
- * Author: Carlo Caione <carlo@endlessm.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <linux/clk-provider.h>
-#include <linux/mfd/syscon.h>
-#include <linux/slab.h>
-
-#include "clkc.h"
-
-static DEFINE_SPINLOCK(clk_lock);
-
-static struct clk **clks;
-static struct clk_onecell_data clk_data;
-
-struct clk ** __init meson_clk_init(struct device_node *np,
-                                  unsigned long nr_clks)
-{
-       clks = kcalloc(nr_clks, sizeof(*clks), GFP_KERNEL);
-       if (!clks)
-               return ERR_PTR(-ENOMEM);
-
-       clk_data.clks = clks;
-       clk_data.clk_num = nr_clks;
-       of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
-
-       return clks;
-}
-
-static void meson_clk_add_lookup(struct clk *clk, unsigned int id)
-{
-       if (clks && id)
-               clks[id] = clk;
-}
-
-static struct clk * __init
-meson_clk_register_composite(const struct clk_conf *clk_conf,
-                            void __iomem *clk_base)
-{
-       struct clk *clk;
-       struct clk_mux *mux = NULL;
-       struct clk_divider *div = NULL;
-       struct clk_gate *gate = NULL;
-       const struct clk_ops *mux_ops = NULL;
-       const struct composite_conf *composite_conf;
-
-       composite_conf = clk_conf->conf.composite;
-
-       if (clk_conf->num_parents > 1) {
-               mux = kzalloc(sizeof(*mux), GFP_KERNEL);
-               if (!mux)
-                       return ERR_PTR(-ENOMEM);
-
-               mux->reg = clk_base + clk_conf->reg_off
-                               + composite_conf->mux_parm.reg_off;
-               mux->shift = composite_conf->mux_parm.shift;
-               mux->mask = BIT(composite_conf->mux_parm.width) - 1;
-               mux->flags = composite_conf->mux_flags;
-               mux->lock = &clk_lock;
-               mux->table = composite_conf->mux_table;
-               mux_ops = (composite_conf->mux_flags & CLK_MUX_READ_ONLY) ?
-                         &clk_mux_ro_ops : &clk_mux_ops;
-       }
-
-       if (MESON_PARM_APPLICABLE(&composite_conf->div_parm)) {
-               div = kzalloc(sizeof(*div), GFP_KERNEL);
-               if (!div) {
-                       clk = ERR_PTR(-ENOMEM);
-                       goto error;
-               }
-
-               div->reg = clk_base + clk_conf->reg_off
-                               + composite_conf->div_parm.reg_off;
-               div->shift = composite_conf->div_parm.shift;
-               div->width = composite_conf->div_parm.width;
-               div->lock = &clk_lock;
-               div->flags = composite_conf->div_flags;
-               div->table = composite_conf->div_table;
-       }
-
-       if (MESON_PARM_APPLICABLE(&composite_conf->gate_parm)) {
-               gate = kzalloc(sizeof(*gate), GFP_KERNEL);
-               if (!gate) {
-                       clk = ERR_PTR(-ENOMEM);
-                       goto error;
-               }
-
-               gate->reg = clk_base + clk_conf->reg_off
-                               + composite_conf->div_parm.reg_off;
-               gate->bit_idx = composite_conf->gate_parm.shift;
-               gate->flags = composite_conf->gate_flags;
-               gate->lock = &clk_lock;
-       }
-
-       clk = clk_register_composite(NULL, clk_conf->clk_name,
-                                   clk_conf->clks_parent,
-                                   clk_conf->num_parents,
-                                   mux ? &mux->hw : NULL, mux_ops,
-                                   div ? &div->hw : NULL, &clk_divider_ops,
-                                   gate ? &gate->hw : NULL, &clk_gate_ops,
-                                   clk_conf->flags);
-       if (IS_ERR(clk))
-               goto error;
-
-       return clk;
-
-error:
-       kfree(gate);
-       kfree(div);
-       kfree(mux);
-
-       return clk;
-}
-
-static struct clk * __init
-meson_clk_register_fixed_factor(const struct clk_conf *clk_conf,
-                               void __iomem *clk_base)
-{
-       struct clk *clk;
-       const struct fixed_fact_conf *fixed_fact_conf;
-       const struct parm *p;
-       unsigned int mult, div;
-       u32 reg;
-
-       fixed_fact_conf = &clk_conf->conf.fixed_fact;
-
-       mult = clk_conf->conf.fixed_fact.mult;
-       div = clk_conf->conf.fixed_fact.div;
-
-       if (!mult) {
-               mult = 1;
-               p = &fixed_fact_conf->mult_parm;
-               if (MESON_PARM_APPLICABLE(p)) {
-                       reg = readl(clk_base + clk_conf->reg_off + p->reg_off);
-                       mult = PARM_GET(p->width, p->shift, reg);
-               }
-       }
-
-       if (!div) {
-               div = 1;
-               p = &fixed_fact_conf->div_parm;
-               if (MESON_PARM_APPLICABLE(p)) {
-                       reg = readl(clk_base + clk_conf->reg_off + p->reg_off);
-                       mult = PARM_GET(p->width, p->shift, reg);
-               }
-       }
-
-       clk = clk_register_fixed_factor(NULL,
-                       clk_conf->clk_name,
-                       clk_conf->clks_parent[0],
-                       clk_conf->flags,
-                       mult, div);
-
-       return clk;
-}
-
-static struct clk * __init
-meson_clk_register_fixed_rate(const struct clk_conf *clk_conf,
-                             void __iomem *clk_base)
-{
-       struct clk *clk;
-       const struct fixed_rate_conf *fixed_rate_conf;
-       const struct parm *r;
-       unsigned long rate;
-       u32 reg;
-
-       fixed_rate_conf = &clk_conf->conf.fixed_rate;
-       rate = fixed_rate_conf->rate;
-
-       if (!rate) {
-               r = &fixed_rate_conf->rate_parm;
-               reg = readl(clk_base + clk_conf->reg_off + r->reg_off);
-               rate = PARM_GET(r->width, r->shift, reg);
-       }
-
-       rate *= 1000000;
-
-       clk = clk_register_fixed_rate(NULL,
-                       clk_conf->clk_name,
-                       clk_conf->num_parents
-                               ? clk_conf->clks_parent[0] : NULL,
-                       clk_conf->flags, rate);
-
-       return clk;
-}
-
-void __init meson_clk_register_clks(const struct clk_conf *clk_confs,
-                                   unsigned int nr_confs,
-                                   void __iomem *clk_base)
-{
-       unsigned int i;
-       struct clk *clk = NULL;
-
-       for (i = 0; i < nr_confs; i++) {
-               const struct clk_conf *clk_conf = &clk_confs[i];
-
-               switch (clk_conf->clk_type) {
-               case CLK_FIXED_RATE:
-                       clk = meson_clk_register_fixed_rate(clk_conf,
-                                                           clk_base);
-                       break;
-               case CLK_FIXED_FACTOR:
-                       clk = meson_clk_register_fixed_factor(clk_conf,
-                                                             clk_base);
-                       break;
-               case CLK_COMPOSITE:
-                       clk = meson_clk_register_composite(clk_conf,
-                                                          clk_base);
-                       break;
-               case CLK_CPU:
-                       clk = meson_clk_register_cpu(clk_conf, clk_base,
-                                                    &clk_lock);
-                       break;
-               case CLK_PLL:
-                       clk = meson_clk_register_pll(clk_conf, clk_base,
-                                                    &clk_lock);
-                       break;
-               default:
-                       clk = NULL;
-               }
-
-               if (!clk) {
-                       pr_err("%s: unknown clock type %d\n", __func__,
-                              clk_conf->clk_type);
-                       continue;
-               }
-
-               if (IS_ERR(clk)) {
-                       pr_warn("%s: Unable to create %s clock\n", __func__,
-                               clk_conf->clk_name);
-                       continue;
-               }
-
-               meson_clk_add_lookup(clk, clk_conf->clk_id);
-       }
-}
index 609ae92cc13f16e2cc292a513ff2f5c06ee48fe4..53326c32e8532a1cef69243653281d9a665cf4c3 100644 (file)
@@ -34,19 +34,16 @@ struct parm {
        u8      shift;
        u8      width;
 };
-#define PARM(_r, _s, _w)                                               \
-       {                                                               \
-               .reg_off        = (_r),                                 \
-               .shift          = (_s),                                 \
-               .width          = (_w),                                 \
-       }                                                               \
 
 struct pll_rate_table {
        unsigned long   rate;
        u16             m;
        u16             n;
        u16             od;
+       u16             od2;
+       u16             frac;
 };
+
 #define PLL_RATE(_r, _m, _n, _od)                                      \
        {                                                               \
                .rate           = (_r),                                 \
@@ -55,133 +52,69 @@ struct pll_rate_table {
                .od             = (_od),                                \
        }                                                               \
 
-struct pll_conf {
-       const struct pll_rate_table     *rate_table;
-       struct parm                     m;
-       struct parm                     n;
-       struct parm                     od;
-};
+#define PLL_FRAC_RATE(_r, _m, _n, _od, _od2, _frac)                    \
+       {                                                               \
+               .rate           = (_r),                                 \
+               .m              = (_m),                                 \
+               .n              = (_n),                                 \
+               .od             = (_od),                                \
+               .od2            = (_od2),                               \
+               .frac           = (_frac),                              \
+       }                                                               \
 
-struct fixed_fact_conf {
-       unsigned int    div;
-       unsigned int    mult;
-       struct parm     div_parm;
-       struct parm     mult_parm;
+struct meson_clk_pll {
+       struct clk_hw hw;
+       void __iomem *base;
+       struct parm m;
+       struct parm n;
+       struct parm frac;
+       struct parm od;
+       struct parm od2;
+       const struct pll_rate_table *rate_table;
+       unsigned int rate_count;
+       spinlock_t *lock;
 };
 
-struct fixed_rate_conf {
-       unsigned long   rate;
-       struct parm     rate_parm;
-};
+#define to_meson_clk_pll(_hw) container_of(_hw, struct meson_clk_pll, hw)
 
-struct composite_conf {
-       struct parm             mux_parm;
-       struct parm             div_parm;
-       struct parm             gate_parm;
-       struct clk_div_table    *div_table;
-       u32                     *mux_table;
-       u8                      mux_flags;
-       u8                      div_flags;
-       u8                      gate_flags;
+struct meson_clk_cpu {
+       struct clk_hw hw;
+       void __iomem *base;
+       u16 reg_off;
+       struct notifier_block clk_nb;
+       const struct clk_div_table *div_table;
 };
 
-#define PNAME(x) static const char *x[]
+int meson_clk_cpu_notifier_cb(struct notifier_block *nb, unsigned long event,
+               void *data);
 
-enum clk_type {
-       CLK_FIXED_FACTOR,
-       CLK_FIXED_RATE,
-       CLK_COMPOSITE,
-       CLK_CPU,
-       CLK_PLL,
+struct meson_clk_mpll {
+       struct clk_hw hw;
+       void __iomem *base;
+       struct parm sdm;
+       struct parm n2;
+       /* FIXME ssen gate control? */
+       spinlock_t *lock;
 };
 
-struct clk_conf {
-       u16                             reg_off;
-       enum clk_type                   clk_type;
-       unsigned int                    clk_id;
-       const char                      *clk_name;
-       const char                      **clks_parent;
-       int                             num_parents;
-       unsigned long                   flags;
-       union {
-               struct fixed_fact_conf          fixed_fact;
-               struct fixed_rate_conf          fixed_rate;
-               const struct composite_conf             *composite;
-               struct pll_conf                 *pll;
-               const struct clk_div_table      *div_table;
-       } conf;
+#define MESON_GATE(_name, _reg, _bit)                                  \
+struct clk_gate gxbb_##_name = {                                               \
+       .reg = (void __iomem *) _reg,                                   \
+       .bit_idx = (_bit),                                              \
+       .lock = &clk_lock,                                              \
+       .hw.init = &(struct clk_init_data) {                            \
+               .name = #_name,                                 \
+               .ops = &clk_gate_ops,                                   \
+               .parent_names = (const char *[]){ "clk81" },            \
+               .num_parents = 1,                                       \
+               .flags = (CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED),     \
+       },                                                              \
 };
 
-#define FIXED_RATE_P(_ro, _ci, _cn, _f, _c)                            \
-       {                                                               \
-               .reg_off                        = (_ro),                \
-               .clk_type                       = CLK_FIXED_RATE,       \
-               .clk_id                         = (_ci),                \
-               .clk_name                       = (_cn),                \
-               .flags                          = (_f),                 \
-               .conf.fixed_rate.rate_parm      = _c,                   \
-       }                                                               \
-
-#define FIXED_RATE(_ci, _cn, _f, _r)                                   \
-       {                                                               \
-               .clk_type                       = CLK_FIXED_RATE,       \
-               .clk_id                         = (_ci),                \
-               .clk_name                       = (_cn),                \
-               .flags                          = (_f),                 \
-               .conf.fixed_rate.rate           = (_r),                 \
-       }                                                               \
-
-#define PLL(_ro, _ci, _cn, _cp, _f, _c)                                        \
-       {                                                               \
-               .reg_off                        = (_ro),                \
-               .clk_type                       = CLK_PLL,              \
-               .clk_id                         = (_ci),                \
-               .clk_name                       = (_cn),                \
-               .clks_parent                    = (_cp),                \
-               .num_parents                    = ARRAY_SIZE(_cp),      \
-               .flags                          = (_f),                 \
-               .conf.pll                       = (_c),                 \
-       }                                                               \
-
-#define FIXED_FACTOR_DIV(_ci, _cn, _cp, _f, _d)                                \
-       {                                                               \
-               .clk_type                       = CLK_FIXED_FACTOR,     \
-               .clk_id                         = (_ci),                \
-               .clk_name                       = (_cn),                \
-               .clks_parent                    = (_cp),                \
-               .num_parents                    = ARRAY_SIZE(_cp),      \
-               .conf.fixed_fact.div            = (_d),                 \
-       }                                                               \
-
-#define CPU(_ro, _ci, _cn, _cp, _dt)                                   \
-       {                                                               \
-               .reg_off                        = (_ro),                \
-               .clk_type                       = CLK_CPU,              \
-               .clk_id                         = (_ci),                \
-               .clk_name                       = (_cn),                \
-               .clks_parent                    = (_cp),                \
-               .num_parents                    = ARRAY_SIZE(_cp),      \
-               .conf.div_table                 = (_dt),                \
-       }                                                               \
-
-#define COMPOSITE(_ro, _ci, _cn, _cp, _f, _c)                          \
-       {                                                               \
-               .reg_off                        = (_ro),                \
-               .clk_type                       = CLK_COMPOSITE,        \
-               .clk_id                         = (_ci),                \
-               .clk_name                       = (_cn),                \
-               .clks_parent                    = (_cp),                \
-               .num_parents                    = ARRAY_SIZE(_cp),      \
-               .flags                          = (_f),                 \
-               .conf.composite                 = (_c),                 \
-       }                                                               \
-
-struct clk **meson_clk_init(struct device_node *np, unsigned long nr_clks);
-void meson_clk_register_clks(const struct clk_conf *clk_confs,
-                            unsigned int nr_confs, void __iomem *clk_base);
-struct clk *meson_clk_register_cpu(const struct clk_conf *clk_conf,
-                                  void __iomem *reg_base, spinlock_t *lock);
-struct clk *meson_clk_register_pll(const struct clk_conf *clk_conf,
-                                  void __iomem *reg_base, spinlock_t *lock);
+/* clk_ops */
+extern const struct clk_ops meson_clk_pll_ro_ops;
+extern const struct clk_ops meson_clk_pll_ops;
+extern const struct clk_ops meson_clk_cpu_ops;
+extern const struct clk_ops meson_clk_mpll_ro_ops;
 
 #endif /* __CLKC_H */
diff --git a/drivers/clk/meson/gxbb.c b/drivers/clk/meson/gxbb.c
new file mode 100644 (file)
index 0000000..007b715
--- /dev/null
@@ -0,0 +1,954 @@
+/*
+ * Copyright (c) 2016 AmLogic, Inc.
+ * Michael Turquette <mturquette@baylibre.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/module.h>
+
+#include "clkc.h"
+#include "gxbb.h"
+
+static DEFINE_SPINLOCK(clk_lock);
+
+static const struct pll_rate_table sys_pll_rate_table[] = {
+       PLL_RATE(24000000, 56, 1, 2),
+       PLL_RATE(48000000, 64, 1, 2),
+       PLL_RATE(72000000, 72, 1, 2),
+       PLL_RATE(96000000, 64, 1, 2),
+       PLL_RATE(120000000, 80, 1, 2),
+       PLL_RATE(144000000, 96, 1, 2),
+       PLL_RATE(168000000, 56, 1, 1),
+       PLL_RATE(192000000, 64, 1, 1),
+       PLL_RATE(216000000, 72, 1, 1),
+       PLL_RATE(240000000, 80, 1, 1),
+       PLL_RATE(264000000, 88, 1, 1),
+       PLL_RATE(288000000, 96, 1, 1),
+       PLL_RATE(312000000, 52, 1, 2),
+       PLL_RATE(336000000, 56, 1, 2),
+       PLL_RATE(360000000, 60, 1, 2),
+       PLL_RATE(384000000, 64, 1, 2),
+       PLL_RATE(408000000, 68, 1, 2),
+       PLL_RATE(432000000, 72, 1, 2),
+       PLL_RATE(456000000, 76, 1, 2),
+       PLL_RATE(480000000, 80, 1, 2),
+       PLL_RATE(504000000, 84, 1, 2),
+       PLL_RATE(528000000, 88, 1, 2),
+       PLL_RATE(552000000, 92, 1, 2),
+       PLL_RATE(576000000, 96, 1, 2),
+       PLL_RATE(600000000, 50, 1, 1),
+       PLL_RATE(624000000, 52, 1, 1),
+       PLL_RATE(648000000, 54, 1, 1),
+       PLL_RATE(672000000, 56, 1, 1),
+       PLL_RATE(696000000, 58, 1, 1),
+       PLL_RATE(720000000, 60, 1, 1),
+       PLL_RATE(744000000, 62, 1, 1),
+       PLL_RATE(768000000, 64, 1, 1),
+       PLL_RATE(792000000, 66, 1, 1),
+       PLL_RATE(816000000, 68, 1, 1),
+       PLL_RATE(840000000, 70, 1, 1),
+       PLL_RATE(864000000, 72, 1, 1),
+       PLL_RATE(888000000, 74, 1, 1),
+       PLL_RATE(912000000, 76, 1, 1),
+       PLL_RATE(936000000, 78, 1, 1),
+       PLL_RATE(960000000, 80, 1, 1),
+       PLL_RATE(984000000, 82, 1, 1),
+       PLL_RATE(1008000000, 84, 1, 1),
+       PLL_RATE(1032000000, 86, 1, 1),
+       PLL_RATE(1056000000, 88, 1, 1),
+       PLL_RATE(1080000000, 90, 1, 1),
+       PLL_RATE(1104000000, 92, 1, 1),
+       PLL_RATE(1128000000, 94, 1, 1),
+       PLL_RATE(1152000000, 96, 1, 1),
+       PLL_RATE(1176000000, 98, 1, 1),
+       PLL_RATE(1200000000, 50, 1, 0),
+       PLL_RATE(1224000000, 51, 1, 0),
+       PLL_RATE(1248000000, 52, 1, 0),
+       PLL_RATE(1272000000, 53, 1, 0),
+       PLL_RATE(1296000000, 54, 1, 0),
+       PLL_RATE(1320000000, 55, 1, 0),
+       PLL_RATE(1344000000, 56, 1, 0),
+       PLL_RATE(1368000000, 57, 1, 0),
+       PLL_RATE(1392000000, 58, 1, 0),
+       PLL_RATE(1416000000, 59, 1, 0),
+       PLL_RATE(1440000000, 60, 1, 0),
+       PLL_RATE(1464000000, 61, 1, 0),
+       PLL_RATE(1488000000, 62, 1, 0),
+       PLL_RATE(1512000000, 63, 1, 0),
+       PLL_RATE(1536000000, 64, 1, 0),
+       PLL_RATE(1560000000, 65, 1, 0),
+       PLL_RATE(1584000000, 66, 1, 0),
+       PLL_RATE(1608000000, 67, 1, 0),
+       PLL_RATE(1632000000, 68, 1, 0),
+       PLL_RATE(1656000000, 68, 1, 0),
+       PLL_RATE(1680000000, 68, 1, 0),
+       PLL_RATE(1704000000, 68, 1, 0),
+       PLL_RATE(1728000000, 69, 1, 0),
+       PLL_RATE(1752000000, 69, 1, 0),
+       PLL_RATE(1776000000, 69, 1, 0),
+       PLL_RATE(1800000000, 69, 1, 0),
+       PLL_RATE(1824000000, 70, 1, 0),
+       PLL_RATE(1848000000, 70, 1, 0),
+       PLL_RATE(1872000000, 70, 1, 0),
+       PLL_RATE(1896000000, 70, 1, 0),
+       PLL_RATE(1920000000, 71, 1, 0),
+       PLL_RATE(1944000000, 71, 1, 0),
+       PLL_RATE(1968000000, 71, 1, 0),
+       PLL_RATE(1992000000, 71, 1, 0),
+       PLL_RATE(2016000000, 72, 1, 0),
+       PLL_RATE(2040000000, 72, 1, 0),
+       PLL_RATE(2064000000, 72, 1, 0),
+       PLL_RATE(2088000000, 72, 1, 0),
+       PLL_RATE(2112000000, 73, 1, 0),
+       { /* sentinel */ },
+};
+
+static const struct pll_rate_table gp0_pll_rate_table[] = {
+       PLL_RATE(96000000, 32, 1, 3),
+       PLL_RATE(99000000, 33, 1, 3),
+       PLL_RATE(102000000, 34, 1, 3),
+       PLL_RATE(105000000, 35, 1, 3),
+       PLL_RATE(108000000, 36, 1, 3),
+       PLL_RATE(111000000, 37, 1, 3),
+       PLL_RATE(114000000, 38, 1, 3),
+       PLL_RATE(117000000, 39, 1, 3),
+       PLL_RATE(120000000, 40, 1, 3),
+       PLL_RATE(123000000, 41, 1, 3),
+       PLL_RATE(126000000, 42, 1, 3),
+       PLL_RATE(129000000, 43, 1, 3),
+       PLL_RATE(132000000, 44, 1, 3),
+       PLL_RATE(135000000, 45, 1, 3),
+       PLL_RATE(138000000, 46, 1, 3),
+       PLL_RATE(141000000, 47, 1, 3),
+       PLL_RATE(144000000, 48, 1, 3),
+       PLL_RATE(147000000, 49, 1, 3),
+       PLL_RATE(150000000, 50, 1, 3),
+       PLL_RATE(153000000, 51, 1, 3),
+       PLL_RATE(156000000, 52, 1, 3),
+       PLL_RATE(159000000, 53, 1, 3),
+       PLL_RATE(162000000, 54, 1, 3),
+       PLL_RATE(165000000, 55, 1, 3),
+       PLL_RATE(168000000, 56, 1, 3),
+       PLL_RATE(171000000, 57, 1, 3),
+       PLL_RATE(174000000, 58, 1, 3),
+       PLL_RATE(177000000, 59, 1, 3),
+       PLL_RATE(180000000, 60, 1, 3),
+       PLL_RATE(183000000, 61, 1, 3),
+       PLL_RATE(186000000, 62, 1, 3),
+       PLL_RATE(192000000, 32, 1, 2),
+       PLL_RATE(198000000, 33, 1, 2),
+       PLL_RATE(204000000, 34, 1, 2),
+       PLL_RATE(210000000, 35, 1, 2),
+       PLL_RATE(216000000, 36, 1, 2),
+       PLL_RATE(222000000, 37, 1, 2),
+       PLL_RATE(228000000, 38, 1, 2),
+       PLL_RATE(234000000, 39, 1, 2),
+       PLL_RATE(240000000, 40, 1, 2),
+       PLL_RATE(246000000, 41, 1, 2),
+       PLL_RATE(252000000, 42, 1, 2),
+       PLL_RATE(258000000, 43, 1, 2),
+       PLL_RATE(264000000, 44, 1, 2),
+       PLL_RATE(270000000, 45, 1, 2),
+       PLL_RATE(276000000, 46, 1, 2),
+       PLL_RATE(282000000, 47, 1, 2),
+       PLL_RATE(288000000, 48, 1, 2),
+       PLL_RATE(294000000, 49, 1, 2),
+       PLL_RATE(300000000, 50, 1, 2),
+       PLL_RATE(306000000, 51, 1, 2),
+       PLL_RATE(312000000, 52, 1, 2),
+       PLL_RATE(318000000, 53, 1, 2),
+       PLL_RATE(324000000, 54, 1, 2),
+       PLL_RATE(330000000, 55, 1, 2),
+       PLL_RATE(336000000, 56, 1, 2),
+       PLL_RATE(342000000, 57, 1, 2),
+       PLL_RATE(348000000, 58, 1, 2),
+       PLL_RATE(354000000, 59, 1, 2),
+       PLL_RATE(360000000, 60, 1, 2),
+       PLL_RATE(366000000, 61, 1, 2),
+       PLL_RATE(372000000, 62, 1, 2),
+       PLL_RATE(384000000, 32, 1, 1),
+       PLL_RATE(396000000, 33, 1, 1),
+       PLL_RATE(408000000, 34, 1, 1),
+       PLL_RATE(420000000, 35, 1, 1),
+       PLL_RATE(432000000, 36, 1, 1),
+       PLL_RATE(444000000, 37, 1, 1),
+       PLL_RATE(456000000, 38, 1, 1),
+       PLL_RATE(468000000, 39, 1, 1),
+       PLL_RATE(480000000, 40, 1, 1),
+       PLL_RATE(492000000, 41, 1, 1),
+       PLL_RATE(504000000, 42, 1, 1),
+       PLL_RATE(516000000, 43, 1, 1),
+       PLL_RATE(528000000, 44, 1, 1),
+       PLL_RATE(540000000, 45, 1, 1),
+       PLL_RATE(552000000, 46, 1, 1),
+       PLL_RATE(564000000, 47, 1, 1),
+       PLL_RATE(576000000, 48, 1, 1),
+       PLL_RATE(588000000, 49, 1, 1),
+       PLL_RATE(600000000, 50, 1, 1),
+       PLL_RATE(612000000, 51, 1, 1),
+       PLL_RATE(624000000, 52, 1, 1),
+       PLL_RATE(636000000, 53, 1, 1),
+       PLL_RATE(648000000, 54, 1, 1),
+       PLL_RATE(660000000, 55, 1, 1),
+       PLL_RATE(672000000, 56, 1, 1),
+       PLL_RATE(684000000, 57, 1, 1),
+       PLL_RATE(696000000, 58, 1, 1),
+       PLL_RATE(708000000, 59, 1, 1),
+       PLL_RATE(720000000, 60, 1, 1),
+       PLL_RATE(732000000, 61, 1, 1),
+       PLL_RATE(744000000, 62, 1, 1),
+       PLL_RATE(768000000, 32, 1, 0),
+       PLL_RATE(792000000, 33, 1, 0),
+       PLL_RATE(816000000, 34, 1, 0),
+       PLL_RATE(840000000, 35, 1, 0),
+       PLL_RATE(864000000, 36, 1, 0),
+       PLL_RATE(888000000, 37, 1, 0),
+       PLL_RATE(912000000, 38, 1, 0),
+       PLL_RATE(936000000, 39, 1, 0),
+       PLL_RATE(960000000, 40, 1, 0),
+       PLL_RATE(984000000, 41, 1, 0),
+       PLL_RATE(1008000000, 42, 1, 0),
+       PLL_RATE(1032000000, 43, 1, 0),
+       PLL_RATE(1056000000, 44, 1, 0),
+       PLL_RATE(1080000000, 45, 1, 0),
+       PLL_RATE(1104000000, 46, 1, 0),
+       PLL_RATE(1128000000, 47, 1, 0),
+       PLL_RATE(1152000000, 48, 1, 0),
+       PLL_RATE(1176000000, 49, 1, 0),
+       PLL_RATE(1200000000, 50, 1, 0),
+       PLL_RATE(1224000000, 51, 1, 0),
+       PLL_RATE(1248000000, 52, 1, 0),
+       PLL_RATE(1272000000, 53, 1, 0),
+       PLL_RATE(1296000000, 54, 1, 0),
+       PLL_RATE(1320000000, 55, 1, 0),
+       PLL_RATE(1344000000, 56, 1, 0),
+       PLL_RATE(1368000000, 57, 1, 0),
+       PLL_RATE(1392000000, 58, 1, 0),
+       PLL_RATE(1416000000, 59, 1, 0),
+       PLL_RATE(1440000000, 60, 1, 0),
+       PLL_RATE(1464000000, 61, 1, 0),
+       PLL_RATE(1488000000, 62, 1, 0),
+       { /* sentinel */ },
+};
+
+static const struct clk_div_table cpu_div_table[] = {
+       { .val = 1, .div = 1 },
+       { .val = 2, .div = 2 },
+       { .val = 3, .div = 3 },
+       { .val = 2, .div = 4 },
+       { .val = 3, .div = 6 },
+       { .val = 4, .div = 8 },
+       { .val = 5, .div = 10 },
+       { .val = 6, .div = 12 },
+       { .val = 7, .div = 14 },
+       { .val = 8, .div = 16 },
+       { /* sentinel */ },
+};
+
+static struct meson_clk_pll gxbb_fixed_pll = {
+       .m = {
+               .reg_off = HHI_MPLL_CNTL,
+               .shift   = 0,
+               .width   = 9,
+       },
+       .n = {
+               .reg_off = HHI_MPLL_CNTL,
+               .shift   = 9,
+               .width   = 5,
+       },
+       .od = {
+               .reg_off = HHI_MPLL_CNTL,
+               .shift   = 16,
+               .width   = 2,
+       },
+       .lock = &clk_lock,
+       .hw.init = &(struct clk_init_data){
+               .name = "fixed_pll",
+               .ops = &meson_clk_pll_ro_ops,
+               .parent_names = (const char *[]){ "xtal" },
+               .num_parents = 1,
+               .flags = CLK_GET_RATE_NOCACHE,
+       },
+};
+
+static struct meson_clk_pll gxbb_hdmi_pll = {
+       .m = {
+               .reg_off = HHI_HDMI_PLL_CNTL,
+               .shift   = 0,
+               .width   = 9,
+       },
+       .n = {
+               .reg_off = HHI_HDMI_PLL_CNTL,
+               .shift   = 9,
+               .width   = 5,
+       },
+       .frac = {
+               .reg_off = HHI_HDMI_PLL_CNTL2,
+               .shift   = 0,
+               .width   = 12,
+       },
+       .od = {
+               .reg_off = HHI_HDMI_PLL_CNTL2,
+               .shift   = 16,
+               .width   = 2,
+       },
+       .od2 = {
+               .reg_off = HHI_HDMI_PLL_CNTL2,
+               .shift   = 22,
+               .width   = 2,
+       },
+       .lock = &clk_lock,
+       .hw.init = &(struct clk_init_data){
+               .name = "hdmi_pll",
+               .ops = &meson_clk_pll_ro_ops,
+               .parent_names = (const char *[]){ "xtal" },
+               .num_parents = 1,
+               .flags = CLK_GET_RATE_NOCACHE,
+       },
+};
+
+static struct meson_clk_pll gxbb_sys_pll = {
+       .m = {
+               .reg_off = HHI_SYS_PLL_CNTL,
+               .shift   = 0,
+               .width   = 9,
+       },
+       .n = {
+               .reg_off = HHI_SYS_PLL_CNTL,
+               .shift   = 9,
+               .width   = 5,
+       },
+       .od = {
+               .reg_off = HHI_SYS_PLL_CNTL,
+               .shift   = 10,
+               .width   = 2,
+       },
+       .rate_table = sys_pll_rate_table,
+       .rate_count = ARRAY_SIZE(sys_pll_rate_table),
+       .lock = &clk_lock,
+       .hw.init = &(struct clk_init_data){
+               .name = "sys_pll",
+               .ops = &meson_clk_pll_ro_ops,
+               .parent_names = (const char *[]){ "xtal" },
+               .num_parents = 1,
+               .flags = CLK_GET_RATE_NOCACHE,
+       },
+};
+
+static struct meson_clk_pll gxbb_gp0_pll = {
+       .m = {
+               .reg_off = HHI_GP0_PLL_CNTL,
+               .shift   = 0,
+               .width   = 9,
+       },
+       .n = {
+               .reg_off = HHI_GP0_PLL_CNTL,
+               .shift   = 9,
+               .width   = 5,
+       },
+       .od = {
+               .reg_off = HHI_GP0_PLL_CNTL,
+               .shift   = 16,
+               .width   = 2,
+       },
+       .rate_table = gp0_pll_rate_table,
+       .rate_count = ARRAY_SIZE(gp0_pll_rate_table),
+       .lock = &clk_lock,
+       .hw.init = &(struct clk_init_data){
+               .name = "gp0_pll",
+               .ops = &meson_clk_pll_ops,
+               .parent_names = (const char *[]){ "xtal" },
+               .num_parents = 1,
+               .flags = CLK_GET_RATE_NOCACHE,
+       },
+};
+
+static struct clk_fixed_factor gxbb_fclk_div2 = {
+       .mult = 1,
+       .div = 2,
+       .hw.init = &(struct clk_init_data){
+               .name = "fclk_div2",
+               .ops = &clk_fixed_factor_ops,
+               .parent_names = (const char *[]){ "fixed_pll" },
+               .num_parents = 1,
+       },
+};
+
+static struct clk_fixed_factor gxbb_fclk_div3 = {
+       .mult = 1,
+       .div = 3,
+       .hw.init = &(struct clk_init_data){
+               .name = "fclk_div3",
+               .ops = &clk_fixed_factor_ops,
+               .parent_names = (const char *[]){ "fixed_pll" },
+               .num_parents = 1,
+       },
+};
+
+static struct clk_fixed_factor gxbb_fclk_div4 = {
+       .mult = 1,
+       .div = 4,
+       .hw.init = &(struct clk_init_data){
+               .name = "fclk_div4",
+               .ops = &clk_fixed_factor_ops,
+               .parent_names = (const char *[]){ "fixed_pll" },
+               .num_parents = 1,
+       },
+};
+
+static struct clk_fixed_factor gxbb_fclk_div5 = {
+       .mult = 1,
+       .div = 5,
+       .hw.init = &(struct clk_init_data){
+               .name = "fclk_div5",
+               .ops = &clk_fixed_factor_ops,
+               .parent_names = (const char *[]){ "fixed_pll" },
+               .num_parents = 1,
+       },
+};
+
+static struct clk_fixed_factor gxbb_fclk_div7 = {
+       .mult = 1,
+       .div = 7,
+       .hw.init = &(struct clk_init_data){
+               .name = "fclk_div7",
+               .ops = &clk_fixed_factor_ops,
+               .parent_names = (const char *[]){ "fixed_pll" },
+               .num_parents = 1,
+       },
+};
+
+static struct meson_clk_mpll gxbb_mpll0 = {
+       .sdm = {
+               .reg_off = HHI_MPLL_CNTL7,
+               .shift   = 0,
+               .width   = 14,
+       },
+       .n2 = {
+               .reg_off = HHI_MPLL_CNTL7,
+               .shift   = 16,
+               .width   = 9,
+       },
+       .lock = &clk_lock,
+       .hw.init = &(struct clk_init_data){
+               .name = "mpll0",
+               .ops = &meson_clk_mpll_ro_ops,
+               .parent_names = (const char *[]){ "fixed_pll" },
+               .num_parents = 1,
+       },
+};
+
+static struct meson_clk_mpll gxbb_mpll1 = {
+       .sdm = {
+               .reg_off = HHI_MPLL_CNTL8,
+               .shift   = 0,
+               .width   = 14,
+       },
+       .n2 = {
+               .reg_off = HHI_MPLL_CNTL8,
+               .shift   = 16,
+               .width   = 9,
+       },
+       .lock = &clk_lock,
+       .hw.init = &(struct clk_init_data){
+               .name = "mpll1",
+               .ops = &meson_clk_mpll_ro_ops,
+               .parent_names = (const char *[]){ "fixed_pll" },
+               .num_parents = 1,
+       },
+};
+
+static struct meson_clk_mpll gxbb_mpll2 = {
+       .sdm = {
+               .reg_off = HHI_MPLL_CNTL9,
+               .shift   = 0,
+               .width   = 14,
+       },
+       .n2 = {
+               .reg_off = HHI_MPLL_CNTL9,
+               .shift   = 16,
+               .width   = 9,
+       },
+       .lock = &clk_lock,
+       .hw.init = &(struct clk_init_data){
+               .name = "mpll2",
+               .ops = &meson_clk_mpll_ro_ops,
+               .parent_names = (const char *[]){ "fixed_pll" },
+               .num_parents = 1,
+       },
+};
+
+/*
+ * FIXME cpu clocks and the legacy composite clocks (e.g. clk81) are both PLL
+ * post-dividers and should be modeled with their respective PLLs via the
+ * forthcoming coordinated clock rates feature
+ */
+static struct meson_clk_cpu gxbb_cpu_clk = {
+       .reg_off = HHI_SYS_CPU_CLK_CNTL1,
+       .div_table = cpu_div_table,
+       .clk_nb.notifier_call = meson_clk_cpu_notifier_cb,
+       .hw.init = &(struct clk_init_data){
+               .name = "cpu_clk",
+               .ops = &meson_clk_cpu_ops,
+               .parent_names = (const char *[]){ "sys_pll" },
+               .num_parents = 1,
+       },
+};
+
+static u32 mux_table_clk81[]   = { 6, 5, 7 };
+
+static struct clk_mux gxbb_mpeg_clk_sel = {
+       .reg = (void *)HHI_MPEG_CLK_CNTL,
+       .mask = 0x7,
+       .shift = 12,
+       .flags = CLK_MUX_READ_ONLY,
+       .table = mux_table_clk81,
+       .lock = &clk_lock,
+       .hw.init = &(struct clk_init_data){
+               .name = "mpeg_clk_sel",
+               .ops = &clk_mux_ro_ops,
+               /*
+                * FIXME bits 14:12 selects from 8 possible parents:
+                * xtal, 1'b0 (wtf), fclk_div7, mpll_clkout1, mpll_clkout2,
+                * fclk_div4, fclk_div3, fclk_div5
+                */
+               .parent_names = (const char *[]){ "fclk_div3", "fclk_div4",
+                       "fclk_div5" },
+               .num_parents = 3,
+               .flags = (CLK_SET_RATE_NO_REPARENT | CLK_IGNORE_UNUSED),
+       },
+};
+
+static struct clk_divider gxbb_mpeg_clk_div = {
+       .reg = (void *)HHI_MPEG_CLK_CNTL,
+       .shift = 0,
+       .width = 7,
+       .lock = &clk_lock,
+       .hw.init = &(struct clk_init_data){
+               .name = "mpeg_clk_div",
+               .ops = &clk_divider_ops,
+               .parent_names = (const char *[]){ "mpeg_clk_sel" },
+               .num_parents = 1,
+               .flags = (CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED),
+       },
+};
+
+/* the mother of dragons^W gates */
+static struct clk_gate gxbb_clk81 = {
+       .reg = (void *)HHI_MPEG_CLK_CNTL,
+       .bit_idx = 7,
+       .lock = &clk_lock,
+       .hw.init = &(struct clk_init_data){
+               .name = "clk81",
+               .ops = &clk_gate_ops,
+               .parent_names = (const char *[]){ "mpeg_clk_div" },
+               .num_parents = 1,
+               .flags = (CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED | CLK_IS_CRITICAL),
+       },
+};
+
+/* Everything Else (EE) domain gates */
+static MESON_GATE(ddr, HHI_GCLK_MPEG0, 0);
+static MESON_GATE(dos, HHI_GCLK_MPEG0, 1);
+static MESON_GATE(isa, HHI_GCLK_MPEG0, 5);
+static MESON_GATE(pl301, HHI_GCLK_MPEG0, 6);
+static MESON_GATE(periphs, HHI_GCLK_MPEG0, 7);
+static MESON_GATE(spicc, HHI_GCLK_MPEG0, 8);
+static MESON_GATE(i2c, HHI_GCLK_MPEG0, 9);
+static MESON_GATE(sar_adc, HHI_GCLK_MPEG0, 10);
+static MESON_GATE(smart_card, HHI_GCLK_MPEG0, 11);
+static MESON_GATE(rng0, HHI_GCLK_MPEG0, 12);
+static MESON_GATE(uart0, HHI_GCLK_MPEG0, 13);
+static MESON_GATE(sdhc, HHI_GCLK_MPEG0, 14);
+static MESON_GATE(stream, HHI_GCLK_MPEG0, 15);
+static MESON_GATE(async_fifo, HHI_GCLK_MPEG0, 16);
+static MESON_GATE(sdio, HHI_GCLK_MPEG0, 17);
+static MESON_GATE(abuf, HHI_GCLK_MPEG0, 18);
+static MESON_GATE(hiu_iface, HHI_GCLK_MPEG0, 19);
+static MESON_GATE(assist_misc, HHI_GCLK_MPEG0, 23);
+static MESON_GATE(spi, HHI_GCLK_MPEG0, 30);
+
+static MESON_GATE(i2s_spdif, HHI_GCLK_MPEG1, 2);
+static MESON_GATE(eth, HHI_GCLK_MPEG1, 3);
+static MESON_GATE(demux, HHI_GCLK_MPEG1, 4);
+static MESON_GATE(aiu_glue, HHI_GCLK_MPEG1, 6);
+static MESON_GATE(iec958, HHI_GCLK_MPEG1, 7);
+static MESON_GATE(i2s_out, HHI_GCLK_MPEG1, 8);
+static MESON_GATE(amclk, HHI_GCLK_MPEG1, 9);
+static MESON_GATE(aififo2, HHI_GCLK_MPEG1, 10);
+static MESON_GATE(mixer, HHI_GCLK_MPEG1, 11);
+static MESON_GATE(mixer_iface, HHI_GCLK_MPEG1, 12);
+static MESON_GATE(adc, HHI_GCLK_MPEG1, 13);
+static MESON_GATE(blkmv, HHI_GCLK_MPEG1, 14);
+static MESON_GATE(aiu, HHI_GCLK_MPEG1, 15);
+static MESON_GATE(uart1, HHI_GCLK_MPEG1, 16);
+static MESON_GATE(g2d, HHI_GCLK_MPEG1, 20);
+static MESON_GATE(usb0, HHI_GCLK_MPEG1, 21);
+static MESON_GATE(usb1, HHI_GCLK_MPEG1, 22);
+static MESON_GATE(reset, HHI_GCLK_MPEG1, 23);
+static MESON_GATE(nand, HHI_GCLK_MPEG1, 24);
+static MESON_GATE(dos_parser, HHI_GCLK_MPEG1, 25);
+static MESON_GATE(usb, HHI_GCLK_MPEG1, 26);
+static MESON_GATE(vdin1, HHI_GCLK_MPEG1, 28);
+static MESON_GATE(ahb_arb0, HHI_GCLK_MPEG1, 29);
+static MESON_GATE(efuse, HHI_GCLK_MPEG1, 30);
+static MESON_GATE(boot_rom, HHI_GCLK_MPEG1, 31);
+
+static MESON_GATE(ahb_data_bus, HHI_GCLK_MPEG2, 1);
+static MESON_GATE(ahb_ctrl_bus, HHI_GCLK_MPEG2, 2);
+static MESON_GATE(hdmi_intr_sync, HHI_GCLK_MPEG2, 3);
+static MESON_GATE(hdmi_pclk, HHI_GCLK_MPEG2, 4);
+static MESON_GATE(usb1_ddr_bridge, HHI_GCLK_MPEG2, 8);
+static MESON_GATE(usb0_ddr_bridge, HHI_GCLK_MPEG2, 9);
+static MESON_GATE(mmc_pclk, HHI_GCLK_MPEG2, 11);
+static MESON_GATE(dvin, HHI_GCLK_MPEG2, 12);
+static MESON_GATE(uart2, HHI_GCLK_MPEG2, 15);
+static MESON_GATE(sana, HHI_GCLK_MPEG2, 22);
+static MESON_GATE(vpu_intr, HHI_GCLK_MPEG2, 25);
+static MESON_GATE(sec_ahb_ahb3_bridge, HHI_GCLK_MPEG2, 26);
+static MESON_GATE(clk81_a53, HHI_GCLK_MPEG2, 29);
+
+static MESON_GATE(vclk2_venci0, HHI_GCLK_OTHER, 1);
+static MESON_GATE(vclk2_venci1, HHI_GCLK_OTHER, 2);
+static MESON_GATE(vclk2_vencp0, HHI_GCLK_OTHER, 3);
+static MESON_GATE(vclk2_vencp1, HHI_GCLK_OTHER, 4);
+static MESON_GATE(gclk_venci_int0, HHI_GCLK_OTHER, 8);
+static MESON_GATE(gclk_vencp_int, HHI_GCLK_OTHER, 9);
+static MESON_GATE(dac_clk, HHI_GCLK_OTHER, 10);
+static MESON_GATE(aoclk_gate, HHI_GCLK_OTHER, 14);
+static MESON_GATE(iec958_gate, HHI_GCLK_OTHER, 16);
+static MESON_GATE(enc480p, HHI_GCLK_OTHER, 20);
+static MESON_GATE(rng1, HHI_GCLK_OTHER, 21);
+static MESON_GATE(gclk_venci_int1, HHI_GCLK_OTHER, 22);
+static MESON_GATE(vclk2_venclmcc, HHI_GCLK_OTHER, 24);
+static MESON_GATE(vclk2_vencl, HHI_GCLK_OTHER, 25);
+static MESON_GATE(vclk_other, HHI_GCLK_OTHER, 26);
+static MESON_GATE(edp, HHI_GCLK_OTHER, 31);
+
+/* Always On (AO) domain gates */
+
+static MESON_GATE(ao_media_cpu, HHI_GCLK_AO, 0);
+static MESON_GATE(ao_ahb_sram, HHI_GCLK_AO, 1);
+static MESON_GATE(ao_ahb_bus, HHI_GCLK_AO, 2);
+static MESON_GATE(ao_iface, HHI_GCLK_AO, 3);
+static MESON_GATE(ao_i2c, HHI_GCLK_AO, 4);
+
+/* Array of all clocks provided by this provider */
+
+static struct clk_hw_onecell_data gxbb_hw_onecell_data = {
+       .hws = {
+               [CLKID_SYS_PLL]             = &gxbb_sys_pll.hw,
+               [CLKID_CPUCLK]              = &gxbb_cpu_clk.hw,
+               [CLKID_HDMI_PLL]            = &gxbb_hdmi_pll.hw,
+               [CLKID_FIXED_PLL]           = &gxbb_fixed_pll.hw,
+               [CLKID_FCLK_DIV2]           = &gxbb_fclk_div2.hw,
+               [CLKID_FCLK_DIV3]           = &gxbb_fclk_div3.hw,
+               [CLKID_FCLK_DIV4]           = &gxbb_fclk_div4.hw,
+               [CLKID_FCLK_DIV5]           = &gxbb_fclk_div5.hw,
+               [CLKID_FCLK_DIV7]           = &gxbb_fclk_div7.hw,
+               [CLKID_GP0_PLL]             = &gxbb_gp0_pll.hw,
+               [CLKID_MPEG_SEL]            = &gxbb_mpeg_clk_sel.hw,
+               [CLKID_MPEG_DIV]            = &gxbb_mpeg_clk_div.hw,
+               [CLKID_CLK81]               = &gxbb_clk81.hw,
+               [CLKID_MPLL0]               = &gxbb_mpll0.hw,
+               [CLKID_MPLL1]               = &gxbb_mpll1.hw,
+               [CLKID_MPLL2]               = &gxbb_mpll2.hw,
+               [CLKID_DDR]                 = &gxbb_ddr.hw,
+               [CLKID_DOS]                 = &gxbb_dos.hw,
+               [CLKID_ISA]                 = &gxbb_isa.hw,
+               [CLKID_PL301]               = &gxbb_pl301.hw,
+               [CLKID_PERIPHS]             = &gxbb_periphs.hw,
+               [CLKID_SPICC]               = &gxbb_spicc.hw,
+               [CLKID_I2C]                 = &gxbb_i2c.hw,
+               [CLKID_SAR_ADC]             = &gxbb_sar_adc.hw,
+               [CLKID_SMART_CARD]          = &gxbb_smart_card.hw,
+               [CLKID_RNG0]                = &gxbb_rng0.hw,
+               [CLKID_UART0]               = &gxbb_uart0.hw,
+               [CLKID_SDHC]                = &gxbb_sdhc.hw,
+               [CLKID_STREAM]              = &gxbb_stream.hw,
+               [CLKID_ASYNC_FIFO]          = &gxbb_async_fifo.hw,
+               [CLKID_SDIO]                = &gxbb_sdio.hw,
+               [CLKID_ABUF]                = &gxbb_abuf.hw,
+               [CLKID_HIU_IFACE]           = &gxbb_hiu_iface.hw,
+               [CLKID_ASSIST_MISC]         = &gxbb_assist_misc.hw,
+               [CLKID_SPI]                 = &gxbb_spi.hw,
+               [CLKID_I2S_SPDIF]           = &gxbb_i2s_spdif.hw,
+               [CLKID_ETH]                 = &gxbb_eth.hw,
+               [CLKID_DEMUX]               = &gxbb_demux.hw,
+               [CLKID_AIU_GLUE]            = &gxbb_aiu_glue.hw,
+               [CLKID_IEC958]              = &gxbb_iec958.hw,
+               [CLKID_I2S_OUT]             = &gxbb_i2s_out.hw,
+               [CLKID_AMCLK]               = &gxbb_amclk.hw,
+               [CLKID_AIFIFO2]             = &gxbb_aififo2.hw,
+               [CLKID_MIXER]               = &gxbb_mixer.hw,
+               [CLKID_MIXER_IFACE]         = &gxbb_mixer_iface.hw,
+               [CLKID_ADC]                 = &gxbb_adc.hw,
+               [CLKID_BLKMV]               = &gxbb_blkmv.hw,
+               [CLKID_AIU]                 = &gxbb_aiu.hw,
+               [CLKID_UART1]               = &gxbb_uart1.hw,
+               [CLKID_G2D]                 = &gxbb_g2d.hw,
+               [CLKID_USB0]                = &gxbb_usb0.hw,
+               [CLKID_USB1]                = &gxbb_usb1.hw,
+               [CLKID_RESET]               = &gxbb_reset.hw,
+               [CLKID_NAND]                = &gxbb_nand.hw,
+               [CLKID_DOS_PARSER]          = &gxbb_dos_parser.hw,
+               [CLKID_USB]                 = &gxbb_usb.hw,
+               [CLKID_VDIN1]               = &gxbb_vdin1.hw,
+               [CLKID_AHB_ARB0]            = &gxbb_ahb_arb0.hw,
+               [CLKID_EFUSE]               = &gxbb_efuse.hw,
+               [CLKID_BOOT_ROM]            = &gxbb_boot_rom.hw,
+               [CLKID_AHB_DATA_BUS]        = &gxbb_ahb_data_bus.hw,
+               [CLKID_AHB_CTRL_BUS]        = &gxbb_ahb_ctrl_bus.hw,
+               [CLKID_HDMI_INTR_SYNC]      = &gxbb_hdmi_intr_sync.hw,
+               [CLKID_HDMI_PCLK]           = &gxbb_hdmi_pclk.hw,
+               [CLKID_USB1_DDR_BRIDGE]     = &gxbb_usb1_ddr_bridge.hw,
+               [CLKID_USB0_DDR_BRIDGE]     = &gxbb_usb0_ddr_bridge.hw,
+               [CLKID_MMC_PCLK]            = &gxbb_mmc_pclk.hw,
+               [CLKID_DVIN]                = &gxbb_dvin.hw,
+               [CLKID_UART2]               = &gxbb_uart2.hw,
+               [CLKID_SANA]                = &gxbb_sana.hw,
+               [CLKID_VPU_INTR]            = &gxbb_vpu_intr.hw,
+               [CLKID_SEC_AHB_AHB3_BRIDGE] = &gxbb_sec_ahb_ahb3_bridge.hw,
+               [CLKID_CLK81_A53]           = &gxbb_clk81_a53.hw,
+               [CLKID_VCLK2_VENCI0]        = &gxbb_vclk2_venci0.hw,
+               [CLKID_VCLK2_VENCI1]        = &gxbb_vclk2_venci1.hw,
+               [CLKID_VCLK2_VENCP0]        = &gxbb_vclk2_vencp0.hw,
+               [CLKID_VCLK2_VENCP1]        = &gxbb_vclk2_vencp1.hw,
+               [CLKID_GCLK_VENCI_INT0]     = &gxbb_gclk_venci_int0.hw,
+               [CLKID_GCLK_VENCI_INT]      = &gxbb_gclk_vencp_int.hw,
+               [CLKID_DAC_CLK]             = &gxbb_dac_clk.hw,
+               [CLKID_AOCLK_GATE]          = &gxbb_aoclk_gate.hw,
+               [CLKID_IEC958_GATE]         = &gxbb_iec958_gate.hw,
+               [CLKID_ENC480P]             = &gxbb_enc480p.hw,
+               [CLKID_RNG1]                = &gxbb_rng1.hw,
+               [CLKID_GCLK_VENCI_INT1]     = &gxbb_gclk_venci_int1.hw,
+               [CLKID_VCLK2_VENCLMCC]      = &gxbb_vclk2_venclmcc.hw,
+               [CLKID_VCLK2_VENCL]         = &gxbb_vclk2_vencl.hw,
+               [CLKID_VCLK_OTHER]          = &gxbb_vclk_other.hw,
+               [CLKID_EDP]                 = &gxbb_edp.hw,
+               [CLKID_AO_MEDIA_CPU]        = &gxbb_ao_media_cpu.hw,
+               [CLKID_AO_AHB_SRAM]         = &gxbb_ao_ahb_sram.hw,
+               [CLKID_AO_AHB_BUS]          = &gxbb_ao_ahb_bus.hw,
+               [CLKID_AO_IFACE]            = &gxbb_ao_iface.hw,
+               [CLKID_AO_I2C]              = &gxbb_ao_i2c.hw,
+       },
+       .num = NR_CLKS,
+};
+
+/* Convenience tables to populate base addresses in .probe */
+
+static struct meson_clk_pll *const gxbb_clk_plls[] = {
+       &gxbb_fixed_pll,
+       &gxbb_hdmi_pll,
+       &gxbb_sys_pll,
+       &gxbb_gp0_pll,
+};
+
+static struct meson_clk_mpll *const gxbb_clk_mplls[] = {
+       &gxbb_mpll0,
+       &gxbb_mpll1,
+       &gxbb_mpll2,
+};
+
+static struct clk_gate *gxbb_clk_gates[] = {
+       &gxbb_clk81,
+       &gxbb_ddr,
+       &gxbb_dos,
+       &gxbb_isa,
+       &gxbb_pl301,
+       &gxbb_periphs,
+       &gxbb_spicc,
+       &gxbb_i2c,
+       &gxbb_sar_adc,
+       &gxbb_smart_card,
+       &gxbb_rng0,
+       &gxbb_uart0,
+       &gxbb_sdhc,
+       &gxbb_stream,
+       &gxbb_async_fifo,
+       &gxbb_sdio,
+       &gxbb_abuf,
+       &gxbb_hiu_iface,
+       &gxbb_assist_misc,
+       &gxbb_spi,
+       &gxbb_i2s_spdif,
+       &gxbb_eth,
+       &gxbb_demux,
+       &gxbb_aiu_glue,
+       &gxbb_iec958,
+       &gxbb_i2s_out,
+       &gxbb_amclk,
+       &gxbb_aififo2,
+       &gxbb_mixer,
+       &gxbb_mixer_iface,
+       &gxbb_adc,
+       &gxbb_blkmv,
+       &gxbb_aiu,
+       &gxbb_uart1,
+       &gxbb_g2d,
+       &gxbb_usb0,
+       &gxbb_usb1,
+       &gxbb_reset,
+       &gxbb_nand,
+       &gxbb_dos_parser,
+       &gxbb_usb,
+       &gxbb_vdin1,
+       &gxbb_ahb_arb0,
+       &gxbb_efuse,
+       &gxbb_boot_rom,
+       &gxbb_ahb_data_bus,
+       &gxbb_ahb_ctrl_bus,
+       &gxbb_hdmi_intr_sync,
+       &gxbb_hdmi_pclk,
+       &gxbb_usb1_ddr_bridge,
+       &gxbb_usb0_ddr_bridge,
+       &gxbb_mmc_pclk,
+       &gxbb_dvin,
+       &gxbb_uart2,
+       &gxbb_sana,
+       &gxbb_vpu_intr,
+       &gxbb_sec_ahb_ahb3_bridge,
+       &gxbb_clk81_a53,
+       &gxbb_vclk2_venci0,
+       &gxbb_vclk2_venci1,
+       &gxbb_vclk2_vencp0,
+       &gxbb_vclk2_vencp1,
+       &gxbb_gclk_venci_int0,
+       &gxbb_gclk_vencp_int,
+       &gxbb_dac_clk,
+       &gxbb_aoclk_gate,
+       &gxbb_iec958_gate,
+       &gxbb_enc480p,
+       &gxbb_rng1,
+       &gxbb_gclk_venci_int1,
+       &gxbb_vclk2_venclmcc,
+       &gxbb_vclk2_vencl,
+       &gxbb_vclk_other,
+       &gxbb_edp,
+       &gxbb_ao_media_cpu,
+       &gxbb_ao_ahb_sram,
+       &gxbb_ao_ahb_bus,
+       &gxbb_ao_iface,
+       &gxbb_ao_i2c,
+};
+
+static int gxbb_clkc_probe(struct platform_device *pdev)
+{
+       void __iomem *clk_base;
+       int ret, clkid, i;
+       struct clk_hw *parent_hw;
+       struct clk *parent_clk;
+       struct device *dev = &pdev->dev;
+
+       /*  Generic clocks and PLLs */
+       clk_base = of_iomap(dev->of_node, 0);
+       if (!clk_base) {
+               pr_err("%s: Unable to map clk base\n", __func__);
+               return -ENXIO;
+       }
+
+       /* Populate base address for PLLs */
+       for (i = 0; i < ARRAY_SIZE(gxbb_clk_plls); i++)
+               gxbb_clk_plls[i]->base = clk_base;
+
+       /* Populate base address for MPLLs */
+       for (i = 0; i < ARRAY_SIZE(gxbb_clk_mplls); i++)
+               gxbb_clk_mplls[i]->base = clk_base;
+
+       /* Populate the base address for CPU clk */
+       gxbb_cpu_clk.base = clk_base;
+
+       /* Populate the base address for the MPEG clks */
+       gxbb_mpeg_clk_sel.reg = clk_base + (u64)gxbb_mpeg_clk_sel.reg;
+       gxbb_mpeg_clk_div.reg = clk_base + (u64)gxbb_mpeg_clk_div.reg;
+
+       /* Populate base address for gates */
+       for (i = 0; i < ARRAY_SIZE(gxbb_clk_gates); i++)
+               gxbb_clk_gates[i]->reg = clk_base +
+                       (u64)gxbb_clk_gates[i]->reg;
+
+       /*
+        * register all clks
+        */
+       for (clkid = 0; clkid < NR_CLKS; clkid++) {
+               ret = devm_clk_hw_register(dev, gxbb_hw_onecell_data.hws[clkid]);
+               if (ret)
+                       goto iounmap;
+       }
+
+       /*
+        * Register CPU clk notifier
+        *
+        * FIXME this is wrong for a lot of reasons. First, the muxes should be
+        * struct clk_hw objects. Second, we shouldn't program the muxes in
+        * notifier handlers. The tricky programming sequence will be handled
+        * by the forthcoming coordinated clock rates mechanism once that
+        * feature is released.
+        *
+        * Furthermore, looking up the parent this way is terrible. At some
+        * point we will stop allocating a default struct clk when registering
+        * a new clk_hw, and this hack will no longer work. Releasing the ccr
+        * feature before that time solves the problem :-)
+        */
+       parent_hw = clk_hw_get_parent(&gxbb_cpu_clk.hw);
+       parent_clk = parent_hw->clk;
+       ret = clk_notifier_register(parent_clk, &gxbb_cpu_clk.clk_nb);
+       if (ret) {
+               pr_err("%s: failed to register clock notifier for cpu_clk\n",
+                               __func__);
+               goto iounmap;
+       }
+
+       return of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
+                       &gxbb_hw_onecell_data);
+
+iounmap:
+       iounmap(clk_base);
+       return ret;
+}
+
+static const struct of_device_id gxbb_clkc_match_table[] = {
+       { .compatible = "amlogic,gxbb-clkc" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, gxbb_match_table);
+
+static struct platform_driver gxbb_driver = {
+       .probe          = gxbb_clkc_probe,
+       .driver         = {
+               .name   = "gxbb-clkc",
+               .of_match_table = gxbb_clkc_match_table,
+       },
+};
+
+static int __init gxbb_clkc_init(void)
+{
+       return platform_driver_register(&gxbb_driver);
+}
+module_init(gxbb_clkc_init);
+
+static void __exit gxbb_clkc_exit(void)
+{
+       platform_driver_unregister(&gxbb_driver);
+}
+module_exit(gxbb_clkc_exit);
+
+MODULE_DESCRIPTION("AmLogic S905 / GXBB Clock Controller Driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:gxbb-clkc");
+MODULE_AUTHOR("Michael Turquette <mturquette@baylibre.com>");
diff --git a/drivers/clk/meson/gxbb.h b/drivers/clk/meson/gxbb.h
new file mode 100644 (file)
index 0000000..a2adf34
--- /dev/null
@@ -0,0 +1,271 @@
+/*
+ * This file is provided under a dual BSD/GPLv2 license.  When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * GPL LICENSE SUMMARY
+ *
+ * Copyright (c) 2016 AmLogic, Inc.
+ * Author: Michael Turquette <mturquette@baylibre.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ * The full GNU General Public License is included in this distribution
+ * in the file called COPYING
+ *
+ * BSD LICENSE
+ *
+ * Copyright (c) 2016 BayLibre, Inc.
+ * Author: Michael Turquette <mturquette@baylibre.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.
+ *   * Neither the name of Intel Corporation nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __GXBB_H
+#define __GXBB_H
+
+/*
+ * Clock controller register offsets
+ *
+ * Register offsets from the data sheet are listed in comment blocks below.
+ * Those offsets must be multiplied by 4 before adding them to the base address
+ * to get the right value
+ */
+#define SCR                            0x2C /* 0x0b offset in data sheet */
+#define TIMEOUT_VALUE                  0x3c /* 0x0f offset in data sheet */
+
+#define HHI_GP0_PLL_CNTL               0x40 /* 0x10 offset in data sheet */
+#define HHI_GP0_PLL_CNTL2              0x44 /* 0x11 offset in data sheet */
+#define HHI_GP0_PLL_CNTL3              0x48 /* 0x12 offset in data sheet */
+#define HHI_GP0_PLL_CNTL4              0x4c /* 0x13 offset in data sheet */
+
+#define HHI_XTAL_DIVN_CNTL             0xbc /* 0x2f offset in data sheet */
+#define HHI_TIMER90K                   0xec /* 0x3b offset in data sheet */
+
+#define HHI_MEM_PD_REG0                        0x100 /* 0x40 offset in data sheet */
+#define HHI_MEM_PD_REG1                        0x104 /* 0x41 offset in data sheet */
+#define HHI_VPU_MEM_PD_REG1            0x108 /* 0x42 offset in data sheet */
+#define HHI_VIID_CLK_DIV               0x128 /* 0x4a offset in data sheet */
+#define HHI_VIID_CLK_CNTL              0x12c /* 0x4b offset in data sheet */
+
+#define HHI_GCLK_MPEG0                 0x140 /* 0x50 offset in data sheet */
+#define HHI_GCLK_MPEG1                 0x144 /* 0x51 offset in data sheet */
+#define HHI_GCLK_MPEG2                 0x148 /* 0x52 offset in data sheet */
+#define HHI_GCLK_OTHER                 0x150 /* 0x54 offset in data sheet */
+#define HHI_GCLK_AO                    0x154 /* 0x55 offset in data sheet */
+#define HHI_SYS_OSCIN_CNTL             0x158 /* 0x56 offset in data sheet */
+#define HHI_SYS_CPU_CLK_CNTL1          0x15c /* 0x57 offset in data sheet */
+#define HHI_SYS_CPU_RESET_CNTL         0x160 /* 0x58 offset in data sheet */
+#define HHI_VID_CLK_DIV                        0x164 /* 0x59 offset in data sheet */
+
+#define HHI_MPEG_CLK_CNTL              0x174 /* 0x5d offset in data sheet */
+#define HHI_AUD_CLK_CNTL               0x178 /* 0x5e offset in data sheet */
+#define HHI_VID_CLK_CNTL               0x17c /* 0x5f offset in data sheet */
+#define HHI_AUD_CLK_CNTL2              0x190 /* 0x64 offset in data sheet */
+#define HHI_VID_CLK_CNTL2              0x194 /* 0x65 offset in data sheet */
+#define HHI_SYS_CPU_CLK_CNTL0          0x19c /* 0x67 offset in data sheet */
+#define HHI_VID_PLL_CLK_DIV            0x1a0 /* 0x68 offset in data sheet */
+#define HHI_AUD_CLK_CNTL3              0x1a4 /* 0x69 offset in data sheet */
+#define HHI_MALI_CLK_CNTL              0x1b0 /* 0x6c offset in data sheet */
+#define HHI_VPU_CLK_CNTL               0x1bC /* 0x6f offset in data sheet */
+
+#define HHI_HDMI_CLK_CNTL              0x1CC /* 0x73 offset in data sheet */
+#define HHI_VDEC_CLK_CNTL              0x1E0 /* 0x78 offset in data sheet */
+#define HHI_VDEC2_CLK_CNTL             0x1E4 /* 0x79 offset in data sheet */
+#define HHI_VDEC3_CLK_CNTL             0x1E8 /* 0x7a offset in data sheet */
+#define HHI_VDEC4_CLK_CNTL             0x1EC /* 0x7b offset in data sheet */
+#define HHI_HDCP22_CLK_CNTL            0x1F0 /* 0x7c offset in data sheet */
+#define HHI_VAPBCLK_CNTL               0x1F4 /* 0x7d offset in data sheet */
+
+#define HHI_VPU_CLKB_CNTL              0x20C /* 0x83 offset in data sheet */
+#define HHI_USB_CLK_CNTL               0x220 /* 0x88 offset in data sheet */
+#define HHI_32K_CLK_CNTL               0x224 /* 0x89 offset in data sheet */
+#define HHI_GEN_CLK_CNTL               0x228 /* 0x8a offset in data sheet */
+#define HHI_GEN_CLK_CNTL               0x228 /* 0x8a offset in data sheet */
+
+#define HHI_PCM_CLK_CNTL               0x258 /* 0x96 offset in data sheet */
+#define HHI_NAND_CLK_CNTL              0x25C /* 0x97 offset in data sheet */
+#define HHI_SD_EMMC_CLK_CNTL           0x264 /* 0x99 offset in data sheet */
+
+#define HHI_MPLL_CNTL                  0x280 /* 0xa0 offset in data sheet */
+#define HHI_MPLL_CNTL2                 0x284 /* 0xa1 offset in data sheet */
+#define HHI_MPLL_CNTL3                 0x288 /* 0xa2 offset in data sheet */
+#define HHI_MPLL_CNTL4                 0x28C /* 0xa3 offset in data sheet */
+#define HHI_MPLL_CNTL5                 0x290 /* 0xa4 offset in data sheet */
+#define HHI_MPLL_CNTL6                 0x294 /* 0xa5 offset in data sheet */
+#define HHI_MPLL_CNTL7                 0x298 /* MP0, 0xa6 offset in data sheet */
+#define HHI_MPLL_CNTL8                 0x29C /* MP1, 0xa7 offset in data sheet */
+#define HHI_MPLL_CNTL9                 0x2A0 /* MP2, 0xa8 offset in data sheet */
+#define HHI_MPLL_CNTL10                        0x2A4 /* MP2, 0xa9 offset in data sheet */
+
+#define HHI_MPLL3_CNTL0                        0x2E0 /* 0xb8 offset in data sheet */
+#define HHI_MPLL3_CNTL1                        0x2E4 /* 0xb9 offset in data sheet */
+#define HHI_VDAC_CNTL0                 0x2F4 /* 0xbd offset in data sheet */
+#define HHI_VDAC_CNTL1                 0x2F8 /* 0xbe offset in data sheet */
+
+#define HHI_SYS_PLL_CNTL               0x300 /* 0xc0 offset in data sheet */
+#define HHI_SYS_PLL_CNTL2              0x304 /* 0xc1 offset in data sheet */
+#define HHI_SYS_PLL_CNTL3              0x308 /* 0xc2 offset in data sheet */
+#define HHI_SYS_PLL_CNTL4              0x30c /* 0xc3 offset in data sheet */
+#define HHI_SYS_PLL_CNTL5              0x310 /* 0xc4 offset in data sheet */
+#define HHI_DPLL_TOP_I                 0x318 /* 0xc6 offset in data sheet */
+#define HHI_DPLL_TOP2_I                        0x31C /* 0xc7 offset in data sheet */
+#define HHI_HDMI_PLL_CNTL              0x320 /* 0xc8 offset in data sheet */
+#define HHI_HDMI_PLL_CNTL2             0x324 /* 0xc9 offset in data sheet */
+#define HHI_HDMI_PLL_CNTL3             0x328 /* 0xca offset in data sheet */
+#define HHI_HDMI_PLL_CNTL4             0x32C /* 0xcb offset in data sheet */
+#define HHI_HDMI_PLL_CNTL5             0x330 /* 0xcc offset in data sheet */
+#define HHI_HDMI_PLL_CNTL6             0x334 /* 0xcd offset in data sheet */
+#define HHI_HDMI_PLL_CNTL_I            0x338 /* 0xce offset in data sheet */
+#define HHI_HDMI_PLL_CNTL7             0x33C /* 0xcf offset in data sheet */
+
+#define HHI_HDMI_PHY_CNTL0             0x3A0 /* 0xe8 offset in data sheet */
+#define HHI_HDMI_PHY_CNTL1             0x3A4 /* 0xe9 offset in data sheet */
+#define HHI_HDMI_PHY_CNTL2             0x3A8 /* 0xea offset in data sheet */
+#define HHI_HDMI_PHY_CNTL3             0x3AC /* 0xeb offset in data sheet */
+
+#define HHI_VID_LOCK_CLK_CNTL          0x3C8 /* 0xf2 offset in data sheet */
+#define HHI_BT656_CLK_CNTL             0x3D4 /* 0xf5 offset in data sheet */
+#define HHI_SAR_CLK_CNTL               0x3D8 /* 0xf6 offset in data sheet */
+
+/*
+ * CLKID index values
+ *
+ * These indices are entirely contrived and do not map onto the hardware.
+ * Migrate them out of this header and into the DT header file when they need
+ * to be exposed to client nodes in DT: include/dt-bindings/clock/gxbb-clkc.h
+ */
+#define CLKID_SYS_PLL            0
+/* CLKID_CPUCLK */
+#define CLKID_HDMI_PLL           2
+#define CLKID_FIXED_PLL                  3
+#define CLKID_FCLK_DIV2                  4
+#define CLKID_FCLK_DIV3                  5
+#define CLKID_FCLK_DIV4                  6
+#define CLKID_FCLK_DIV5                  7
+#define CLKID_FCLK_DIV7                  8
+#define CLKID_GP0_PLL            9
+#define CLKID_MPEG_SEL           10
+#define CLKID_MPEG_DIV           11
+/* CLKID_CLK81 */
+#define CLKID_MPLL0              13
+#define CLKID_MPLL1              14
+#define CLKID_MPLL2              15
+#define CLKID_DDR                16
+#define CLKID_DOS                17
+#define CLKID_ISA                18
+#define CLKID_PL301              19
+#define CLKID_PERIPHS            20
+#define CLKID_SPICC              21
+#define CLKID_I2C                22
+#define CLKID_SAR_ADC            23
+#define CLKID_SMART_CARD         24
+#define CLKID_RNG0               25
+#define CLKID_UART0              26
+#define CLKID_SDHC               27
+#define CLKID_STREAM             28
+#define CLKID_ASYNC_FIFO         29
+#define CLKID_SDIO               30
+#define CLKID_ABUF               31
+#define CLKID_HIU_IFACE                  32
+#define CLKID_ASSIST_MISC        33
+#define CLKID_SPI                34
+#define CLKID_I2S_SPDIF                  35
+#define CLKID_ETH                36
+#define CLKID_DEMUX              37
+#define CLKID_AIU_GLUE           38
+#define CLKID_IEC958             39
+#define CLKID_I2S_OUT            40
+#define CLKID_AMCLK              41
+#define CLKID_AIFIFO2            42
+#define CLKID_MIXER              43
+#define CLKID_MIXER_IFACE        44
+#define CLKID_ADC                45
+#define CLKID_BLKMV              46
+#define CLKID_AIU                47
+#define CLKID_UART1              48
+#define CLKID_G2D                49
+#define CLKID_USB0               50
+#define CLKID_USB1               51
+#define CLKID_RESET              52
+#define CLKID_NAND               53
+#define CLKID_DOS_PARSER         54
+#define CLKID_USB                55
+#define CLKID_VDIN1              56
+#define CLKID_AHB_ARB0           57
+#define CLKID_EFUSE              58
+#define CLKID_BOOT_ROM           59
+#define CLKID_AHB_DATA_BUS       60
+#define CLKID_AHB_CTRL_BUS       61
+#define CLKID_HDMI_INTR_SYNC     62
+#define CLKID_HDMI_PCLK                  63
+#define CLKID_USB1_DDR_BRIDGE    64
+#define CLKID_USB0_DDR_BRIDGE    65
+#define CLKID_MMC_PCLK           66
+#define CLKID_DVIN               67
+#define CLKID_UART2              68
+#define CLKID_SANA               69
+#define CLKID_VPU_INTR           70
+#define CLKID_SEC_AHB_AHB3_BRIDGE 71
+#define CLKID_CLK81_A53                  72
+#define CLKID_VCLK2_VENCI0       73
+#define CLKID_VCLK2_VENCI1       74
+#define CLKID_VCLK2_VENCP0       75
+#define CLKID_VCLK2_VENCP1       76
+#define CLKID_GCLK_VENCI_INT0    77
+#define CLKID_GCLK_VENCI_INT     78
+#define CLKID_DAC_CLK            79
+#define CLKID_AOCLK_GATE         80
+#define CLKID_IEC958_GATE        81
+#define CLKID_ENC480P            82
+#define CLKID_RNG1               83
+#define CLKID_GCLK_VENCI_INT1    84
+#define CLKID_VCLK2_VENCLMCC     85
+#define CLKID_VCLK2_VENCL        86
+#define CLKID_VCLK_OTHER         87
+#define CLKID_EDP                88
+#define CLKID_AO_MEDIA_CPU       89
+#define CLKID_AO_AHB_SRAM        90
+#define CLKID_AO_AHB_BUS         91
+#define CLKID_AO_IFACE           92
+#define CLKID_AO_I2C             93
+
+#define NR_CLKS                          94
+
+/* include the CLKIDs that have been made part of the stable DT binding */
+#include <dt-bindings/clock/gxbb-clkc.h>
+
+#endif /* __GXBB_H */
index 4d057b3e21b2a50d9bbae66abf745d2d7a4ef277..b1902e91213da9153225bdce40d6ebb77f886dd1 100644 (file)
@@ -2,6 +2,9 @@
  * Copyright (c) 2015 Endless Mobile, Inc.
  * Author: Carlo Caione <carlo@endlessm.com>
  *
+ * Copyright (c) 2016 BayLibre, Inc.
+ * Michael Turquette <mturquette@baylibre.com>
+ *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
  * version 2, as published by the Free Software Foundation.
  * this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <linux/clk.h>
 #include <linux/clk-provider.h>
-#include <linux/kernel.h>
-#include <linux/of.h>
 #include <linux/of_address.h>
-#include <linux/slab.h>
 #include <dt-bindings/clock/meson8b-clkc.h>
+#include <linux/platform_device.h>
+#include <linux/module.h>
 
 #include "clkc.h"
 
-#define MESON8B_REG_CTL0_ADDR          0x0000
-#define MESON8B_REG_SYS_CPU_CNTL1      0x015c
-#define MESON8B_REG_HHI_MPEG           0x0174
-#define MESON8B_REG_MALI               0x01b0
+/*
+ * Clock controller register offsets
+ *
+ * Register offsets from the HardKernel[0] data sheet are listed in comment
+ * blocks below. Those offsets must be multiplied by 4 before adding them to
+ * the base address to get the right value
+ *
+ * [0] http://dn.odroid.com/S805/Datasheet/S805_Datasheet%20V0.8%2020150126.pdf
+ */
+#define MESON8B_REG_SYS_CPU_CNTL1      0x015c /* 0x57 offset in data sheet */
+#define MESON8B_REG_HHI_MPEG           0x0174 /* 0x5d offset in data sheet */
+#define MESON8B_REG_MALI               0x01b0 /* 0x6c offset in data sheet */
 #define MESON8B_REG_PLL_FIXED          0x0280
 #define MESON8B_REG_PLL_SYS            0x0300
 #define MESON8B_REG_PLL_VID            0x0320
 
+static DEFINE_SPINLOCK(clk_lock);
+
 static const struct pll_rate_table sys_pll_rate_table[] = {
        PLL_RATE(312000000, 52, 1, 2),
        PLL_RATE(336000000, 56, 1, 2),
@@ -102,95 +115,344 @@ static const struct clk_div_table cpu_div_table[] = {
        { /* sentinel */ },
 };
 
-PNAME(p_xtal)          = { "xtal" };
-PNAME(p_fclk_div)      = { "fixed_pll" };
-PNAME(p_cpu_clk)       = { "sys_pll" };
-PNAME(p_clk81)         = { "fclk_div3", "fclk_div4", "fclk_div5" };
-PNAME(p_mali)          = { "fclk_div3", "fclk_div4", "fclk_div5",
-                           "fclk_div7", "zero" };
+static struct clk_fixed_rate meson8b_xtal = {
+       .fixed_rate = 24000000,
+       .hw.init = &(struct clk_init_data){
+               .name = "xtal",
+               .num_parents = 0,
+               .ops = &clk_fixed_rate_ops,
+       },
+};
+
+static struct meson_clk_pll meson8b_fixed_pll = {
+       .m = {
+               .reg_off = MESON8B_REG_PLL_FIXED,
+               .shift   = 0,
+               .width   = 9,
+       },
+       .n = {
+               .reg_off = MESON8B_REG_PLL_FIXED,
+               .shift   = 9,
+               .width   = 5,
+       },
+       .od = {
+               .reg_off = MESON8B_REG_PLL_FIXED,
+               .shift   = 16,
+               .width   = 2,
+       },
+       .lock = &clk_lock,
+       .hw.init = &(struct clk_init_data){
+               .name = "fixed_pll",
+               .ops = &meson_clk_pll_ro_ops,
+               .parent_names = (const char *[]){ "xtal" },
+               .num_parents = 1,
+               .flags = CLK_GET_RATE_NOCACHE,
+       },
+};
+
+static struct meson_clk_pll meson8b_vid_pll = {
+       .m = {
+               .reg_off = MESON8B_REG_PLL_VID,
+               .shift   = 0,
+               .width   = 9,
+       },
+       .n = {
+               .reg_off = MESON8B_REG_PLL_VID,
+               .shift   = 9,
+               .width   = 5,
+       },
+       .od = {
+               .reg_off = MESON8B_REG_PLL_VID,
+               .shift   = 16,
+               .width   = 2,
+       },
+       .lock = &clk_lock,
+       .hw.init = &(struct clk_init_data){
+               .name = "vid_pll",
+               .ops = &meson_clk_pll_ro_ops,
+               .parent_names = (const char *[]){ "xtal" },
+               .num_parents = 1,
+               .flags = CLK_GET_RATE_NOCACHE,
+       },
+};
+
+static struct meson_clk_pll meson8b_sys_pll = {
+       .m = {
+               .reg_off = MESON8B_REG_PLL_SYS,
+               .shift   = 0,
+               .width   = 9,
+       },
+       .n = {
+               .reg_off = MESON8B_REG_PLL_SYS,
+               .shift   = 9,
+               .width   = 5,
+       },
+       .od = {
+               .reg_off = MESON8B_REG_PLL_SYS,
+               .shift   = 16,
+               .width   = 2,
+       },
+       .rate_table = sys_pll_rate_table,
+       .rate_count = ARRAY_SIZE(sys_pll_rate_table),
+       .lock = &clk_lock,
+       .hw.init = &(struct clk_init_data){
+               .name = "sys_pll",
+               .ops = &meson_clk_pll_ops,
+               .parent_names = (const char *[]){ "xtal" },
+               .num_parents = 1,
+               .flags = CLK_GET_RATE_NOCACHE,
+       },
+};
+
+static struct clk_fixed_factor meson8b_fclk_div2 = {
+       .mult = 1,
+       .div = 2,
+       .hw.init = &(struct clk_init_data){
+               .name = "fclk_div2",
+               .ops = &clk_fixed_factor_ops,
+               .parent_names = (const char *[]){ "fixed_pll" },
+               .num_parents = 1,
+       },
+};
+
+static struct clk_fixed_factor meson8b_fclk_div3 = {
+       .mult = 1,
+       .div = 3,
+       .hw.init = &(struct clk_init_data){
+               .name = "fclk_div3",
+               .ops = &clk_fixed_factor_ops,
+               .parent_names = (const char *[]){ "fixed_pll" },
+               .num_parents = 1,
+       },
+};
+
+static struct clk_fixed_factor meson8b_fclk_div4 = {
+       .mult = 1,
+       .div = 4,
+       .hw.init = &(struct clk_init_data){
+               .name = "fclk_div4",
+               .ops = &clk_fixed_factor_ops,
+               .parent_names = (const char *[]){ "fixed_pll" },
+               .num_parents = 1,
+       },
+};
+
+static struct clk_fixed_factor meson8b_fclk_div5 = {
+       .mult = 1,
+       .div = 5,
+       .hw.init = &(struct clk_init_data){
+               .name = "fclk_div5",
+               .ops = &clk_fixed_factor_ops,
+               .parent_names = (const char *[]){ "fixed_pll" },
+               .num_parents = 1,
+       },
+};
+
+static struct clk_fixed_factor meson8b_fclk_div7 = {
+       .mult = 1,
+       .div = 7,
+       .hw.init = &(struct clk_init_data){
+               .name = "fclk_div7",
+               .ops = &clk_fixed_factor_ops,
+               .parent_names = (const char *[]){ "fixed_pll" },
+               .num_parents = 1,
+       },
+};
+
+/*
+ * FIXME cpu clocks and the legacy composite clocks (e.g. clk81) are both PLL
+ * post-dividers and should be modeled with their respective PLLs via the
+ * forthcoming coordinated clock rates feature
+ */
+static struct meson_clk_cpu meson8b_cpu_clk = {
+       .reg_off = MESON8B_REG_SYS_CPU_CNTL1,
+       .div_table = cpu_div_table,
+       .clk_nb.notifier_call = meson_clk_cpu_notifier_cb,
+       .hw.init = &(struct clk_init_data){
+               .name = "cpu_clk",
+               .ops = &meson_clk_cpu_ops,
+               .parent_names = (const char *[]){ "sys_pll" },
+               .num_parents = 1,
+       },
+};
 
 static u32 mux_table_clk81[]   = { 6, 5, 7 };
-static u32 mux_table_mali[]    = { 6, 5, 7, 4, 0 };
-
-static struct pll_conf pll_confs = {
-       .m              = PARM(0x00, 0,  9),
-       .n              = PARM(0x00, 9,  5),
-       .od             = PARM(0x00, 16, 2),
-};
-
-static struct pll_conf sys_pll_conf = {
-       .m              = PARM(0x00, 0,  9),
-       .n              = PARM(0x00, 9,  5),
-       .od             = PARM(0x00, 16, 2),
-       .rate_table     = sys_pll_rate_table,
-};
-
-static const struct composite_conf clk81_conf __initconst = {
-       .mux_table              = mux_table_clk81,
-       .mux_flags              = CLK_MUX_READ_ONLY,
-       .mux_parm               = PARM(0x00, 12, 3),
-       .div_parm               = PARM(0x00, 0, 7),
-       .gate_parm              = PARM(0x00, 7, 1),
-};
-
-static const struct composite_conf mali_conf __initconst = {
-       .mux_table              = mux_table_mali,
-       .mux_parm               = PARM(0x00, 9, 3),
-       .div_parm               = PARM(0x00, 0, 7),
-       .gate_parm              = PARM(0x00, 8, 1),
-};
-
-static const struct clk_conf meson8b_xtal_conf __initconst =
-       FIXED_RATE_P(MESON8B_REG_CTL0_ADDR, CLKID_XTAL, "xtal", 0,
-                       PARM(0x00, 4, 7));
-
-static const struct clk_conf meson8b_clk_confs[] __initconst = {
-       FIXED_RATE(CLKID_ZERO, "zero", 0, 0),
-       PLL(MESON8B_REG_PLL_FIXED, CLKID_PLL_FIXED, "fixed_pll",
-           p_xtal, 0, &pll_confs),
-       PLL(MESON8B_REG_PLL_VID, CLKID_PLL_VID, "vid_pll",
-           p_xtal, 0, &pll_confs),
-       PLL(MESON8B_REG_PLL_SYS, CLKID_PLL_SYS, "sys_pll",
-           p_xtal, 0, &sys_pll_conf),
-       FIXED_FACTOR_DIV(CLKID_FCLK_DIV2, "fclk_div2", p_fclk_div, 0, 2),
-       FIXED_FACTOR_DIV(CLKID_FCLK_DIV3, "fclk_div3", p_fclk_div, 0, 3),
-       FIXED_FACTOR_DIV(CLKID_FCLK_DIV4, "fclk_div4", p_fclk_div, 0, 4),
-       FIXED_FACTOR_DIV(CLKID_FCLK_DIV5, "fclk_div5", p_fclk_div, 0, 5),
-       FIXED_FACTOR_DIV(CLKID_FCLK_DIV7, "fclk_div7", p_fclk_div, 0, 7),
-       CPU(MESON8B_REG_SYS_CPU_CNTL1, CLKID_CPUCLK, "a5_clk", p_cpu_clk,
-           cpu_div_table),
-       COMPOSITE(MESON8B_REG_HHI_MPEG, CLKID_CLK81, "clk81", p_clk81,
-                 CLK_SET_RATE_NO_REPARENT | CLK_IGNORE_UNUSED, &clk81_conf),
-       COMPOSITE(MESON8B_REG_MALI, CLKID_MALI, "mali", p_mali,
-                 CLK_IGNORE_UNUSED, &mali_conf),
-};
-
-static void __init meson8b_clkc_init(struct device_node *np)
-{
-       void __iomem *clk_base;
 
-       if (!meson_clk_init(np, CLK_NR_CLKS))
-               return;
+struct clk_mux meson8b_mpeg_clk_sel = {
+       .reg = (void *)MESON8B_REG_HHI_MPEG,
+       .mask = 0x7,
+       .shift = 12,
+       .flags = CLK_MUX_READ_ONLY,
+       .table = mux_table_clk81,
+       .lock = &clk_lock,
+       .hw.init = &(struct clk_init_data){
+               .name = "mpeg_clk_sel",
+               .ops = &clk_mux_ro_ops,
+               /*
+                * FIXME bits 14:12 selects from 8 possible parents:
+                * xtal, 1'b0 (wtf), fclk_div7, mpll_clkout1, mpll_clkout2,
+                * fclk_div4, fclk_div3, fclk_div5
+                */
+               .parent_names = (const char *[]){ "fclk_div3", "fclk_div4",
+                       "fclk_div5" },
+               .num_parents = 3,
+               .flags = (CLK_SET_RATE_NO_REPARENT | CLK_IGNORE_UNUSED),
+       },
+};
 
-       /* XTAL */
-       clk_base = of_iomap(np, 0);
-       if (!clk_base) {
-               pr_err("%s: Unable to map xtal base\n", __func__);
-               return;
-       }
+struct clk_divider meson8b_mpeg_clk_div = {
+       .reg = (void *)MESON8B_REG_HHI_MPEG,
+       .shift = 0,
+       .width = 7,
+       .lock = &clk_lock,
+       .hw.init = &(struct clk_init_data){
+               .name = "mpeg_clk_div",
+               .ops = &clk_divider_ops,
+               .parent_names = (const char *[]){ "mpeg_clk_sel" },
+               .num_parents = 1,
+               .flags = (CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED),
+       },
+};
 
-       meson_clk_register_clks(&meson8b_xtal_conf, 1, clk_base);
-       iounmap(clk_base);
+struct clk_gate meson8b_clk81 = {
+       .reg = (void *)MESON8B_REG_HHI_MPEG,
+       .bit_idx = 7,
+       .lock = &clk_lock,
+       .hw.init = &(struct clk_init_data){
+               .name = "clk81",
+               .ops = &clk_gate_ops,
+               .parent_names = (const char *[]){ "mpeg_clk_div" },
+               .num_parents = 1,
+               .flags = (CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED),
+       },
+};
+
+static struct clk_hw_onecell_data meson8b_hw_onecell_data = {
+       .hws = {
+               [CLKID_XTAL] = &meson8b_xtal.hw,
+               [CLKID_PLL_FIXED] = &meson8b_fixed_pll.hw,
+               [CLKID_PLL_VID] = &meson8b_vid_pll.hw,
+               [CLKID_PLL_SYS] = &meson8b_sys_pll.hw,
+               [CLKID_FCLK_DIV2] = &meson8b_fclk_div2.hw,
+               [CLKID_FCLK_DIV3] = &meson8b_fclk_div3.hw,
+               [CLKID_FCLK_DIV4] = &meson8b_fclk_div4.hw,
+               [CLKID_FCLK_DIV5] = &meson8b_fclk_div5.hw,
+               [CLKID_FCLK_DIV7] = &meson8b_fclk_div7.hw,
+               [CLKID_CPUCLK] = &meson8b_cpu_clk.hw,
+               [CLKID_MPEG_SEL] = &meson8b_mpeg_clk_sel.hw,
+               [CLKID_MPEG_DIV] = &meson8b_mpeg_clk_div.hw,
+               [CLKID_CLK81] = &meson8b_clk81.hw,
+       },
+       .num = CLK_NR_CLKS,
+};
+
+static struct meson_clk_pll *const meson8b_clk_plls[] = {
+       &meson8b_fixed_pll,
+       &meson8b_vid_pll,
+       &meson8b_sys_pll,
+};
+
+static int meson8b_clkc_probe(struct platform_device *pdev)
+{
+       void __iomem *clk_base;
+       int ret, clkid, i;
+       struct clk_hw *parent_hw;
+       struct clk *parent_clk;
+       struct device *dev = &pdev->dev;
 
        /*  Generic clocks and PLLs */
-       clk_base = of_iomap(np, 1);
+       clk_base = of_iomap(dev->of_node, 1);
        if (!clk_base) {
                pr_err("%s: Unable to map clk base\n", __func__);
-               return;
+               return -ENXIO;
+       }
+
+       /* Populate base address for PLLs */
+       for (i = 0; i < ARRAY_SIZE(meson8b_clk_plls); i++)
+               meson8b_clk_plls[i]->base = clk_base;
+
+       /* Populate the base address for CPU clk */
+       meson8b_cpu_clk.base = clk_base;
+
+       /* Populate the base address for the MPEG clks */
+       meson8b_mpeg_clk_sel.reg = clk_base + (u32)meson8b_mpeg_clk_sel.reg;
+       meson8b_mpeg_clk_div.reg = clk_base + (u32)meson8b_mpeg_clk_div.reg;
+       meson8b_clk81.reg = clk_base + (u32)meson8b_clk81.reg;
+
+       /*
+        * register all clks
+        * CLKID_UNUSED = 0, so skip it and start with CLKID_XTAL = 1
+        */
+       for (clkid = CLKID_XTAL; clkid < CLK_NR_CLKS; clkid++) {
+               /* array might be sparse */
+               if (!meson8b_hw_onecell_data.hws[clkid])
+                       continue;
+
+               /* FIXME convert to devm_clk_register */
+               ret = devm_clk_hw_register(dev, meson8b_hw_onecell_data.hws[clkid]);
+               if (ret)
+                       goto iounmap;
        }
 
-       meson_clk_register_clks(meson8b_clk_confs,
-                               ARRAY_SIZE(meson8b_clk_confs),
-                               clk_base);
+       /*
+        * Register CPU clk notifier
+        *
+        * FIXME this is wrong for a lot of reasons. First, the muxes should be
+        * struct clk_hw objects. Second, we shouldn't program the muxes in
+        * notifier handlers. The tricky programming sequence will be handled
+        * by the forthcoming coordinated clock rates mechanism once that
+        * feature is released.
+        *
+        * Furthermore, looking up the parent this way is terrible. At some
+        * point we will stop allocating a default struct clk when registering
+        * a new clk_hw, and this hack will no longer work. Releasing the ccr
+        * feature before that time solves the problem :-)
+        */
+       parent_hw = clk_hw_get_parent(&meson8b_cpu_clk.hw);
+       parent_clk = parent_hw->clk;
+       ret = clk_notifier_register(parent_clk, &meson8b_cpu_clk.clk_nb);
+       if (ret) {
+               pr_err("%s: failed to register clock notifier for cpu_clk\n",
+                               __func__);
+               goto iounmap;
+       }
+
+       return of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get,
+                       &meson8b_hw_onecell_data);
+
+iounmap:
+       iounmap(clk_base);
+       return ret;
 }
-CLK_OF_DECLARE(meson8b_clock, "amlogic,meson8b-clkc", meson8b_clkc_init);
+
+static const struct of_device_id meson8b_clkc_match_table[] = {
+       { .compatible = "amlogic,meson8b-clkc" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, meson8b_match_table);
+
+static struct platform_driver meson8b_driver = {
+       .probe          = meson8b_clkc_probe,
+       .driver         = {
+               .name   = "meson8b-clkc",
+               .of_match_table = meson8b_clkc_match_table,
+       },
+};
+
+static int __init meson8b_clkc_init(void)
+{
+       return platform_driver_register(&meson8b_driver);
+}
+module_init(meson8b_clkc_init);
+
+static void __exit meson8b_clkc_exit(void)
+{
+       platform_driver_unregister(&meson8b_driver);
+}
+module_exit(meson8b_clkc_exit);
+
+MODULE_DESCRIPTION("AmLogic S805 / Meson8b Clock Controller Driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:meson8b-clkc");
+MODULE_AUTHOR("Michael Turquette <mturquette@baylibre.com>");
+MODULE_AUTHOR("Carlo Caione <carlo@endlessm.com>");
index 020a29acc5b079e7c6560745804a6fa91e7d9273..51f54380474b6acbe4f39a6ea1a54c19cb4121f1 100644 (file)
@@ -180,15 +180,15 @@ static int pic32mzda_clk_probe(struct platform_device *pdev)
 
        /* register fixed rate clocks */
        clks[POSCCLK] = clk_register_fixed_rate(&pdev->dev, "posc_clk", NULL,
-                                               CLK_IS_ROOT, 24000000);
+                                               0, 24000000);
        clks[FRCCLK] =  clk_register_fixed_rate(&pdev->dev, "frc_clk", NULL,
-                                               CLK_IS_ROOT, 8000000);
+                                               0, 8000000);
        clks[BFRCCLK] = clk_register_fixed_rate(&pdev->dev, "bfrc_clk", NULL,
-                                               CLK_IS_ROOT, 8000000);
+                                               0, 8000000);
        clks[LPRCCLK] = clk_register_fixed_rate(&pdev->dev, "lprc_clk", NULL,
-                                               CLK_IS_ROOT, 32000);
+                                               0, 32000);
        clks[UPLLCLK] = clk_register_fixed_rate(&pdev->dev, "usbphy_clk", NULL,
-                                               CLK_IS_ROOT, 24000000);
+                                               0, 24000000);
        /* fixed rate (optional) clock */
        if (of_find_property(np, "microchip,pic32mzda-sosc", NULL)) {
                pr_info("pic32-clk: dt requests SOSC.\n");
index c9b96f318d9c84159841b0ba40bd6e35cf841d3b..bbf732bbc3fdc37dd79fd6475461356e64b85538 100644 (file)
@@ -2891,21 +2891,6 @@ static struct clk_branch gcc_smmu_aggre0_ahb_clk = {
        },
 };
 
-static struct clk_branch gcc_aggre1_pnoc_ahb_clk = {
-       .halt_reg = 0x82014,
-       .clkr = {
-               .enable_reg = 0x82014,
-               .enable_mask = BIT(0),
-               .hw.init = &(struct clk_init_data){
-                       .name = "gcc_aggre1_pnoc_ahb_clk",
-                       .parent_names = (const char *[]){ "periph_noc_clk_src" },
-                       .num_parents = 1,
-                       .flags = CLK_SET_RATE_PARENT,
-                       .ops = &clk_branch2_ops,
-               },
-       },
-};
-
 static struct clk_branch gcc_aggre2_ufs_axi_clk = {
        .halt_reg = 0x83014,
        .clkr = {
@@ -3308,7 +3293,6 @@ static struct clk_regmap *gcc_msm8996_clocks[] = {
        [GCC_AGGRE0_CNOC_AHB_CLK] = &gcc_aggre0_cnoc_ahb_clk.clkr,
        [GCC_SMMU_AGGRE0_AXI_CLK] = &gcc_smmu_aggre0_axi_clk.clkr,
        [GCC_SMMU_AGGRE0_AHB_CLK] = &gcc_smmu_aggre0_ahb_clk.clkr,
-       [GCC_AGGRE1_PNOC_AHB_CLK] = &gcc_aggre1_pnoc_ahb_clk.clkr,
        [GCC_AGGRE2_UFS_AXI_CLK] = &gcc_aggre2_ufs_axi_clk.clkr,
        [GCC_AGGRE2_USB3_AXI_CLK] = &gcc_aggre2_usb3_axi_clk.clkr,
        [GCC_QSPI_AHB_CLK] = &gcc_qspi_ahb_clk.clkr,
index 2115ce410cfb4bc9607744ac03ff506fb330adf8..41a12d376799ae8c4b358f5f0cc3e5846b98cfcf 100644 (file)
@@ -1,6 +1,7 @@
 config CLK_RENESAS_CPG_MSSR
        bool
        default y if ARCH_R8A7795
+       default y if ARCH_R8A7796
 
 config CLK_RENESAS_CPG_MSTP
        bool
@@ -11,6 +12,7 @@ config CLK_RENESAS_CPG_MSTP
        default y if ARCH_R8A7779
        default y if ARCH_R8A7790
        default y if ARCH_R8A7791
+       default y if ARCH_R8A7792
        default y if ARCH_R8A7793
        default y if ARCH_R8A7794
        default y if ARCH_SH73A0
index ead8bb8435249493958f2320c5c15aca9430fa66..90dd0db7d9c6ef7c328c1ff981872d7e24623d84 100644 (file)
@@ -6,9 +6,11 @@ obj-$(CONFIG_ARCH_R8A7778)             += clk-r8a7778.o
 obj-$(CONFIG_ARCH_R8A7779)             += clk-r8a7779.o
 obj-$(CONFIG_ARCH_R8A7790)             += clk-rcar-gen2.o clk-div6.o
 obj-$(CONFIG_ARCH_R8A7791)             += clk-rcar-gen2.o clk-div6.o
+obj-$(CONFIG_ARCH_R8A7792)             += clk-rcar-gen2.o clk-div6.o
 obj-$(CONFIG_ARCH_R8A7793)             += clk-rcar-gen2.o clk-div6.o
 obj-$(CONFIG_ARCH_R8A7794)             += clk-rcar-gen2.o clk-div6.o
-obj-$(CONFIG_ARCH_R8A7795)             += r8a7795-cpg-mssr.o
+obj-$(CONFIG_ARCH_R8A7795)             += r8a7795-cpg-mssr.o rcar-gen3-cpg.o
+obj-$(CONFIG_ARCH_R8A7796)             += r8a7796-cpg-mssr.o rcar-gen3-cpg.o
 obj-$(CONFIG_ARCH_SH73A0)              += clk-sh73a0.o clk-div6.o
 
 obj-$(CONFIG_CLK_RENESAS_CPG_MSSR)     += renesas-cpg-mssr.o clk-div6.o
index ca5519c583d4bf57d1c948abc4bf76ee4b8e60c7..d359c92e13a65c00725f3a1178a1096babc0e226 100644 (file)
  * the Free Software Foundation; version 2 of the License.
  */
 
-#include <linux/bug.h>
-#include <linux/clk.h>
-#include <linux/clk-provider.h>
 #include <linux/device.h>
-#include <linux/err.h>
 #include <linux/init.h>
-#include <linux/io.h>
 #include <linux/kernel.h>
-#include <linux/of.h>
-#include <linux/slab.h>
 
 #include <dt-bindings/clock/r8a7795-cpg-mssr.h>
 
 #include "renesas-cpg-mssr.h"
-
-#define CPG_RCKCR      0x240
+#include "rcar-gen3-cpg.h"
 
 enum clk_ids {
        /* Core Clock Outputs exported to DT */
@@ -58,20 +50,6 @@ enum clk_ids {
        MOD_CLK_BASE
 };
 
-enum r8a7795_clk_types {
-       CLK_TYPE_GEN3_MAIN = CLK_TYPE_CUSTOM,
-       CLK_TYPE_GEN3_PLL0,
-       CLK_TYPE_GEN3_PLL1,
-       CLK_TYPE_GEN3_PLL2,
-       CLK_TYPE_GEN3_PLL3,
-       CLK_TYPE_GEN3_PLL4,
-       CLK_TYPE_GEN3_SD,
-       CLK_TYPE_GEN3_R,
-};
-
-#define DEF_GEN3_SD(_name, _id, _parent, _offset)      \
-       DEF_BASE(_name, _id, CLK_TYPE_GEN3_SD, _parent, .offset = _offset)
-
 static const struct cpg_core_clk r8a7795_core_clks[] __initconst = {
        /* External Clock Inputs */
        DEF_INPUT("extal",  CLK_EXTAL),
@@ -129,6 +107,9 @@ static const struct cpg_core_clk r8a7795_core_clks[] __initconst = {
 };
 
 static const struct mssr_mod_clk r8a7795_mod_clks[] __initconst = {
+       DEF_MOD("fdp1-2",                117,   R8A7795_CLK_S2D1),
+       DEF_MOD("fdp1-1",                118,   R8A7795_CLK_S2D1),
+       DEF_MOD("fdp1-0",                119,   R8A7795_CLK_S2D1),
        DEF_MOD("scif5",                 202,   R8A7795_CLK_S3D4),
        DEF_MOD("scif4",                 203,   R8A7795_CLK_S3D4),
        DEF_MOD("scif3",                 204,   R8A7795_CLK_S3D4),
@@ -157,11 +138,20 @@ static const struct mssr_mod_clk r8a7795_mod_clks[] __initconst = {
        DEF_MOD("intc-ap",               408,   R8A7795_CLK_S3D1),
        DEF_MOD("audmac0",               502,   R8A7795_CLK_S3D4),
        DEF_MOD("audmac1",               501,   R8A7795_CLK_S3D4),
+       DEF_MOD("drif7",                 508,   R8A7795_CLK_S3D2),
+       DEF_MOD("drif6",                 509,   R8A7795_CLK_S3D2),
+       DEF_MOD("drif5",                 510,   R8A7795_CLK_S3D2),
+       DEF_MOD("drif4",                 511,   R8A7795_CLK_S3D2),
+       DEF_MOD("drif3",                 512,   R8A7795_CLK_S3D2),
+       DEF_MOD("drif2",                 513,   R8A7795_CLK_S3D2),
+       DEF_MOD("drif1",                 514,   R8A7795_CLK_S3D2),
+       DEF_MOD("drif0",                 515,   R8A7795_CLK_S3D2),
        DEF_MOD("hscif4",                516,   R8A7795_CLK_S3D1),
        DEF_MOD("hscif3",                517,   R8A7795_CLK_S3D1),
        DEF_MOD("hscif2",                518,   R8A7795_CLK_S3D1),
        DEF_MOD("hscif1",                519,   R8A7795_CLK_S3D1),
        DEF_MOD("hscif0",                520,   R8A7795_CLK_S3D1),
+       DEF_MOD("thermal",               522,   R8A7795_CLK_CP),
        DEF_MOD("pwm",                   523,   R8A7795_CLK_S3D4),
        DEF_MOD("fcpvd3",                600,   R8A7795_CLK_S2D1),
        DEF_MOD("fcpvd2",                601,   R8A7795_CLK_S2D1),
@@ -199,7 +189,7 @@ static const struct mssr_mod_clk r8a7795_mod_clks[] __initconst = {
        DEF_MOD("du2",                   722,   R8A7795_CLK_S2D1),
        DEF_MOD("du1",                   723,   R8A7795_CLK_S2D1),
        DEF_MOD("du0",                   724,   R8A7795_CLK_S2D1),
-       DEF_MOD("lvds",                  727,   R8A7795_CLK_S2D1),
+       DEF_MOD("lvds",                  727,   R8A7795_CLK_S0D4),
        DEF_MOD("hdmi1",                 728,   R8A7795_CLK_HDMI),
        DEF_MOD("hdmi0",                 729,   R8A7795_CLK_HDMI),
        DEF_MOD("vin7",                  804,   R8A7795_CLK_S2D1),
@@ -262,225 +252,6 @@ static const unsigned int r8a7795_crit_mod_clks[] __initconst = {
        MOD_CLK_ID(408),        /* INTC-AP (GIC) */
 };
 
-/* -----------------------------------------------------------------------------
- * SDn Clock
- *
- */
-#define CPG_SD_STP_HCK         BIT(9)
-#define CPG_SD_STP_CK          BIT(8)
-
-#define CPG_SD_STP_MASK                (CPG_SD_STP_HCK | CPG_SD_STP_CK)
-#define CPG_SD_FC_MASK         (0x7 << 2 | 0x3 << 0)
-
-#define CPG_SD_DIV_TABLE_DATA(stp_hck, stp_ck, sd_srcfc, sd_fc, sd_div) \
-{ \
-       .val = ((stp_hck) ? CPG_SD_STP_HCK : 0) | \
-              ((stp_ck) ? CPG_SD_STP_CK : 0) | \
-              ((sd_srcfc) << 2) | \
-              ((sd_fc) << 0), \
-       .div = (sd_div), \
-}
-
-struct sd_div_table {
-       u32 val;
-       unsigned int div;
-};
-
-struct sd_clock {
-       struct clk_hw hw;
-       void __iomem *reg;
-       const struct sd_div_table *div_table;
-       unsigned int div_num;
-       unsigned int div_min;
-       unsigned int div_max;
-};
-
-/* SDn divider
- *                     sd_srcfc   sd_fc   div
- * stp_hck   stp_ck    (div)      (div)     = sd_srcfc x sd_fc
- *-------------------------------------------------------------------
- *  0         0         0 (1)      1 (4)      4
- *  0         0         1 (2)      1 (4)      8
- *  1         0         2 (4)      1 (4)     16
- *  1         0         3 (8)      1 (4)     32
- *  1         0         4 (16)     1 (4)     64
- *  0         0         0 (1)      0 (2)      2
- *  0         0         1 (2)      0 (2)      4
- *  1         0         2 (4)      0 (2)      8
- *  1         0         3 (8)      0 (2)     16
- *  1         0         4 (16)     0 (2)     32
- */
-static const struct sd_div_table cpg_sd_div_table[] = {
-/*     CPG_SD_DIV_TABLE_DATA(stp_hck,  stp_ck,   sd_srcfc,   sd_fc,  sd_div) */
-       CPG_SD_DIV_TABLE_DATA(0,        0,        0,          1,        4),
-       CPG_SD_DIV_TABLE_DATA(0,        0,        1,          1,        8),
-       CPG_SD_DIV_TABLE_DATA(1,        0,        2,          1,       16),
-       CPG_SD_DIV_TABLE_DATA(1,        0,        3,          1,       32),
-       CPG_SD_DIV_TABLE_DATA(1,        0,        4,          1,       64),
-       CPG_SD_DIV_TABLE_DATA(0,        0,        0,          0,        2),
-       CPG_SD_DIV_TABLE_DATA(0,        0,        1,          0,        4),
-       CPG_SD_DIV_TABLE_DATA(1,        0,        2,          0,        8),
-       CPG_SD_DIV_TABLE_DATA(1,        0,        3,          0,       16),
-       CPG_SD_DIV_TABLE_DATA(1,        0,        4,          0,       32),
-};
-
-#define to_sd_clock(_hw) container_of(_hw, struct sd_clock, hw)
-
-static int cpg_sd_clock_enable(struct clk_hw *hw)
-{
-       struct sd_clock *clock = to_sd_clock(hw);
-       u32 val, sd_fc;
-       unsigned int i;
-
-       val = clk_readl(clock->reg);
-
-       sd_fc = val & CPG_SD_FC_MASK;
-       for (i = 0; i < clock->div_num; i++)
-               if (sd_fc == (clock->div_table[i].val & CPG_SD_FC_MASK))
-                       break;
-
-       if (i >= clock->div_num)
-               return -EINVAL;
-
-       val &= ~(CPG_SD_STP_MASK);
-       val |= clock->div_table[i].val & CPG_SD_STP_MASK;
-
-       clk_writel(val, clock->reg);
-
-       return 0;
-}
-
-static void cpg_sd_clock_disable(struct clk_hw *hw)
-{
-       struct sd_clock *clock = to_sd_clock(hw);
-
-       clk_writel(clk_readl(clock->reg) | CPG_SD_STP_MASK, clock->reg);
-}
-
-static int cpg_sd_clock_is_enabled(struct clk_hw *hw)
-{
-       struct sd_clock *clock = to_sd_clock(hw);
-
-       return !(clk_readl(clock->reg) & CPG_SD_STP_MASK);
-}
-
-static unsigned long cpg_sd_clock_recalc_rate(struct clk_hw *hw,
-                                               unsigned long parent_rate)
-{
-       struct sd_clock *clock = to_sd_clock(hw);
-       unsigned long rate = parent_rate;
-       u32 val, sd_fc;
-       unsigned int i;
-
-       val = clk_readl(clock->reg);
-
-       sd_fc = val & CPG_SD_FC_MASK;
-       for (i = 0; i < clock->div_num; i++)
-               if (sd_fc == (clock->div_table[i].val & CPG_SD_FC_MASK))
-                       break;
-
-       if (i >= clock->div_num)
-               return -EINVAL;
-
-       return DIV_ROUND_CLOSEST(rate, clock->div_table[i].div);
-}
-
-static unsigned int cpg_sd_clock_calc_div(struct sd_clock *clock,
-                                         unsigned long rate,
-                                         unsigned long parent_rate)
-{
-       unsigned int div;
-
-       if (!rate)
-               rate = 1;
-
-       div = DIV_ROUND_CLOSEST(parent_rate, rate);
-
-       return clamp_t(unsigned int, div, clock->div_min, clock->div_max);
-}
-
-static long cpg_sd_clock_round_rate(struct clk_hw *hw, unsigned long rate,
-                                     unsigned long *parent_rate)
-{
-       struct sd_clock *clock = to_sd_clock(hw);
-       unsigned int div = cpg_sd_clock_calc_div(clock, rate, *parent_rate);
-
-       return DIV_ROUND_CLOSEST(*parent_rate, div);
-}
-
-static int cpg_sd_clock_set_rate(struct clk_hw *hw, unsigned long rate,
-                                  unsigned long parent_rate)
-{
-       struct sd_clock *clock = to_sd_clock(hw);
-       unsigned int div = cpg_sd_clock_calc_div(clock, rate, parent_rate);
-       u32 val;
-       unsigned int i;
-
-       for (i = 0; i < clock->div_num; i++)
-               if (div == clock->div_table[i].div)
-                       break;
-
-       if (i >= clock->div_num)
-               return -EINVAL;
-
-       val = clk_readl(clock->reg);
-       val &= ~(CPG_SD_STP_MASK | CPG_SD_FC_MASK);
-       val |= clock->div_table[i].val & (CPG_SD_STP_MASK | CPG_SD_FC_MASK);
-       clk_writel(val, clock->reg);
-
-       return 0;
-}
-
-static const struct clk_ops cpg_sd_clock_ops = {
-       .enable = cpg_sd_clock_enable,
-       .disable = cpg_sd_clock_disable,
-       .is_enabled = cpg_sd_clock_is_enabled,
-       .recalc_rate = cpg_sd_clock_recalc_rate,
-       .round_rate = cpg_sd_clock_round_rate,
-       .set_rate = cpg_sd_clock_set_rate,
-};
-
-static struct clk * __init cpg_sd_clk_register(const struct cpg_core_clk *core,
-                                              void __iomem *base,
-                                              const char *parent_name)
-{
-       struct clk_init_data init;
-       struct sd_clock *clock;
-       struct clk *clk;
-       unsigned int i;
-
-       clock = kzalloc(sizeof(*clock), GFP_KERNEL);
-       if (!clock)
-               return ERR_PTR(-ENOMEM);
-
-       init.name = core->name;
-       init.ops = &cpg_sd_clock_ops;
-       init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT;
-       init.parent_names = &parent_name;
-       init.num_parents = 1;
-
-       clock->reg = base + core->offset;
-       clock->hw.init = &init;
-       clock->div_table = cpg_sd_div_table;
-       clock->div_num = ARRAY_SIZE(cpg_sd_div_table);
-
-       clock->div_max = clock->div_table[0].div;
-       clock->div_min = clock->div_max;
-       for (i = 1; i < clock->div_num; i++) {
-               clock->div_max = max(clock->div_max, clock->div_table[i].div);
-               clock->div_min = min(clock->div_min, clock->div_table[i].div);
-       }
-
-       clk = clk_register(NULL, &clock->hw);
-       if (IS_ERR(clk))
-               kfree(clock);
-
-       return clk;
-}
-
-#define CPG_PLL0CR     0x00d8
-#define CPG_PLL2CR     0x002c
-#define CPG_PLL4CR     0x01f4
 
 /*
  * CPG Clock Data
@@ -512,13 +283,7 @@ static struct clk * __init cpg_sd_clk_register(const struct cpg_core_clk *core,
                                         (((md) & BIT(19)) >> 18) | \
                                         (((md) & BIT(17)) >> 17))
 
-struct cpg_pll_config {
-       unsigned int extal_div;
-       unsigned int pll1_mult;
-       unsigned int pll3_mult;
-};
-
-static const struct cpg_pll_config cpg_pll_configs[16] __initconst = {
+static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[16] __initconst = {
        /* EXTAL div    PLL1 mult       PLL3 mult */
        { 1,            192,            192,    },
        { 1,            192,            128,    },
@@ -538,112 +303,9 @@ static const struct cpg_pll_config cpg_pll_configs[16] __initconst = {
        { 2,            192,            192,    },
 };
 
-static const struct cpg_pll_config *cpg_pll_config __initdata;
-
-static
-struct clk * __init r8a7795_cpg_clk_register(struct device *dev,
-                                            const struct cpg_core_clk *core,
-                                            const struct cpg_mssr_info *info,
-                                            struct clk **clks,
-                                            void __iomem *base)
-{
-       const struct clk *parent;
-       unsigned int mult = 1;
-       unsigned int div = 1;
-       u32 value;
-
-       parent = clks[core->parent];
-       if (IS_ERR(parent))
-               return ERR_CAST(parent);
-
-       switch (core->type) {
-       case CLK_TYPE_GEN3_MAIN:
-               div = cpg_pll_config->extal_div;
-               break;
-
-       case CLK_TYPE_GEN3_PLL0:
-               /*
-                * PLL0 is a configurable multiplier clock. Register it as a
-                * fixed factor clock for now as there's no generic multiplier
-                * clock implementation and we currently have no need to change
-                * the multiplier value.
-                */
-               value = readl(base + CPG_PLL0CR);
-               mult = (((value >> 24) & 0x7f) + 1) * 2;
-               break;
-
-       case CLK_TYPE_GEN3_PLL1:
-               mult = cpg_pll_config->pll1_mult;
-               break;
-
-       case CLK_TYPE_GEN3_PLL2:
-               /*
-                * PLL2 is a configurable multiplier clock. Register it as a
-                * fixed factor clock for now as there's no generic multiplier
-                * clock implementation and we currently have no need to change
-                * the multiplier value.
-                */
-               value = readl(base + CPG_PLL2CR);
-               mult = (((value >> 24) & 0x7f) + 1) * 2;
-               break;
-
-       case CLK_TYPE_GEN3_PLL3:
-               mult = cpg_pll_config->pll3_mult;
-               break;
-
-       case CLK_TYPE_GEN3_PLL4:
-               /*
-                * PLL4 is a configurable multiplier clock. Register it as a
-                * fixed factor clock for now as there's no generic multiplier
-                * clock implementation and we currently have no need to change
-                * the multiplier value.
-                */
-               value = readl(base + CPG_PLL4CR);
-               mult = (((value >> 24) & 0x7f) + 1) * 2;
-               break;
-
-       case CLK_TYPE_GEN3_SD:
-               return cpg_sd_clk_register(core, base, __clk_get_name(parent));
-
-       case CLK_TYPE_GEN3_R:
-               /* RINT is default. Only if EXTALR is populated, we switch to it */
-               value = readl(base + CPG_RCKCR) & 0x3f;
-
-               if (clk_get_rate(clks[CLK_EXTALR])) {
-                       parent = clks[CLK_EXTALR];
-                       value |= BIT(15);
-               }
-
-               writel(value, base + CPG_RCKCR);
-               break;
-
-       default:
-               return ERR_PTR(-EINVAL);
-       }
-
-       return clk_register_fixed_factor(NULL, core->name,
-                                        __clk_get_name(parent), 0, mult, div);
-}
-
-/*
- * Reset register definitions.
- */
-#define MODEMR 0xe6160060
-
-static u32 rcar_gen3_read_mode_pins(void)
-{
-       void __iomem *modemr = ioremap_nocache(MODEMR, 4);
-       u32 mode;
-
-       BUG_ON(!modemr);
-       mode = ioread32(modemr);
-       iounmap(modemr);
-
-       return mode;
-}
-
 static int __init r8a7795_cpg_mssr_init(struct device *dev)
 {
+       const struct rcar_gen3_cpg_pll_config *cpg_pll_config;
        u32 cpg_mode = rcar_gen3_read_mode_pins();
 
        cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)];
@@ -652,7 +314,7 @@ static int __init r8a7795_cpg_mssr_init(struct device *dev)
                return -EINVAL;
        }
 
-       return 0;
+       return rcar_gen3_cpg_init(cpg_pll_config, CLK_EXTALR);
 }
 
 const struct cpg_mssr_info r8a7795_cpg_mssr_info __initconst = {
@@ -673,5 +335,5 @@ const struct cpg_mssr_info r8a7795_cpg_mssr_info __initconst = {
 
        /* Callbacks */
        .init = r8a7795_cpg_mssr_init,
-       .cpg_clk_register = r8a7795_cpg_clk_register,
+       .cpg_clk_register = rcar_gen3_cpg_clk_register,
 };
diff --git a/drivers/clk/renesas/r8a7796-cpg-mssr.c b/drivers/clk/renesas/r8a7796-cpg-mssr.c
new file mode 100644 (file)
index 0000000..c84b549
--- /dev/null
@@ -0,0 +1,192 @@
+/*
+ * r8a7796 Clock Pulse Generator / Module Standby and Software Reset
+ *
+ * Copyright (C) 2016 Glider bvba
+ *
+ * Based on r8a7795-cpg-mssr.c
+ *
+ * Copyright (C) 2015 Glider bvba
+ * Copyright (C) 2015 Renesas Electronics Corp.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ */
+
+#include <linux/device.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+
+#include <dt-bindings/clock/r8a7796-cpg-mssr.h>
+
+#include "renesas-cpg-mssr.h"
+#include "rcar-gen3-cpg.h"
+
+enum clk_ids {
+       /* Core Clock Outputs exported to DT */
+       LAST_DT_CORE_CLK = R8A7796_CLK_OSC,
+
+       /* External Input Clocks */
+       CLK_EXTAL,
+       CLK_EXTALR,
+
+       /* Internal Core Clocks */
+       CLK_MAIN,
+       CLK_PLL0,
+       CLK_PLL1,
+       CLK_PLL2,
+       CLK_PLL3,
+       CLK_PLL4,
+       CLK_PLL1_DIV2,
+       CLK_PLL1_DIV4,
+       CLK_S0,
+       CLK_S1,
+       CLK_S2,
+       CLK_S3,
+       CLK_SDSRC,
+       CLK_SSPSRC,
+
+       /* Module Clocks */
+       MOD_CLK_BASE
+};
+
+static const struct cpg_core_clk r8a7796_core_clks[] __initconst = {
+       /* External Clock Inputs */
+       DEF_INPUT("extal",  CLK_EXTAL),
+       DEF_INPUT("extalr", CLK_EXTALR),
+
+       /* Internal Core Clocks */
+       DEF_BASE(".main",       CLK_MAIN, CLK_TYPE_GEN3_MAIN, CLK_EXTAL),
+       DEF_BASE(".pll0",       CLK_PLL0, CLK_TYPE_GEN3_PLL0, CLK_MAIN),
+       DEF_BASE(".pll1",       CLK_PLL1, CLK_TYPE_GEN3_PLL1, CLK_MAIN),
+       DEF_BASE(".pll2",       CLK_PLL2, CLK_TYPE_GEN3_PLL2, CLK_MAIN),
+       DEF_BASE(".pll3",       CLK_PLL3, CLK_TYPE_GEN3_PLL3, CLK_MAIN),
+       DEF_BASE(".pll4",       CLK_PLL4, CLK_TYPE_GEN3_PLL4, CLK_MAIN),
+
+       DEF_FIXED(".pll1_div2", CLK_PLL1_DIV2,     CLK_PLL1,       2, 1),
+       DEF_FIXED(".pll1_div4", CLK_PLL1_DIV4,     CLK_PLL1_DIV2,  2, 1),
+       DEF_FIXED(".s0",        CLK_S0,            CLK_PLL1_DIV2,  2, 1),
+       DEF_FIXED(".s1",        CLK_S1,            CLK_PLL1_DIV2,  3, 1),
+       DEF_FIXED(".s2",        CLK_S2,            CLK_PLL1_DIV2,  4, 1),
+       DEF_FIXED(".s3",        CLK_S3,            CLK_PLL1_DIV2,  6, 1),
+
+       /* Core Clock Outputs */
+       DEF_FIXED("ztr",        R8A7796_CLK_ZTR,   CLK_PLL1_DIV2,  6, 1),
+       DEF_FIXED("ztrd2",      R8A7796_CLK_ZTRD2, CLK_PLL1_DIV2, 12, 1),
+       DEF_FIXED("zt",         R8A7796_CLK_ZT,    CLK_PLL1_DIV2,  4, 1),
+       DEF_FIXED("zx",         R8A7796_CLK_ZX,    CLK_PLL1_DIV2,  2, 1),
+       DEF_FIXED("s0d1",       R8A7796_CLK_S0D1,  CLK_S0,         1, 1),
+       DEF_FIXED("s0d2",       R8A7796_CLK_S0D2,  CLK_S0,         2, 1),
+       DEF_FIXED("s0d3",       R8A7796_CLK_S0D3,  CLK_S0,         3, 1),
+       DEF_FIXED("s0d4",       R8A7796_CLK_S0D4,  CLK_S0,         4, 1),
+       DEF_FIXED("s0d6",       R8A7796_CLK_S0D6,  CLK_S0,         6, 1),
+       DEF_FIXED("s0d8",       R8A7796_CLK_S0D8,  CLK_S0,         8, 1),
+       DEF_FIXED("s0d12",      R8A7796_CLK_S0D12, CLK_S0,        12, 1),
+       DEF_FIXED("s1d1",       R8A7796_CLK_S1D1,  CLK_S1,         1, 1),
+       DEF_FIXED("s1d2",       R8A7796_CLK_S1D2,  CLK_S1,         2, 1),
+       DEF_FIXED("s1d4",       R8A7796_CLK_S1D4,  CLK_S1,         4, 1),
+       DEF_FIXED("s2d1",       R8A7796_CLK_S2D1,  CLK_S2,         1, 1),
+       DEF_FIXED("s2d2",       R8A7796_CLK_S2D2,  CLK_S2,         2, 1),
+       DEF_FIXED("s2d4",       R8A7796_CLK_S2D4,  CLK_S2,         4, 1),
+       DEF_FIXED("s3d1",       R8A7796_CLK_S3D1,  CLK_S3,         1, 1),
+       DEF_FIXED("s3d2",       R8A7796_CLK_S3D2,  CLK_S3,         2, 1),
+       DEF_FIXED("s3d4",       R8A7796_CLK_S3D4,  CLK_S3,         4, 1),
+
+       DEF_FIXED("cl",         R8A7796_CLK_CL,    CLK_PLL1_DIV2, 48, 1),
+       DEF_FIXED("cp",         R8A7796_CLK_CP,    CLK_EXTAL,      2, 1),
+};
+
+static const struct mssr_mod_clk r8a7796_mod_clks[] __initconst = {
+       DEF_MOD("scif2",                 310,   R8A7796_CLK_S3D4),
+       DEF_MOD("intc-ap",               408,   R8A7796_CLK_S3D1),
+};
+
+static const unsigned int r8a7796_crit_mod_clks[] __initconst = {
+       MOD_CLK_ID(408),        /* INTC-AP (GIC) */
+};
+
+
+/*
+ * CPG Clock Data
+ */
+
+/*
+ *   MD                EXTAL           PLL0    PLL1    PLL2    PLL3    PLL4
+ * 14 13 19 17 (MHz)
+ *-------------------------------------------------------------------
+ * 0  0  0  0  16.66 x 1       x180    x192    x144    x192    x144
+ * 0  0  0  1  16.66 x 1       x180    x192    x144    x128    x144
+ * 0  0  1  0  Prohibited setting
+ * 0  0  1  1  16.66 x 1       x180    x192    x144    x192    x144
+ * 0  1  0  0  20    x 1       x150    x160    x120    x160    x120
+ * 0  1  0  1  20    x 1       x150    x160    x120    x106    x120
+ * 0  1  1  0  Prohibited setting
+ * 0  1  1  1  20    x 1       x150    x160    x120    x160    x120
+ * 1  0  0  0  25    x 1       x120    x128    x96     x128    x96
+ * 1  0  0  1  25    x 1       x120    x128    x96     x84     x96
+ * 1  0  1  0  Prohibited setting
+ * 1  0  1  1  25    x 1       x120    x128    x96     x128    x96
+ * 1  1  0  0  33.33 / 2       x180    x192    x144    x192    x144
+ * 1  1  0  1  33.33 / 2       x180    x192    x144    x128    x144
+ * 1  1  1  0  Prohibited setting
+ * 1  1  1  1  33.33 / 2       x180    x192    x144    x192    x144
+ */
+#define CPG_PLL_CONFIG_INDEX(md)       ((((md) & BIT(14)) >> 11) | \
+                                        (((md) & BIT(13)) >> 11) | \
+                                        (((md) & BIT(19)) >> 18) | \
+                                        (((md) & BIT(17)) >> 17))
+
+static const struct rcar_gen3_cpg_pll_config cpg_pll_configs[16] __initconst = {
+       /* EXTAL div    PLL1 mult       PLL3 mult */
+       { 1,            192,            192,    },
+       { 1,            192,            128,    },
+       { 0, /* Prohibited setting */           },
+       { 1,            192,            192,    },
+       { 1,            160,            160,    },
+       { 1,            160,            106,    },
+       { 0, /* Prohibited setting */           },
+       { 1,            160,            160,    },
+       { 1,            128,            128,    },
+       { 1,            128,            84,     },
+       { 0, /* Prohibited setting */           },
+       { 1,            128,            128,    },
+       { 2,            192,            192,    },
+       { 2,            192,            128,    },
+       { 0, /* Prohibited setting */           },
+       { 2,            192,            192,    },
+};
+
+static int __init r8a7796_cpg_mssr_init(struct device *dev)
+{
+       const struct rcar_gen3_cpg_pll_config *cpg_pll_config;
+       u32 cpg_mode = rcar_gen3_read_mode_pins();
+
+       cpg_pll_config = &cpg_pll_configs[CPG_PLL_CONFIG_INDEX(cpg_mode)];
+       if (!cpg_pll_config->extal_div) {
+               dev_err(dev, "Prohibited setting (cpg_mode=0x%x)\n", cpg_mode);
+               return -EINVAL;
+       }
+
+       return rcar_gen3_cpg_init(cpg_pll_config, CLK_EXTALR);
+}
+
+const struct cpg_mssr_info r8a7796_cpg_mssr_info __initconst = {
+       /* Core Clocks */
+       .core_clks = r8a7796_core_clks,
+       .num_core_clks = ARRAY_SIZE(r8a7796_core_clks),
+       .last_dt_core_clk = LAST_DT_CORE_CLK,
+       .num_total_core_clks = MOD_CLK_BASE,
+
+       /* Module Clocks */
+       .mod_clks = r8a7796_mod_clks,
+       .num_mod_clks = ARRAY_SIZE(r8a7796_mod_clks),
+       .num_hw_mod_clks = 12 * 32,
+
+       /* Critical Module Clocks */
+       .crit_mod_clks = r8a7796_crit_mod_clks,
+       .num_crit_mod_clks = ARRAY_SIZE(r8a7796_crit_mod_clks),
+
+       /* Callbacks */
+       .init = r8a7796_cpg_mssr_init,
+       .cpg_clk_register = rcar_gen3_cpg_clk_register,
+};
diff --git a/drivers/clk/renesas/rcar-gen3-cpg.c b/drivers/clk/renesas/rcar-gen3-cpg.c
new file mode 100644 (file)
index 0000000..bb4f2f9
--- /dev/null
@@ -0,0 +1,359 @@
+/*
+ * R-Car Gen3 Clock Pulse Generator
+ *
+ * Copyright (C) 2015-2016 Glider bvba
+ *
+ * Based on clk-rcar-gen3.c
+ *
+ * Copyright (C) 2015 Renesas Electronics Corp.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ */
+
+#include <linux/bug.h>
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/slab.h>
+
+#include "renesas-cpg-mssr.h"
+#include "rcar-gen3-cpg.h"
+
+#define CPG_PLL0CR             0x00d8
+#define CPG_PLL2CR             0x002c
+#define CPG_PLL4CR             0x01f4
+
+
+/*
+ * SDn Clock
+ */
+#define CPG_SD_STP_HCK         BIT(9)
+#define CPG_SD_STP_CK          BIT(8)
+
+#define CPG_SD_STP_MASK                (CPG_SD_STP_HCK | CPG_SD_STP_CK)
+#define CPG_SD_FC_MASK         (0x7 << 2 | 0x3 << 0)
+
+#define CPG_SD_DIV_TABLE_DATA(stp_hck, stp_ck, sd_srcfc, sd_fc, sd_div) \
+{ \
+       .val = ((stp_hck) ? CPG_SD_STP_HCK : 0) | \
+              ((stp_ck) ? CPG_SD_STP_CK : 0) | \
+              ((sd_srcfc) << 2) | \
+              ((sd_fc) << 0), \
+       .div = (sd_div), \
+}
+
+struct sd_div_table {
+       u32 val;
+       unsigned int div;
+};
+
+struct sd_clock {
+       struct clk_hw hw;
+       void __iomem *reg;
+       const struct sd_div_table *div_table;
+       unsigned int div_num;
+       unsigned int div_min;
+       unsigned int div_max;
+};
+
+/* SDn divider
+ *                     sd_srcfc   sd_fc   div
+ * stp_hck   stp_ck    (div)      (div)     = sd_srcfc x sd_fc
+ *-------------------------------------------------------------------
+ *  0         0         0 (1)      1 (4)      4
+ *  0         0         1 (2)      1 (4)      8
+ *  1         0         2 (4)      1 (4)     16
+ *  1         0         3 (8)      1 (4)     32
+ *  1         0         4 (16)     1 (4)     64
+ *  0         0         0 (1)      0 (2)      2
+ *  0         0         1 (2)      0 (2)      4
+ *  1         0         2 (4)      0 (2)      8
+ *  1         0         3 (8)      0 (2)     16
+ *  1         0         4 (16)     0 (2)     32
+ */
+static const struct sd_div_table cpg_sd_div_table[] = {
+/*     CPG_SD_DIV_TABLE_DATA(stp_hck,  stp_ck,   sd_srcfc,   sd_fc,  sd_div) */
+       CPG_SD_DIV_TABLE_DATA(0,        0,        0,          1,        4),
+       CPG_SD_DIV_TABLE_DATA(0,        0,        1,          1,        8),
+       CPG_SD_DIV_TABLE_DATA(1,        0,        2,          1,       16),
+       CPG_SD_DIV_TABLE_DATA(1,        0,        3,          1,       32),
+       CPG_SD_DIV_TABLE_DATA(1,        0,        4,          1,       64),
+       CPG_SD_DIV_TABLE_DATA(0,        0,        0,          0,        2),
+       CPG_SD_DIV_TABLE_DATA(0,        0,        1,          0,        4),
+       CPG_SD_DIV_TABLE_DATA(1,        0,        2,          0,        8),
+       CPG_SD_DIV_TABLE_DATA(1,        0,        3,          0,       16),
+       CPG_SD_DIV_TABLE_DATA(1,        0,        4,          0,       32),
+};
+
+#define to_sd_clock(_hw) container_of(_hw, struct sd_clock, hw)
+
+static int cpg_sd_clock_enable(struct clk_hw *hw)
+{
+       struct sd_clock *clock = to_sd_clock(hw);
+       u32 val, sd_fc;
+       unsigned int i;
+
+       val = clk_readl(clock->reg);
+
+       sd_fc = val & CPG_SD_FC_MASK;
+       for (i = 0; i < clock->div_num; i++)
+               if (sd_fc == (clock->div_table[i].val & CPG_SD_FC_MASK))
+                       break;
+
+       if (i >= clock->div_num)
+               return -EINVAL;
+
+       val &= ~(CPG_SD_STP_MASK);
+       val |= clock->div_table[i].val & CPG_SD_STP_MASK;
+
+       clk_writel(val, clock->reg);
+
+       return 0;
+}
+
+static void cpg_sd_clock_disable(struct clk_hw *hw)
+{
+       struct sd_clock *clock = to_sd_clock(hw);
+
+       clk_writel(clk_readl(clock->reg) | CPG_SD_STP_MASK, clock->reg);
+}
+
+static int cpg_sd_clock_is_enabled(struct clk_hw *hw)
+{
+       struct sd_clock *clock = to_sd_clock(hw);
+
+       return !(clk_readl(clock->reg) & CPG_SD_STP_MASK);
+}
+
+static unsigned long cpg_sd_clock_recalc_rate(struct clk_hw *hw,
+                                               unsigned long parent_rate)
+{
+       struct sd_clock *clock = to_sd_clock(hw);
+       unsigned long rate = parent_rate;
+       u32 val, sd_fc;
+       unsigned int i;
+
+       val = clk_readl(clock->reg);
+
+       sd_fc = val & CPG_SD_FC_MASK;
+       for (i = 0; i < clock->div_num; i++)
+               if (sd_fc == (clock->div_table[i].val & CPG_SD_FC_MASK))
+                       break;
+
+       if (i >= clock->div_num)
+               return -EINVAL;
+
+       return DIV_ROUND_CLOSEST(rate, clock->div_table[i].div);
+}
+
+static unsigned int cpg_sd_clock_calc_div(struct sd_clock *clock,
+                                         unsigned long rate,
+                                         unsigned long parent_rate)
+{
+       unsigned int div;
+
+       if (!rate)
+               rate = 1;
+
+       div = DIV_ROUND_CLOSEST(parent_rate, rate);
+
+       return clamp_t(unsigned int, div, clock->div_min, clock->div_max);
+}
+
+static long cpg_sd_clock_round_rate(struct clk_hw *hw, unsigned long rate,
+                                     unsigned long *parent_rate)
+{
+       struct sd_clock *clock = to_sd_clock(hw);
+       unsigned int div = cpg_sd_clock_calc_div(clock, rate, *parent_rate);
+
+       return DIV_ROUND_CLOSEST(*parent_rate, div);
+}
+
+static int cpg_sd_clock_set_rate(struct clk_hw *hw, unsigned long rate,
+                                  unsigned long parent_rate)
+{
+       struct sd_clock *clock = to_sd_clock(hw);
+       unsigned int div = cpg_sd_clock_calc_div(clock, rate, parent_rate);
+       u32 val;
+       unsigned int i;
+
+       for (i = 0; i < clock->div_num; i++)
+               if (div == clock->div_table[i].div)
+                       break;
+
+       if (i >= clock->div_num)
+               return -EINVAL;
+
+       val = clk_readl(clock->reg);
+       val &= ~(CPG_SD_STP_MASK | CPG_SD_FC_MASK);
+       val |= clock->div_table[i].val & (CPG_SD_STP_MASK | CPG_SD_FC_MASK);
+       clk_writel(val, clock->reg);
+
+       return 0;
+}
+
+static const struct clk_ops cpg_sd_clock_ops = {
+       .enable = cpg_sd_clock_enable,
+       .disable = cpg_sd_clock_disable,
+       .is_enabled = cpg_sd_clock_is_enabled,
+       .recalc_rate = cpg_sd_clock_recalc_rate,
+       .round_rate = cpg_sd_clock_round_rate,
+       .set_rate = cpg_sd_clock_set_rate,
+};
+
+static struct clk * __init cpg_sd_clk_register(const struct cpg_core_clk *core,
+                                              void __iomem *base,
+                                              const char *parent_name)
+{
+       struct clk_init_data init;
+       struct sd_clock *clock;
+       struct clk *clk;
+       unsigned int i;
+
+       clock = kzalloc(sizeof(*clock), GFP_KERNEL);
+       if (!clock)
+               return ERR_PTR(-ENOMEM);
+
+       init.name = core->name;
+       init.ops = &cpg_sd_clock_ops;
+       init.flags = CLK_IS_BASIC | CLK_SET_RATE_PARENT;
+       init.parent_names = &parent_name;
+       init.num_parents = 1;
+
+       clock->reg = base + core->offset;
+       clock->hw.init = &init;
+       clock->div_table = cpg_sd_div_table;
+       clock->div_num = ARRAY_SIZE(cpg_sd_div_table);
+
+       clock->div_max = clock->div_table[0].div;
+       clock->div_min = clock->div_max;
+       for (i = 1; i < clock->div_num; i++) {
+               clock->div_max = max(clock->div_max, clock->div_table[i].div);
+               clock->div_min = min(clock->div_min, clock->div_table[i].div);
+       }
+
+       clk = clk_register(NULL, &clock->hw);
+       if (IS_ERR(clk))
+               kfree(clock);
+
+       return clk;
+}
+
+
+static const struct rcar_gen3_cpg_pll_config *cpg_pll_config __initdata;
+static unsigned int cpg_clk_extalr __initdata;
+
+struct clk * __init rcar_gen3_cpg_clk_register(struct device *dev,
+       const struct cpg_core_clk *core, const struct cpg_mssr_info *info,
+       struct clk **clks, void __iomem *base)
+{
+       const struct clk *parent;
+       unsigned int mult = 1;
+       unsigned int div = 1;
+       u32 value;
+
+       parent = clks[core->parent];
+       if (IS_ERR(parent))
+               return ERR_CAST(parent);
+
+       switch (core->type) {
+       case CLK_TYPE_GEN3_MAIN:
+               div = cpg_pll_config->extal_div;
+               break;
+
+       case CLK_TYPE_GEN3_PLL0:
+               /*
+                * PLL0 is a configurable multiplier clock. Register it as a
+                * fixed factor clock for now as there's no generic multiplier
+                * clock implementation and we currently have no need to change
+                * the multiplier value.
+                */
+               value = readl(base + CPG_PLL0CR);
+               mult = (((value >> 24) & 0x7f) + 1) * 2;
+               break;
+
+       case CLK_TYPE_GEN3_PLL1:
+               mult = cpg_pll_config->pll1_mult;
+               break;
+
+       case CLK_TYPE_GEN3_PLL2:
+               /*
+                * PLL2 is a configurable multiplier clock. Register it as a
+                * fixed factor clock for now as there's no generic multiplier
+                * clock implementation and we currently have no need to change
+                * the multiplier value.
+                */
+               value = readl(base + CPG_PLL2CR);
+               mult = (((value >> 24) & 0x7f) + 1) * 2;
+               break;
+
+       case CLK_TYPE_GEN3_PLL3:
+               mult = cpg_pll_config->pll3_mult;
+               break;
+
+       case CLK_TYPE_GEN3_PLL4:
+               /*
+                * PLL4 is a configurable multiplier clock. Register it as a
+                * fixed factor clock for now as there's no generic multiplier
+                * clock implementation and we currently have no need to change
+                * the multiplier value.
+                */
+               value = readl(base + CPG_PLL4CR);
+               mult = (((value >> 24) & 0x7f) + 1) * 2;
+               break;
+
+       case CLK_TYPE_GEN3_SD:
+               return cpg_sd_clk_register(core, base, __clk_get_name(parent));
+
+       case CLK_TYPE_GEN3_R:
+               /*
+                * RINT is default.
+                * Only if EXTALR is populated, we switch to it.
+                */
+               value = readl(base + CPG_RCKCR) & 0x3f;
+
+               if (clk_get_rate(clks[cpg_clk_extalr])) {
+                       parent = clks[cpg_clk_extalr];
+                       value |= BIT(15);
+               }
+
+               writel(value, base + CPG_RCKCR);
+               break;
+
+       default:
+               return ERR_PTR(-EINVAL);
+       }
+
+       return clk_register_fixed_factor(NULL, core->name,
+                                        __clk_get_name(parent), 0, mult, div);
+}
+
+/*
+ * Reset register definitions.
+ */
+#define MODEMR 0xe6160060
+
+u32 __init rcar_gen3_read_mode_pins(void)
+{
+       void __iomem *modemr = ioremap_nocache(MODEMR, 4);
+       u32 mode;
+
+       BUG_ON(!modemr);
+       mode = ioread32(modemr);
+       iounmap(modemr);
+
+       return mode;
+}
+
+int __init rcar_gen3_cpg_init(const struct rcar_gen3_cpg_pll_config *config,
+                             unsigned int clk_extalr)
+{
+       cpg_pll_config = config;
+       cpg_clk_extalr = clk_extalr;
+       return 0;
+}
diff --git a/drivers/clk/renesas/rcar-gen3-cpg.h b/drivers/clk/renesas/rcar-gen3-cpg.h
new file mode 100644 (file)
index 0000000..f699085
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * R-Car Gen3 Clock Pulse Generator
+ *
+ * Copyright (C) 2015-2016 Glider bvba
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ */
+
+#ifndef __CLK_RENESAS_RCAR_GEN3_CPG_H__
+#define __CLK_RENESAS_RCAR_GEN3_CPG_H__
+
+enum rcar_gen3_clk_types {
+       CLK_TYPE_GEN3_MAIN = CLK_TYPE_CUSTOM,
+       CLK_TYPE_GEN3_PLL0,
+       CLK_TYPE_GEN3_PLL1,
+       CLK_TYPE_GEN3_PLL2,
+       CLK_TYPE_GEN3_PLL3,
+       CLK_TYPE_GEN3_PLL4,
+       CLK_TYPE_GEN3_SD,
+       CLK_TYPE_GEN3_R,
+};
+
+#define DEF_GEN3_SD(_name, _id, _parent, _offset)      \
+       DEF_BASE(_name, _id, CLK_TYPE_GEN3_SD, _parent, .offset = _offset)
+
+struct rcar_gen3_cpg_pll_config {
+       unsigned int extal_div;
+       unsigned int pll1_mult;
+       unsigned int pll3_mult;
+};
+
+#define CPG_RCKCR      0x240
+
+u32 rcar_gen3_read_mode_pins(void);
+struct clk *rcar_gen3_cpg_clk_register(struct device *dev,
+       const struct cpg_core_clk *core, const struct cpg_mssr_info *info,
+       struct clk **clks, void __iomem *base);
+int rcar_gen3_cpg_init(const struct rcar_gen3_cpg_pll_config *config,
+                      unsigned int clk_extalr);
+
+#endif
index 210cd744a7a97bbd278ae7f671bf5b2403d4af1e..e1365e7491ae02a0519ec94aaea92baa5f58d55e 100644 (file)
@@ -508,6 +508,12 @@ static const struct of_device_id cpg_mssr_match[] = {
                .compatible = "renesas,r8a7795-cpg-mssr",
                .data = &r8a7795_cpg_mssr_info,
        },
+#endif
+#ifdef CONFIG_ARCH_R8A7796
+       {
+               .compatible = "renesas,r8a7796-cpg-mssr",
+               .data = &r8a7796_cpg_mssr_info,
+       },
 #endif
        { /* sentinel */ }
 };
index 0d1e3e811e79bf431c0640667af9343b92a3cbf0..ee7edfaf14089cefbd5949a484334c8de7d181dc 100644 (file)
@@ -131,4 +131,5 @@ struct cpg_mssr_info {
 };
 
 extern const struct cpg_mssr_info r8a7795_cpg_mssr_info;
+extern const struct cpg_mssr_info r8a7796_cpg_mssr_info;
 #endif
index 4bb130cd006275f5c70e27bcda7a746a00c76d34..05b3d73bfefaacdd54c6123609165d6d2d8481d8 100644 (file)
@@ -321,9 +321,9 @@ struct clk *rockchip_clk_register_cpuclk(const char *name,
        }
 
        cclk = clk_register(NULL, &cpuclk->hw);
-       if (IS_ERR(clk)) {
+       if (IS_ERR(cclk)) {
                pr_err("%s: could not register cpuclk %s\n", __func__,  name);
-               ret = PTR_ERR(clk);
+               ret = PTR_ERR(cclk);
                goto free_rate_table;
        }
 
index bc856f21f6b20d35e2c421c51a54e1718274302e..077fcdc7908bb9f3791fe20bc60a0266327ca050 100644 (file)
@@ -41,8 +41,6 @@ static unsigned long rockchip_mmc_recalc(struct clk_hw *hw,
 #define ROCKCHIP_MMC_DEGREE_MASK 0x3
 #define ROCKCHIP_MMC_DELAYNUM_OFFSET 2
 #define ROCKCHIP_MMC_DELAYNUM_MASK (0xff << ROCKCHIP_MMC_DELAYNUM_OFFSET)
-#define ROCKCHIP_MMC_INIT_STATE_RESET 0x1
-#define ROCKCHIP_MMC_INIT_STATE_SHIFT 1
 
 #define PSECS_PER_SEC 1000000000000LL
 
@@ -154,6 +152,7 @@ struct clk *rockchip_clk_register_mmc(const char *name,
                return ERR_PTR(-ENOMEM);
 
        init.name = name;
+       init.flags = 0;
        init.num_parents = num_parents;
        init.parent_names = parent_names;
        init.ops = &rockchip_mmc_clk_ops;
@@ -162,15 +161,6 @@ struct clk *rockchip_clk_register_mmc(const char *name,
        mmc_clock->reg = reg;
        mmc_clock->shift = shift;
 
-       /*
-        * Assert init_state to soft reset the CLKGEN
-        * for mmc tuning phase and degree
-        */
-       if (mmc_clock->shift == ROCKCHIP_MMC_INIT_STATE_SHIFT)
-               writel(HIWORD_UPDATE(ROCKCHIP_MMC_INIT_STATE_RESET,
-                                    ROCKCHIP_MMC_INIT_STATE_RESET,
-                                    mmc_clock->shift), mmc_clock->reg);
-
        clk = clk_register(NULL, &mmc_clock->hw);
        if (IS_ERR(clk))
                kfree(mmc_clock);
index 291543f52caad63630b45cf3500d94e2bf4f9733..8059a8d3ea36430e359e4857b33b58a5f4952aec 100644 (file)
@@ -832,9 +832,9 @@ static struct rockchip_clk_branch rk3399_clk_branches[] __initdata = {
                        RK3399_CLKGATE_CON(13), 1, GFLAGS),
 
        /* perihp */
-       GATE(0, "cpll_aclk_perihp_src", "gpll", CLK_IGNORE_UNUSED,
+       GATE(0, "cpll_aclk_perihp_src", "cpll", CLK_IGNORE_UNUSED,
                        RK3399_CLKGATE_CON(5), 0, GFLAGS),
-       GATE(0, "gpll_aclk_perihp_src", "cpll", CLK_IGNORE_UNUSED,
+       GATE(0, "gpll_aclk_perihp_src", "gpll", CLK_IGNORE_UNUSED,
                        RK3399_CLKGATE_CON(5), 1, GFLAGS),
        COMPOSITE(ACLK_PERIHP, "aclk_perihp", mux_aclk_perihp_p, CLK_IGNORE_UNUSED,
                        RK3399_CLKSEL_CON(14), 7, 1, MFLAGS, 0, 5, DFLAGS,
@@ -1466,6 +1466,8 @@ static struct rockchip_clk_branch rk3399_clk_pmu_branches[] __initdata = {
 
 static const char *const rk3399_cru_critical_clocks[] __initconst = {
        "aclk_cci_pre",
+       "aclk_gic",
+       "aclk_gic_noc",
        "pclk_perilp0",
        "pclk_perilp0",
        "hclk_perilp0",
@@ -1508,6 +1510,7 @@ static void __init rk3399_clk_init(struct device_node *np)
        ctx = rockchip_clk_init(np, reg_base, CLK_NR_CLKS);
        if (IS_ERR(ctx)) {
                pr_err("%s: rockchip clk init failed\n", __func__);
+               iounmap(reg_base);
                return;
        }
 
@@ -1553,6 +1556,7 @@ static void __init rk3399_pmu_clk_init(struct device_node *np)
        ctx = rockchip_clk_init(np, reg_base, CLKPMU_NR_CLKS);
        if (IS_ERR(ctx)) {
                pr_err("%s: rockchip pmu clk init failed\n", __func__);
+               iounmap(reg_base);
                return;
        }
 
index 813003d6ce097f4bbbda48e7d471b73388b611ac..8bf7e805fd34913ad08622824309753a86850b3a 100644 (file)
 #define E4210_DIV_STAT_CPU0    0x400
 #define E4210_DIV_STAT_CPU1    0x404
 
+#define E5433_MUX_SEL2         0x008
+#define E5433_MUX_STAT2                0x208
+#define E5433_DIV_CPU0         0x400
+#define E5433_DIV_CPU1         0x404
+#define E5433_DIV_STAT_CPU0    0x500
+#define E5433_DIV_STAT_CPU1    0x504
+
 #define E4210_DIV0_RATIO0_MASK 0x7
 #define E4210_DIV1_HPM_MASK    (0x7 << 4)
 #define E4210_DIV1_COPY_MASK   (0x7 << 0)
@@ -252,6 +259,102 @@ static int exynos_cpuclk_post_rate_change(struct clk_notifier_data *ndata,
        return 0;
 }
 
+/*
+ * Helper function to set the 'safe' dividers for the CPU clock. The parameters
+ * div and mask contain the divider value and the register bit mask of the
+ * dividers to be programmed.
+ */
+static void exynos5433_set_safe_div(void __iomem *base, unsigned long div,
+                                       unsigned long mask)
+{
+       unsigned long div0;
+
+       div0 = readl(base + E5433_DIV_CPU0);
+       div0 = (div0 & ~mask) | (div & mask);
+       writel(div0, base + E5433_DIV_CPU0);
+       wait_until_divider_stable(base + E5433_DIV_STAT_CPU0, mask);
+}
+
+/* handler for pre-rate change notification from parent clock */
+static int exynos5433_cpuclk_pre_rate_change(struct clk_notifier_data *ndata,
+                       struct exynos_cpuclk *cpuclk, void __iomem *base)
+{
+       const struct exynos_cpuclk_cfg_data *cfg_data = cpuclk->cfg;
+       unsigned long alt_prate = clk_get_rate(cpuclk->alt_parent);
+       unsigned long alt_div = 0, alt_div_mask = DIV_MASK;
+       unsigned long div0, div1 = 0, mux_reg;
+       unsigned long flags;
+
+       /* find out the divider values to use for clock data */
+       while ((cfg_data->prate * 1000) != ndata->new_rate) {
+               if (cfg_data->prate == 0)
+                       return -EINVAL;
+               cfg_data++;
+       }
+
+       spin_lock_irqsave(cpuclk->lock, flags);
+
+       /*
+        * For the selected PLL clock frequency, get the pre-defined divider
+        * values.
+        */
+       div0 = cfg_data->div0;
+       div1 = cfg_data->div1;
+
+       /*
+        * If the old parent clock speed is less than the clock speed of
+        * the alternate parent, then it should be ensured that at no point
+        * the armclk speed is more than the old_prate until the dividers are
+        * set.  Also workaround the issue of the dividers being set to lower
+        * values before the parent clock speed is set to new lower speed
+        * (this can result in too high speed of armclk output clocks).
+        */
+       if (alt_prate > ndata->old_rate || ndata->old_rate > ndata->new_rate) {
+               unsigned long tmp_rate = min(ndata->old_rate, ndata->new_rate);
+
+               alt_div = DIV_ROUND_UP(alt_prate, tmp_rate) - 1;
+               WARN_ON(alt_div >= MAX_DIV);
+
+               exynos5433_set_safe_div(base, alt_div, alt_div_mask);
+               div0 |= alt_div;
+       }
+
+       /* select the alternate parent */
+       mux_reg = readl(base + E5433_MUX_SEL2);
+       writel(mux_reg | 1, base + E5433_MUX_SEL2);
+       wait_until_mux_stable(base + E5433_MUX_STAT2, 0, 2);
+
+       /* alternate parent is active now. set the dividers */
+       writel(div0, base + E5433_DIV_CPU0);
+       wait_until_divider_stable(base + E5433_DIV_STAT_CPU0, DIV_MASK_ALL);
+
+       writel(div1, base + E5433_DIV_CPU1);
+       wait_until_divider_stable(base + E5433_DIV_STAT_CPU1, DIV_MASK_ALL);
+
+       spin_unlock_irqrestore(cpuclk->lock, flags);
+       return 0;
+}
+
+/* handler for post-rate change notification from parent clock */
+static int exynos5433_cpuclk_post_rate_change(struct clk_notifier_data *ndata,
+                       struct exynos_cpuclk *cpuclk, void __iomem *base)
+{
+       unsigned long div = 0, div_mask = DIV_MASK;
+       unsigned long mux_reg;
+       unsigned long flags;
+
+       spin_lock_irqsave(cpuclk->lock, flags);
+
+       /* select apll as the alternate parent */
+       mux_reg = readl(base + E5433_MUX_SEL2);
+       writel(mux_reg & ~1, base + E5433_MUX_SEL2);
+       wait_until_mux_stable(base + E5433_MUX_STAT2, 0, 1);
+
+       exynos5433_set_safe_div(base, div, div_mask);
+       spin_unlock_irqrestore(cpuclk->lock, flags);
+       return 0;
+}
+
 /*
  * This notifier function is called for the pre-rate and post-rate change
  * notifications of the parent clock of cpuclk.
@@ -275,6 +378,29 @@ static int exynos_cpuclk_notifier_cb(struct notifier_block *nb,
        return notifier_from_errno(err);
 }
 
+/*
+ * This notifier function is called for the pre-rate and post-rate change
+ * notifications of the parent clock of cpuclk.
+ */
+static int exynos5433_cpuclk_notifier_cb(struct notifier_block *nb,
+                               unsigned long event, void *data)
+{
+       struct clk_notifier_data *ndata = data;
+       struct exynos_cpuclk *cpuclk;
+       void __iomem *base;
+       int err = 0;
+
+       cpuclk = container_of(nb, struct exynos_cpuclk, clk_nb);
+       base = cpuclk->ctrl_base;
+
+       if (event == PRE_RATE_CHANGE)
+               err = exynos5433_cpuclk_pre_rate_change(ndata, cpuclk, base);
+       else if (event == POST_RATE_CHANGE)
+               err = exynos5433_cpuclk_post_rate_change(ndata, cpuclk, base);
+
+       return notifier_from_errno(err);
+}
+
 /* helper function to register a CPU clock */
 int __init exynos_register_cpu_clock(struct samsung_clk_provider *ctx,
                unsigned int lookup_id, const char *name, const char *parent,
@@ -301,7 +427,10 @@ int __init exynos_register_cpu_clock(struct samsung_clk_provider *ctx,
        cpuclk->ctrl_base = ctx->reg_base + offset;
        cpuclk->lock = &ctx->lock;
        cpuclk->flags = flags;
-       cpuclk->clk_nb.notifier_call = exynos_cpuclk_notifier_cb;
+       if (flags & CLK_CPU_HAS_E5433_REGS_LAYOUT)
+               cpuclk->clk_nb.notifier_call = exynos5433_cpuclk_notifier_cb;
+       else
+               cpuclk->clk_nb.notifier_call = exynos_cpuclk_notifier_cb;
 
        cpuclk->alt_parent = __clk_lookup(alt_parent);
        if (!cpuclk->alt_parent) {
index 37874d3c3165eb7589a3cc75b08a6af371539a26..d4b6b517fe1b44689df28853cf894baa3799153d 100644 (file)
@@ -57,10 +57,12 @@ struct exynos_cpuclk {
        struct notifier_block                   clk_nb;
        unsigned long                           flags;
 
-/* The CPU clock registers has DIV1 configuration register */
+/* The CPU clock registers have DIV1 configuration register */
 #define CLK_CPU_HAS_DIV1               (1 << 0)
 /* When ALT parent is active, debug clocks need safe divider values */
 #define CLK_CPU_NEEDS_DEBUG_ALT_DIV    (1 << 1)
+/* The CPU clock registers have Exynos5433-compatible layout */
+#define CLK_CPU_HAS_E5433_REGS_LAYOUT  (1 << 2)
 };
 
 extern int __init exynos_register_cpu_clock(struct samsung_clk_provider *ctx,
index 7cd02ff37a1f6919fea89e6c1a6306fd3695dc28..96fab6cfb2027f805e8ed941012a464d58cbb3dd 100644 (file)
@@ -151,6 +151,8 @@ static void __init exynos5_clkout_init(struct device_node *node)
 }
 CLK_OF_DECLARE(exynos5250_clkout, "samsung,exynos5250-pmu",
                exynos5_clkout_init);
+CLK_OF_DECLARE(exynos5410_clkout, "samsung,exynos5410-pmu",
+               exynos5_clkout_init);
 CLK_OF_DECLARE(exynos5420_clkout, "samsung,exynos5420-pmu",
                exynos5_clkout_init);
 CLK_OF_DECLARE(exynos5433_clkout, "samsung,exynos5433-pmu",
index 16575ee874cbb9e633a575001406e10621602836..1b81e283f60589c900c5bfc6370a125d8c8c845d 100644 (file)
 #define PWR_CTRL1_USE_CORE1_WFI                        (1 << 1)
 #define PWR_CTRL1_USE_CORE0_WFI                        (1 << 0)
 
-static unsigned long exynos3250_cmu_clk_regs[] __initdata = {
+static const unsigned long exynos3250_cmu_clk_regs[] __initconst = {
        SRC_LEFTBUS,
        DIV_LEFTBUS,
        GATE_IP_LEFTBUS,
@@ -226,7 +226,7 @@ PNAME(group_sclk_fimd0_p)   = { "xxti", "xusbxti",
 PNAME(mout_mfc_p)              = { "mout_mfc_0", "mout_mfc_1" };
 PNAME(mout_g3d_p)              = { "mout_g3d_0", "mout_g3d_1" };
 
-static struct samsung_fixed_factor_clock fixed_factor_clks[] __initdata = {
+static const struct samsung_fixed_factor_clock fixed_factor_clks[] __initconst = {
        FFACTOR(0, "sclk_mpll_1600", "mout_mpll", 1, 1, 0),
        FFACTOR(0, "sclk_mpll_mif", "mout_mpll", 1, 2, 0),
        FFACTOR(0, "sclk_bpll", "fout_bpll", 1, 2, 0),
@@ -237,7 +237,7 @@ static struct samsung_fixed_factor_clock fixed_factor_clks[] __initdata = {
        FFACTOR(CLK_FIN_PLL, "fin_pll", "xusbxti", 1, 1, 0),
 };
 
-static struct samsung_mux_clock mux_clks[] __initdata = {
+static const struct samsung_mux_clock mux_clks[] __initconst = {
        /*
         * NOTE: Following table is sorted by register address in ascending
         * order and then bitfield shift in descending order, as it is done
@@ -326,7 +326,7 @@ static struct samsung_mux_clock mux_clks[] __initdata = {
                        CLK_SET_RATE_PARENT, 0),
 };
 
-static struct samsung_div_clock div_clks[] __initdata = {
+static const struct samsung_div_clock div_clks[] __initconst = {
        /*
         * NOTE: Following table is sorted by register address in ascending
         * order and then bitfield shift in descending order, as it is done
@@ -429,7 +429,7 @@ static struct samsung_div_clock div_clks[] __initdata = {
        DIV(CLK_DIV_COPY, "div_copy", "mout_hpm", DIV_CPU1, 0, 3),
 };
 
-static struct samsung_gate_clock gate_clks[] __initdata = {
+static const struct samsung_gate_clock gate_clks[] __initconst = {
        /*
         * NOTE: Following table is sorted by register address in ascending
         * order and then bitfield shift in descending order, as it is done
@@ -669,7 +669,7 @@ static struct samsung_gate_clock gate_clks[] __initdata = {
 };
 
 /* APLL & MPLL & BPLL & UPLL */
-static struct samsung_pll_rate_table exynos3250_pll_rates[] = {
+static const struct samsung_pll_rate_table exynos3250_pll_rates[] __initconst = {
        PLL_35XX_RATE(1200000000, 400, 4, 1),
        PLL_35XX_RATE(1100000000, 275, 3, 1),
        PLL_35XX_RATE(1066000000, 533, 6, 1),
@@ -691,7 +691,7 @@ static struct samsung_pll_rate_table exynos3250_pll_rates[] = {
 };
 
 /* EPLL */
-static struct samsung_pll_rate_table exynos3250_epll_rates[] = {
+static const struct samsung_pll_rate_table exynos3250_epll_rates[] __initconst = {
        PLL_36XX_RATE(800000000, 200, 3, 1,     0),
        PLL_36XX_RATE(288000000,  96, 2, 2,     0),
        PLL_36XX_RATE(192000000, 128, 2, 3,     0),
@@ -710,7 +710,7 @@ static struct samsung_pll_rate_table exynos3250_epll_rates[] = {
 };
 
 /* VPLL */
-static struct samsung_pll_rate_table exynos3250_vpll_rates[] = {
+static const struct samsung_pll_rate_table exynos3250_vpll_rates[] __initconst = {
        PLL_36XX_RATE(600000000, 100, 2, 1,     0),
        PLL_36XX_RATE(533000000, 266, 3, 2, 32768),
        PLL_36XX_RATE(519230987, 173, 2, 2,  5046),
@@ -740,7 +740,7 @@ static struct samsung_pll_rate_table exynos3250_vpll_rates[] = {
        { /* sentinel */ }
 };
 
-static struct samsung_pll_clock exynos3250_plls[] __initdata = {
+static const struct samsung_pll_clock exynos3250_plls[] __initconst = {
        PLL(pll_35xx, CLK_FOUT_APLL, "fout_apll", "fin_pll",
                APLL_LOCK, APLL_CON0, exynos3250_pll_rates),
        PLL(pll_35xx, CLK_FOUT_MPLL, "fout_mpll", "fin_pll",
@@ -772,7 +772,7 @@ static void __init exynos3_core_down_clock(void __iomem *reg_base)
        __raw_writel(0x0, reg_base + PWR_CTRL2);
 }
 
-static struct samsung_cmu_info cmu_info __initdata = {
+static const struct samsung_cmu_info cmu_info __initconst = {
        .pll_clks               = exynos3250_plls,
        .nr_pll_clks            = ARRAY_SIZE(exynos3250_plls),
        .mux_clks               = mux_clks,
@@ -848,7 +848,7 @@ CLK_OF_DECLARE(exynos3250_cmu, "samsung,exynos3250-cmu", exynos3250_cmu_init);
 #define EPLL_CON2              0x111c
 #define SRC_EPLL               0x1120
 
-static unsigned long exynos3250_cmu_dmc_clk_regs[] __initdata = {
+static const unsigned long exynos3250_cmu_dmc_clk_regs[] __initconst = {
        BPLL_LOCK,
        BPLL_CON0,
        BPLL_CON1,
@@ -874,7 +874,7 @@ PNAME(mout_bpll_p)  = { "fin_pll", "fout_bpll", };
 PNAME(mout_mpll_mif_p) = { "fin_pll", "sclk_mpll_mif", };
 PNAME(mout_dphy_p)     = { "mout_mpll_mif", "mout_bpll", };
 
-static struct samsung_mux_clock dmc_mux_clks[] __initdata = {
+static const struct samsung_mux_clock dmc_mux_clks[] __initconst = {
        /*
         * NOTE: Following table is sorted by register address in ascending
         * order and then bitfield shift in descending order, as it is done
@@ -893,7 +893,7 @@ static struct samsung_mux_clock dmc_mux_clks[] __initdata = {
        MUX(CLK_MOUT_EPLL, "mout_epll", mout_epll_p, SRC_EPLL, 4, 1),
 };
 
-static struct samsung_div_clock dmc_div_clks[] __initdata = {
+static const struct samsung_div_clock dmc_div_clks[] __initconst = {
        /*
         * NOTE: Following table is sorted by register address in ascending
         * order and then bitfield shift in descending order, as it is done
@@ -910,14 +910,14 @@ static struct samsung_div_clock dmc_div_clks[] __initdata = {
        DIV(CLK_DIV_DMCD, "div_dmcd", "div_dmc", DIV_DMC1, 11, 3),
 };
 
-static struct samsung_pll_clock exynos3250_dmc_plls[] __initdata = {
+static const struct samsung_pll_clock exynos3250_dmc_plls[] __initconst = {
        PLL(pll_35xx, CLK_FOUT_BPLL, "fout_bpll", "fin_pll",
                BPLL_LOCK, BPLL_CON0, exynos3250_pll_rates),
        PLL(pll_36xx, CLK_FOUT_EPLL, "fout_epll", "fin_pll",
                EPLL_LOCK, EPLL_CON0, exynos3250_epll_rates),
 };
 
-static struct samsung_cmu_info dmc_cmu_info __initdata = {
+static const struct samsung_cmu_info dmc_cmu_info __initconst = {
        .pll_clks               = exynos3250_dmc_plls,
        .nr_pll_clks            = ARRAY_SIZE(exynos3250_dmc_plls),
        .mux_clks               = dmc_mux_clks,
@@ -947,7 +947,7 @@ CLK_OF_DECLARE(exynos3250_cmu_dmc, "samsung,exynos3250-cmu-dmc",
 #define GATE_IP_ISP1           0x804
 #define GATE_SCLK_ISP          0x900
 
-static struct samsung_div_clock isp_div_clks[] __initdata = {
+static const struct samsung_div_clock isp_div_clks[] __initconst = {
        /*
         * NOTE: Following table is sorted by register address in ascending
         * order and then bitfield shift in descending order, as it is done
@@ -967,7 +967,7 @@ static struct samsung_div_clock isp_div_clks[] __initdata = {
        DIV(CLK_DIV_MPWM, "div_mpwm", "div_isp1", DIV_ISP1, 0, 3),
 };
 
-static struct samsung_gate_clock isp_gate_clks[] __initdata = {
+static const struct samsung_gate_clock isp_gate_clks[] __initconst = {
        /*
         * NOTE: Following table is sorted by register address in ascending
         * order and then bitfield shift in descending order, as it is done
@@ -1063,7 +1063,7 @@ static struct samsung_gate_clock isp_gate_clks[] __initdata = {
                GATE_SCLK_ISP, 0, CLK_IGNORE_UNUSED, 0),
 };
 
-static struct samsung_cmu_info isp_cmu_info __initdata = {
+static const struct samsung_cmu_info isp_cmu_info __initconst = {
        .div_clks       = isp_div_clks,
        .nr_div_clks    = ARRAY_SIZE(isp_div_clks),
        .gate_clks      = isp_gate_clks,
@@ -1079,14 +1079,15 @@ static int __init exynos3250_cmu_isp_probe(struct platform_device *pdev)
        return 0;
 }
 
-static const struct of_device_id exynos3250_cmu_isp_of_match[] = {
+static const struct of_device_id exynos3250_cmu_isp_of_match[] __initconst = {
        { .compatible = "samsung,exynos3250-cmu-isp", },
        { /* sentinel */ }
 };
 
-static struct platform_driver exynos3250_cmu_isp_driver = {
+static struct platform_driver exynos3250_cmu_isp_driver __initdata = {
        .driver = {
                .name = "exynos3250-cmu-isp",
+               .suppress_bind_attrs = true,
                .of_match_table = exynos3250_cmu_isp_of_match,
        },
 };
index 7b3d0f97598740240fecec3afa0e08e074933876..faab9b31baf5b4b15ec0fec8623d01031e991fa9 100644 (file)
@@ -169,7 +169,7 @@ static struct samsung_clk_reg_dump *exynos4_save_pll;
  * list of controller registers to be saved and restored during a
  * suspend/resume cycle.
  */
-static unsigned long exynos4210_clk_save[] __initdata = {
+static const unsigned long exynos4210_clk_save[] __initconst = {
        E4210_SRC_IMAGE,
        E4210_SRC_LCD1,
        E4210_SRC_MASK_LCD1,
@@ -181,7 +181,7 @@ static unsigned long exynos4210_clk_save[] __initdata = {
        PWR_CTRL1,
 };
 
-static unsigned long exynos4x12_clk_save[] __initdata = {
+static const unsigned long exynos4x12_clk_save[] __initconst = {
        E4X12_GATE_IP_IMAGE,
        E4X12_GATE_IP_PERIR,
        E4X12_SRC_CAM1,
@@ -192,7 +192,7 @@ static unsigned long exynos4x12_clk_save[] __initdata = {
        E4X12_PWR_CTRL2,
 };
 
-static unsigned long exynos4_clk_pll_regs[] __initdata = {
+static const unsigned long exynos4_clk_pll_regs[] __initconst = {
        EPLL_LOCK,
        VPLL_LOCK,
        EPLL_CON0,
@@ -203,7 +203,7 @@ static unsigned long exynos4_clk_pll_regs[] __initdata = {
        VPLL_CON2,
 };
 
-static unsigned long exynos4_clk_regs[] __initdata = {
+static const unsigned long exynos4_clk_regs[] __initconst = {
        SRC_LEFTBUS,
        DIV_LEFTBUS,
        GATE_IP_LEFTBUS,
@@ -505,28 +505,28 @@ static struct samsung_fixed_rate_clock exynos4_fixed_rate_ext_clks[] __initdata
 };
 
 /* fixed rate clocks generated inside the soc */
-static struct samsung_fixed_rate_clock exynos4_fixed_rate_clks[] __initdata = {
+static const struct samsung_fixed_rate_clock exynos4_fixed_rate_clks[] __initconst = {
        FRATE(0, "sclk_hdmi24m", NULL, 0, 24000000),
        FRATE(CLK_SCLK_HDMIPHY, "sclk_hdmiphy", "hdmi", 0, 27000000),
        FRATE(0, "sclk_usbphy0", NULL, 0, 48000000),
 };
 
-static struct samsung_fixed_rate_clock exynos4210_fixed_rate_clks[] __initdata = {
+static const struct samsung_fixed_rate_clock exynos4210_fixed_rate_clks[] __initconst = {
        FRATE(0, "sclk_usbphy1", NULL, 0, 48000000),
 };
 
-static struct samsung_fixed_factor_clock exynos4_fixed_factor_clks[] __initdata = {
+static const struct samsung_fixed_factor_clock exynos4_fixed_factor_clks[] __initconst = {
        FFACTOR(0, "sclk_apll_div_2", "sclk_apll", 1, 2, 0),
        FFACTOR(0, "fout_mpll_div_2", "fout_mpll", 1, 2, 0),
        FFACTOR(0, "fout_apll_div_2", "fout_apll", 1, 2, 0),
        FFACTOR(0, "arm_clk_div_2", "div_core2", 1, 2, 0),
 };
 
-static struct samsung_fixed_factor_clock exynos4210_fixed_factor_clks[] __initdata = {
+static const struct samsung_fixed_factor_clock exynos4210_fixed_factor_clks[] __initconst = {
        FFACTOR(0, "sclk_mpll_div_2", "sclk_mpll", 1, 2, 0),
 };
 
-static struct samsung_fixed_factor_clock exynos4x12_fixed_factor_clks[] __initdata = {
+static const struct samsung_fixed_factor_clock exynos4x12_fixed_factor_clks[] __initconst = {
        FFACTOR(0, "sclk_mpll_user_l_div_2", "mout_mpll_user_l", 1, 2, 0),
        FFACTOR(0, "sclk_mpll_user_r_div_2", "mout_mpll_user_r", 1, 2, 0),
        FFACTOR(0, "sclk_mpll_user_t_div_2", "mout_mpll_user_t", 1, 2, 0),
@@ -534,7 +534,7 @@ static struct samsung_fixed_factor_clock exynos4x12_fixed_factor_clks[] __initda
 };
 
 /* list of mux clocks supported in all exynos4 soc's */
-static struct samsung_mux_clock exynos4_mux_clks[] __initdata = {
+static const struct samsung_mux_clock exynos4_mux_clks[] __initconst = {
        MUX_FA(CLK_MOUT_APLL, "mout_apll", mout_apll_p, SRC_CPU, 0, 1,
                        CLK_SET_RATE_PARENT | CLK_RECALC_NEW_RATES, 0,
                        "mout_apll"),
@@ -555,11 +555,11 @@ static struct samsung_mux_clock exynos4_mux_clks[] __initdata = {
 };
 
 /* list of mux clocks supported in exynos4210 soc */
-static struct samsung_mux_clock exynos4210_mux_early[] __initdata = {
+static const struct samsung_mux_clock exynos4210_mux_early[] __initconst = {
        MUX(0, "mout_vpllsrc", mout_vpllsrc_p, SRC_TOP1, 0, 1),
 };
 
-static struct samsung_mux_clock exynos4210_mux_clks[] __initdata = {
+static const struct samsung_mux_clock exynos4210_mux_clks[] __initconst = {
        MUX(0, "mout_gdl", sclk_ampll_p4210, SRC_LEFTBUS, 0, 1),
        MUX(0, "mout_clkout_leftbus", clkout_left_p4210,
                        CLKOUT_CMU_LEFTBUS, 0, 5),
@@ -622,7 +622,7 @@ static struct samsung_mux_clock exynos4210_mux_clks[] __initdata = {
 };
 
 /* list of mux clocks supported in exynos4x12 soc */
-static struct samsung_mux_clock exynos4x12_mux_clks[] __initdata = {
+static const struct samsung_mux_clock exynos4x12_mux_clks[] __initconst = {
        MUX(0, "mout_mpll_user_l", mout_mpll_p, SRC_LEFTBUS, 4, 1),
        MUX(0, "mout_gdl", mout_gdl_p4x12, SRC_LEFTBUS, 0, 1),
        MUX(0, "mout_clkout_leftbus", clkout_left_p4x12,
@@ -705,7 +705,7 @@ static struct samsung_mux_clock exynos4x12_mux_clks[] __initdata = {
 };
 
 /* list of divider clocks supported in all exynos4 soc's */
-static struct samsung_div_clock exynos4_div_clks[] __initdata = {
+static const struct samsung_div_clock exynos4_div_clks[] __initconst = {
        DIV(CLK_DIV_GDL, "div_gdl", "mout_gdl", DIV_LEFTBUS, 0, 3),
        DIV(0, "div_gpl", "div_gdl", DIV_LEFTBUS, 4, 3),
        DIV(0, "div_clkout_leftbus", "mout_clkout_leftbus",
@@ -795,7 +795,7 @@ static struct samsung_div_clock exynos4_div_clks[] __initdata = {
 };
 
 /* list of divider clocks supported in exynos4210 soc */
-static struct samsung_div_clock exynos4210_div_clks[] __initdata = {
+static const struct samsung_div_clock exynos4210_div_clks[] __initconst = {
        DIV(CLK_ACLK200, "aclk200", "mout_aclk200", DIV_TOP, 0, 3),
        DIV(CLK_SCLK_FIMG2D, "sclk_fimg2d", "mout_g2d", DIV_IMAGE, 0, 4),
        DIV(0, "div_fimd1", "mout_fimd1", E4210_DIV_LCD1, 0, 4),
@@ -806,7 +806,7 @@ static struct samsung_div_clock exynos4210_div_clks[] __initdata = {
 };
 
 /* list of divider clocks supported in exynos4x12 soc */
-static struct samsung_div_clock exynos4x12_div_clks[] __initdata = {
+static const struct samsung_div_clock exynos4x12_div_clks[] __initconst = {
        DIV(0, "div_mdnie0", "mout_mdnie0", DIV_LCD0, 4, 4),
        DIV(0, "div_mdnie_pwm0", "mout_mdnie_pwm0", DIV_LCD0, 8, 4),
        DIV(0, "div_mdnie_pwm_pre0", "div_mdnie_pwm0", DIV_LCD0, 12, 4),
@@ -837,7 +837,7 @@ static struct samsung_div_clock exynos4x12_div_clks[] __initdata = {
 };
 
 /* list of gate clocks supported in all exynos4 soc's */
-static struct samsung_gate_clock exynos4_gate_clks[] __initdata = {
+static const struct samsung_gate_clock exynos4_gate_clks[] __initconst = {
        /*
         * After all Exynos4 based platforms are migrated to use device tree,
         * the device name and clock alias names specified below for some
@@ -1043,7 +1043,7 @@ static struct samsung_gate_clock exynos4_gate_clks[] __initdata = {
 };
 
 /* list of gate clocks supported in exynos4210 soc */
-static struct samsung_gate_clock exynos4210_gate_clks[] __initdata = {
+static const struct samsung_gate_clock exynos4210_gate_clks[] __initconst = {
        GATE(CLK_TVENC, "tvenc", "aclk160", GATE_IP_TV, 2, 0, 0),
        GATE(CLK_G2D, "g2d", "aclk200", E4210_GATE_IP_IMAGE, 0, 0, 0),
        GATE(CLK_ROTATOR, "rotator", "aclk200", E4210_GATE_IP_IMAGE, 1, 0, 0),
@@ -1090,7 +1090,7 @@ static struct samsung_gate_clock exynos4210_gate_clks[] __initdata = {
 };
 
 /* list of gate clocks supported in exynos4x12 soc */
-static struct samsung_gate_clock exynos4x12_gate_clks[] __initdata = {
+static const struct samsung_gate_clock exynos4x12_gate_clks[] __initconst = {
        GATE(CLK_AUDSS, "audss", "sclk_epll", E4X12_GATE_IP_MAUDIO, 0, 0, 0),
        GATE(CLK_MDNIE0, "mdnie0", "aclk160", GATE_IP_LCD0, 2, 0, 0),
        GATE(CLK_ROTATOR, "rotator", "aclk200", E4X12_GATE_IP_IMAGE, 1, 0, 0),
@@ -1190,17 +1190,17 @@ static struct samsung_gate_clock exynos4x12_gate_clks[] __initdata = {
                0),
 };
 
-static struct samsung_clock_alias exynos4_aliases[] __initdata = {
+static const struct samsung_clock_alias exynos4_aliases[] __initconst = {
        ALIAS(CLK_MOUT_CORE, NULL, "moutcore"),
        ALIAS(CLK_ARM_CLK, NULL, "armclk"),
        ALIAS(CLK_SCLK_APLL, NULL, "mout_apll"),
 };
 
-static struct samsung_clock_alias exynos4210_aliases[] __initdata = {
+static const struct samsung_clock_alias exynos4210_aliases[] __initconst = {
        ALIAS(CLK_SCLK_MPLL, NULL, "mout_mpll"),
 };
 
-static struct samsung_clock_alias exynos4x12_aliases[] __initdata = {
+static const struct samsung_clock_alias exynos4x12_aliases[] __initconst = {
        ALIAS(CLK_MOUT_MPLL_USER_C, NULL, "mout_mpll"),
 };
 
@@ -1211,7 +1211,7 @@ static struct samsung_clock_alias exynos4x12_aliases[] __initdata = {
  * controller is first remapped and the value of XOM[0] bit is read to
  * determine the parent clock.
  */
-static unsigned long exynos4_get_xom(void)
+static unsigned long __init exynos4_get_xom(void)
 {
        unsigned long xom = 0;
        void __iomem *chipid_base;
@@ -1264,7 +1264,7 @@ static const struct of_device_id ext_clk_match[] __initconst = {
 };
 
 /* PLLs PMS values */
-static struct samsung_pll_rate_table exynos4210_apll_rates[] __initdata = {
+static const struct samsung_pll_rate_table exynos4210_apll_rates[] __initconst = {
        PLL_45XX_RATE(1200000000, 150,  3, 1, 28),
        PLL_45XX_RATE(1000000000, 250,  6, 1, 28),
        PLL_45XX_RATE( 800000000, 200,  6, 1, 28),
@@ -1277,7 +1277,7 @@ static struct samsung_pll_rate_table exynos4210_apll_rates[] __initdata = {
        { /* sentinel */ }
 };
 
-static struct samsung_pll_rate_table exynos4210_epll_rates[] __initdata = {
+static const struct samsung_pll_rate_table exynos4210_epll_rates[] __initconst = {
        PLL_4600_RATE(192000000, 48, 3, 1,     0, 0),
        PLL_4600_RATE(180633605, 45, 3, 1, 10381, 0),
        PLL_4600_RATE(180000000, 45, 3, 1,     0, 0),
@@ -1288,7 +1288,7 @@ static struct samsung_pll_rate_table exynos4210_epll_rates[] __initdata = {
        { /* sentinel */ }
 };
 
-static struct samsung_pll_rate_table exynos4210_vpll_rates[] __initdata = {
+static const struct samsung_pll_rate_table exynos4210_vpll_rates[] __initconst = {
        PLL_4650_RATE(360000000, 44, 3, 0, 1024, 0, 14, 0),
        PLL_4650_RATE(324000000, 53, 2, 1, 1024, 1,  1, 1),
        PLL_4650_RATE(259617187, 63, 3, 1, 1950, 0, 20, 1),
@@ -1297,7 +1297,7 @@ static struct samsung_pll_rate_table exynos4210_vpll_rates[] __initdata = {
        { /* sentinel */ }
 };
 
-static struct samsung_pll_rate_table exynos4x12_apll_rates[] __initdata = {
+static const struct samsung_pll_rate_table exynos4x12_apll_rates[] __initconst = {
        PLL_35XX_RATE(1500000000, 250, 4, 0),
        PLL_35XX_RATE(1400000000, 175, 3, 0),
        PLL_35XX_RATE(1300000000, 325, 6, 0),
@@ -1315,7 +1315,7 @@ static struct samsung_pll_rate_table exynos4x12_apll_rates[] __initdata = {
        { /* sentinel */ }
 };
 
-static struct samsung_pll_rate_table exynos4x12_epll_rates[] __initdata = {
+static const struct samsung_pll_rate_table exynos4x12_epll_rates[] __initconst = {
        PLL_36XX_RATE(192000000, 48, 3, 1,     0),
        PLL_36XX_RATE(180633605, 45, 3, 1, 10381),
        PLL_36XX_RATE(180000000, 45, 3, 1,     0),
@@ -1326,7 +1326,7 @@ static struct samsung_pll_rate_table exynos4x12_epll_rates[] __initdata = {
        { /* sentinel */ }
 };
 
-static struct samsung_pll_rate_table exynos4x12_vpll_rates[] __initdata = {
+static const struct samsung_pll_rate_table exynos4x12_vpll_rates[] __initconst = {
        PLL_36XX_RATE(533000000, 133, 3, 1, 16384),
        PLL_36XX_RATE(440000000, 110, 3, 1,     0),
        PLL_36XX_RATE(350000000, 175, 3, 2,     0),
@@ -1375,12 +1375,12 @@ static void __init exynos4x12_core_down_clock(void)
        if (num_possible_cpus() == 4)
                tmp |= PWR_CTRL1_USE_CORE3_WFE | PWR_CTRL1_USE_CORE2_WFE |
                       PWR_CTRL1_USE_CORE3_WFI | PWR_CTRL1_USE_CORE2_WFI;
-       __raw_writel(tmp, reg_base + PWR_CTRL1);
+       writel_relaxed(tmp, reg_base + PWR_CTRL1);
 
        /*
         * Disable the clock up feature in case it was enabled by bootloader.
         */
-       __raw_writel(0x0, reg_base + E4X12_PWR_CTRL2);
+       writel_relaxed(0x0, reg_base + E4X12_PWR_CTRL2);
 }
 
 #define E4210_CPU_DIV0(apll, pclk_dbg, atb, periph, corem1, corem0)    \
@@ -1450,8 +1450,6 @@ static void __init exynos4_clk_init(struct device_node *np,
                panic("%s: failed to map registers\n", __func__);
 
        ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS);
-       if (!ctx)
-               panic("%s: unable to allocate context.\n", __func__);
 
        samsung_clk_of_register_fixed_ext(ctx, exynos4_fixed_rate_ext_clks,
                        ARRAY_SIZE(exynos4_fixed_rate_ext_clks),
index 86ee06b226bdbaa0f71793d1ea50265faee1c6e4..6c90631597176af72e325d9bc57403ae34720a93 100644 (file)
 #define DIV_CPU0               0x14500
 #define DIV_CPU1               0x14504
 
-static unsigned long exynos4415_cmu_clk_regs[] __initdata = {
+static const unsigned long exynos4415_cmu_clk_regs[] __initconst = {
        SRC_LEFTBUS,
        DIV_LEFTBUS,
        GATE_IP_LEFTBUS,
@@ -268,16 +268,16 @@ PNAME(group_aclk_isp0_300_user_p) = { "fin_pll", "mout_aclk_isp0_300" };
 PNAME(group_aclk_isp1_300_user_p) = { "fin_pll", "mout_aclk_isp1_300" };
 PNAME(group_mout_mpll_user_t_p)        = { "mout_mpll_user_t" };
 
-static struct samsung_fixed_factor_clock exynos4415_fixed_factor_clks[] __initdata = {
+static const struct samsung_fixed_factor_clock exynos4415_fixed_factor_clks[] __initconst = {
        /* HACK: fin_pll hardcoded to xusbxti until detection is implemented. */
        FFACTOR(CLK_FIN_PLL, "fin_pll", "xusbxti", 1, 1, 0),
 };
 
-static struct samsung_fixed_rate_clock exynos4415_fixed_rate_clks[] __initdata = {
+static const struct samsung_fixed_rate_clock exynos4415_fixed_rate_clks[] __initconst = {
        FRATE(CLK_SCLK_HDMIPHY, "sclk_hdmiphy", NULL, 0, 27000000),
 };
 
-static struct samsung_mux_clock exynos4415_mux_clks[] __initdata = {
+static const struct samsung_mux_clock exynos4415_mux_clks[] __initconst = {
        /*
         * NOTE: Following table is sorted by register address in ascending
         * order and then bitfield shift in descending order, as it is done
@@ -427,7 +427,7 @@ static struct samsung_mux_clock exynos4415_mux_clks[] __initdata = {
                group_aclk_isp1_300_user_p, SRC_TOP_ISP1, 0, 1),
 };
 
-static struct samsung_div_clock exynos4415_div_clks[] __initdata = {
+static const struct samsung_div_clock exynos4415_div_clks[] __initconst = {
        /*
         * NOTE: Following table is sorted by register address in ascending
         * order and then bitfield shift in descending order, as it is done
@@ -566,7 +566,7 @@ static struct samsung_div_clock exynos4415_div_clks[] __initdata = {
        DIV(CLK_DIV_COPY, "div_copy", "mout_hpm", DIV_CPU1, 0, 3),
 };
 
-static struct samsung_gate_clock exynos4415_gate_clks[] __initdata = {
+static const struct samsung_gate_clock exynos4415_gate_clks[] __initconst = {
        /*
         * NOTE: Following table is sorted by register address in ascending
         * order and then bitfield shift in descending order, as it is done
@@ -859,7 +859,7 @@ static struct samsung_gate_clock exynos4415_gate_clks[] __initdata = {
 /*
  * APLL & MPLL & BPLL & ISP_PLL & DISP_PLL & G3D_PLL
  */
-static struct samsung_pll_rate_table exynos4415_pll_rates[] = {
+static const struct samsung_pll_rate_table exynos4415_pll_rates[] __initconst = {
        PLL_35XX_RATE(1600000000, 400, 3,  1),
        PLL_35XX_RATE(1500000000, 250, 2,  1),
        PLL_35XX_RATE(1400000000, 175, 3,  0),
@@ -891,7 +891,7 @@ static struct samsung_pll_rate_table exynos4415_pll_rates[] = {
 };
 
 /* EPLL */
-static struct samsung_pll_rate_table exynos4415_epll_rates[] = {
+static const struct samsung_pll_rate_table exynos4415_epll_rates[] __initconst = {
        PLL_36XX_RATE(800000000, 200, 3, 1,     0),
        PLL_36XX_RATE(288000000,  96, 2, 2,     0),
        PLL_36XX_RATE(192000000, 128, 2, 3,     0),
@@ -909,7 +909,7 @@ static struct samsung_pll_rate_table exynos4415_epll_rates[] = {
        { /* sentinel */ }
 };
 
-static struct samsung_pll_clock exynos4415_plls[] __initdata = {
+static const struct samsung_pll_clock exynos4415_plls[] __initconst = {
        PLL(pll_35xx, CLK_FOUT_APLL, "fout_apll", "fin_pll",
                APLL_LOCK, APLL_CON0, exynos4415_pll_rates),
        PLL(pll_36xx, CLK_FOUT_EPLL, "fout_epll", "fin_pll",
@@ -922,7 +922,7 @@ static struct samsung_pll_clock exynos4415_plls[] __initdata = {
                "fin_pll", DISP_PLL_LOCK, DISP_PLL_CON0, exynos4415_pll_rates),
 };
 
-static struct samsung_cmu_info cmu_info __initdata = {
+static const struct samsung_cmu_info cmu_info __initconst = {
        .pll_clks               = exynos4415_plls,
        .nr_pll_clks            = ARRAY_SIZE(exynos4415_plls),
        .mux_clks               = exynos4415_mux_clks,
@@ -961,7 +961,7 @@ CLK_OF_DECLARE(exynos4415_cmu, "samsung,exynos4415-cmu", exynos4415_cmu_init);
 #define SRC_DMC                        0x300
 #define DIV_DMC1               0x504
 
-static unsigned long exynos4415_cmu_dmc_clk_regs[] __initdata = {
+static const unsigned long exynos4415_cmu_dmc_clk_regs[] __initconst = {
        MPLL_LOCK,
        MPLL_CON0,
        MPLL_CON1,
@@ -978,14 +978,14 @@ PNAME(mout_mpll_p)                = { "fin_pll", "fout_mpll", };
 PNAME(mout_bpll_p)             = { "fin_pll", "fout_bpll", };
 PNAME(mbpll_p)                 = { "mout_mpll", "mout_bpll", };
 
-static struct samsung_mux_clock exynos4415_dmc_mux_clks[] __initdata = {
+static const struct samsung_mux_clock exynos4415_dmc_mux_clks[] __initconst = {
        MUX(CLK_DMC_MOUT_MPLL, "mout_mpll", mout_mpll_p, SRC_DMC, 12, 1),
        MUX(CLK_DMC_MOUT_BPLL, "mout_bpll", mout_bpll_p, SRC_DMC, 10, 1),
        MUX(CLK_DMC_MOUT_DPHY, "mout_dphy", mbpll_p, SRC_DMC, 8, 1),
        MUX(CLK_DMC_MOUT_DMC_BUS, "mout_dmc_bus", mbpll_p, SRC_DMC, 4, 1),
 };
 
-static struct samsung_div_clock exynos4415_dmc_div_clks[] __initdata = {
+static const struct samsung_div_clock exynos4415_dmc_div_clks[] __initconst = {
        DIV(CLK_DMC_DIV_DMC, "div_dmc", "div_dmc_pre", DIV_DMC1, 27, 3),
        DIV(CLK_DMC_DIV_DPHY, "div_dphy", "mout_dphy", DIV_DMC1, 23, 3),
        DIV(CLK_DMC_DIV_DMC_PRE, "div_dmc_pre", "mout_dmc_bus",
@@ -995,14 +995,14 @@ static struct samsung_div_clock exynos4415_dmc_div_clks[] __initdata = {
        DIV(CLK_DMC_DIV_MPLL_PRE, "div_mpll_pre", "mout_mpll", DIV_DMC1, 8, 2),
 };
 
-static struct samsung_pll_clock exynos4415_dmc_plls[] __initdata = {
+static const struct samsung_pll_clock exynos4415_dmc_plls[] __initconst = {
        PLL(pll_35xx, CLK_DMC_FOUT_MPLL, "fout_mpll", "fin_pll",
                MPLL_LOCK, MPLL_CON0, exynos4415_pll_rates),
        PLL(pll_35xx, CLK_DMC_FOUT_BPLL, "fout_bpll", "fin_pll",
                BPLL_LOCK, BPLL_CON0, exynos4415_pll_rates),
 };
 
-static struct samsung_cmu_info cmu_dmc_info __initdata = {
+static const struct samsung_cmu_info cmu_dmc_info __initconst = {
        .pll_clks               = exynos4415_dmc_plls,
        .nr_pll_clks            = ARRAY_SIZE(exynos4415_dmc_plls),
        .mux_clks               = exynos4415_dmc_mux_clks,
index 837197db4ffbb5f1b3f9539e76ff1d755004c713..27a227d6620c7b32bedf04bf16f2f2a7f71ce49b 100644 (file)
@@ -117,7 +117,7 @@ static struct samsung_clk_reg_dump *exynos5250_save;
  * list of controller registers to be saved and restored during a
  * suspend/resume cycle.
  */
-static unsigned long exynos5250_clk_regs[] __initdata = {
+static const unsigned long exynos5250_clk_regs[] __initconst = {
        SRC_CPU,
        DIV_CPU0,
        PWR_CTRL1,
@@ -190,7 +190,7 @@ static struct syscore_ops exynos5250_clk_syscore_ops = {
        .resume = exynos5250_clk_resume,
 };
 
-static void exynos5250_clk_sleep_init(void)
+static void __init exynos5250_clk_sleep_init(void)
 {
        exynos5250_save = samsung_clk_alloc_reg_dump(exynos5250_clk_regs,
                                        ARRAY_SIZE(exynos5250_clk_regs));
@@ -203,7 +203,7 @@ static void exynos5250_clk_sleep_init(void)
        register_syscore_ops(&exynos5250_clk_syscore_ops);
 }
 #else
-static void exynos5250_clk_sleep_init(void) {}
+static void __init exynos5250_clk_sleep_init(void) {}
 #endif
 
 /* list of all parent clock list */
@@ -266,23 +266,23 @@ static struct samsung_fixed_rate_clock exynos5250_fixed_rate_ext_clks[] __initda
 };
 
 /* fixed rate clocks generated inside the soc */
-static struct samsung_fixed_rate_clock exynos5250_fixed_rate_clks[] __initdata = {
+static const struct samsung_fixed_rate_clock exynos5250_fixed_rate_clks[] __initconst = {
        FRATE(CLK_SCLK_HDMIPHY, "sclk_hdmiphy", NULL, 0, 24000000),
        FRATE(0, "sclk_hdmi27m", NULL, 0, 27000000),
        FRATE(0, "sclk_dptxphy", NULL, 0, 24000000),
        FRATE(0, "sclk_uhostphy", NULL, 0, 48000000),
 };
 
-static struct samsung_fixed_factor_clock exynos5250_fixed_factor_clks[] __initdata = {
+static const struct samsung_fixed_factor_clock exynos5250_fixed_factor_clks[] __initconst = {
        FFACTOR(0, "fout_mplldiv2", "fout_mpll", 1, 2, 0),
        FFACTOR(0, "fout_bplldiv2", "fout_bpll", 1, 2, 0),
 };
 
-static struct samsung_mux_clock exynos5250_pll_pmux_clks[] __initdata = {
+static const struct samsung_mux_clock exynos5250_pll_pmux_clks[] __initconst = {
        MUX(0, "mout_vpllsrc", mout_vpllsrc_p, SRC_TOP2, 0, 1),
 };
 
-static struct samsung_mux_clock exynos5250_mux_clks[] __initdata = {
+static const struct samsung_mux_clock exynos5250_mux_clks[] __initconst = {
        /*
         * NOTE: Following table is sorted by (clock domain, register address,
         * bitfield shift) triplet in ascending order. When adding new entries,
@@ -378,7 +378,7 @@ static struct samsung_mux_clock exynos5250_mux_clks[] __initdata = {
        MUX(0, "mout_bpll_fout", mout_bpll_fout_p, PLL_DIV2_SEL, 0, 1),
 };
 
-static struct samsung_div_clock exynos5250_div_clks[] __initdata = {
+static const struct samsung_div_clock exynos5250_div_clks[] __initconst = {
        /*
         * NOTE: Following table is sorted by (clock domain, register address,
         * bitfield shift) triplet in ascending order. When adding new entries,
@@ -470,7 +470,7 @@ static struct samsung_div_clock exynos5250_div_clks[] __initdata = {
        DIV(CLK_DIV_I2S2, "div_i2s2", "sclk_audio2", DIV_PERIC5, 8, 6),
 };
 
-static struct samsung_gate_clock exynos5250_gate_clks[] __initdata = {
+static const struct samsung_gate_clock exynos5250_gate_clks[] __initconst = {
        /*
         * NOTE: Following table is sorted by (clock domain, register address,
         * bitfield shift) triplet in ascending order. When adding new entries,
@@ -698,7 +698,7 @@ static struct samsung_gate_clock exynos5250_gate_clks[] __initdata = {
                        GATE_IP_ISP1, 7, 0, 0),
 };
 
-static struct samsung_pll_rate_table vpll_24mhz_tbl[] __initdata = {
+static const struct samsung_pll_rate_table vpll_24mhz_tbl[] __initconst = {
        /* sorted in descending order */
        /* PLL_36XX_RATE(rate, m, p, s, k) */
        PLL_36XX_RATE(266000000, 266, 3, 3, 0),
@@ -707,7 +707,7 @@ static struct samsung_pll_rate_table vpll_24mhz_tbl[] __initdata = {
        { },
 };
 
-static struct samsung_pll_rate_table epll_24mhz_tbl[] __initdata = {
+static const struct samsung_pll_rate_table epll_24mhz_tbl[] __initconst = {
        /* sorted in descending order */
        /* PLL_36XX_RATE(rate, m, p, s, k) */
        PLL_36XX_RATE(192000000, 64, 2, 2, 0),
@@ -721,7 +721,7 @@ static struct samsung_pll_rate_table epll_24mhz_tbl[] __initdata = {
        { },
 };
 
-static struct samsung_pll_rate_table apll_24mhz_tbl[] __initdata = {
+static const struct samsung_pll_rate_table apll_24mhz_tbl[] __initconst = {
        /* sorted in descending order */
        /* PLL_35XX_RATE(rate, m, p, s) */
        PLL_35XX_RATE(1700000000, 425, 6, 0),
@@ -805,8 +805,7 @@ static void __init exynos5250_clk_init(struct device_node *np)
        }
 
        ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS);
-       if (!ctx)
-               panic("%s: unable to allocate context.\n", __func__);
+
        samsung_clk_of_register_fixed_ext(ctx, exynos5250_fixed_rate_ext_clks,
                        ARRAY_SIZE(exynos5250_fixed_rate_ext_clks),
                        ext_clk_match);
index 7a7ed075a573d78699c86b2113e8a071f8033472..a43642c36039c165061da8c572a2f2f9efb281c4 100644 (file)
@@ -22,7 +22,7 @@
  * Applicable for all 2550 Type PLLS for Exynos5260, listed below
  * DISP_PLL, EGL_PLL, KFC_PLL, MEM_PLL, BUS_PLL, MEDIA_PLL, G3D_PLL.
  */
-static struct samsung_pll_rate_table pll2550_24mhz_tbl[] __initdata = {
+static const struct samsung_pll_rate_table pll2550_24mhz_tbl[] __initconst = {
        PLL_35XX_RATE(1700000000, 425, 6, 0),
        PLL_35XX_RATE(1600000000, 200, 3, 0),
        PLL_35XX_RATE(1500000000, 250, 4, 0),
@@ -55,7 +55,7 @@ static struct samsung_pll_rate_table pll2550_24mhz_tbl[] __initdata = {
 /*
  * Applicable for 2650 Type PLL for AUD_PLL.
  */
-static struct samsung_pll_rate_table pll2650_24mhz_tbl[] __initdata = {
+static const struct samsung_pll_rate_table pll2650_24mhz_tbl[] __initconst = {
        PLL_36XX_RATE(1600000000, 200, 3, 0, 0),
        PLL_36XX_RATE(1200000000, 100, 2, 0, 0),
        PLL_36XX_RATE(1000000000, 250, 3, 1, 0),
@@ -78,7 +78,7 @@ static struct samsung_pll_rate_table pll2650_24mhz_tbl[] __initdata = {
 
 /* CMU_AUD */
 
-static unsigned long aud_clk_regs[] __initdata = {
+static const unsigned long aud_clk_regs[] __initconst = {
        MUX_SEL_AUD,
        DIV_AUD0,
        DIV_AUD1,
@@ -92,7 +92,7 @@ PNAME(mout_aud_pll_user_p) = {"fin_pll", "fout_aud_pll"};
 PNAME(mout_sclk_aud_i2s_p) = {"mout_aud_pll_user", "ioclk_i2s_cdclk"};
 PNAME(mout_sclk_aud_pcm_p) = {"mout_aud_pll_user", "ioclk_pcm_extclk"};
 
-static struct samsung_mux_clock aud_mux_clks[] __initdata = {
+static const struct samsung_mux_clock aud_mux_clks[] __initconst = {
        MUX(AUD_MOUT_AUD_PLL_USER, "mout_aud_pll_user", mout_aud_pll_user_p,
                        MUX_SEL_AUD, 0, 1),
        MUX(AUD_MOUT_SCLK_AUD_I2S, "mout_sclk_aud_i2s", mout_sclk_aud_i2s_p,
@@ -101,7 +101,7 @@ static struct samsung_mux_clock aud_mux_clks[] __initdata = {
                        MUX_SEL_AUD, 8, 1),
 };
 
-static struct samsung_div_clock aud_div_clks[] __initdata = {
+static const struct samsung_div_clock aud_div_clks[] __initconst = {
        DIV(AUD_DOUT_ACLK_AUD_131, "dout_aclk_aud_131", "mout_aud_pll_user",
                        DIV_AUD0, 0, 4),
 
@@ -113,7 +113,7 @@ static struct samsung_div_clock aud_div_clks[] __initdata = {
                        DIV_AUD1, 12, 4),
 };
 
-static struct samsung_gate_clock aud_gate_clks[] __initdata = {
+static const struct samsung_gate_clock aud_gate_clks[] __initconst = {
        GATE(AUD_SCLK_I2S, "sclk_aud_i2s", "dout_sclk_aud_i2s",
                        EN_SCLK_AUD, 0, CLK_SET_RATE_PARENT, 0),
        GATE(AUD_SCLK_PCM, "sclk_aud_pcm", "dout_sclk_aud_pcm",
@@ -154,7 +154,7 @@ CLK_OF_DECLARE(exynos5260_clk_aud, "samsung,exynos5260-clock-aud",
 
 /* CMU_DISP */
 
-static unsigned long disp_clk_regs[] __initdata = {
+static const unsigned long disp_clk_regs[] __initconst = {
        MUX_SEL_DISP0,
        MUX_SEL_DISP1,
        MUX_SEL_DISP2,
@@ -201,7 +201,7 @@ PNAME(mout_phyclk_mipi_dphy_4lmrxclk_esc0_user_p) = {"fin_pll",
 PNAME(mout_sclk_hdmi_spdif_p) = {"fin_pll", "ioclk_spdif_extclk",
                        "dout_aclk_peri_aud", "phyclk_hdmi_phy_ref_cko"};
 
-static struct samsung_mux_clock disp_mux_clks[] __initdata = {
+static const struct samsung_mux_clock disp_mux_clks[] __initconst = {
        MUX(DISP_MOUT_ACLK_DISP_333_USER, "mout_aclk_disp_333_user",
                        mout_aclk_disp_333_user_p,
                        MUX_SEL_DISP0, 0, 1),
@@ -270,7 +270,7 @@ static struct samsung_mux_clock disp_mux_clks[] __initdata = {
                        MUX_SEL_DISP4, 4, 2),
 };
 
-static struct samsung_div_clock disp_div_clks[] __initdata = {
+static const struct samsung_div_clock disp_div_clks[] __initconst = {
        DIV(DISP_DOUT_PCLK_DISP_111, "dout_pclk_disp_111",
                        "mout_aclk_disp_222_user",
                        DIV_DISP, 8, 4),
@@ -283,7 +283,7 @@ static struct samsung_div_clock disp_div_clks[] __initdata = {
                        DIV_DISP, 16, 4),
 };
 
-static struct samsung_gate_clock disp_gate_clks[] __initdata = {
+static const struct samsung_gate_clock disp_gate_clks[] __initconst = {
        GATE(DISP_MOUT_HDMI_PHY_PIXEL_USER, "sclk_hdmi_link_i_pixel",
                        "mout_phyclk_hdmi_phy_pixel_clko_user",
                        EN_SCLK_DISP0, 26, CLK_SET_RATE_PARENT, 0),
@@ -344,7 +344,7 @@ CLK_OF_DECLARE(exynos5260_clk_disp, "samsung,exynos5260-clock-disp",
 
 /* CMU_EGL */
 
-static unsigned long egl_clk_regs[] __initdata = {
+static const unsigned long egl_clk_regs[] __initconst = {
        EGL_PLL_LOCK,
        EGL_PLL_CON0,
        EGL_PLL_CON1,
@@ -361,13 +361,13 @@ static unsigned long egl_clk_regs[] __initdata = {
 PNAME(mout_egl_b_p) = {"mout_egl_pll", "dout_bus_pll"};
 PNAME(mout_egl_pll_p) = {"fin_pll", "fout_egl_pll"};
 
-static struct samsung_mux_clock egl_mux_clks[] __initdata = {
+static const struct samsung_mux_clock egl_mux_clks[] __initconst = {
        MUX(EGL_MOUT_EGL_PLL, "mout_egl_pll", mout_egl_pll_p,
                        MUX_SEL_EGL, 4, 1),
        MUX(EGL_MOUT_EGL_B, "mout_egl_b", mout_egl_b_p, MUX_SEL_EGL, 16, 1),
 };
 
-static struct samsung_div_clock egl_div_clks[] __initdata = {
+static const struct samsung_div_clock egl_div_clks[] __initconst = {
        DIV(EGL_DOUT_EGL1, "dout_egl1", "mout_egl_b", DIV_EGL, 0, 3),
        DIV(EGL_DOUT_EGL2, "dout_egl2", "dout_egl1", DIV_EGL, 4, 3),
        DIV(EGL_DOUT_ACLK_EGL, "dout_aclk_egl", "dout_egl2", DIV_EGL, 8, 3),
@@ -379,7 +379,7 @@ static struct samsung_div_clock egl_div_clks[] __initdata = {
        DIV(EGL_DOUT_EGL_PLL, "dout_egl_pll", "mout_egl_b", DIV_EGL, 24, 3),
 };
 
-static struct samsung_pll_clock egl_pll_clks[] __initdata = {
+static const struct samsung_pll_clock egl_pll_clks[] __initconst = {
        PLL(pll_2550xx, EGL_FOUT_EGL_PLL, "fout_egl_pll", "fin_pll",
                EGL_PLL_LOCK, EGL_PLL_CON0,
                pll2550_24mhz_tbl),
@@ -408,7 +408,7 @@ CLK_OF_DECLARE(exynos5260_clk_egl, "samsung,exynos5260-clock-egl",
 
 /* CMU_FSYS */
 
-static unsigned long fsys_clk_regs[] __initdata = {
+static const unsigned long fsys_clk_regs[] __initconst = {
        MUX_SEL_FSYS0,
        MUX_SEL_FSYS1,
        EN_ACLK_FSYS,
@@ -431,7 +431,7 @@ PNAME(mout_phyclk_usbdrd30_pipe_pclk_user_p) = {"fin_pll",
 PNAME(mout_phyclk_usbdrd30_phyclock_user_p) = {"fin_pll",
                        "phyclk_usbdrd30_udrd30_phyclock"};
 
-static struct samsung_mux_clock fsys_mux_clks[] __initdata = {
+static const struct samsung_mux_clock fsys_mux_clks[] __initconst = {
        MUX(FSYS_MOUT_PHYCLK_USBDRD30_PHYCLOCK_USER,
                        "mout_phyclk_usbdrd30_phyclock_user",
                        mout_phyclk_usbdrd30_phyclock_user_p,
@@ -454,7 +454,7 @@ static struct samsung_mux_clock fsys_mux_clks[] __initdata = {
                        MUX_SEL_FSYS1, 16, 1),
 };
 
-static struct samsung_gate_clock fsys_gate_clks[] __initdata = {
+static const struct samsung_gate_clock fsys_gate_clks[] __initconst = {
        GATE(FSYS_PHYCLK_USBHOST20, "phyclk_usbhost20_phyclock",
                        "mout_phyclk_usbdrd30_phyclock_user",
                        EN_SCLK_FSYS, 1, 0, 0),
@@ -508,7 +508,7 @@ CLK_OF_DECLARE(exynos5260_clk_fsys, "samsung,exynos5260-clock-fsys",
 
 /* CMU_G2D */
 
-static unsigned long g2d_clk_regs[] __initdata = {
+static const unsigned long g2d_clk_regs[] __initconst = {
        MUX_SEL_G2D,
        MUX_STAT_G2D,
        DIV_G2D,
@@ -535,18 +535,18 @@ static unsigned long g2d_clk_regs[] __initdata = {
 
 PNAME(mout_aclk_g2d_333_user_p) = {"fin_pll", "dout_aclk_g2d_333"};
 
-static struct samsung_mux_clock g2d_mux_clks[] __initdata = {
+static const struct samsung_mux_clock g2d_mux_clks[] __initconst = {
        MUX(G2D_MOUT_ACLK_G2D_333_USER, "mout_aclk_g2d_333_user",
                        mout_aclk_g2d_333_user_p,
                        MUX_SEL_G2D, 0, 1),
 };
 
-static struct samsung_div_clock g2d_div_clks[] __initdata = {
+static const struct samsung_div_clock g2d_div_clks[] __initconst = {
        DIV(G2D_DOUT_PCLK_G2D_83, "dout_pclk_g2d_83", "mout_aclk_g2d_333_user",
                        DIV_G2D, 0, 3),
 };
 
-static struct samsung_gate_clock g2d_gate_clks[] __initdata = {
+static const struct samsung_gate_clock g2d_gate_clks[] __initconst = {
        GATE(G2D_CLK_G2D, "clk_g2d", "mout_aclk_g2d_333_user",
                        EN_IP_G2D, 4, 0, 0),
        GATE(G2D_CLK_JPEG, "clk_jpeg", "mout_aclk_g2d_333_user",
@@ -599,7 +599,7 @@ CLK_OF_DECLARE(exynos5260_clk_g2d, "samsung,exynos5260-clock-g2d",
 
 /* CMU_G3D */
 
-static unsigned long g3d_clk_regs[] __initdata = {
+static const unsigned long g3d_clk_regs[] __initconst = {
        G3D_PLL_LOCK,
        G3D_PLL_CON0,
        G3D_PLL_CON1,
@@ -615,23 +615,23 @@ static unsigned long g3d_clk_regs[] __initdata = {
 
 PNAME(mout_g3d_pll_p) = {"fin_pll", "fout_g3d_pll"};
 
-static struct samsung_mux_clock g3d_mux_clks[] __initdata = {
+static const struct samsung_mux_clock g3d_mux_clks[] __initconst = {
        MUX(G3D_MOUT_G3D_PLL, "mout_g3d_pll", mout_g3d_pll_p,
                        MUX_SEL_G3D, 0, 1),
 };
 
-static struct samsung_div_clock g3d_div_clks[] __initdata = {
+static const struct samsung_div_clock g3d_div_clks[] __initconst = {
        DIV(G3D_DOUT_PCLK_G3D, "dout_pclk_g3d", "dout_aclk_g3d", DIV_G3D, 0, 3),
        DIV(G3D_DOUT_ACLK_G3D, "dout_aclk_g3d", "mout_g3d_pll", DIV_G3D, 4, 3),
 };
 
-static struct samsung_gate_clock g3d_gate_clks[] __initdata = {
+static const struct samsung_gate_clock g3d_gate_clks[] __initconst = {
        GATE(G3D_CLK_G3D, "clk_g3d", "dout_aclk_g3d", EN_IP_G3D, 2, 0, 0),
        GATE(G3D_CLK_G3D_HPM, "clk_g3d_hpm", "dout_aclk_g3d",
                        EN_IP_G3D, 3, 0, 0),
 };
 
-static struct samsung_pll_clock g3d_pll_clks[] __initdata = {
+static const struct samsung_pll_clock g3d_pll_clks[] __initconst = {
        PLL(pll_2550, G3D_FOUT_G3D_PLL, "fout_g3d_pll", "fin_pll",
                G3D_PLL_LOCK, G3D_PLL_CON0,
                pll2550_24mhz_tbl),
@@ -662,7 +662,7 @@ CLK_OF_DECLARE(exynos5260_clk_g3d, "samsung,exynos5260-clock-g3d",
 
 /* CMU_GSCL */
 
-static unsigned long gscl_clk_regs[] __initdata = {
+static const unsigned long gscl_clk_regs[] __initconst = {
        MUX_SEL_GSCL,
        DIV_GSCL,
        EN_ACLK_GSCL,
@@ -692,7 +692,7 @@ PNAME(mout_aclk_m2m_400_user_p) = {"fin_pll", "dout_aclk_gscl_400"};
 PNAME(mout_aclk_gscl_fimc_user_p) = {"fin_pll", "dout_aclk_gscl_400"};
 PNAME(mout_aclk_csis_p) = {"dout_aclk_csis_200", "mout_aclk_gscl_fimc_user"};
 
-static struct samsung_mux_clock gscl_mux_clks[] __initdata = {
+static const struct samsung_mux_clock gscl_mux_clks[] __initconst = {
        MUX(GSCL_MOUT_ACLK_GSCL_333_USER, "mout_aclk_gscl_333_user",
                        mout_aclk_gscl_333_user_p,
                        MUX_SEL_GSCL, 0, 1),
@@ -706,7 +706,7 @@ static struct samsung_mux_clock gscl_mux_clks[] __initdata = {
                        MUX_SEL_GSCL, 24, 1),
 };
 
-static struct samsung_div_clock gscl_div_clks[] __initdata = {
+static const struct samsung_div_clock gscl_div_clks[] __initconst = {
        DIV(GSCL_DOUT_PCLK_M2M_100, "dout_pclk_m2m_100",
                        "mout_aclk_m2m_400_user",
                        DIV_GSCL, 0, 3),
@@ -715,7 +715,7 @@ static struct samsung_div_clock gscl_div_clks[] __initdata = {
                        DIV_GSCL, 4, 3),
 };
 
-static struct samsung_gate_clock gscl_gate_clks[] __initdata = {
+static const struct samsung_gate_clock gscl_gate_clks[] __initconst = {
        GATE(GSCL_SCLK_CSIS0_WRAP, "sclk_csis0_wrap", "dout_aclk_csis_200",
                        EN_SCLK_GSCL_FIMC, 0, CLK_SET_RATE_PARENT, 0),
        GATE(GSCL_SCLK_CSIS1_WRAP, "sclk_csis1_wrap", "dout_aclk_csis_200",
@@ -795,7 +795,7 @@ CLK_OF_DECLARE(exynos5260_clk_gscl, "samsung,exynos5260-clock-gscl",
 
 /* CMU_ISP */
 
-static unsigned long isp_clk_regs[] __initdata = {
+static const unsigned long isp_clk_regs[] __initconst = {
        MUX_SEL_ISP0,
        MUX_SEL_ISP1,
        DIV_ISP,
@@ -811,14 +811,14 @@ static unsigned long isp_clk_regs[] __initdata = {
 PNAME(mout_isp_400_user_p) = {"fin_pll", "dout_aclk_isp1_400"};
 PNAME(mout_isp_266_user_p)      = {"fin_pll", "dout_aclk_isp1_266"};
 
-static struct samsung_mux_clock isp_mux_clks[] __initdata = {
+static const struct samsung_mux_clock isp_mux_clks[] __initconst = {
        MUX(ISP_MOUT_ISP_266_USER, "mout_isp_266_user", mout_isp_266_user_p,
                        MUX_SEL_ISP0, 0, 1),
        MUX(ISP_MOUT_ISP_400_USER, "mout_isp_400_user", mout_isp_400_user_p,
                        MUX_SEL_ISP0, 4, 1),
 };
 
-static struct samsung_div_clock isp_div_clks[] __initdata = {
+static const struct samsung_div_clock isp_div_clks[] __initconst = {
        DIV(ISP_DOUT_PCLK_ISP_66, "dout_pclk_isp_66", "mout_kfc",
                        DIV_ISP, 0, 3),
        DIV(ISP_DOUT_PCLK_ISP_133, "dout_pclk_isp_133", "mout_kfc",
@@ -830,7 +830,7 @@ static struct samsung_div_clock isp_div_clks[] __initdata = {
        DIV(ISP_DOUT_SCLK_MPWM, "dout_sclk_mpwm", "mout_kfc", DIV_ISP, 20, 2),
 };
 
-static struct samsung_gate_clock isp_gate_clks[] __initdata = {
+static const struct samsung_gate_clock isp_gate_clks[] __initconst = {
        GATE(ISP_CLK_GIC, "clk_isp_gic", "mout_aclk_isp1_266",
                        EN_IP_ISP0, 15, 0, 0),
 
@@ -914,7 +914,7 @@ CLK_OF_DECLARE(exynos5260_clk_isp, "samsung,exynos5260-clock-isp",
 
 /* CMU_KFC */
 
-static unsigned long kfc_clk_regs[] __initdata = {
+static const unsigned long kfc_clk_regs[] __initconst = {
        KFC_PLL_LOCK,
        KFC_PLL_CON0,
        KFC_PLL_CON1,
@@ -932,13 +932,13 @@ static unsigned long kfc_clk_regs[] __initdata = {
 PNAME(mout_kfc_pll_p) = {"fin_pll", "fout_kfc_pll"};
 PNAME(mout_kfc_p)       = {"mout_kfc_pll", "dout_media_pll"};
 
-static struct samsung_mux_clock kfc_mux_clks[] __initdata = {
+static const struct samsung_mux_clock kfc_mux_clks[] __initconst = {
        MUX(KFC_MOUT_KFC_PLL, "mout_kfc_pll", mout_kfc_pll_p,
                        MUX_SEL_KFC0, 0, 1),
        MUX(KFC_MOUT_KFC, "mout_kfc", mout_kfc_p, MUX_SEL_KFC2, 0, 1),
 };
 
-static struct samsung_div_clock kfc_div_clks[] __initdata = {
+static const struct samsung_div_clock kfc_div_clks[] __initconst = {
        DIV(KFC_DOUT_KFC1, "dout_kfc1", "mout_kfc", DIV_KFC, 0, 3),
        DIV(KFC_DOUT_KFC2, "dout_kfc2", "dout_kfc1", DIV_KFC, 4, 3),
        DIV(KFC_DOUT_KFC_ATCLK, "dout_kfc_atclk", "dout_kfc2", DIV_KFC, 8, 3),
@@ -949,7 +949,7 @@ static struct samsung_div_clock kfc_div_clks[] __initdata = {
        DIV(KFC_DOUT_KFC_PLL, "dout_kfc_pll", "mout_kfc", DIV_KFC, 24, 3),
 };
 
-static struct samsung_pll_clock kfc_pll_clks[] __initdata = {
+static const struct samsung_pll_clock kfc_pll_clks[] __initconst = {
        PLL(pll_2550xx, KFC_FOUT_KFC_PLL, "fout_kfc_pll", "fin_pll",
                KFC_PLL_LOCK, KFC_PLL_CON0,
                pll2550_24mhz_tbl),
@@ -978,7 +978,7 @@ CLK_OF_DECLARE(exynos5260_clk_kfc, "samsung,exynos5260-clock-kfc",
 
 /* CMU_MFC */
 
-static unsigned long mfc_clk_regs[] __initdata = {
+static const unsigned long mfc_clk_regs[] __initconst = {
        MUX_SEL_MFC,
        DIV_MFC,
        EN_ACLK_MFC,
@@ -991,18 +991,18 @@ static unsigned long mfc_clk_regs[] __initdata = {
 
 PNAME(mout_aclk_mfc_333_user_p) = {"fin_pll", "dout_aclk_mfc_333"};
 
-static struct samsung_mux_clock mfc_mux_clks[] __initdata = {
+static const struct samsung_mux_clock mfc_mux_clks[] __initconst = {
        MUX(MFC_MOUT_ACLK_MFC_333_USER, "mout_aclk_mfc_333_user",
                        mout_aclk_mfc_333_user_p,
                        MUX_SEL_MFC, 0, 1),
 };
 
-static struct samsung_div_clock mfc_div_clks[] __initdata = {
+static const struct samsung_div_clock mfc_div_clks[] __initconst = {
        DIV(MFC_DOUT_PCLK_MFC_83, "dout_pclk_mfc_83", "mout_aclk_mfc_333_user",
                        DIV_MFC, 0, 3),
 };
 
-static struct samsung_gate_clock mfc_gate_clks[] __initdata = {
+static const struct samsung_gate_clock mfc_gate_clks[] __initconst = {
        GATE(MFC_CLK_MFC, "clk_mfc", "mout_aclk_mfc_333_user",
                        EN_IP_MFC, 1, 0, 0),
        GATE(MFC_CLK_SMMU2_MFCM0, "clk_smmu2_mfcm0", "mout_aclk_mfc_333_user",
@@ -1034,7 +1034,7 @@ CLK_OF_DECLARE(exynos5260_clk_mfc, "samsung,exynos5260-clock-mfc",
 
 /* CMU_MIF */
 
-static unsigned long mif_clk_regs[] __initdata = {
+static const unsigned long mif_clk_regs[] __initconst = {
        MEM_PLL_LOCK,
        BUS_PLL_LOCK,
        MEDIA_PLL_LOCK,
@@ -1076,7 +1076,7 @@ PNAME(mout_mif_drex2x_p) = {"dout_mem_pll", "dout_bus_pll"};
 PNAME(mout_clkm_phy_p) = {"mout_mif_drex", "dout_media_pll"};
 PNAME(mout_clk2x_phy_p) = {"mout_mif_drex2x", "dout_media_pll"};
 
-static struct samsung_mux_clock mif_mux_clks[] __initdata = {
+static const struct samsung_mux_clock mif_mux_clks[] __initconst = {
        MUX(MIF_MOUT_MEM_PLL, "mout_mem_pll", mout_mem_pll_p,
                        MUX_SEL_MIF, 0, 1),
        MUX(MIF_MOUT_BUS_PLL, "mout_bus_pll", mout_bus_pll_p,
@@ -1093,7 +1093,7 @@ static struct samsung_mux_clock mif_mux_clks[] __initdata = {
                        MUX_SEL_MIF, 24, 1),
 };
 
-static struct samsung_div_clock mif_div_clks[] __initdata = {
+static const struct samsung_div_clock mif_div_clks[] __initconst = {
        DIV(MIF_DOUT_MEDIA_PLL, "dout_media_pll", "mout_media_pll",
                        DIV_MIF, 0, 3),
        DIV(MIF_DOUT_MEM_PLL, "dout_mem_pll", "mout_mem_pll",
@@ -1112,7 +1112,7 @@ static struct samsung_div_clock mif_div_clks[] __initdata = {
                        DIV_MIF, 28, 4),
 };
 
-static struct samsung_gate_clock mif_gate_clks[] __initdata = {
+static const struct samsung_gate_clock mif_gate_clks[] __initconst = {
        GATE(MIF_CLK_LPDDR3PHY_WRAP0, "clk_lpddr3phy_wrap0", "dout_clk2x_phy",
                        EN_IP_MIF, 12, CLK_IGNORE_UNUSED, 0),
        GATE(MIF_CLK_LPDDR3PHY_WRAP1, "clk_lpddr3phy_wrap1", "dout_clk2x_phy",
@@ -1146,7 +1146,7 @@ static struct samsung_gate_clock mif_gate_clks[] __initdata = {
                        CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0),
 };
 
-static struct samsung_pll_clock mif_pll_clks[] __initdata = {
+static const struct samsung_pll_clock mif_pll_clks[] __initconst = {
        PLL(pll_2550xx, MIF_FOUT_MEM_PLL, "fout_mem_pll", "fin_pll",
                MEM_PLL_LOCK, MEM_PLL_CON0,
                pll2550_24mhz_tbl),
@@ -1183,7 +1183,7 @@ CLK_OF_DECLARE(exynos5260_clk_mif, "samsung,exynos5260-clock-mif",
 
 /* CMU_PERI */
 
-static unsigned long peri_clk_regs[] __initdata = {
+static const unsigned long peri_clk_regs[] __initconst = {
        MUX_SEL_PERI,
        MUX_SEL_PERI1,
        DIV_PERI,
@@ -1219,7 +1219,7 @@ PNAME(mout_sclk_i2scod_p) = {"ioclk_i2s_cdclk", "fin_pll", "dout_aclk_peri_aud",
 PNAME(mout_sclk_spdif_p) = {"ioclk_spdif_extclk", "fin_pll",
                        "dout_aclk_peri_aud", "phyclk_hdmi_phy_ref_cko"};
 
-static struct samsung_mux_clock peri_mux_clks[] __initdata = {
+static const struct samsung_mux_clock peri_mux_clks[] __initconst = {
        MUX(PERI_MOUT_SCLK_PCM, "mout_sclk_pcm", mout_sclk_pcm_p,
                        MUX_SEL_PERI1, 4, 2),
        MUX(PERI_MOUT_SCLK_I2SCOD, "mout_sclk_i2scod", mout_sclk_i2scod_p,
@@ -1228,12 +1228,12 @@ static struct samsung_mux_clock peri_mux_clks[] __initdata = {
                        MUX_SEL_PERI1, 20, 2),
 };
 
-static struct samsung_div_clock peri_div_clks[] __initdata = {
+static const struct samsung_div_clock peri_div_clks[] __initconst = {
        DIV(PERI_DOUT_PCM, "dout_pcm", "mout_sclk_pcm", DIV_PERI, 0, 8),
        DIV(PERI_DOUT_I2S, "dout_i2s", "mout_sclk_i2scod", DIV_PERI, 8, 6),
 };
 
-static struct samsung_gate_clock peri_gate_clks[] __initdata = {
+static const struct samsung_gate_clock peri_gate_clks[] __initconst = {
        GATE(PERI_SCLK_PCM1, "sclk_pcm1", "dout_pcm", EN_SCLK_PERI, 0,
                        CLK_SET_RATE_PARENT, 0),
        GATE(PERI_SCLK_I2S, "sclk_i2s", "dout_i2s", EN_SCLK_PERI, 1,
@@ -1389,7 +1389,7 @@ CLK_OF_DECLARE(exynos5260_clk_peri, "samsung,exynos5260-clock-peri",
 
 /* CMU_TOP */
 
-static unsigned long top_clk_regs[] __initdata = {
+static const unsigned long top_clk_regs[] __initconst = {
        DISP_PLL_LOCK,
        AUD_PLL_LOCK,
        DISP_PLL_CON0,
@@ -1430,7 +1430,7 @@ static unsigned long top_clk_regs[] __initdata = {
 };
 
 /* fixed rate clocks generated inside the soc */
-static struct samsung_fixed_rate_clock fixed_rate_clks[] __initdata = {
+static const struct samsung_fixed_rate_clock fixed_rate_clks[] __initconst = {
        FRATE(PHYCLK_DPTX_PHY_CH3_TXD_CLK, "phyclk_dptx_phy_ch3_txd_clk", NULL,
                        0, 270000000),
        FRATE(PHYCLK_DPTX_PHY_CH2_TXD_CLK, "phyclk_dptx_phy_ch2_txd_clk", NULL,
@@ -1513,7 +1513,7 @@ PNAME(mout_sclk_fsys_mmc1_sdclkin_b_p) = {"mout_sclk_fsys_mmc1_sdclkin_a",
 PNAME(mout_sclk_fsys_mmc2_sdclkin_b_p) = {"mout_sclk_fsys_mmc2_sdclkin_a",
                        "mout_mediatop_pll_user"};
 
-static struct samsung_mux_clock top_mux_clks[] __initdata = {
+static const struct samsung_mux_clock top_mux_clks[] __initconst = {
        MUX(TOP_MOUT_MEDIATOP_PLL_USER, "mout_mediatop_pll_user",
                        mout_mediatop_pll_user_p,
                        MUX_SEL_TOP_PLL0, 0, 1),
@@ -1673,7 +1673,7 @@ static struct samsung_mux_clock top_mux_clks[] __initdata = {
                        MUX_SEL_TOP_GSCL, 20, 1),
 };
 
-static struct samsung_div_clock top_div_clks[] __initdata = {
+static const struct samsung_div_clock top_div_clks[] __initconst = {
        DIV(TOP_DOUT_ACLK_G2D_333, "dout_aclk_g2d_333", "mout_aclk_g2d_333",
                        DIV_TOP_G2D_MFC, 0, 3),
        DIV(TOP_DOUT_ACLK_MFC_333, "dout_aclk_mfc_333", "mout_aclk_mfc_333",
@@ -1794,7 +1794,7 @@ static struct samsung_div_clock top_div_clks[] __initdata = {
 
 };
 
-static struct samsung_gate_clock top_gate_clks[] __initdata = {
+static const struct samsung_gate_clock top_gate_clks[] __initconst = {
        GATE(TOP_SCLK_MMC0, "sclk_fsys_mmc0_sdclkin",
                        "dout_sclk_fsys_mmc0_sdclkin_b",
                        EN_SCLK_TOP, 7, CLK_SET_RATE_PARENT, 0),
@@ -1809,7 +1809,7 @@ static struct samsung_gate_clock top_gate_clks[] __initdata = {
                        CLK_SET_RATE_PARENT, 0),
 };
 
-static struct samsung_pll_clock top_pll_clks[] __initdata = {
+static const struct samsung_pll_clock top_pll_clks[] __initconst = {
        PLL(pll_2550xx, TOP_FOUT_DISP_PLL, "fout_disp_pll", "fin_pll",
                DISP_PLL_LOCK, DISP_PLL_CON0,
                pll2550_24mhz_tbl),
index d5d5dcabc4a968c490a768634f28d8cd04327c93..54ec486a5e45c2c1fdb2e203edd67e7c0b761093 100644 (file)
 #define SRC_CPU                        0x200
 #define DIV_CPU0               0x500
 #define SRC_CPERI1             0x4204
+#define GATE_IP_G2D            0x8800
 #define DIV_TOP0               0x10510
 #define DIV_TOP1               0x10514
+#define DIV_FSYS0              0x10548
 #define DIV_FSYS1              0x1054c
 #define DIV_FSYS2              0x10550
 #define DIV_PERIC0             0x10558
+#define DIV_PERIC3             0x10564
 #define SRC_TOP0               0x10210
 #define SRC_TOP1               0x10214
 #define SRC_TOP2               0x10218
@@ -44,6 +47,8 @@
 #define SRC_MASK_FSYS          0x10340
 #define SRC_MASK_PERIC0                0x10350
 #define GATE_BUS_FSYS0         0x10740
+#define GATE_TOP_SCLK_FSYS     0x10840
+#define GATE_TOP_SCLK_PERIC    0x10850
 #define GATE_IP_FSYS           0x10944
 #define GATE_IP_PERIC          0x10950
 #define GATE_IP_PERIS          0x10960
@@ -71,12 +76,13 @@ PNAME(mout_kfc_p)   = { "mout_kpll", "sclk_mpll", };
 PNAME(mpll_user_p)     = { "fin_pll", "sclk_mpll", };
 PNAME(bpll_user_p)     = { "fin_pll", "sclk_bpll", };
 PNAME(mpll_bpll_p)     = { "sclk_mpll_muxed", "sclk_bpll_muxed", };
+PNAME(sclk_mpll_bpll_p)        = { "sclk_mpll_bpll", "fin_pll", };
 
 PNAME(group2_p)                = { "fin_pll", "fin_pll", "none", "none",
                        "none", "none", "sclk_mpll_bpll",
                         "none", "none", "sclk_cpll" };
 
-static struct samsung_mux_clock exynos5410_mux_clks[] __initdata = {
+static const struct samsung_mux_clock exynos5410_mux_clks[] __initconst = {
        MUX(0, "mout_apll", apll_p, SRC_CPU, 0, 1),
        MUX(0, "mout_cpu", mout_cpu_p, SRC_CPU, 16, 1),
 
@@ -96,16 +102,20 @@ static struct samsung_mux_clock exynos5410_mux_clks[] __initdata = {
        MUX(0, "mout_mmc0", group2_p, SRC_FSYS, 0, 4),
        MUX(0, "mout_mmc1", group2_p, SRC_FSYS, 4, 4),
        MUX(0, "mout_mmc2", group2_p, SRC_FSYS, 8, 4),
+       MUX(0, "mout_usbd300", sclk_mpll_bpll_p, SRC_FSYS, 28, 1),
+       MUX(0, "mout_usbd301", sclk_mpll_bpll_p, SRC_FSYS, 29, 1),
 
        MUX(0, "mout_uart0", group2_p, SRC_PERIC0, 0, 4),
        MUX(0, "mout_uart1", group2_p, SRC_PERIC0, 4, 4),
        MUX(0, "mout_uart2", group2_p, SRC_PERIC0, 8, 4),
+       MUX(0, "mout_uart3", group2_p, SRC_PERIC0, 12, 4),
+       MUX(0, "mout_pwm", group2_p, SRC_PERIC0, 24, 4),
 
        MUX(0, "mout_aclk200", mpll_bpll_p, SRC_TOP0, 12, 1),
        MUX(0, "mout_aclk400", mpll_bpll_p, SRC_TOP0, 20, 1),
 };
 
-static struct samsung_div_clock exynos5410_div_clks[] __initdata = {
+static const struct samsung_div_clock exynos5410_div_clks[] __initconst = {
        DIV(0, "div_arm", "mout_cpu", DIV_CPU0, 0, 3),
        DIV(0, "div_arm2", "div_arm", DIV_CPU0, 28, 3),
 
@@ -121,6 +131,11 @@ static struct samsung_div_clock exynos5410_div_clks[] __initdata = {
        DIV(0, "aclk66_pre", "sclk_mpll_muxed", DIV_TOP1, 24, 3),
        DIV(0, "aclk66", "aclk66_pre", DIV_TOP0, 0, 3),
 
+       DIV(0, "dout_usbphy300", "mout_usbd300", DIV_FSYS0, 16, 4),
+       DIV(0, "dout_usbphy301", "mout_usbd301", DIV_FSYS0, 20, 4),
+       DIV(0, "dout_usbd300", "mout_usbd300", DIV_FSYS0, 24, 4),
+       DIV(0, "dout_usbd301", "mout_usbd301", DIV_FSYS0, 28, 4),
+
        DIV(0, "div_mmc0", "mout_mmc0", DIV_FSYS1, 0, 4),
        DIV(0, "div_mmc1", "mout_mmc1", DIV_FSYS1, 16, 4),
        DIV(0, "div_mmc2", "mout_mmc2", DIV_FSYS2, 0, 4),
@@ -137,12 +152,19 @@ static struct samsung_div_clock exynos5410_div_clks[] __initdata = {
        DIV(0, "div_uart2", "mout_uart2", DIV_PERIC0, 8, 4),
        DIV(0, "div_uart3", "mout_uart3", DIV_PERIC0, 12, 4),
 
+       DIV(0, "dout_pwm", "mout_pwm", DIV_PERIC3, 0, 4),
+
        DIV(0, "aclk200", "mout_aclk200", DIV_TOP0, 12, 3),
+       DIV(0, "aclk266", "mpll_user_p", DIV_TOP0, 16, 3),
        DIV(0, "aclk400", "mout_aclk400", DIV_TOP0, 24, 3),
 };
 
-static struct samsung_gate_clock exynos5410_gate_clks[] __initdata = {
+static const struct samsung_gate_clock exynos5410_gate_clks[] __initconst = {
+       GATE(CLK_SSS, "sss", "aclk266", GATE_IP_G2D, 2, 0, 0),
        GATE(CLK_MCT, "mct", "aclk66", GATE_IP_PERIS, 18, 0, 0),
+       GATE(CLK_WDT, "wdt", "aclk66", GATE_IP_PERIS, 19, 0, 0),
+       GATE(CLK_RTC, "rtc", "aclk66", GATE_IP_PERIS, 20, 0, 0),
+       GATE(CLK_TMU, "tmu", "aclk66", GATE_IP_PERIS, 21, 0, 0),
 
        GATE(CLK_SCLK_MMC0, "sclk_mmc0", "div_mmc_pre0",
                        SRC_MASK_FSYS, 0, CLK_SET_RATE_PARENT, 0),
@@ -155,9 +177,31 @@ static struct samsung_gate_clock exynos5410_gate_clks[] __initdata = {
        GATE(CLK_MMC1, "sdmmc1", "aclk200", GATE_BUS_FSYS0, 13, 0, 0),
        GATE(CLK_MMC2, "sdmmc2", "aclk200", GATE_BUS_FSYS0, 14, 0, 0),
 
+       GATE(CLK_SCLK_USBPHY301, "sclk_usbphy301", "dout_usbphy301",
+            GATE_TOP_SCLK_FSYS, 7, CLK_SET_RATE_PARENT, 0),
+       GATE(CLK_SCLK_USBPHY300, "sclk_usbphy300", "dout_usbphy300",
+            GATE_TOP_SCLK_FSYS, 8, CLK_SET_RATE_PARENT, 0),
+       GATE(CLK_SCLK_USBD300, "sclk_usbd300", "dout_usbd300",
+            GATE_TOP_SCLK_FSYS, 9, CLK_SET_RATE_PARENT, 0),
+       GATE(CLK_SCLK_USBD301, "sclk_usbd301", "dout_usbd301",
+            GATE_TOP_SCLK_FSYS, 10, CLK_SET_RATE_PARENT, 0),
+
+       GATE(CLK_SCLK_PWM, "sclk_pwm", "dout_pwm",
+            GATE_TOP_SCLK_PERIC, 11, CLK_SET_RATE_PARENT, 0),
+
        GATE(CLK_UART0, "uart0", "aclk66", GATE_IP_PERIC, 0, 0, 0),
        GATE(CLK_UART1, "uart1", "aclk66", GATE_IP_PERIC, 1, 0, 0),
        GATE(CLK_UART2, "uart2", "aclk66", GATE_IP_PERIC, 2, 0, 0),
+       GATE(CLK_UART3, "uart3", "aclk66", GATE_IP_PERIC, 3, 0, 0),
+       GATE(CLK_I2C0, "i2c0", "aclk66", GATE_IP_PERIC, 6, 0, 0),
+       GATE(CLK_I2C1, "i2c1", "aclk66", GATE_IP_PERIC, 7, 0, 0),
+       GATE(CLK_I2C2, "i2c2", "aclk66", GATE_IP_PERIC, 8, 0, 0),
+       GATE(CLK_I2C3, "i2c3", "aclk66", GATE_IP_PERIC, 9, 0, 0),
+       GATE(CLK_USI0, "usi0", "aclk66", GATE_IP_PERIC, 10, 0, 0),
+       GATE(CLK_USI1, "usi1", "aclk66", GATE_IP_PERIC, 11, 0, 0),
+       GATE(CLK_USI2, "usi2", "aclk66", GATE_IP_PERIC, 12, 0, 0),
+       GATE(CLK_USI3, "usi3", "aclk66", GATE_IP_PERIC, 13, 0, 0),
+       GATE(CLK_PWM, "pwm", "aclk66", GATE_IP_PERIC, 24, 0, 0),
 
        GATE(CLK_SCLK_UART0, "sclk_uart0", "div_uart0",
                        SRC_MASK_PERIC0, 0, CLK_SET_RATE_PARENT, 0),
@@ -165,9 +209,15 @@ static struct samsung_gate_clock exynos5410_gate_clks[] __initdata = {
                        SRC_MASK_PERIC0, 4, CLK_SET_RATE_PARENT, 0),
        GATE(CLK_SCLK_UART2, "sclk_uart2", "div_uart2",
                        SRC_MASK_PERIC0, 8, CLK_SET_RATE_PARENT, 0),
+       GATE(CLK_SCLK_UART3, "sclk_uart3", "div_uart3",
+                       SRC_MASK_PERIC0, 12, CLK_SET_RATE_PARENT, 0),
+
+       GATE(CLK_USBH20, "usbh20", "aclk200_fsys", GATE_IP_FSYS, 18, 0, 0),
+       GATE(CLK_USBD300, "usbd300", "aclk200_fsys", GATE_IP_FSYS, 19, 0, 0),
+       GATE(CLK_USBD301, "usbd301", "aclk200_fsys", GATE_IP_FSYS, 20, 0, 0),
 };
 
-static struct samsung_pll_clock exynos5410_plls[nr_plls] __initdata = {
+static const struct samsung_pll_clock exynos5410_plls[nr_plls] __initconst = {
        [apll] = PLL(pll_35xx, CLK_FOUT_APLL, "fout_apll", "fin_pll", APLL_LOCK,
                APLL_CON0, NULL),
        [cpll] = PLL(pll_35xx, CLK_FOUT_CPLL, "fout_cpll", "fin_pll", CPLL_LOCK,
index 92382cef9f90a2cc23c0c74ed11cad6e404c37c4..bb196ca21a775f70793f36e641adf18150fa29a7 100644 (file)
@@ -160,7 +160,7 @@ static struct samsung_clk_reg_dump *exynos5800_save;
  * list of controller registers to be saved and restored during a
  * suspend/resume cycle.
  */
-static unsigned long exynos5x_clk_regs[] __initdata = {
+static const unsigned long exynos5x_clk_regs[] __initconst = {
        SRC_CPU,
        DIV_CPU0,
        DIV_CPU1,
@@ -248,7 +248,7 @@ static unsigned long exynos5x_clk_regs[] __initdata = {
        DIV_KFC0,
 };
 
-static unsigned long exynos5800_clk_regs[] __initdata = {
+static const unsigned long exynos5800_clk_regs[] __initconst = {
        SRC_TOP8,
        SRC_TOP9,
        SRC_CAM,
@@ -306,7 +306,7 @@ static struct syscore_ops exynos5420_clk_syscore_ops = {
        .resume = exynos5420_clk_resume,
 };
 
-static void exynos5420_clk_sleep_init(void)
+static void __init exynos5420_clk_sleep_init(void)
 {
        exynos5x_save = samsung_clk_alloc_reg_dump(exynos5x_clk_regs,
                                        ARRAY_SIZE(exynos5x_clk_regs));
@@ -333,7 +333,7 @@ err_soc:
        return;
 }
 #else
-static void exynos5420_clk_sleep_init(void) {}
+static void __init exynos5420_clk_sleep_init(void) {}
 #endif
 
 /* list of all parent clocks */
@@ -484,7 +484,7 @@ static struct samsung_fixed_rate_clock
 };
 
 /* fixed rate clocks generated inside the soc */
-static struct samsung_fixed_rate_clock exynos5x_fixed_rate_clks[] __initdata = {
+static const struct samsung_fixed_rate_clock exynos5x_fixed_rate_clks[] __initconst = {
        FRATE(CLK_SCLK_HDMIPHY, "sclk_hdmiphy", NULL, 0, 24000000),
        FRATE(0, "sclk_pwi", NULL, 0, 24000000),
        FRATE(0, "sclk_usbh20", NULL, 0, 48000000),
@@ -492,19 +492,19 @@ static struct samsung_fixed_rate_clock exynos5x_fixed_rate_clks[] __initdata = {
        FRATE(0, "sclk_usbh20_scan_clk", NULL, 0, 480000000),
 };
 
-static struct samsung_fixed_factor_clock
-               exynos5x_fixed_factor_clks[] __initdata = {
+static const struct samsung_fixed_factor_clock
+               exynos5x_fixed_factor_clks[] __initconst = {
        FFACTOR(0, "ff_hsic_12m", "fin_pll", 1, 2, 0),
        FFACTOR(0, "ff_sw_aclk66", "mout_sw_aclk66", 1, 2, 0),
 };
 
-static struct samsung_fixed_factor_clock
-               exynos5800_fixed_factor_clks[] __initdata = {
+static const struct samsung_fixed_factor_clock
+               exynos5800_fixed_factor_clks[] __initconst = {
        FFACTOR(0, "ff_dout_epll2", "mout_sclk_epll", 1, 2, 0),
        FFACTOR(0, "ff_dout_spll2", "mout_sclk_spll", 1, 2, 0),
 };
 
-static struct samsung_mux_clock exynos5800_mux_clks[] __initdata = {
+static const struct samsung_mux_clock exynos5800_mux_clks[] __initconst = {
        MUX(0, "mout_aclk400_isp", mout_group3_5800_p, SRC_TOP0, 0, 3),
        MUX(0, "mout_aclk400_mscl", mout_group3_5800_p, SRC_TOP0, 4, 3),
        MUX(0, "mout_aclk400_wcore", mout_group2_5800_p, SRC_TOP0, 16, 3),
@@ -553,7 +553,7 @@ static struct samsung_mux_clock exynos5800_mux_clks[] __initdata = {
        MUX(0, "mout_fimd1", mout_group2_p, SRC_DISP10, 4, 3),
 };
 
-static struct samsung_div_clock exynos5800_div_clks[] __initdata = {
+static const struct samsung_div_clock exynos5800_div_clks[] __initconst = {
        DIV(CLK_DOUT_ACLK400_WCORE, "dout_aclk400_wcore",
                        "mout_aclk400_wcore", DIV_TOP0, 16, 3),
        DIV(0, "dout_aclk550_cam", "mout_aclk550_cam",
@@ -569,14 +569,14 @@ static struct samsung_div_clock exynos5800_div_clks[] __initdata = {
        DIV(0, "dout_sclk_sw", "sclk_spll", DIV_TOP9, 24, 6),
 };
 
-static struct samsung_gate_clock exynos5800_gate_clks[] __initdata = {
+static const struct samsung_gate_clock exynos5800_gate_clks[] __initconst = {
        GATE(CLK_ACLK550_CAM, "aclk550_cam", "mout_user_aclk550_cam",
                                GATE_BUS_TOP, 24, 0, 0),
        GATE(CLK_ACLK432_SCALER, "aclk432_scaler", "mout_user_aclk432_scaler",
                                GATE_BUS_TOP, 27, 0, 0),
 };
 
-static struct samsung_mux_clock exynos5420_mux_clks[] __initdata = {
+static const struct samsung_mux_clock exynos5420_mux_clks[] __initconst = {
        MUX(0, "sclk_bpll", mout_bpll_p, TOP_SPARE2, 0, 1),
        MUX(0, "mout_aclk400_wcore_bpll", mout_aclk400_wcore_bpll_p,
                                TOP_SPARE2, 4, 1),
@@ -606,12 +606,12 @@ static struct samsung_mux_clock exynos5420_mux_clks[] __initdata = {
        MUX(0, "mout_fimd1", mout_group3_p, SRC_DISP10, 4, 1),
 };
 
-static struct samsung_div_clock exynos5420_div_clks[] __initdata = {
+static const struct samsung_div_clock exynos5420_div_clks[] __initconst = {
        DIV(CLK_DOUT_ACLK400_WCORE, "dout_aclk400_wcore",
                        "mout_aclk400_wcore_bpll", DIV_TOP0, 16, 3),
 };
 
-static struct samsung_mux_clock exynos5x_mux_clks[] __initdata = {
+static const struct samsung_mux_clock exynos5x_mux_clks[] __initconst = {
        MUX(0, "mout_user_pclk66_gpio", mout_user_pclk66_gpio_p,
                        SRC_TOP7, 4, 1),
        MUX(0, "mout_mspll_kfc", mout_mspll_cpu_p, SRC_TOP7, 8, 2),
@@ -778,7 +778,7 @@ static struct samsung_mux_clock exynos5x_mux_clks[] __initdata = {
        MUX(0, "mout_isp_sensor", mout_group2_p, SRC_ISP, 28, 3),
 };
 
-static struct samsung_div_clock exynos5x_div_clks[] __initdata = {
+static const struct samsung_div_clock exynos5x_div_clks[] __initconst = {
        DIV(0, "div_arm", "mout_cpu", DIV_CPU0, 0, 3),
        DIV(0, "sclk_apll", "mout_apll", DIV_CPU0, 24, 3),
        DIV(0, "armclk2", "div_arm", DIV_CPU0, 28, 3),
@@ -911,7 +911,7 @@ static struct samsung_div_clock exynos5x_div_clks[] __initdata = {
                        CLK_SET_RATE_PARENT, 0),
 };
 
-static struct samsung_gate_clock exynos5x_gate_clks[] __initdata = {
+static const struct samsung_gate_clock exynos5x_gate_clks[] __initconst = {
        /* G2D */
        GATE(CLK_MDMA0, "mdma0", "aclk266_g2d", GATE_IP_G2D, 1, 0, 0),
        GATE(CLK_SSS, "sss", "aclk266_g2d", GATE_IP_G2D, 2, 0, 0),
@@ -946,7 +946,7 @@ static struct samsung_gate_clock exynos5x_gate_clks[] __initdata = {
                        GATE_BUS_TOP, 13, 0, 0),
        GATE(0, "aclk166", "mout_user_aclk166",
                        GATE_BUS_TOP, 14, CLK_IGNORE_UNUSED, 0),
-       GATE(0, "aclk333", "mout_user_aclk333",
+       GATE(CLK_ACLK333, "aclk333", "mout_user_aclk333",
                        GATE_BUS_TOP, 15, CLK_IGNORE_UNUSED, 0),
        GATE(0, "aclk400_isp", "mout_user_aclk400_isp",
                        GATE_BUS_TOP, 16, 0, 0),
@@ -1219,7 +1219,7 @@ static struct samsung_gate_clock exynos5x_gate_clks[] __initdata = {
        GATE(CLK_G3D, "g3d", "mout_user_aclk_g3d", GATE_IP_G3D, 9, 0, 0),
 };
 
-static const struct samsung_pll_rate_table exynos5420_pll2550x_24mhz_tbl[] = {
+static const struct samsung_pll_rate_table exynos5420_pll2550x_24mhz_tbl[] __initconst = {
        PLL_35XX_RATE(2000000000, 250, 3, 0),
        PLL_35XX_RATE(1900000000, 475, 6, 0),
        PLL_35XX_RATE(1800000000, 225, 3, 0),
@@ -1356,8 +1356,6 @@ static void __init exynos5x_clk_init(struct device_node *np,
        exynos5x_soc = soc;
 
        ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS);
-       if (!ctx)
-               panic("%s: unable to allocate context.\n", __func__);
 
        samsung_clk_of_register_fixed_ext(ctx, exynos5x_fixed_rate_ext_clks,
                        ARRAY_SIZE(exynos5x_fixed_rate_ext_clks),
index 128527b8fbeb8e54a06d8abbeabe4a6e9f5f9903..4204eb828d86fc229543b8ee4eaa0634d3f99144 100644 (file)
 
 #include <linux/clk-provider.h>
 #include <linux/of.h>
+#include <linux/of_address.h>
 
 #include <dt-bindings/clock/exynos5433.h>
 
 #include "clk.h"
+#include "clk-cpu.h"
 #include "clk-pll.h"
 
 /*
 #define ENABLE_CMU_TOP                 0x0c00
 #define ENABLE_CMU_TOP_DIV_STAT                0x0c04
 
-static unsigned long top_clk_regs[] __initdata = {
+static const unsigned long top_clk_regs[] __initconst = {
        ISP_PLL_LOCK,
        AUD_PLL_LOCK,
        ISP_PLL_CON0,
@@ -218,11 +220,11 @@ PNAME(mout_sclk_audio0_p) = { "ioclk_audiocdclk0", "oscclk",
 
 PNAME(mout_sclk_hdmi_spdif_p)  = { "sclk_audio1", "ioclk_spdif_extclk", };
 
-static struct samsung_fixed_factor_clock top_fixed_factor_clks[] __initdata = {
+static const struct samsung_fixed_factor_clock top_fixed_factor_clks[] __initconst = {
        FFACTOR(0, "oscclk_efuse_common", "oscclk", 1, 1, 0),
 };
 
-static struct samsung_fixed_rate_clock top_fixed_clks[] __initdata = {
+static const struct samsung_fixed_rate_clock top_fixed_clks[] __initconst = {
        /* Xi2s{0|1}CDCLK input clock for I2S/PCM */
        FRATE(0, "ioclk_audiocdclk1", NULL, 0, 100000000),
        FRATE(0, "ioclk_audiocdclk0", NULL, 0, 100000000),
@@ -238,7 +240,7 @@ static struct samsung_fixed_rate_clock top_fixed_clks[] __initdata = {
        FRATE(0, "ioclk_i2s1_bclk_in", NULL, 0, 12288000),
 };
 
-static struct samsung_mux_clock top_mux_clks[] __initdata = {
+static const struct samsung_mux_clock top_mux_clks[] __initconst = {
        /* MUX_SEL_TOP0 */
        MUX(CLK_MOUT_AUD_PLL, "mout_aud_pll", mout_aud_pll_p, MUX_SEL_TOP0,
                        4, 1),
@@ -374,7 +376,7 @@ static struct samsung_mux_clock top_mux_clks[] __initdata = {
                        mout_sclk_hdmi_spdif_p, MUX_SEL_TOP_DISP, 0, 1),
 };
 
-static struct samsung_div_clock top_div_clks[] __initdata = {
+static const struct samsung_div_clock top_div_clks[] __initconst = {
        /* DIV_TOP0 */
        DIV(CLK_DIV_ACLK_CAM1_333, "div_aclk_cam1_333", "mout_aclk_cam1_333",
                        DIV_TOP0, 28, 3),
@@ -538,7 +540,7 @@ static struct samsung_div_clock top_div_clks[] __initdata = {
                        DIV_TOP_PERIC4, 0, 4),
 };
 
-static struct samsung_gate_clock top_gate_clks[] __initdata = {
+static const struct samsung_gate_clock top_gate_clks[] __initconst = {
        /* ENABLE_ACLK_TOP */
        GATE(CLK_ACLK_G3D_400, "aclk_g3d_400", "div_aclk_g3d_400",
                        ENABLE_ACLK_TOP, 30, 0, 0),
@@ -639,7 +641,7 @@ static struct samsung_gate_clock top_gate_clks[] __initdata = {
 
        /* ENABLE_SCLK_TOP_FSYS */
        GATE(CLK_SCLK_PCIE_100_FSYS, "sclk_pcie_100_fsys", "div_sclk_pcie_100",
-                       ENABLE_SCLK_TOP_FSYS, 7, 0, 0),
+                       ENABLE_SCLK_TOP_FSYS, 7, CLK_IGNORE_UNUSED, 0),
        GATE(CLK_SCLK_MMC2_FSYS, "sclk_mmc2_fsys", "div_sclk_mmc2_b",
                        ENABLE_SCLK_TOP_FSYS, 6, CLK_SET_RATE_PARENT, 0),
        GATE(CLK_SCLK_MMC1_FSYS, "sclk_mmc1_fsys", "div_sclk_mmc1_b",
@@ -668,11 +670,14 @@ static struct samsung_gate_clock top_gate_clks[] __initdata = {
        GATE(CLK_SCLK_PCM1_PERIC, "sclk_pcm1_peric", "div_sclk_pcm1",
                        ENABLE_SCLK_TOP_PERIC, 7, CLK_SET_RATE_PARENT, 0),
        GATE(CLK_SCLK_UART2_PERIC, "sclk_uart2_peric", "div_sclk_uart2",
-                       ENABLE_SCLK_TOP_PERIC, 5, CLK_SET_RATE_PARENT, 0),
+                       ENABLE_SCLK_TOP_PERIC, 5, CLK_SET_RATE_PARENT |
+                       CLK_IGNORE_UNUSED, 0),
        GATE(CLK_SCLK_UART1_PERIC, "sclk_uart1_peric", "div_sclk_uart1",
-                       ENABLE_SCLK_TOP_PERIC, 4, CLK_SET_RATE_PARENT, 0),
+                       ENABLE_SCLK_TOP_PERIC, 4, CLK_SET_RATE_PARENT |
+                       CLK_IGNORE_UNUSED, 0),
        GATE(CLK_SCLK_UART0_PERIC, "sclk_uart0_peric", "div_sclk_uart0",
-                       ENABLE_SCLK_TOP_PERIC, 3, CLK_SET_RATE_PARENT, 0),
+                       ENABLE_SCLK_TOP_PERIC, 3, CLK_SET_RATE_PARENT |
+                       CLK_IGNORE_UNUSED, 0),
        GATE(CLK_SCLK_SPI2_PERIC, "sclk_spi2_peric", "div_sclk_spi2_b",
                        ENABLE_SCLK_TOP_PERIC, 2, CLK_SET_RATE_PARENT, 0),
        GATE(CLK_SCLK_SPI1_PERIC, "sclk_spi1_peric", "div_sclk_spi1_b",
@@ -693,7 +698,7 @@ static struct samsung_gate_clock top_gate_clks[] __initdata = {
  * ATLAS_PLL & APOLLO_PLL & MEM0_PLL & MEM1_PLL & BUS_PLL & MFC_PLL
  * & MPHY_PLL & G3D_PLL & DISP_PLL & ISP_PLL
  */
-static struct samsung_pll_rate_table exynos5443_pll_rates[] = {
+static const struct samsung_pll_rate_table exynos5443_pll_rates[] __initconst = {
        PLL_35XX_RATE(2500000000U, 625, 6,  0),
        PLL_35XX_RATE(2400000000U, 500, 5,  0),
        PLL_35XX_RATE(2300000000U, 575, 6,  0),
@@ -744,7 +749,7 @@ static struct samsung_pll_rate_table exynos5443_pll_rates[] = {
 };
 
 /* AUD_PLL */
-static struct samsung_pll_rate_table exynos5443_aud_pll_rates[] = {
+static const struct samsung_pll_rate_table exynos5443_aud_pll_rates[] __initconst = {
        PLL_36XX_RATE(400000000U, 200, 3, 2,      0),
        PLL_36XX_RATE(393216000U, 197, 3, 2, -25690),
        PLL_36XX_RATE(384000000U, 128, 2, 2,      0),
@@ -757,14 +762,14 @@ static struct samsung_pll_rate_table exynos5443_aud_pll_rates[] = {
        { /* sentinel */ }
 };
 
-static struct samsung_pll_clock top_pll_clks[] __initdata = {
+static const struct samsung_pll_clock top_pll_clks[] __initconst = {
        PLL(pll_35xx, CLK_FOUT_ISP_PLL, "fout_isp_pll", "oscclk",
                ISP_PLL_LOCK, ISP_PLL_CON0, exynos5443_pll_rates),
        PLL(pll_36xx, CLK_FOUT_AUD_PLL, "fout_aud_pll", "oscclk",
                AUD_PLL_LOCK, AUD_PLL_CON0, exynos5443_aud_pll_rates),
 };
 
-static struct samsung_cmu_info top_cmu_info __initdata = {
+static const struct samsung_cmu_info top_cmu_info __initconst = {
        .pll_clks               = top_pll_clks,
        .nr_pll_clks            = ARRAY_SIZE(top_pll_clks),
        .mux_clks               = top_mux_clks,
@@ -800,7 +805,7 @@ CLK_OF_DECLARE(exynos5433_cmu_top, "samsung,exynos5433-cmu-top",
 #define DIV_CPIF               0x0600
 #define ENABLE_SCLK_CPIF       0x0a00
 
-static unsigned long cpif_clk_regs[] __initdata = {
+static const unsigned long cpif_clk_regs[] __initconst = {
        MPHY_PLL_LOCK,
        MPHY_PLL_CON0,
        MPHY_PLL_CON1,
@@ -813,32 +818,32 @@ static unsigned long cpif_clk_regs[] __initdata = {
 /* list of all parent clock list */
 PNAME(mout_mphy_pll_p)         = { "oscclk", "fout_mphy_pll", };
 
-static struct samsung_pll_clock cpif_pll_clks[] __initdata = {
+static const struct samsung_pll_clock cpif_pll_clks[] __initconst = {
        PLL(pll_35xx, CLK_FOUT_MPHY_PLL, "fout_mphy_pll", "oscclk",
                MPHY_PLL_LOCK, MPHY_PLL_CON0, exynos5443_pll_rates),
 };
 
-static struct samsung_mux_clock cpif_mux_clks[] __initdata = {
+static const struct samsung_mux_clock cpif_mux_clks[] __initconst = {
        /* MUX_SEL_CPIF0 */
        MUX(CLK_MOUT_MPHY_PLL, "mout_mphy_pll", mout_mphy_pll_p, MUX_SEL_CPIF0,
                        0, 1),
 };
 
-static struct samsung_div_clock cpif_div_clks[] __initdata = {
+static const struct samsung_div_clock cpif_div_clks[] __initconst = {
        /* DIV_CPIF */
        DIV(CLK_DIV_SCLK_MPHY, "div_sclk_mphy", "mout_mphy_pll", DIV_CPIF,
                        0, 6),
 };
 
-static struct samsung_gate_clock cpif_gate_clks[] __initdata = {
+static const struct samsung_gate_clock cpif_gate_clks[] __initconst = {
        /* ENABLE_SCLK_CPIF */
        GATE(CLK_SCLK_MPHY_PLL, "sclk_mphy_pll", "mout_mphy_pll",
-                       ENABLE_SCLK_CPIF, 9, 0, 0),
+                       ENABLE_SCLK_CPIF, 9, CLK_IGNORE_UNUSED, 0),
        GATE(CLK_SCLK_UFS_MPHY, "sclk_ufs_mphy", "div_sclk_mphy",
                        ENABLE_SCLK_CPIF, 4, 0, 0),
 };
 
-static struct samsung_cmu_info cpif_cmu_info __initdata = {
+static const struct samsung_cmu_info cpif_cmu_info __initconst = {
        .pll_clks               = cpif_pll_clks,
        .nr_pll_clks            = ARRAY_SIZE(cpif_pll_clks),
        .mux_clks               = cpif_mux_clks,
@@ -939,7 +944,7 @@ CLK_OF_DECLARE(exynos5433_cmu_cpif, "samsung,exynos5433-cmu-cpif",
 #define PAUSE                          0x1008
 #define DDRPHY_LOCK_CTRL               0x100c
 
-static unsigned long mif_clk_regs[] __initdata = {
+static const unsigned long mif_clk_regs[] __initconst = {
        MEM0_PLL_LOCK,
        MEM1_PLL_LOCK,
        BUS_PLL_LOCK,
@@ -1004,7 +1009,7 @@ static unsigned long mif_clk_regs[] __initdata = {
        DDRPHY_LOCK_CTRL,
 };
 
-static struct samsung_pll_clock mif_pll_clks[] __initdata = {
+static const struct samsung_pll_clock mif_pll_clks[] __initconst = {
        PLL(pll_35xx, CLK_FOUT_MEM0_PLL, "fout_mem0_pll", "oscclk",
                MEM0_PLL_LOCK, MEM0_PLL_CON0, exynos5443_pll_rates),
        PLL(pll_35xx, CLK_FOUT_MEM1_PLL, "fout_mem1_pll", "oscclk",
@@ -1065,7 +1070,7 @@ PNAME(mout_sclk_decon_tv_vclk_b_p) = { "mout_sclk_decon_tv_vclk_a",
 PNAME(mout_sclk_dsim1_c_p)     = { "mout_sclk_dsim1_b", "sclk_mphy_pll", };
 PNAME(mout_sclk_dsim1_b_p)     = { "mout_sclk_dsim1_a", "mout_mfc_pll_div2",};
 
-static struct samsung_fixed_factor_clock mif_fixed_factor_clks[] __initdata = {
+static const struct samsung_fixed_factor_clock mif_fixed_factor_clks[] __initconst = {
        /* dout_{mfc|bus|mem1|mem0}_pll is half fixed rate from parent mux */
        FFACTOR(CLK_DOUT_MFC_PLL, "dout_mfc_pll", "mout_mfc_pll", 1, 1, 0),
        FFACTOR(CLK_DOUT_BUS_PLL, "dout_bus_pll", "mout_bus_pll", 1, 1, 0),
@@ -1073,7 +1078,7 @@ static struct samsung_fixed_factor_clock mif_fixed_factor_clks[] __initdata = {
        FFACTOR(CLK_DOUT_MEM0_PLL, "dout_mem0_pll", "mout_mem0_pll", 1, 1, 0),
 };
 
-static struct samsung_mux_clock mif_mux_clks[] __initdata = {
+static const struct samsung_mux_clock mif_mux_clks[] __initconst = {
        /* MUX_SEL_MIF0 */
        MUX(CLK_MOUT_MFC_PLL_DIV2, "mout_mfc_pll_div2", mout_mfc_pll_div2_p,
                        MUX_SEL_MIF0, 28, 1),
@@ -1169,7 +1174,7 @@ static struct samsung_mux_clock mif_mux_clks[] __initdata = {
                        MUX_SEL_MIF7, 0, 1),
 };
 
-static struct samsung_div_clock mif_div_clks[] __initdata = {
+static const struct samsung_div_clock mif_div_clks[] __initconst = {
        /* DIV_MIF1 */
        DIV(CLK_DIV_SCLK_HPM_MIF, "div_sclk_hpm_mif", "div_clk2x_phy",
                        DIV_MIF1, 16, 2),
@@ -1223,7 +1228,7 @@ static struct samsung_div_clock mif_div_clks[] __initdata = {
                        0, 3),
 };
 
-static struct samsung_gate_clock mif_gate_clks[] __initdata = {
+static const struct samsung_gate_clock mif_gate_clks[] __initconst = {
        /* ENABLE_ACLK_MIF0 */
        GATE(CLK_CLK2X_PHY1, "clk2k_phy1", "div_clk2x_phy", ENABLE_ACLK_MIF0,
                        19, CLK_IGNORE_UNUSED, 0),
@@ -1440,11 +1445,13 @@ static struct samsung_gate_clock mif_gate_clks[] __initdata = {
 
        /* ENABLE_PCLK_MIF_SECURE_DREX0_TZ */
        GATE(CLK_PCLK_DREX0_TZ, "pclk_drex0_tz", "div_aclk_mif_133",
-                       ENABLE_PCLK_MIF_SECURE_DREX0_TZ, 0, 0, 0),
+                       ENABLE_PCLK_MIF_SECURE_DREX0_TZ, 0,
+                       CLK_IGNORE_UNUSED, 0),
 
        /* ENABLE_PCLK_MIF_SECURE_DREX1_TZ */
        GATE(CLK_PCLK_DREX1_TZ, "pclk_drex1_tz", "div_aclk_mif_133",
-                       ENABLE_PCLK_MIF_SECURE_DREX1_TZ, 0, 0, 0),
+                       ENABLE_PCLK_MIF_SECURE_DREX1_TZ, 0,
+                       CLK_IGNORE_UNUSED, 0),
 
        /* ENABLE_PCLK_MIF_SECURE_MONOTONIC_CNT */
        GATE(CLK_PCLK_MONOTONIC_CNT, "pclk_monotonic_cnt", "div_aclk_mif_133",
@@ -1486,7 +1493,7 @@ static struct samsung_gate_clock mif_gate_clks[] __initdata = {
                        ENABLE_SCLK_MIF, 0, CLK_IGNORE_UNUSED, 0),
 };
 
-static struct samsung_cmu_info mif_cmu_info __initdata = {
+static const struct samsung_cmu_info mif_cmu_info __initconst = {
        .pll_clks               = mif_pll_clks,
        .nr_pll_clks            = ARRAY_SIZE(mif_pll_clks),
        .mux_clks               = mif_mux_clks,
@@ -1522,7 +1529,7 @@ CLK_OF_DECLARE(exynos5433_cmu_mif, "samsung,exynos5433-cmu-mif",
 #define ENABLE_IP_PERIC1               0x0B04
 #define ENABLE_IP_PERIC2               0x0B08
 
-static unsigned long peric_clk_regs[] __initdata = {
+static const unsigned long peric_clk_regs[] __initconst = {
        DIV_PERIC,
        ENABLE_ACLK_PERIC,
        ENABLE_PCLK_PERIC0,
@@ -1533,13 +1540,13 @@ static unsigned long peric_clk_regs[] __initdata = {
        ENABLE_IP_PERIC2,
 };
 
-static struct samsung_div_clock peric_div_clks[] __initdata = {
+static const struct samsung_div_clock peric_div_clks[] __initconst = {
        /* DIV_PERIC */
        DIV(CLK_DIV_SCLK_SCI, "div_sclk_sci", "oscclk", DIV_PERIC, 4, 4),
        DIV(CLK_DIV_SCLK_SC_IN, "div_sclk_sc_in", "oscclk", DIV_PERIC, 0, 4),
 };
 
-static struct samsung_gate_clock peric_gate_clks[] __initdata = {
+static const struct samsung_gate_clock peric_gate_clks[] __initconst = {
        /* ENABLE_ACLK_PERIC */
        GATE(CLK_ACLK_AHB2APB_PERIC2P, "aclk_ahb2apb_peric2p", "aclk_peric_66",
                        ENABLE_ACLK_PERIC, 3, CLK_IGNORE_UNUSED, 0),
@@ -1674,14 +1681,17 @@ static struct samsung_gate_clock peric_gate_clks[] __initdata = {
        GATE(CLK_SCLK_SPI0, "sclk_spi0", "sclk_spi0_peric", ENABLE_SCLK_PERIC,
                        3, CLK_SET_RATE_PARENT, 0),
        GATE(CLK_SCLK_UART2, "sclk_uart2", "sclk_uart2_peric",
-                       ENABLE_SCLK_PERIC, 2, CLK_SET_RATE_PARENT, 0),
+                       ENABLE_SCLK_PERIC, 2,
+                       CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
        GATE(CLK_SCLK_UART1, "sclk_uart1", "sclk_uart1_peric",
-                       ENABLE_SCLK_PERIC, 1, CLK_SET_RATE_PARENT, 0),
+                       ENABLE_SCLK_PERIC, 1,
+                       CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
        GATE(CLK_SCLK_UART0, "sclk_uart0", "sclk_uart0_peric",
-                       ENABLE_SCLK_PERIC, 0, CLK_SET_RATE_PARENT, 0),
+                       ENABLE_SCLK_PERIC, 0,
+                       CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
 };
 
-static struct samsung_cmu_info peric_cmu_info __initdata = {
+static const struct samsung_cmu_info peric_cmu_info __initconst = {
        .div_clks               = peric_div_clks,
        .nr_div_clks            = ARRAY_SIZE(peric_div_clks),
        .gate_clks              = peric_gate_clks,
@@ -1728,7 +1738,7 @@ CLK_OF_DECLARE(exynos5433_cmu_peric, "samsung,exynos5433-cmu-peric",
 #define ENABLE_IP_PERIS_SECURE_ANTIBRK_CNT             0x0b1c
 #define ENABLE_IP_PERIS_SECURE_OTP_CON                 0x0b20
 
-static unsigned long peris_clk_regs[] __initdata = {
+static const unsigned long peris_clk_regs[] __initconst = {
        ENABLE_ACLK_PERIS,
        ENABLE_PCLK_PERIS,
        ENABLE_PCLK_PERIS_SECURE_TZPC,
@@ -1756,7 +1766,7 @@ static unsigned long peris_clk_regs[] __initdata = {
        ENABLE_IP_PERIS_SECURE_OTP_CON,
 };
 
-static struct samsung_gate_clock peris_gate_clks[] __initdata = {
+static const struct samsung_gate_clock peris_gate_clks[] __initconst = {
        /* ENABLE_ACLK_PERIS */
        GATE(CLK_ACLK_AHB2APB_PERIS1P, "aclk_ahb2apb_peris1p", "aclk_peris_66",
                        ENABLE_ACLK_PERIS, 2, CLK_IGNORE_UNUSED, 0),
@@ -1875,7 +1885,7 @@ static struct samsung_gate_clock peris_gate_clks[] __initdata = {
                        ENABLE_SCLK_PERIS_SECURE_OTP_CON, 0, 0, 0),
 };
 
-static struct samsung_cmu_info peris_cmu_info __initdata = {
+static const struct samsung_cmu_info peris_cmu_info __initconst = {
        .gate_clks              = peris_gate_clks,
        .nr_gate_clks           = ARRAY_SIZE(peris_gate_clks),
        .nr_clk_ids             = PERIS_NR_CLK,
@@ -1959,7 +1969,7 @@ PNAME(mout_sclk_mphy_p)
                = { "mout_sclk_ufs_mphy_user",
                            "mout_phyclk_lli_mphy_to_ufs_user", };
 
-static unsigned long fsys_clk_regs[] __initdata = {
+static const unsigned long fsys_clk_regs[] __initconst = {
        MUX_SEL_FSYS0,
        MUX_SEL_FSYS1,
        MUX_SEL_FSYS2,
@@ -1980,7 +1990,7 @@ static unsigned long fsys_clk_regs[] __initdata = {
        ENABLE_IP_FSYS1,
 };
 
-static struct samsung_fixed_rate_clock fsys_fixed_clks[] __initdata = {
+static const struct samsung_fixed_rate_clock fsys_fixed_clks[] __initconst = {
        /* PHY clocks from USBDRD30_PHY */
        FRATE(CLK_PHYCLK_USBDRD30_UDRD30_PHYCLOCK_PHY,
                        "phyclk_usbdrd30_udrd30_phyclock_phy", NULL,
@@ -2020,7 +2030,7 @@ static struct samsung_fixed_rate_clock fsys_fixed_clks[] __initdata = {
                        NULL, 0, 26000000),
 };
 
-static struct samsung_mux_clock fsys_mux_clks[] __initdata = {
+static const struct samsung_mux_clock fsys_mux_clks[] __initconst = {
        /* MUX_SEL_FSYS0 */
        MUX(CLK_MOUT_SCLK_UFS_MPHY_USER, "mout_sclk_ufs_mphy_user",
                        mout_sclk_ufs_mphy_user_p, MUX_SEL_FSYS0, 4, 1),
@@ -2104,7 +2114,7 @@ static struct samsung_mux_clock fsys_mux_clks[] __initdata = {
                        MUX_SEL_FSYS4, 0, 1),
 };
 
-static struct samsung_gate_clock fsys_gate_clks[] __initdata = {
+static const struct samsung_gate_clock fsys_gate_clks[] __initconst = {
        /* ENABLE_ACLK_FSYS0 */
        GATE(CLK_ACLK_PCIE, "aclk_pcie", "mout_aclk_fsys_200_user",
                        ENABLE_ACLK_FSYS0, 13, CLK_IGNORE_UNUSED, 0),
@@ -2138,7 +2148,7 @@ static struct samsung_gate_clock fsys_gate_clks[] __initdata = {
        GATE(CLK_ACLK_SMMU_PDMA1, "aclk_smmu_pdma1", "mout_aclk_fsys_200_user",
                        ENABLE_ACLK_FSYS1, 25, CLK_IGNORE_UNUSED, 0),
        GATE(CLK_ACLK_BTS_PCIE, "aclk_bts_pcie", "mout_aclk_fsys_200_user",
-                       ENABLE_ACLK_FSYS1, 24, 0, 0),
+                       ENABLE_ACLK_FSYS1, 24, CLK_IGNORE_UNUSED, 0),
        GATE(CLK_ACLK_AXIUS_PDMA1, "aclk_axius_pdma1",
                        "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1,
                        22, CLK_IGNORE_UNUSED, 0),
@@ -2185,13 +2195,13 @@ static struct samsung_gate_clock fsys_gate_clks[] __initdata = {
 
        /* ENABLE_PCLK_FSYS */
        GATE(CLK_PCLK_PCIE_CTRL, "pclk_pcie_ctrl", "mout_aclk_fsys_200_user",
-                       ENABLE_PCLK_FSYS, 17, 0, 0),
+                       ENABLE_PCLK_FSYS, 17, CLK_IGNORE_UNUSED, 0),
        GATE(CLK_PCLK_SMMU_PDMA1, "pclk_smmu_pdma1", "mout_aclk_fsys_200_user",
                        ENABLE_PCLK_FSYS, 16, CLK_IGNORE_UNUSED, 0),
        GATE(CLK_PCLK_PCIE_PHY, "pclk_pcie_phy", "mout_aclk_fsys_200_user",
-                       ENABLE_PCLK_FSYS, 14, 0, 0),
+                       ENABLE_PCLK_FSYS, 14, CLK_IGNORE_UNUSED, 0),
        GATE(CLK_PCLK_BTS_PCIE, "pclk_bts_pcie", "mout_aclk_fsys_200_user",
-                       ENABLE_PCLK_FSYS, 13, 0, 0),
+                       ENABLE_PCLK_FSYS, 13, CLK_IGNORE_UNUSED, 0),
        GATE(CLK_PCLK_SMMU_PDMA0, "pclk_smmu_pdma0", "mout_aclk_fsys_200_user",
                        ENABLE_PCLK_FSYS, 8, CLK_IGNORE_UNUSED, 0),
        GATE(CLK_PCLK_BTS_UFS, "pclk_bts_ufs", "mout_aclk_fsys_200_user",
@@ -2270,11 +2280,12 @@ static struct samsung_gate_clock fsys_gate_clks[] __initdata = {
                        ENABLE_SCLK_FSYS, 0, 0, 0),
 
        /* ENABLE_IP_FSYS0 */
+       GATE(CLK_PCIE, "pcie", "sclk_pcie_100", ENABLE_IP_FSYS0, 17, 0, 0),
        GATE(CLK_PDMA1, "pdma1", "aclk_pdma1", ENABLE_IP_FSYS0, 15, 0, 0),
        GATE(CLK_PDMA0, "pdma0", "aclk_pdma0", ENABLE_IP_FSYS0, 0, 0, 0),
 };
 
-static struct samsung_cmu_info fsys_cmu_info __initdata = {
+static const struct samsung_cmu_info fsys_cmu_info __initconst = {
        .mux_clks               = fsys_mux_clks,
        .nr_mux_clks            = ARRAY_SIZE(fsys_mux_clks),
        .gate_clks              = fsys_gate_clks,
@@ -2310,7 +2321,7 @@ CLK_OF_DECLARE(exynos5433_cmu_fsys, "samsung,exynos5433-cmu-fsys",
 #define DIV_ENABLE_IP_G2D1                     0x0b04
 #define DIV_ENABLE_IP_G2D_SECURE_SMMU_G2D      0x0b08
 
-static unsigned long g2d_clk_regs[] __initdata = {
+static const unsigned long g2d_clk_regs[] __initconst = {
        MUX_SEL_G2D0,
        MUX_SEL_ENABLE_G2D0,
        DIV_G2D,
@@ -2327,7 +2338,7 @@ static unsigned long g2d_clk_regs[] __initdata = {
 PNAME(mout_aclk_g2d_266_user_p)                = { "oscclk", "aclk_g2d_266", };
 PNAME(mout_aclk_g2d_400_user_p)                = { "oscclk", "aclk_g2d_400", };
 
-static struct samsung_mux_clock g2d_mux_clks[] __initdata = {
+static const struct samsung_mux_clock g2d_mux_clks[] __initconst = {
        /* MUX_SEL_G2D0 */
        MUX(CLK_MUX_ACLK_G2D_266_USER, "mout_aclk_g2d_266_user",
                        mout_aclk_g2d_266_user_p, MUX_SEL_G2D0, 4, 1),
@@ -2335,13 +2346,13 @@ static struct samsung_mux_clock g2d_mux_clks[] __initdata = {
                        mout_aclk_g2d_400_user_p, MUX_SEL_G2D0, 0, 1),
 };
 
-static struct samsung_div_clock g2d_div_clks[] __initdata = {
+static const struct samsung_div_clock g2d_div_clks[] __initconst = {
        /* DIV_G2D */
        DIV(CLK_DIV_PCLK_G2D, "div_pclk_g2d", "mout_aclk_g2d_266_user",
                        DIV_G2D, 0, 2),
 };
 
-static struct samsung_gate_clock g2d_gate_clks[] __initdata = {
+static const struct samsung_gate_clock g2d_gate_clks[] __initconst = {
        /* DIV_ENABLE_ACLK_G2D */
        GATE(CLK_ACLK_SMMU_MDMA1, "aclk_smmu_mdma1", "mout_aclk_g2d_266_user",
                        DIV_ENABLE_ACLK_G2D, 12, 0, 0),
@@ -2398,7 +2409,7 @@ static struct samsung_gate_clock g2d_gate_clks[] __initdata = {
                DIV_ENABLE_PCLK_G2D_SECURE_SMMU_G2D, 0, 0, 0),
 };
 
-static struct samsung_cmu_info g2d_cmu_info __initdata = {
+static const struct samsung_cmu_info g2d_cmu_info __initconst = {
        .mux_clks               = g2d_mux_clks,
        .nr_mux_clks            = ARRAY_SIZE(g2d_mux_clks),
        .div_clks               = g2d_div_clks,
@@ -2454,7 +2465,7 @@ CLK_OF_DECLARE(exynos5433_cmu_g2d, "samsung,exynos5433-cmu-g2d",
 #define CLKOUT_CMU_DISP                        0x0c00
 #define CLKOUT_CMU_DISP_DIV_STAT       0x0c04
 
-static unsigned long disp_clk_regs[] __initdata = {
+static const unsigned long disp_clk_regs[] __initconst = {
        DISP_PLL_LOCK,
        DISP_PLL_CON0,
        DISP_PLL_CON1,
@@ -2527,12 +2538,12 @@ PNAME(mout_sclk_decon_tv_vclk_c_disp_p) = {
 PNAME(mout_sclk_decon_tv_vclk_b_disp_p)        = { "mout_sclk_decon_tv_vclk_a_disp",
                                            "mout_sclk_decon_tv_vclk_user", };
 
-static struct samsung_pll_clock disp_pll_clks[] __initdata = {
+static const struct samsung_pll_clock disp_pll_clks[] __initconst = {
        PLL(pll_35xx, CLK_FOUT_DISP_PLL, "fout_disp_pll", "oscclk",
                DISP_PLL_LOCK, DISP_PLL_CON0, exynos5443_pll_rates),
 };
 
-static struct samsung_fixed_factor_clock disp_fixed_factor_clks[] __initdata = {
+static const struct samsung_fixed_factor_clock disp_fixed_factor_clks[] __initconst = {
        /*
         * sclk_rgb_{vclk|tv_vclk} is half clock of sclk_decon_{vclk|tv_vclk}.
         * The divider has fixed value (2) between sclk_rgb_{vclk|tv_vclk}
@@ -2544,7 +2555,7 @@ static struct samsung_fixed_factor_clock disp_fixed_factor_clks[] __initdata = {
                        1, 2, 0),
 };
 
-static struct samsung_fixed_rate_clock disp_fixed_clks[] __initdata = {
+static const struct samsung_fixed_rate_clock disp_fixed_clks[] __initconst = {
        /* PHY clocks from MIPI_DPHY1 */
        FRATE(0, "phyclk_mipidphy1_bitclkdiv8_phy", NULL, 0, 188000000),
        FRATE(0, "phyclk_mipidphy1_rxclkesc0_phy", NULL, 0, 100000000),
@@ -2558,7 +2569,7 @@ static struct samsung_fixed_rate_clock disp_fixed_clks[] __initdata = {
                        NULL, 0, 166000000),
 };
 
-static struct samsung_mux_clock disp_mux_clks[] __initdata = {
+static const struct samsung_mux_clock disp_mux_clks[] __initconst = {
        /* MUX_SEL_DISP0 */
        MUX(CLK_MOUT_DISP_PLL, "mout_disp_pll", mout_disp_pll_p, MUX_SEL_DISP0,
                        0, 1),
@@ -2633,7 +2644,7 @@ static struct samsung_mux_clock disp_mux_clks[] __initdata = {
                        mout_sclk_decon_vclk_p, MUX_SEL_DISP4, 0, 1),
 };
 
-static struct samsung_div_clock disp_div_clks[] __initdata = {
+static const struct samsung_div_clock disp_div_clks[] __initconst = {
        /* DIV_DISP */
        DIV(CLK_DIV_SCLK_DSIM1_DISP, "div_sclk_dsim1_disp",
                        "mout_sclk_dsim1_b_disp", DIV_DISP, 24, 3),
@@ -2651,7 +2662,7 @@ static struct samsung_div_clock disp_div_clks[] __initdata = {
                        DIV_DISP, 0, 2),
 };
 
-static struct samsung_gate_clock disp_gate_clks[] __initdata = {
+static const struct samsung_gate_clock disp_gate_clks[] __initconst = {
        /* ENABLE_ACLK_DISP0 */
        GATE(CLK_ACLK_DECON_TV, "aclk_decon_tv", "mout_aclk_disp_333_user",
                        ENABLE_ACLK_DISP0, 2, 0, 0),
@@ -2811,7 +2822,7 @@ static struct samsung_gate_clock disp_gate_clks[] __initdata = {
                        "div_sclk_decon_eclk_disp", ENABLE_SCLK_DISP, 2, 0, 0),
 };
 
-static struct samsung_cmu_info disp_cmu_info __initdata = {
+static const struct samsung_cmu_info disp_cmu_info __initconst = {
        .pll_clks               = disp_pll_clks,
        .nr_pll_clks            = ARRAY_SIZE(disp_pll_clks),
        .mux_clks               = disp_mux_clks,
@@ -2856,7 +2867,7 @@ CLK_OF_DECLARE(exynos5433_cmu_disp, "samsung,exynos5433-cmu-disp",
 #define ENABLE_IP_AUD0                 0x0b00
 #define ENABLE_IP_AUD1                 0x0b04
 
-static unsigned long aud_clk_regs[] __initdata = {
+static const unsigned long aud_clk_regs[] __initconst = {
        MUX_SEL_AUD0,
        MUX_SEL_AUD1,
        MUX_ENABLE_AUD0,
@@ -2875,13 +2886,13 @@ static unsigned long aud_clk_regs[] __initdata = {
 PNAME(mout_aud_pll_user_aud_p) = { "oscclk", "fout_aud_pll", };
 PNAME(mout_sclk_aud_pcm_p)     = { "mout_aud_pll_user", "ioclk_audiocdclk0",};
 
-static struct samsung_fixed_rate_clock aud_fixed_clks[] __initdata = {
+static const struct samsung_fixed_rate_clock aud_fixed_clks[] __initconst = {
        FRATE(0, "ioclk_jtag_tclk", NULL, 0, 33000000),
        FRATE(0, "ioclk_slimbus_clk", NULL, 0, 25000000),
        FRATE(0, "ioclk_i2s_bclk", NULL, 0, 50000000),
 };
 
-static struct samsung_mux_clock aud_mux_clks[] __initdata = {
+static const struct samsung_mux_clock aud_mux_clks[] __initconst = {
        /* MUX_SEL_AUD0 */
        MUX(CLK_MOUT_AUD_PLL_USER, "mout_aud_pll_user",
                        mout_aud_pll_user_aud_p, MUX_SEL_AUD0, 0, 1),
@@ -2893,7 +2904,7 @@ static struct samsung_mux_clock aud_mux_clks[] __initdata = {
                        MUX_SEL_AUD1, 0, 1),
 };
 
-static struct samsung_div_clock aud_div_clks[] __initdata = {
+static const struct samsung_div_clock aud_div_clks[] __initconst = {
        /* DIV_AUD0 */
        DIV(CLK_DIV_ATCLK_AUD, "div_atclk_aud", "div_aud_ca5", DIV_AUD0,
                        12, 4),
@@ -2915,7 +2926,7 @@ static struct samsung_div_clock aud_div_clks[] __initdata = {
                        DIV_AUD1, 0, 4),
 };
 
-static struct samsung_gate_clock aud_gate_clks[] __initdata = {
+static const struct samsung_gate_clock aud_gate_clks[] __initconst = {
        /* ENABLE_ACLK_AUD */
        GATE(CLK_ACLK_INTR_CTRL, "aclk_intr_ctrl", "div_aclk_aud",
                        ENABLE_ACLK_AUD, 12, 0, 0),
@@ -2962,7 +2973,7 @@ static struct samsung_gate_clock aud_gate_clks[] __initdata = {
 
        /* ENABLE_SCLK_AUD0 */
        GATE(CLK_ATCLK_AUD, "atclk_aud", "div_atclk_aud", ENABLE_SCLK_AUD0,
-                       2, 0, 0),
+                       2, CLK_IGNORE_UNUSED, 0),
        GATE(CLK_PCLK_DBG_AUD, "pclk_dbg_aud", "div_pclk_dbg_aud",
                        ENABLE_SCLK_AUD0, 1, 0, 0),
        GATE(CLK_SCLK_AUD_CA5, "sclk_aud_ca5", "div_aud_ca5", ENABLE_SCLK_AUD0,
@@ -2976,7 +2987,7 @@ static struct samsung_gate_clock aud_gate_clks[] __initdata = {
        GATE(CLK_SCLK_AUD_SLIMBUS, "sclk_aud_slimbus", "div_sclk_aud_slimbus",
                        ENABLE_SCLK_AUD1, 4, 0, 0),
        GATE(CLK_SCLK_AUD_UART, "sclk_aud_uart", "div_sclk_aud_uart",
-                       ENABLE_SCLK_AUD1, 3, 0, 0),
+                       ENABLE_SCLK_AUD1, 3, CLK_IGNORE_UNUSED, 0),
        GATE(CLK_SCLK_AUD_PCM, "sclk_aud_pcm", "div_sclk_aud_pcm",
                        ENABLE_SCLK_AUD1, 2, 0, 0),
        GATE(CLK_SCLK_I2S_BCLK, "sclk_i2s_bclk", "ioclk_i2s_bclk",
@@ -2985,7 +2996,7 @@ static struct samsung_gate_clock aud_gate_clks[] __initdata = {
                        ENABLE_SCLK_AUD1, 0, CLK_IGNORE_UNUSED, 0),
 };
 
-static struct samsung_cmu_info aud_cmu_info __initdata = {
+static const struct samsung_cmu_info aud_cmu_info __initconst = {
        .mux_clks               = aud_mux_clks,
        .nr_mux_clks            = ARRAY_SIZE(aud_mux_clks),
        .div_clks               = aud_div_clks,
@@ -3031,24 +3042,24 @@ PNAME(mout_aclk_bus2_400_p)     = { "oscclk", "aclk_bus2_400", };
        ENABLE_IP_BUS0,         \
        ENABLE_IP_BUS1
 
-static unsigned long bus01_clk_regs[] __initdata = {
+static const unsigned long bus01_clk_regs[] __initconst = {
        CMU_BUS_COMMON_CLK_REGS,
 };
 
-static unsigned long bus2_clk_regs[] __initdata = {
+static const unsigned long bus2_clk_regs[] __initconst = {
        MUX_SEL_BUS2,
        MUX_ENABLE_BUS2,
        CMU_BUS_COMMON_CLK_REGS,
 };
 
-static struct samsung_div_clock bus0_div_clks[] __initdata = {
+static const struct samsung_div_clock bus0_div_clks[] __initconst = {
        /* DIV_BUS0 */
        DIV(CLK_DIV_PCLK_BUS_133, "div_pclk_bus0_133", "aclk_bus0_400",
                        DIV_BUS, 0, 3),
 };
 
 /* CMU_BUS0 clocks */
-static struct samsung_gate_clock bus0_gate_clks[] __initdata = {
+static const struct samsung_gate_clock bus0_gate_clks[] __initconst = {
        /* ENABLE_ACLK_BUS0 */
        GATE(CLK_ACLK_AHB2APB_BUSP, "aclk_ahb2apb_bus0p", "div_pclk_bus0_133",
                        ENABLE_ACLK_BUS, 4, CLK_IGNORE_UNUSED, 0),
@@ -3067,13 +3078,13 @@ static struct samsung_gate_clock bus0_gate_clks[] __initdata = {
 };
 
 /* CMU_BUS1 clocks */
-static struct samsung_div_clock bus1_div_clks[] __initdata = {
+static const struct samsung_div_clock bus1_div_clks[] __initconst = {
        /* DIV_BUS1 */
        DIV(CLK_DIV_PCLK_BUS_133, "div_pclk_bus1_133", "aclk_bus1_400",
                        DIV_BUS, 0, 3),
 };
 
-static struct samsung_gate_clock bus1_gate_clks[] __initdata = {
+static const struct samsung_gate_clock bus1_gate_clks[] __initconst = {
        /* ENABLE_ACLK_BUS1 */
        GATE(CLK_ACLK_AHB2APB_BUSP, "aclk_ahb2apb_bus1p", "div_pclk_bus1_133",
                        ENABLE_ACLK_BUS, 4, CLK_IGNORE_UNUSED, 0),
@@ -3092,19 +3103,19 @@ static struct samsung_gate_clock bus1_gate_clks[] __initdata = {
 };
 
 /* CMU_BUS2 clocks */
-static struct samsung_mux_clock bus2_mux_clks[] __initdata = {
+static const struct samsung_mux_clock bus2_mux_clks[] __initconst = {
        /* MUX_SEL_BUS2 */
        MUX(CLK_MOUT_ACLK_BUS2_400_USER, "mout_aclk_bus2_400_user",
                        mout_aclk_bus2_400_p, MUX_SEL_BUS2, 0, 1),
 };
 
-static struct samsung_div_clock bus2_div_clks[] __initdata = {
+static const struct samsung_div_clock bus2_div_clks[] __initconst = {
        /* DIV_BUS2 */
        DIV(CLK_DIV_PCLK_BUS_133, "div_pclk_bus2_133",
                        "mout_aclk_bus2_400_user", DIV_BUS, 0, 3),
 };
 
-static struct samsung_gate_clock bus2_gate_clks[] __initdata = {
+static const struct samsung_gate_clock bus2_gate_clks[] __initconst = {
        /* ENABLE_ACLK_BUS2 */
        GATE(CLK_ACLK_AHB2APB_BUSP, "aclk_ahb2apb_bus2p", "div_pclk_bus2_133",
                        ENABLE_ACLK_BUS, 3, CLK_IGNORE_UNUSED, 0),
@@ -3133,19 +3144,19 @@ static struct samsung_gate_clock bus2_gate_clks[] __initdata = {
        .nr_gate_clks           = ARRAY_SIZE(bus##id##_gate_clks),      \
        .nr_clk_ids             = BUSx_NR_CLK
 
-static struct samsung_cmu_info bus0_cmu_info __initdata = {
+static const struct samsung_cmu_info bus0_cmu_info __initconst = {
        CMU_BUS_INFO_CLKS(0),
        .clk_regs               = bus01_clk_regs,
        .nr_clk_regs            = ARRAY_SIZE(bus01_clk_regs),
 };
 
-static struct samsung_cmu_info bus1_cmu_info __initdata = {
+static const struct samsung_cmu_info bus1_cmu_info __initconst = {
        CMU_BUS_INFO_CLKS(1),
        .clk_regs               = bus01_clk_regs,
        .nr_clk_regs            = ARRAY_SIZE(bus01_clk_regs),
 };
 
-static struct samsung_cmu_info bus2_cmu_info __initdata = {
+static const struct samsung_cmu_info bus2_cmu_info __initconst = {
        CMU_BUS_INFO_CLKS(2),
        .mux_clks               = bus2_mux_clks,
        .nr_mux_clks            = ARRAY_SIZE(bus2_mux_clks),
@@ -3189,7 +3200,7 @@ exynos5433_cmu_bus_init(2);
 #define CLKOUT_CMU_G3D_DIV_STAT                0x0c04
 #define CLK_STOPCTRL                   0x1000
 
-static unsigned long g3d_clk_regs[] __initdata = {
+static const unsigned long g3d_clk_regs[] __initconst = {
        G3D_PLL_LOCK,
        G3D_PLL_CON0,
        G3D_PLL_CON1,
@@ -3212,12 +3223,12 @@ static unsigned long g3d_clk_regs[] __initdata = {
 PNAME(mout_aclk_g3d_400_p)     = { "mout_g3d_pll", "aclk_g3d_400", };
 PNAME(mout_g3d_pll_p)          = { "oscclk", "fout_g3d_pll", };
 
-static struct samsung_pll_clock g3d_pll_clks[] __initdata = {
+static const struct samsung_pll_clock g3d_pll_clks[] __initconst = {
        PLL(pll_35xx, CLK_FOUT_G3D_PLL, "fout_g3d_pll", "oscclk",
                G3D_PLL_LOCK, G3D_PLL_CON0, exynos5443_pll_rates),
 };
 
-static struct samsung_mux_clock g3d_mux_clks[] __initdata = {
+static const struct samsung_mux_clock g3d_mux_clks[] __initconst = {
        /* MUX_SEL_G3D */
        MUX_F(CLK_MOUT_ACLK_G3D_400, "mout_aclk_g3d_400", mout_aclk_g3d_400_p,
                        MUX_SEL_G3D, 8, 1, CLK_SET_RATE_PARENT, 0),
@@ -3225,7 +3236,7 @@ static struct samsung_mux_clock g3d_mux_clks[] __initdata = {
                        MUX_SEL_G3D, 0, 1, CLK_SET_RATE_PARENT, 0),
 };
 
-static struct samsung_div_clock g3d_div_clks[] __initdata = {
+static const struct samsung_div_clock g3d_div_clks[] __initconst = {
        /* DIV_G3D */
        DIV(CLK_DIV_SCLK_HPM_G3D, "div_sclk_hpm_g3d", "mout_g3d_pll", DIV_G3D,
                        8, 2),
@@ -3235,7 +3246,7 @@ static struct samsung_div_clock g3d_div_clks[] __initdata = {
                        0, 3, CLK_SET_RATE_PARENT, 0),
 };
 
-static struct samsung_gate_clock g3d_gate_clks[] __initdata = {
+static const struct samsung_gate_clock g3d_gate_clks[] __initconst = {
        /* ENABLE_ACLK_G3D */
        GATE(CLK_ACLK_BTS_G3D1, "aclk_bts_g3d1", "div_aclk_g3d",
                        ENABLE_ACLK_G3D, 7, 0, 0),
@@ -3269,7 +3280,7 @@ static struct samsung_gate_clock g3d_gate_clks[] __initdata = {
                        ENABLE_SCLK_G3D, 0, 0, 0),
 };
 
-static struct samsung_cmu_info g3d_cmu_info __initdata = {
+static const struct samsung_cmu_info g3d_cmu_info __initconst = {
        .pll_clks               = g3d_pll_clks,
        .nr_pll_clks            = ARRAY_SIZE(g3d_pll_clks),
        .mux_clks               = g3d_mux_clks,
@@ -3310,7 +3321,7 @@ CLK_OF_DECLARE(exynos5433_cmu_g3d, "samsung,exynos5433-cmu-g3d",
 #define ENABLE_IP_GSCL_SECURE_SMMU_GSCL1       0x0b0c
 #define ENABLE_IP_GSCL_SECURE_SMMU_GSCL2       0x0b10
 
-static unsigned long gscl_clk_regs[] __initdata = {
+static const unsigned long gscl_clk_regs[] __initconst = {
        MUX_SEL_GSCL,
        MUX_ENABLE_GSCL,
        ENABLE_ACLK_GSCL,
@@ -3332,7 +3343,7 @@ static unsigned long gscl_clk_regs[] __initdata = {
 PNAME(aclk_gscl_111_user_p)    = { "oscclk", "aclk_gscl_111", };
 PNAME(aclk_gscl_333_user_p)    = { "oscclk", "aclk_gscl_333", };
 
-static struct samsung_mux_clock gscl_mux_clks[] __initdata = {
+static const struct samsung_mux_clock gscl_mux_clks[] __initconst = {
        /* MUX_SEL_GSCL */
        MUX(CLK_MOUT_ACLK_GSCL_111_USER, "mout_aclk_gscl_111_user",
                        aclk_gscl_111_user_p, MUX_SEL_GSCL, 4, 1),
@@ -3340,7 +3351,7 @@ static struct samsung_mux_clock gscl_mux_clks[] __initdata = {
                        aclk_gscl_333_user_p, MUX_SEL_GSCL, 0, 1),
 };
 
-static struct samsung_gate_clock gscl_gate_clks[] __initdata = {
+static const struct samsung_gate_clock gscl_gate_clks[] __initconst = {
        /* ENABLE_ACLK_GSCL */
        GATE(CLK_ACLK_BTS_GSCL2, "aclk_bts_gscl2", "mout_aclk_gscl_333_user",
                        ENABLE_ACLK_GSCL, 11, 0, 0),
@@ -3356,9 +3367,11 @@ static struct samsung_gate_clock gscl_gate_clks[] __initdata = {
        GATE(CLK_ACLK_GSCLNP_111, "aclk_gsclnp_111", "mout_aclk_gscl_111_user",
                        ENABLE_ACLK_GSCL, 6, CLK_IGNORE_UNUSED, 0),
        GATE(CLK_ACLK_GSCLRTND_333, "aclk_gsclrtnd_333",
-                       "mout_aclk_gscl_333_user", ENABLE_ACLK_GSCL, 5, 0, 0),
+                       "mout_aclk_gscl_333_user", ENABLE_ACLK_GSCL, 5,
+                       CLK_IGNORE_UNUSED, 0),
        GATE(CLK_ACLK_GSCLBEND_333, "aclk_gsclbend_333",
-                       "mout_aclk_gscl_333_user", ENABLE_ACLK_GSCL, 4, 0, 0),
+                       "mout_aclk_gscl_333_user", ENABLE_ACLK_GSCL, 4,
+                       CLK_IGNORE_UNUSED, 0),
        GATE(CLK_ACLK_GSD, "aclk_gsd", "mout_aclk_gscl_333_user",
                        ENABLE_ACLK_GSCL, 3, 0, 0),
        GATE(CLK_ACLK_GSCL2, "aclk_gscl2", "mout_aclk_gscl_333_user",
@@ -3412,7 +3425,7 @@ static struct samsung_gate_clock gscl_gate_clks[] __initdata = {
                ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL2, 0, 0, 0),
 };
 
-static struct samsung_cmu_info gscl_cmu_info __initdata = {
+static const struct samsung_cmu_info gscl_cmu_info __initconst = {
        .mux_clks               = gscl_mux_clks,
        .nr_mux_clks            = ARRAY_SIZE(gscl_mux_clks),
        .gate_clks              = gscl_gate_clks,
@@ -3465,7 +3478,7 @@ CLK_OF_DECLARE(exynos5433_cmu_gscl, "samsung,exynos5433-cmu-gscl",
 #define APOLLO_INTR_SPREAD_USE_STANDBYWFI      0x1084
 #define APOLLO_INTR_SPREAD_BLOCKING_DURATION   0x1088
 
-static unsigned long apollo_clk_regs[] __initdata = {
+static const unsigned long apollo_clk_regs[] __initconst = {
        APOLLO_PLL_LOCK,
        APOLLO_PLL_CON0,
        APOLLO_PLL_CON1,
@@ -3500,15 +3513,16 @@ PNAME(mout_bus_pll_apollo_user_p)       = { "oscclk", "sclk_bus_pll_apollo", };
 PNAME(mout_apollo_p)                   = { "mout_apollo_pll",
                                            "mout_bus_pll_apollo_user", };
 
-static struct samsung_pll_clock apollo_pll_clks[] __initdata = {
+static const struct samsung_pll_clock apollo_pll_clks[] __initconst = {
        PLL(pll_35xx, CLK_FOUT_APOLLO_PLL, "fout_apollo_pll", "oscclk",
                APOLLO_PLL_LOCK, APOLLO_PLL_CON0, exynos5443_pll_rates),
 };
 
-static struct samsung_mux_clock apollo_mux_clks[] __initdata = {
+static const struct samsung_mux_clock apollo_mux_clks[] __initconst = {
        /* MUX_SEL_APOLLO0 */
        MUX_F(CLK_MOUT_APOLLO_PLL, "mout_apollo_pll", mout_apollo_pll_p,
-                       MUX_SEL_APOLLO0, 0, 1, CLK_SET_RATE_PARENT, 0),
+                       MUX_SEL_APOLLO0, 0, 1, CLK_SET_RATE_PARENT |
+                       CLK_RECALC_NEW_RATES, 0),
 
        /* MUX_SEL_APOLLO1 */
        MUX(CLK_MOUT_BUS_PLL_APOLLO_USER, "mout_bus_pll_apollo_user",
@@ -3519,7 +3533,7 @@ static struct samsung_mux_clock apollo_mux_clks[] __initdata = {
                        0, 1, CLK_SET_RATE_PARENT, 0),
 };
 
-static struct samsung_div_clock apollo_div_clks[] __initdata = {
+static const struct samsung_div_clock apollo_div_clks[] __initconst = {
        /* DIV_APOLLO0 */
        DIV_F(CLK_DIV_CNTCLK_APOLLO, "div_cntclk_apollo", "div_apollo2",
                        DIV_APOLLO0, 24, 3, CLK_GET_RATE_NOCACHE,
@@ -3550,7 +3564,7 @@ static struct samsung_div_clock apollo_div_clks[] __initdata = {
                        CLK_DIVIDER_READ_ONLY),
 };
 
-static struct samsung_gate_clock apollo_gate_clks[] __initdata = {
+static const struct samsung_gate_clock apollo_gate_clks[] __initconst = {
        /* ENABLE_ACLK_APOLLO */
        GATE(CLK_ACLK_ASATBSLV_APOLLO_3_CSSYS, "aclk_asatbslv_apollo_3_cssys",
                        "div_atclk_apollo", ENABLE_ACLK_APOLLO,
@@ -3589,28 +3603,64 @@ static struct samsung_gate_clock apollo_gate_clks[] __initdata = {
                        ENABLE_SCLK_APOLLO, 3, CLK_IGNORE_UNUSED, 0),
        GATE(CLK_SCLK_HPM_APOLLO, "sclk_hpm_apollo", "div_sclk_hpm_apollo",
                        ENABLE_SCLK_APOLLO, 1, CLK_IGNORE_UNUSED, 0),
-       GATE(CLK_SCLK_APOLLO, "sclk_apollo", "div_apollo2",
-                       ENABLE_SCLK_APOLLO, 0,
-                       CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0),
 };
 
-static struct samsung_cmu_info apollo_cmu_info __initdata = {
-       .pll_clks               = apollo_pll_clks,
-       .nr_pll_clks            = ARRAY_SIZE(apollo_pll_clks),
-       .mux_clks               = apollo_mux_clks,
-       .nr_mux_clks            = ARRAY_SIZE(apollo_mux_clks),
-       .div_clks               = apollo_div_clks,
-       .nr_div_clks            = ARRAY_SIZE(apollo_div_clks),
-       .gate_clks              = apollo_gate_clks,
-       .nr_gate_clks           = ARRAY_SIZE(apollo_gate_clks),
-       .nr_clk_ids             = APOLLO_NR_CLK,
-       .clk_regs               = apollo_clk_regs,
-       .nr_clk_regs            = ARRAY_SIZE(apollo_clk_regs),
+#define E5433_APOLLO_DIV0(cntclk, pclk_dbg, atclk, pclk, aclk) \
+               (((cntclk) << 24) | ((pclk_dbg) << 20) | ((atclk) << 16) | \
+                ((pclk) << 12) | ((aclk) << 8))
+
+#define E5433_APOLLO_DIV1(hpm, copy) \
+               (((hpm) << 4) | ((copy) << 0))
+
+static const struct exynos_cpuclk_cfg_data exynos5433_apolloclk_d[] __initconst = {
+       { 1300000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), },
+       { 1200000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), },
+       { 1100000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), },
+       { 1000000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), },
+       {  900000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), },
+       {  800000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), },
+       {  700000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), },
+       {  600000, E5433_APOLLO_DIV0(3, 7, 7, 7, 1), E5433_APOLLO_DIV1(7, 1), },
+       {  500000, E5433_APOLLO_DIV0(3, 7, 7, 7, 1), E5433_APOLLO_DIV1(7, 1), },
+       {  400000, E5433_APOLLO_DIV0(3, 7, 7, 7, 1), E5433_APOLLO_DIV1(7, 1), },
+       {  0 },
 };
 
 static void __init exynos5433_cmu_apollo_init(struct device_node *np)
 {
-       samsung_cmu_register_one(np, &apollo_cmu_info);
+       void __iomem *reg_base;
+       struct samsung_clk_provider *ctx;
+
+       reg_base = of_iomap(np, 0);
+       if (!reg_base) {
+               panic("%s: failed to map registers\n", __func__);
+               return;
+       }
+
+       ctx = samsung_clk_init(np, reg_base, APOLLO_NR_CLK);
+       if (!ctx) {
+               panic("%s: unable to allocate ctx\n", __func__);
+               return;
+       }
+
+       samsung_clk_register_pll(ctx, apollo_pll_clks,
+                                ARRAY_SIZE(apollo_pll_clks), reg_base);
+       samsung_clk_register_mux(ctx, apollo_mux_clks,
+                                ARRAY_SIZE(apollo_mux_clks));
+       samsung_clk_register_div(ctx, apollo_div_clks,
+                                ARRAY_SIZE(apollo_div_clks));
+       samsung_clk_register_gate(ctx, apollo_gate_clks,
+                                 ARRAY_SIZE(apollo_gate_clks));
+
+       exynos_register_cpu_clock(ctx, CLK_SCLK_APOLLO, "apolloclk",
+               mout_apollo_p[0], mout_apollo_p[1], 0x200,
+               exynos5433_apolloclk_d, ARRAY_SIZE(exynos5433_apolloclk_d),
+               CLK_CPU_HAS_E5433_REGS_LAYOUT);
+
+       samsung_clk_sleep_init(reg_base, apollo_clk_regs,
+                              ARRAY_SIZE(apollo_clk_regs));
+
+       samsung_clk_of_add_provider(np, ctx);
 }
 CLK_OF_DECLARE(exynos5433_cmu_apollo, "samsung,exynos5433-cmu-apollo",
                exynos5433_cmu_apollo_init);
@@ -3651,7 +3701,7 @@ CLK_OF_DECLARE(exynos5433_cmu_apollo, "samsung,exynos5433-cmu-apollo",
 #define ATLAS_INTR_SPREAD_USE_STANDBYWFI       0x1084
 #define ATLAS_INTR_SPREAD_BLOCKING_DURATION    0x1088
 
-static unsigned long atlas_clk_regs[] __initdata = {
+static const unsigned long atlas_clk_regs[] __initconst = {
        ATLAS_PLL_LOCK,
        ATLAS_PLL_CON0,
        ATLAS_PLL_CON1,
@@ -3686,15 +3736,16 @@ PNAME(mout_bus_pll_atlas_user_p)        = { "oscclk", "sclk_bus_pll_atlas", };
 PNAME(mout_atlas_p)                    = { "mout_atlas_pll",
                                            "mout_bus_pll_atlas_user", };
 
-static struct samsung_pll_clock atlas_pll_clks[] __initdata = {
+static const struct samsung_pll_clock atlas_pll_clks[] __initconst = {
        PLL(pll_35xx, CLK_FOUT_ATLAS_PLL, "fout_atlas_pll", "oscclk",
                ATLAS_PLL_LOCK, ATLAS_PLL_CON0, exynos5443_pll_rates),
 };
 
-static struct samsung_mux_clock atlas_mux_clks[] __initdata = {
+static const struct samsung_mux_clock atlas_mux_clks[] __initconst = {
        /* MUX_SEL_ATLAS0 */
        MUX_F(CLK_MOUT_ATLAS_PLL, "mout_atlas_pll", mout_atlas_pll_p,
-                       MUX_SEL_ATLAS0, 0, 1, CLK_SET_RATE_PARENT, 0),
+                       MUX_SEL_ATLAS0, 0, 1, CLK_SET_RATE_PARENT |
+                       CLK_RECALC_NEW_RATES, 0),
 
        /* MUX_SEL_ATLAS1 */
        MUX(CLK_MOUT_BUS_PLL_ATLAS_USER, "mout_bus_pll_atlas_user",
@@ -3705,7 +3756,7 @@ static struct samsung_mux_clock atlas_mux_clks[] __initdata = {
                        0, 1, CLK_SET_RATE_PARENT, 0),
 };
 
-static struct samsung_div_clock atlas_div_clks[] __initdata = {
+static const struct samsung_div_clock atlas_div_clks[] __initconst = {
        /* DIV_ATLAS0 */
        DIV_F(CLK_DIV_CNTCLK_ATLAS, "div_cntclk_atlas", "div_atlas2",
                        DIV_ATLAS0, 24, 3, CLK_GET_RATE_NOCACHE,
@@ -3736,7 +3787,7 @@ static struct samsung_div_clock atlas_div_clks[] __initdata = {
                        CLK_DIVIDER_READ_ONLY),
 };
 
-static struct samsung_gate_clock atlas_gate_clks[] __initdata = {
+static const struct samsung_gate_clock atlas_gate_clks[] __initconst = {
        /* ENABLE_ACLK_ATLAS */
        GATE(CLK_ACLK_ATB_AUD_CSSYS, "aclk_atb_aud_cssys",
                        "div_atclk_atlas", ENABLE_ACLK_ATLAS,
@@ -3801,28 +3852,69 @@ static struct samsung_gate_clock atlas_gate_clks[] __initdata = {
                        ENABLE_SCLK_ATLAS, 2, CLK_IGNORE_UNUSED, 0),
        GATE(CLK_ATCLK, "atclk", "div_atclk_atlas",
                        ENABLE_SCLK_ATLAS, 1, CLK_IGNORE_UNUSED, 0),
-       GATE(CLK_SCLK_ATLAS, "sclk_atlas", "div_atlas2",
-                       ENABLE_SCLK_ATLAS, 0,
-                       CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0),
 };
 
-static struct samsung_cmu_info atlas_cmu_info __initdata = {
-       .pll_clks               = atlas_pll_clks,
-       .nr_pll_clks            = ARRAY_SIZE(atlas_pll_clks),
-       .mux_clks               = atlas_mux_clks,
-       .nr_mux_clks            = ARRAY_SIZE(atlas_mux_clks),
-       .div_clks               = atlas_div_clks,
-       .nr_div_clks            = ARRAY_SIZE(atlas_div_clks),
-       .gate_clks              = atlas_gate_clks,
-       .nr_gate_clks           = ARRAY_SIZE(atlas_gate_clks),
-       .nr_clk_ids             = ATLAS_NR_CLK,
-       .clk_regs               = atlas_clk_regs,
-       .nr_clk_regs            = ARRAY_SIZE(atlas_clk_regs),
+#define E5433_ATLAS_DIV0(cntclk, pclk_dbg, atclk, pclk, aclk) \
+               (((cntclk) << 24) | ((pclk_dbg) << 20) | ((atclk) << 16) | \
+                ((pclk) << 12) | ((aclk) << 8))
+
+#define E5433_ATLAS_DIV1(hpm, copy) \
+               (((hpm) << 4) | ((copy) << 0))
+
+static const struct exynos_cpuclk_cfg_data exynos5433_atlasclk_d[] __initconst = {
+       { 1900000, E5433_ATLAS_DIV0(7, 7, 7, 7, 4), E5433_ATLAS_DIV1(7, 1), },
+       { 1800000, E5433_ATLAS_DIV0(7, 7, 7, 7, 4), E5433_ATLAS_DIV1(7, 1), },
+       { 1700000, E5433_ATLAS_DIV0(7, 7, 7, 7, 4), E5433_ATLAS_DIV1(7, 1), },
+       { 1600000, E5433_ATLAS_DIV0(7, 7, 7, 7, 4), E5433_ATLAS_DIV1(7, 1), },
+       { 1500000, E5433_ATLAS_DIV0(7, 7, 7, 7, 3), E5433_ATLAS_DIV1(7, 1), },
+       { 1400000, E5433_ATLAS_DIV0(7, 7, 7, 7, 3), E5433_ATLAS_DIV1(7, 1), },
+       { 1300000, E5433_ATLAS_DIV0(7, 7, 7, 7, 3), E5433_ATLAS_DIV1(7, 1), },
+       { 1200000, E5433_ATLAS_DIV0(7, 7, 7, 7, 3), E5433_ATLAS_DIV1(7, 1), },
+       { 1100000, E5433_ATLAS_DIV0(7, 7, 7, 7, 3), E5433_ATLAS_DIV1(7, 1), },
+       { 1000000, E5433_ATLAS_DIV0(7, 7, 7, 7, 3), E5433_ATLAS_DIV1(7, 1), },
+       {  900000, E5433_ATLAS_DIV0(7, 7, 7, 7, 2), E5433_ATLAS_DIV1(7, 1), },
+       {  800000, E5433_ATLAS_DIV0(7, 7, 7, 7, 2), E5433_ATLAS_DIV1(7, 1), },
+       {  700000, E5433_ATLAS_DIV0(7, 7, 7, 7, 2), E5433_ATLAS_DIV1(7, 1), },
+       {  600000, E5433_ATLAS_DIV0(7, 7, 7, 7, 2), E5433_ATLAS_DIV1(7, 1), },
+       {  500000, E5433_ATLAS_DIV0(7, 7, 7, 7, 2), E5433_ATLAS_DIV1(7, 1), },
+       {  0 },
 };
 
 static void __init exynos5433_cmu_atlas_init(struct device_node *np)
 {
-       samsung_cmu_register_one(np, &atlas_cmu_info);
+       void __iomem *reg_base;
+       struct samsung_clk_provider *ctx;
+
+       reg_base = of_iomap(np, 0);
+       if (!reg_base) {
+               panic("%s: failed to map registers\n", __func__);
+               return;
+       }
+
+       ctx = samsung_clk_init(np, reg_base, ATLAS_NR_CLK);
+       if (!ctx) {
+               panic("%s: unable to allocate ctx\n", __func__);
+               return;
+       }
+
+       samsung_clk_register_pll(ctx, atlas_pll_clks,
+                                ARRAY_SIZE(atlas_pll_clks), reg_base);
+       samsung_clk_register_mux(ctx, atlas_mux_clks,
+                                ARRAY_SIZE(atlas_mux_clks));
+       samsung_clk_register_div(ctx, atlas_div_clks,
+                                ARRAY_SIZE(atlas_div_clks));
+       samsung_clk_register_gate(ctx, atlas_gate_clks,
+                                 ARRAY_SIZE(atlas_gate_clks));
+
+       exynos_register_cpu_clock(ctx, CLK_SCLK_ATLAS, "atlasclk",
+               mout_atlas_p[0], mout_atlas_p[1], 0x200,
+               exynos5433_atlasclk_d, ARRAY_SIZE(exynos5433_atlasclk_d),
+               CLK_CPU_HAS_E5433_REGS_LAYOUT);
+
+       samsung_clk_sleep_init(reg_base, atlas_clk_regs,
+                              ARRAY_SIZE(atlas_clk_regs));
+
+       samsung_clk_of_add_provider(np, ctx);
 }
 CLK_OF_DECLARE(exynos5433_cmu_atlas, "samsung,exynos5433-cmu-atlas",
                exynos5433_cmu_atlas_init);
@@ -3853,7 +3945,7 @@ CLK_OF_DECLARE(exynos5433_cmu_atlas, "samsung,exynos5433-cmu-atlas",
 #define ENABLE_IP_MSCL_SECURE_SMMU_M2MSCALER1          0x0b0c
 #define ENABLE_IP_MSCL_SECURE_SMMU_JPEG                        0x0b10
 
-static unsigned long mscl_clk_regs[] __initdata = {
+static const unsigned long mscl_clk_regs[] __initconst = {
        MUX_SEL_MSCL0,
        MUX_SEL_MSCL1,
        MUX_ENABLE_MSCL0,
@@ -3881,7 +3973,7 @@ PNAME(mout_aclk_mscl_400_user_p)  = { "oscclk", "aclk_mscl_400", };
 PNAME(mout_sclk_jpeg_p)                        = { "mout_sclk_jpeg_user",
                                        "mout_aclk_mscl_400_user", };
 
-static struct samsung_mux_clock mscl_mux_clks[] __initdata = {
+static const struct samsung_mux_clock mscl_mux_clks[] __initconst = {
        /* MUX_SEL_MSCL0 */
        MUX(CLK_MOUT_SCLK_JPEG_USER, "mout_sclk_jpeg_user",
                        mout_sclk_jpeg_user_p, MUX_SEL_MSCL0, 4, 1),
@@ -3893,13 +3985,13 @@ static struct samsung_mux_clock mscl_mux_clks[] __initdata = {
                        MUX_SEL_MSCL1, 0, 1),
 };
 
-static struct samsung_div_clock mscl_div_clks[] __initdata = {
+static const struct samsung_div_clock mscl_div_clks[] __initconst = {
        /* DIV_MSCL */
        DIV(CLK_DIV_PCLK_MSCL, "div_pclk_mscl", "mout_aclk_mscl_400_user",
                        DIV_MSCL, 0, 3),
 };
 
-static struct samsung_gate_clock mscl_gate_clks[] __initdata = {
+static const struct samsung_gate_clock mscl_gate_clks[] __initconst = {
        /* ENABLE_ACLK_MSCL */
        GATE(CLK_ACLK_BTS_JPEG, "aclk_bts_jpeg", "mout_aclk_mscl_400_user",
                        ENABLE_ACLK_MSCL, 9, 0, 0),
@@ -3977,7 +4069,7 @@ static struct samsung_gate_clock mscl_gate_clks[] __initdata = {
                        CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0),
 };
 
-static struct samsung_cmu_info mscl_cmu_info __initdata = {
+static const struct samsung_cmu_info mscl_cmu_info __initconst = {
        .mux_clks               = mscl_mux_clks,
        .nr_mux_clks            = ARRAY_SIZE(mscl_mux_clks),
        .div_clks               = mscl_div_clks,
@@ -4012,7 +4104,7 @@ CLK_OF_DECLARE(exynos5433_cmu_mscl, "samsung,exynos5433-cmu-mscl",
 #define ENABLE_IP_MFC1                         0x0b04
 #define ENABLE_IP_MFC_SECURE_SMMU_MFC          0x0b08
 
-static unsigned long mfc_clk_regs[] __initdata = {
+static const unsigned long mfc_clk_regs[] __initconst = {
        MUX_SEL_MFC,
        MUX_ENABLE_MFC,
        DIV_MFC,
@@ -4027,19 +4119,19 @@ static unsigned long mfc_clk_regs[] __initdata = {
 
 PNAME(mout_aclk_mfc_400_user_p)                = { "oscclk", "aclk_mfc_400", };
 
-static struct samsung_mux_clock mfc_mux_clks[] __initdata = {
+static const struct samsung_mux_clock mfc_mux_clks[] __initconst = {
        /* MUX_SEL_MFC */
        MUX(CLK_MOUT_ACLK_MFC_400_USER, "mout_aclk_mfc_400_user",
                        mout_aclk_mfc_400_user_p, MUX_SEL_MFC, 0, 0),
 };
 
-static struct samsung_div_clock mfc_div_clks[] __initdata = {
+static const struct samsung_div_clock mfc_div_clks[] __initconst = {
        /* DIV_MFC */
        DIV(CLK_DIV_PCLK_MFC, "div_pclk_mfc", "mout_aclk_mfc_400_user",
                        DIV_MFC, 0, 2),
 };
 
-static struct samsung_gate_clock mfc_gate_clks[] __initdata = {
+static const struct samsung_gate_clock mfc_gate_clks[] __initconst = {
        /* ENABLE_ACLK_MFC */
        GATE(CLK_ACLK_BTS_MFC_1, "aclk_bts_mfc_1", "mout_aclk_mfc_400_user",
                        ENABLE_ACLK_MFC, 6, 0, 0),
@@ -4085,7 +4177,7 @@ static struct samsung_gate_clock mfc_gate_clks[] __initdata = {
                        0, CLK_IGNORE_UNUSED, 0),
 };
 
-static struct samsung_cmu_info mfc_cmu_info __initdata = {
+static const struct samsung_cmu_info mfc_cmu_info __initconst = {
        .mux_clks               = mfc_mux_clks,
        .nr_mux_clks            = ARRAY_SIZE(mfc_mux_clks),
        .div_clks               = mfc_div_clks,
@@ -4120,7 +4212,7 @@ CLK_OF_DECLARE(exynos5433_cmu_mfc, "samsung,exynos5433-cmu-mfc",
 #define ENABLE_IP_HEVC1                                0x0b04
 #define ENABLE_IP_HEVC_SECURE_SMMU_HEVC                0x0b08
 
-static unsigned long hevc_clk_regs[] __initdata = {
+static const unsigned long hevc_clk_regs[] __initconst = {
        MUX_SEL_HEVC,
        MUX_ENABLE_HEVC,
        DIV_HEVC,
@@ -4135,19 +4227,19 @@ static unsigned long hevc_clk_regs[] __initdata = {
 
 PNAME(mout_aclk_hevc_400_user_p)       = { "oscclk", "aclk_hevc_400", };
 
-static struct samsung_mux_clock hevc_mux_clks[] __initdata = {
+static const struct samsung_mux_clock hevc_mux_clks[] __initconst = {
        /* MUX_SEL_HEVC */
        MUX(CLK_MOUT_ACLK_HEVC_400_USER, "mout_aclk_hevc_400_user",
                        mout_aclk_hevc_400_user_p, MUX_SEL_HEVC, 0, 0),
 };
 
-static struct samsung_div_clock hevc_div_clks[] __initdata = {
+static const struct samsung_div_clock hevc_div_clks[] __initconst = {
        /* DIV_HEVC */
        DIV(CLK_DIV_PCLK_HEVC, "div_pclk_hevc", "mout_aclk_hevc_400_user",
                        DIV_HEVC, 0, 2),
 };
 
-static struct samsung_gate_clock hevc_gate_clks[] __initdata = {
+static const struct samsung_gate_clock hevc_gate_clks[] __initconst = {
        /* ENABLE_ACLK_HEVC */
        GATE(CLK_ACLK_BTS_HEVC_1, "aclk_bts_hevc_1", "mout_aclk_hevc_400_user",
                        ENABLE_ACLK_HEVC, 6, 0, 0),
@@ -4195,7 +4287,7 @@ static struct samsung_gate_clock hevc_gate_clks[] __initdata = {
                        0, CLK_IGNORE_UNUSED, 0),
 };
 
-static struct samsung_cmu_info hevc_cmu_info __initdata = {
+static const struct samsung_cmu_info hevc_cmu_info __initconst = {
        .mux_clks               = hevc_mux_clks,
        .nr_mux_clks            = ARRAY_SIZE(hevc_mux_clks),
        .div_clks               = hevc_div_clks,
@@ -4232,7 +4324,7 @@ CLK_OF_DECLARE(exynos5433_cmu_hevc, "samsung,exynos5433-cmu-hevc",
 #define ENABLE_IP_ISP2                 0x0b08
 #define ENABLE_IP_ISP3                 0x0b0c
 
-static unsigned long isp_clk_regs[] __initdata = {
+static const unsigned long isp_clk_regs[] __initconst = {
        MUX_SEL_ISP,
        MUX_ENABLE_ISP,
        DIV_ISP,
@@ -4250,7 +4342,7 @@ static unsigned long isp_clk_regs[] __initdata = {
 PNAME(mout_aclk_isp_dis_400_user_p)    = { "oscclk", "aclk_isp_dis_400", };
 PNAME(mout_aclk_isp_400_user_p)                = { "oscclk", "aclk_isp_400", };
 
-static struct samsung_mux_clock isp_mux_clks[] __initdata = {
+static const struct samsung_mux_clock isp_mux_clks[] __initconst = {
        /* MUX_SEL_ISP */
        MUX(CLK_MOUT_ACLK_ISP_DIS_400_USER, "mout_aclk_isp_dis_400_user",
                        mout_aclk_isp_dis_400_user_p, MUX_SEL_ISP, 4, 0),
@@ -4258,7 +4350,7 @@ static struct samsung_mux_clock isp_mux_clks[] __initdata = {
                        mout_aclk_isp_400_user_p, MUX_SEL_ISP, 0, 0),
 };
 
-static struct samsung_div_clock isp_div_clks[] __initdata = {
+static const struct samsung_div_clock isp_div_clks[] __initconst = {
        /* DIV_ISP */
        DIV(CLK_DIV_PCLK_ISP_DIS, "div_pclk_isp_dis",
                        "mout_aclk_isp_dis_400_user", DIV_ISP, 12, 3),
@@ -4270,7 +4362,7 @@ static struct samsung_div_clock isp_div_clks[] __initdata = {
                        "mout_aclk_isp_400_user", DIV_ISP, 0, 3),
 };
 
-static struct samsung_gate_clock isp_gate_clks[] __initdata = {
+static const struct samsung_gate_clock isp_gate_clks[] __initconst = {
        /* ENABLE_ACLK_ISP0 */
        GATE(CLK_ACLK_ISP_D_GLUE, "aclk_isp_d_glue", "mout_aclk_isp_400_user",
                        ENABLE_ACLK_ISP0, 6, CLK_IGNORE_UNUSED, 0),
@@ -4448,7 +4540,7 @@ static struct samsung_gate_clock isp_gate_clks[] __initdata = {
                        0, CLK_IGNORE_UNUSED, 0),
 };
 
-static struct samsung_cmu_info isp_cmu_info __initdata = {
+static const struct samsung_cmu_info isp_cmu_info __initconst = {
        .mux_clks               = isp_mux_clks,
        .nr_mux_clks            = ARRAY_SIZE(isp_mux_clks),
        .div_clks               = isp_div_clks,
@@ -4504,7 +4596,7 @@ CLK_OF_DECLARE(exynos5433_cmu_isp, "samsung,exynos5433-cmu-isp",
 #define ENABLE_IP_CAM02                        0X0b08
 #define ENABLE_IP_CAM03                        0X0b0C
 
-static unsigned long cam0_clk_regs[] __initdata = {
+static const unsigned long cam0_clk_regs[] __initconst = {
        MUX_SEL_CAM00,
        MUX_SEL_CAM01,
        MUX_SEL_CAM02,
@@ -4588,14 +4680,14 @@ PNAME(mout_sclk_pixelasync_lite_c_init_a_p) = {
                                        "mout_aclk_cam0_552_user",
                                        "mout_aclk_cam0_400_user", };
 
-static struct samsung_fixed_rate_clock cam0_fixed_clks[] __initdata = {
+static const struct samsung_fixed_rate_clock cam0_fixed_clks[] __initconst = {
        FRATE(CLK_PHYCLK_RXBYTEECLKHS0_S4_PHY, "phyclk_rxbyteclkhs0_s4_phy",
                        NULL, 0, 100000000),
        FRATE(CLK_PHYCLK_RXBYTEECLKHS0_S2A_PHY, "phyclk_rxbyteclkhs0_s2a_phy",
                        NULL, 0, 100000000),
 };
 
-static struct samsung_mux_clock cam0_mux_clks[] __initdata = {
+static const struct samsung_mux_clock cam0_mux_clks[] __initconst = {
        /* MUX_SEL_CAM00 */
        MUX(CLK_MOUT_ACLK_CAM0_333_USER, "mout_aclk_cam0_333_user",
                        mout_aclk_cam0_333_user_p, MUX_SEL_CAM00, 8, 1),
@@ -4669,7 +4761,7 @@ static struct samsung_mux_clock cam0_mux_clks[] __initdata = {
                        MUX_SEL_CAM04, 0, 1),
 };
 
-static struct samsung_div_clock cam0_div_clks[] __initdata = {
+static const struct samsung_div_clock cam0_div_clks[] __initconst = {
        /* DIV_CAM00 */
        DIV(CLK_DIV_PCLK_CAM0_50, "div_pclk_cam0_50", "div_aclk_cam0_200",
                        DIV_CAM00, 8, 2),
@@ -4716,7 +4808,7 @@ static struct samsung_div_clock cam0_div_clks[] __initdata = {
                        "mout_sclk_pixelasync_lite_c_init_b", DIV_CAM03, 0, 3),
 };
 
-static struct samsung_gate_clock cam0_gate_clks[] __initdata = {
+static const struct samsung_gate_clock cam0_gate_clks[] __initconst = {
        /* ENABLE_ACLK_CAM00 */
        GATE(CLK_ACLK_CSIS1, "aclk_csis1", "div_aclk_csis1", ENABLE_ACLK_CAM00,
                        6, 0, 0),
@@ -4923,7 +5015,7 @@ static struct samsung_gate_clock cam0_gate_clks[] __initdata = {
                        ENABLE_SCLK_CAM0, 0, 0, 0),
 };
 
-static struct samsung_cmu_info cam0_cmu_info __initdata = {
+static const struct samsung_cmu_info cam0_cmu_info __initconst = {
        .mux_clks               = cam0_mux_clks,
        .nr_mux_clks            = ARRAY_SIZE(cam0_mux_clks),
        .div_clks               = cam0_div_clks,
@@ -4970,7 +5062,7 @@ CLK_OF_DECLARE(exynos5433_cmu_cam0, "samsung,exynos5433-cmu-cam0",
 #define ENABLE_IP_CAM11                        0X0b04
 #define ENABLE_IP_CAM12                        0X0b08
 
-static unsigned long cam1_clk_regs[] __initdata = {
+static const unsigned long cam1_clk_regs[] __initconst = {
        MUX_SEL_CAM10,
        MUX_SEL_CAM11,
        MUX_SEL_CAM12,
@@ -5016,12 +5108,12 @@ PNAME(mout_aclk_lite_c_b_p)             = { "mout_aclk_lite_c_a",
 PNAME(mout_aclk_lite_c_a_p)            = { "mout_aclk_cam1_552_user",
                                            "mout_aclk_cam1_400_user", };
 
-static struct samsung_fixed_rate_clock cam1_fixed_clks[] __initdata = {
+static const struct samsung_fixed_rate_clock cam1_fixed_clks[] __initconst = {
        FRATE(CLK_PHYCLK_RXBYTEECLKHS0_S2B, "phyclk_rxbyteclkhs0_s2b_phy", NULL,
                        0, 100000000),
 };
 
-static struct samsung_mux_clock cam1_mux_clks[] __initdata = {
+static const struct samsung_mux_clock cam1_mux_clks[] __initconst = {
        /* MUX_SEL_CAM10 */
        MUX(CLK_MOUT_SCLK_ISP_UART_USER, "mout_sclk_isp_uart_user",
                        mout_sclk_isp_uart_user_p, MUX_SEL_CAM10, 20, 1),
@@ -5057,7 +5149,7 @@ static struct samsung_mux_clock cam1_mux_clks[] __initdata = {
                        MUX_SEL_CAM12, 0, 1),
 };
 
-static struct samsung_div_clock cam1_div_clks[] __initdata = {
+static const struct samsung_div_clock cam1_div_clks[] __initconst = {
        /* DIV_CAM10 */
        DIV(CLK_DIV_SCLK_ISP_MPWM, "div_sclk_isp_mpwm",
                        "div_pclk_cam1_83", DIV_CAM10, 16, 2),
@@ -5081,7 +5173,7 @@ static struct samsung_div_clock cam1_div_clks[] __initdata = {
                        DIV_CAM11, 0, 3),
 };
 
-static struct samsung_gate_clock cam1_gate_clks[] __initdata = {
+static const struct samsung_gate_clock cam1_gate_clks[] __initconst = {
        /* ENABLE_ACLK_CAM10 */
        GATE(CLK_ACLK_ISP_GIC, "aclk_isp_gic", "mout_aclk_cam1_333_user",
                        ENABLE_ACLK_CAM10, 4, 0, 0),
@@ -5296,7 +5388,7 @@ static struct samsung_gate_clock cam1_gate_clks[] __initdata = {
                        ENABLE_SCLK_CAM1, 0, 0, 0),
 };
 
-static struct samsung_cmu_info cam1_cmu_info __initdata = {
+static const struct samsung_cmu_info cam1_cmu_info __initconst = {
        .mux_clks               = cam1_mux_clks,
        .nr_mux_clks            = ARRAY_SIZE(cam1_mux_clks),
        .div_clks               = cam1_div_clks,
index c57cff1e17980170cecc0cb33891241d9d214b40..a57d01b99b766bdcc570a136018179cde688d884 100644 (file)
@@ -35,7 +35,7 @@ static struct samsung_fixed_rate_clock exynos5440_fixed_rate_ext_clks[] __initda
 };
 
 /* fixed rate clocks */
-static struct samsung_fixed_rate_clock exynos5440_fixed_rate_clks[] __initdata = {
+static const struct samsung_fixed_rate_clock exynos5440_fixed_rate_clks[] __initconst = {
        FRATE(0, "ppll", NULL, 0, 1000000000),
        FRATE(0, "usb_phy0", NULL, 0, 60000000),
        FRATE(0, "usb_phy1", NULL, 0, 60000000),
@@ -44,26 +44,26 @@ static struct samsung_fixed_rate_clock exynos5440_fixed_rate_clks[] __initdata =
 };
 
 /* fixed factor clocks */
-static struct samsung_fixed_factor_clock exynos5440_fixed_factor_clks[] __initdata = {
+static const struct samsung_fixed_factor_clock exynos5440_fixed_factor_clks[] __initconst = {
        FFACTOR(0, "div250", "ppll", 1, 4, 0),
        FFACTOR(0, "div200", "ppll", 1, 5, 0),
        FFACTOR(0, "div125", "div250", 1, 2, 0),
 };
 
 /* mux clocks */
-static struct samsung_mux_clock exynos5440_mux_clks[] __initdata = {
+static const struct samsung_mux_clock exynos5440_mux_clks[] __initconst = {
        MUX(0, "mout_spi", mout_spi_p, MISC_DOUT1, 5, 1),
        MUX_A(CLK_ARM_CLK, "arm_clk", mout_armclk_p,
                        CPU_CLK_STATUS, 0, 1, "armclk"),
 };
 
 /* divider clocks */
-static struct samsung_div_clock exynos5440_div_clks[] __initdata = {
+static const struct samsung_div_clock exynos5440_div_clks[] __initconst = {
        DIV(CLK_SPI_BAUD, "div_spi", "mout_spi", MISC_DOUT1, 3, 2),
 };
 
 /* gate clocks */
-static struct samsung_gate_clock exynos5440_gate_clks[] __initdata = {
+static const struct samsung_gate_clock exynos5440_gate_clks[] __initconst = {
        GATE(CLK_PB0_250, "pb0_250", "div250", CLKEN_OV_VAL, 3, 0, 0),
        GATE(CLK_PR0_250, "pr0_250", "div250", CLKEN_OV_VAL, 4, 0, 0),
        GATE(CLK_PR1_250, "pr1_250", "div250", CLKEN_OV_VAL, 5, 0, 0),
@@ -125,8 +125,6 @@ static void __init exynos5440_clk_init(struct device_node *np)
        }
 
        ctx = samsung_clk_init(np, reg_base, CLK_NR_CLKS);
-       if (!ctx)
-               panic("%s: unable to allocate context.\n", __func__);
 
        samsung_clk_of_register_fixed_ext(ctx, exynos5440_fixed_rate_ext_clks,
                ARRAY_SIZE(exynos5440_fixed_rate_ext_clks), ext_clk_match);
index ad68d463b12c66664d16487ba88e8996f5446ad2..5931a4140c3d3f264d75510c277e06401dc31944 100644 (file)
@@ -36,7 +36,7 @@
 #define ENABLE_ACLK_TOPC1      0x0804
 #define ENABLE_SCLK_TOPC1      0x0A04
 
-static struct samsung_fixed_factor_clock topc_fixed_factor_clks[] __initdata = {
+static const struct samsung_fixed_factor_clock topc_fixed_factor_clks[] __initconst = {
        FFACTOR(0, "ffac_topc_bus0_pll_div2", "mout_topc_bus0_pll", 1, 2, 0),
        FFACTOR(0, "ffac_topc_bus0_pll_div4",
                "ffac_topc_bus0_pll_div2", 1, 2, 0),
@@ -69,7 +69,7 @@ PNAME(mout_topc_mfc_pll_half_p) = { "mout_topc_mfc_pll",
 PNAME(mout_topc_bus0_pll_out_p) = {"mout_topc_bus0_pll",
        "ffac_topc_bus0_pll_div2"};
 
-static unsigned long topc_clk_regs[] __initdata = {
+static const unsigned long topc_clk_regs[] __initconst = {
        CC_PLL_LOCK,
        BUS0_PLL_LOCK,
        BUS1_DPLL_LOCK,
@@ -89,7 +89,7 @@ static unsigned long topc_clk_regs[] __initdata = {
        DIV_TOPC3,
 };
 
-static struct samsung_mux_clock topc_mux_clks[] __initdata = {
+static const struct samsung_mux_clock topc_mux_clks[] __initconst = {
        MUX(0, "mout_topc_bus0_pll", mout_topc_bus0_pll_ctrl_p,
                MUX_SEL_TOPC0, 0, 1),
        MUX(0, "mout_topc_bus1_pll", mout_topc_bus1_pll_ctrl_p,
@@ -118,7 +118,7 @@ static struct samsung_mux_clock topc_mux_clks[] __initdata = {
        MUX(0, "mout_aclk_peris_66", mout_topc_group2, MUX_SEL_TOPC3, 24, 2),
 };
 
-static struct samsung_div_clock topc_div_clks[] __initdata = {
+static const struct samsung_div_clock topc_div_clks[] __initconst = {
        DIV(DOUT_ACLK_CCORE_133, "dout_aclk_ccore_133", "mout_aclk_ccore_133",
                DIV_TOPC0, 4, 4),
 
@@ -139,14 +139,14 @@ static struct samsung_div_clock topc_div_clks[] __initdata = {
                DIV_TOPC3, 28, 4),
 };
 
-static struct samsung_pll_rate_table pll1460x_24mhz_tbl[] __initdata = {
+static const struct samsung_pll_rate_table pll1460x_24mhz_tbl[] __initconst = {
        PLL_36XX_RATE(491520000, 20, 1, 0, 31457),
        {},
 };
 
-static struct samsung_gate_clock topc_gate_clks[] __initdata = {
+static const struct samsung_gate_clock topc_gate_clks[] __initconst = {
        GATE(ACLK_CCORE_133, "aclk_ccore_133", "dout_aclk_ccore_133",
-               ENABLE_ACLK_TOPC0, 4, 0, 0),
+               ENABLE_ACLK_TOPC0, 4, CLK_IS_CRITICAL, 0),
 
        GATE(ACLK_MSCL_532, "aclk_mscl_532", "dout_aclk_mscl_532",
                ENABLE_ACLK_TOPC1, 20, 0, 0),
@@ -174,7 +174,7 @@ static struct samsung_gate_clock topc_gate_clks[] __initdata = {
                ENABLE_SCLK_TOPC1, 0, 0, 0),
 };
 
-static struct samsung_pll_clock topc_pll_clks[] __initdata = {
+static const struct samsung_pll_clock topc_pll_clks[] __initconst = {
        PLL(pll_1451x, 0, "fout_bus0_pll", "fin_pll", BUS0_PLL_LOCK,
                BUS0_PLL_CON0, NULL),
        PLL(pll_1452x, 0, "fout_cc_pll", "fin_pll", CC_PLL_LOCK,
@@ -187,7 +187,7 @@ static struct samsung_pll_clock topc_pll_clks[] __initdata = {
                AUD_PLL_CON0, pll1460x_24mhz_tbl),
 };
 
-static struct samsung_cmu_info topc_cmu_info __initdata = {
+static const struct samsung_cmu_info topc_cmu_info __initconst = {
        .pll_clks               = topc_pll_clks,
        .nr_pll_clks            = ARRAY_SIZE(topc_pll_clks),
        .mux_clks               = topc_mux_clks,
@@ -256,7 +256,7 @@ PNAME(mout_top0_group3) = {"ioclk_audiocdclk0",
 PNAME(mout_top0_group4) = {"ioclk_audiocdclk1", "mout_top0_aud_pll_user",
        "mout_top0_bus0_pll_half", "mout_top0_bus1_pll_half"};
 
-static unsigned long top0_clk_regs[] __initdata = {
+static const unsigned long top0_clk_regs[] __initconst = {
        MUX_SEL_TOP00,
        MUX_SEL_TOP01,
        MUX_SEL_TOP03,
@@ -275,7 +275,7 @@ static unsigned long top0_clk_regs[] __initdata = {
        ENABLE_SCLK_TOP0_PERIC3,
 };
 
-static struct samsung_mux_clock top0_mux_clks[] __initdata = {
+static const struct samsung_mux_clock top0_mux_clks[] __initconst = {
        MUX(0, "mout_top0_aud_pll_user", mout_top0_aud_pll_user_p,
                MUX_SEL_TOP00, 0, 1),
        MUX(0, "mout_top0_mfc_pll_user", mout_top0_mfc_pll_user_p,
@@ -315,7 +315,7 @@ static struct samsung_mux_clock top0_mux_clks[] __initdata = {
        MUX(0, "mout_sclk_spi4", mout_top0_group1, MUX_SEL_TOP0_PERIC3, 20, 2),
 };
 
-static struct samsung_div_clock top0_div_clks[] __initdata = {
+static const struct samsung_div_clock top0_div_clks[] __initconst = {
        DIV(DOUT_ACLK_PERIC1, "dout_aclk_peric1_66", "mout_aclk_peric1_66",
                DIV_TOP03, 12, 6),
        DIV(DOUT_ACLK_PERIC0, "dout_aclk_peric0_66", "mout_aclk_peric0_66",
@@ -338,7 +338,7 @@ static struct samsung_div_clock top0_div_clks[] __initdata = {
        DIV(0, "dout_sclk_spi4", "mout_sclk_spi4", DIV_TOP0_PERIC3, 20, 12),
 };
 
-static struct samsung_gate_clock top0_gate_clks[] __initdata = {
+static const struct samsung_gate_clock top0_gate_clks[] __initconst = {
        GATE(CLK_ACLK_PERIC0_66, "aclk_peric0_66", "dout_aclk_peric0_66",
                ENABLE_ACLK_TOP03, 20, CLK_SET_RATE_PARENT, 0),
        GATE(CLK_ACLK_PERIC1_66, "aclk_peric1_66", "dout_aclk_peric1_66",
@@ -372,7 +372,7 @@ static struct samsung_gate_clock top0_gate_clks[] __initdata = {
                ENABLE_SCLK_TOP0_PERIC3, 20, CLK_SET_RATE_PARENT, 0),
 };
 
-static struct samsung_fixed_factor_clock top0_fixed_factor_clks[] __initdata = {
+static const struct samsung_fixed_factor_clock top0_fixed_factor_clks[] __initconst = {
        FFACTOR(0, "ffac_top0_bus0_pll_div2", "mout_top0_bus0_pll_user",
                1, 2, 0),
        FFACTOR(0, "ffac_top0_bus1_pll_div2", "mout_top0_bus1_pll_user",
@@ -381,7 +381,7 @@ static struct samsung_fixed_factor_clock top0_fixed_factor_clks[] __initdata = {
        FFACTOR(0, "ffac_top0_mfc_pll_div2", "mout_top0_mfc_pll_user", 1, 2, 0),
 };
 
-static struct samsung_cmu_info top0_cmu_info __initdata = {
+static const struct samsung_cmu_info top0_cmu_info __initconst = {
        .mux_clks               = top0_mux_clks,
        .nr_mux_clks            = ARRAY_SIZE(top0_mux_clks),
        .div_clks               = top0_div_clks,
@@ -438,7 +438,7 @@ PNAME(mout_top1_group1) = {"mout_top1_bus0_pll_half",
        "mout_top1_bus1_pll_half", "mout_top1_cc_pll_half",
        "mout_top1_mfc_pll_half"};
 
-static unsigned long top1_clk_regs[] __initdata = {
+static const unsigned long top1_clk_regs[] __initconst = {
        MUX_SEL_TOP10,
        MUX_SEL_TOP11,
        MUX_SEL_TOP13,
@@ -455,7 +455,7 @@ static unsigned long top1_clk_regs[] __initdata = {
        ENABLE_SCLK_TOP1_FSYS11,
 };
 
-static struct samsung_mux_clock top1_mux_clks[] __initdata = {
+static const struct samsung_mux_clock top1_mux_clks[] __initconst = {
        MUX(0, "mout_top1_mfc_pll_user", mout_top1_mfc_pll_user_p,
                MUX_SEL_TOP10, 4, 1),
        MUX(0, "mout_top1_cc_pll_user", mout_top1_cc_pll_user_p,
@@ -494,7 +494,7 @@ static struct samsung_mux_clock top1_mux_clks[] __initdata = {
                MUX_SEL_TOP1_FSYS11, 24, 2),
 };
 
-static struct samsung_div_clock top1_div_clks[] __initdata = {
+static const struct samsung_div_clock top1_div_clks[] __initconst = {
        DIV(DOUT_ACLK_FSYS1_200, "dout_aclk_fsys1_200", "mout_aclk_fsys1_200",
                DIV_TOP13, 24, 4),
        DIV(DOUT_ACLK_FSYS0_200, "dout_aclk_fsys0_200", "mout_aclk_fsys0_200",
@@ -521,7 +521,7 @@ static struct samsung_div_clock top1_div_clks[] __initdata = {
                "mout_sclk_phy_fsys1_26m", DIV_TOP1_FSYS11, 24, 6),
 };
 
-static struct samsung_gate_clock top1_gate_clks[] __initdata = {
+static const struct samsung_gate_clock top1_gate_clks[] __initconst = {
        GATE(CLK_SCLK_MMC2, "sclk_mmc2", "dout_sclk_mmc2",
                ENABLE_SCLK_TOP1_FSYS0, 16, CLK_SET_RATE_PARENT, 0),
        GATE(0, "sclk_usbdrd300", "dout_sclk_usbdrd300",
@@ -539,7 +539,8 @@ static struct samsung_gate_clock top1_gate_clks[] __initdata = {
                ENABLE_SCLK_TOP1_FSYS11, 12, CLK_SET_RATE_PARENT, 0),
 
        GATE(CLK_ACLK_FSYS0_200, "aclk_fsys0_200", "dout_aclk_fsys0_200",
-               ENABLE_ACLK_TOP13, 28, CLK_SET_RATE_PARENT, 0),
+               ENABLE_ACLK_TOP13, 28, CLK_SET_RATE_PARENT |
+               CLK_IS_CRITICAL, 0),
        GATE(CLK_ACLK_FSYS1_200, "aclk_fsys1_200", "dout_aclk_fsys1_200",
                ENABLE_ACLK_TOP13, 24, CLK_SET_RATE_PARENT, 0),
 
@@ -548,7 +549,7 @@ static struct samsung_gate_clock top1_gate_clks[] __initdata = {
                24, CLK_SET_RATE_PARENT, 0),
 };
 
-static struct samsung_fixed_factor_clock top1_fixed_factor_clks[] __initdata = {
+static const struct samsung_fixed_factor_clock top1_fixed_factor_clks[] __initconst = {
        FFACTOR(0, "ffac_top1_bus0_pll_div2", "mout_top1_bus0_pll_user",
                1, 2, 0),
        FFACTOR(0, "ffac_top1_bus1_pll_div2", "mout_top1_bus1_pll_user",
@@ -557,7 +558,7 @@ static struct samsung_fixed_factor_clock top1_fixed_factor_clks[] __initdata = {
        FFACTOR(0, "ffac_top1_mfc_pll_div2", "mout_top1_mfc_pll_user", 1, 2, 0),
 };
 
-static struct samsung_cmu_info top1_cmu_info __initdata = {
+static const struct samsung_cmu_info top1_cmu_info __initconst = {
        .mux_clks               = top1_mux_clks,
        .nr_mux_clks            = ARRAY_SIZE(top1_mux_clks),
        .div_clks               = top1_div_clks,
@@ -591,22 +592,22 @@ CLK_OF_DECLARE(exynos7_clk_top1, "samsung,exynos7-clock-top1",
  */
 PNAME(mout_aclk_ccore_133_user_p)      = { "fin_pll", "aclk_ccore_133" };
 
-static unsigned long ccore_clk_regs[] __initdata = {
+static const unsigned long ccore_clk_regs[] __initconst = {
        MUX_SEL_CCORE,
        ENABLE_PCLK_CCORE,
 };
 
-static struct samsung_mux_clock ccore_mux_clks[] __initdata = {
+static const struct samsung_mux_clock ccore_mux_clks[] __initconst = {
        MUX(0, "mout_aclk_ccore_133_user", mout_aclk_ccore_133_user_p,
                MUX_SEL_CCORE, 1, 1),
 };
 
-static struct samsung_gate_clock ccore_gate_clks[] __initdata = {
+static const struct samsung_gate_clock ccore_gate_clks[] __initconst = {
        GATE(PCLK_RTC, "pclk_rtc", "mout_aclk_ccore_133_user",
                ENABLE_PCLK_CCORE, 8, 0, 0),
 };
 
-static struct samsung_cmu_info ccore_cmu_info __initdata = {
+static const struct samsung_cmu_info ccore_cmu_info __initconst = {
        .mux_clks               = ccore_mux_clks,
        .nr_mux_clks            = ARRAY_SIZE(ccore_mux_clks),
        .gate_clks              = ccore_gate_clks,
@@ -633,20 +634,20 @@ CLK_OF_DECLARE(exynos7_clk_ccore, "samsung,exynos7-clock-ccore",
 PNAME(mout_aclk_peric0_66_user_p)      = { "fin_pll", "aclk_peric0_66" };
 PNAME(mout_sclk_uart0_user_p)  = { "fin_pll", "sclk_uart0" };
 
-static unsigned long peric0_clk_regs[] __initdata = {
+static const unsigned long peric0_clk_regs[] __initconst = {
        MUX_SEL_PERIC0,
        ENABLE_PCLK_PERIC0,
        ENABLE_SCLK_PERIC0,
 };
 
-static struct samsung_mux_clock peric0_mux_clks[] __initdata = {
+static const struct samsung_mux_clock peric0_mux_clks[] __initconst = {
        MUX(0, "mout_aclk_peric0_66_user", mout_aclk_peric0_66_user_p,
                MUX_SEL_PERIC0, 0, 1),
        MUX(0, "mout_sclk_uart0_user", mout_sclk_uart0_user_p,
                MUX_SEL_PERIC0, 16, 1),
 };
 
-static struct samsung_gate_clock peric0_gate_clks[] __initdata = {
+static const struct samsung_gate_clock peric0_gate_clks[] __initconst = {
        GATE(PCLK_HSI2C0, "pclk_hsi2c0", "mout_aclk_peric0_66_user",
                ENABLE_PCLK_PERIC0, 8, 0, 0),
        GATE(PCLK_HSI2C1, "pclk_hsi2c1", "mout_aclk_peric0_66_user",
@@ -673,7 +674,7 @@ static struct samsung_gate_clock peric0_gate_clks[] __initdata = {
        GATE(SCLK_PWM, "sclk_pwm", "fin_pll", ENABLE_SCLK_PERIC0, 21, 0, 0),
 };
 
-static struct samsung_cmu_info peric0_cmu_info __initdata = {
+static const struct samsung_cmu_info peric0_cmu_info __initconst = {
        .mux_clks               = peric0_mux_clks,
        .nr_mux_clks            = ARRAY_SIZE(peric0_mux_clks),
        .gate_clks              = peric0_gate_clks,
@@ -709,7 +710,7 @@ PNAME(mout_sclk_spi2_user_p)                = { "fin_pll", "sclk_spi2" };
 PNAME(mout_sclk_spi3_user_p)           = { "fin_pll", "sclk_spi3" };
 PNAME(mout_sclk_spi4_user_p)           = { "fin_pll", "sclk_spi4" };
 
-static unsigned long peric1_clk_regs[] __initdata = {
+static const unsigned long peric1_clk_regs[] __initconst = {
        MUX_SEL_PERIC10,
        MUX_SEL_PERIC11,
        MUX_SEL_PERIC12,
@@ -717,7 +718,7 @@ static unsigned long peric1_clk_regs[] __initdata = {
        ENABLE_SCLK_PERIC10,
 };
 
-static struct samsung_mux_clock peric1_mux_clks[] __initdata = {
+static const struct samsung_mux_clock peric1_mux_clks[] __initconst = {
        MUX(0, "mout_aclk_peric1_66_user", mout_aclk_peric1_66_user_p,
                MUX_SEL_PERIC10, 0, 1),
 
@@ -739,7 +740,7 @@ static struct samsung_mux_clock peric1_mux_clks[] __initdata = {
                MUX_SEL_PERIC11, 28, 1),
 };
 
-static struct samsung_gate_clock peric1_gate_clks[] __initdata = {
+static const struct samsung_gate_clock peric1_gate_clks[] __initconst = {
        GATE(PCLK_HSI2C2, "pclk_hsi2c2", "mout_aclk_peric1_66_user",
                ENABLE_PCLK_PERIC1, 4, 0, 0),
        GATE(PCLK_HSI2C3, "pclk_hsi2c3", "mout_aclk_peric1_66_user",
@@ -797,7 +798,7 @@ static struct samsung_gate_clock peric1_gate_clks[] __initdata = {
                ENABLE_SCLK_PERIC10, 19, CLK_SET_RATE_PARENT, 0),
 };
 
-static struct samsung_cmu_info peric1_cmu_info __initdata = {
+static const struct samsung_cmu_info peric1_cmu_info __initconst = {
        .mux_clks               = peric1_mux_clks,
        .nr_mux_clks            = ARRAY_SIZE(peric1_mux_clks),
        .gate_clks              = peric1_gate_clks,
@@ -825,7 +826,7 @@ CLK_OF_DECLARE(exynos7_clk_peric1, "samsung,exynos7-clock-peric1",
 /* List of parent clocks for Muxes in CMU_PERIS */
 PNAME(mout_aclk_peris_66_user_p) = { "fin_pll", "aclk_peris_66" };
 
-static unsigned long peris_clk_regs[] __initdata = {
+static const unsigned long peris_clk_regs[] __initconst = {
        MUX_SEL_PERIS,
        ENABLE_PCLK_PERIS,
        ENABLE_PCLK_PERIS_SECURE_CHIPID,
@@ -833,12 +834,12 @@ static unsigned long peris_clk_regs[] __initdata = {
        ENABLE_SCLK_PERIS_SECURE_CHIPID,
 };
 
-static struct samsung_mux_clock peris_mux_clks[] __initdata = {
+static const struct samsung_mux_clock peris_mux_clks[] __initconst = {
        MUX(0, "mout_aclk_peris_66_user",
                mout_aclk_peris_66_user_p, MUX_SEL_PERIS, 0, 1),
 };
 
-static struct samsung_gate_clock peris_gate_clks[] __initdata = {
+static const struct samsung_gate_clock peris_gate_clks[] __initconst = {
        GATE(PCLK_WDT, "pclk_wdt", "mout_aclk_peris_66_user",
                ENABLE_PCLK_PERIS, 6, 0, 0),
        GATE(PCLK_TMU, "pclk_tmu_apbif", "mout_aclk_peris_66_user",
@@ -852,7 +853,7 @@ static struct samsung_gate_clock peris_gate_clks[] __initdata = {
        GATE(SCLK_TMU, "sclk_tmu", "fin_pll", ENABLE_SCLK_PERIS, 10, 0, 0),
 };
 
-static struct samsung_cmu_info peris_cmu_info __initdata = {
+static const struct samsung_cmu_info peris_cmu_info __initconst = {
        .mux_clks               = peris_mux_clks,
        .nr_mux_clks            = ARRAY_SIZE(peris_mux_clks),
        .gate_clks              = peris_gate_clks,
@@ -893,12 +894,12 @@ PNAME(mout_phyclk_usbdrd300_udrd30_pipe_pclk_user_p)      = { "fin_pll",
                                "phyclk_usbdrd300_udrd30_pipe_pclk" };
 
 /* fixed rate clocks used in the FSYS0 block */
-static struct samsung_fixed_rate_clock fixed_rate_clks_fsys0[] __initdata = {
+static const struct samsung_fixed_rate_clock fixed_rate_clks_fsys0[] __initconst = {
        FRATE(0, "phyclk_usbdrd300_udrd30_phyclock", NULL, 0, 60000000),
        FRATE(0, "phyclk_usbdrd300_udrd30_pipe_pclk", NULL, 0, 125000000),
 };
 
-static unsigned long fsys0_clk_regs[] __initdata = {
+static const unsigned long fsys0_clk_regs[] __initconst = {
        MUX_SEL_FSYS00,
        MUX_SEL_FSYS01,
        MUX_SEL_FSYS02,
@@ -909,7 +910,7 @@ static unsigned long fsys0_clk_regs[] __initdata = {
        ENABLE_SCLK_FSYS04,
 };
 
-static struct samsung_mux_clock fsys0_mux_clks[] __initdata = {
+static const struct samsung_mux_clock fsys0_mux_clks[] __initconst = {
        MUX(0, "mout_aclk_fsys0_200_user", mout_aclk_fsys0_200_user_p,
                MUX_SEL_FSYS00, 24, 1),
 
@@ -926,7 +927,7 @@ static struct samsung_mux_clock fsys0_mux_clks[] __initdata = {
                MUX_SEL_FSYS02, 28, 1),
 };
 
-static struct samsung_gate_clock fsys0_gate_clks[] __initdata = {
+static const struct samsung_gate_clock fsys0_gate_clks[] __initconst = {
        GATE(ACLK_PDMA1, "aclk_pdma1", "mout_aclk_fsys0_200_user",
                        ENABLE_ACLK_FSYS00, 3, 0, 0),
        GATE(ACLK_PDMA0, "aclk_pdma0", "mout_aclk_fsys0_200_user",
@@ -960,7 +961,7 @@ static struct samsung_gate_clock fsys0_gate_clks[] __initdata = {
                ENABLE_SCLK_FSYS04, 28, 0, 0),
 };
 
-static struct samsung_cmu_info fsys0_cmu_info __initdata = {
+static const struct samsung_cmu_info fsys0_cmu_info __initconst = {
        .fixed_clks             = fixed_rate_clks_fsys0,
        .nr_fixed_clks          = ARRAY_SIZE(fixed_rate_clks_fsys0),
        .mux_clks               = fsys0_mux_clks,
@@ -1005,7 +1006,7 @@ PNAME(mout_phyclk_ufs20_rx0_user_p) = { "fin_pll", "phyclk_ufs20_rx0_symbol" };
 PNAME(mout_phyclk_ufs20_rx1_user_p) = { "fin_pll", "phyclk_ufs20_rx1_symbol" };
 
 /* fixed rate clocks used in the FSYS1 block */
-static struct samsung_fixed_rate_clock fixed_rate_clks_fsys1[] __initdata = {
+static const struct samsung_fixed_rate_clock fixed_rate_clks_fsys1[] __initconst = {
        FRATE(PHYCLK_UFS20_TX0_SYMBOL, "phyclk_ufs20_tx0_symbol", NULL,
                        0, 300000000),
        FRATE(PHYCLK_UFS20_RX0_SYMBOL, "phyclk_ufs20_rx0_symbol", NULL,
@@ -1014,7 +1015,7 @@ static struct samsung_fixed_rate_clock fixed_rate_clks_fsys1[] __initdata = {
                        0, 300000000),
 };
 
-static unsigned long fsys1_clk_regs[] __initdata = {
+static const unsigned long fsys1_clk_regs[] __initconst = {
        MUX_SEL_FSYS10,
        MUX_SEL_FSYS11,
        MUX_SEL_FSYS12,
@@ -1026,7 +1027,7 @@ static unsigned long fsys1_clk_regs[] __initdata = {
        ENABLE_SCLK_FSYS13,
 };
 
-static struct samsung_mux_clock fsys1_mux_clks[] __initdata = {
+static const struct samsung_mux_clock fsys1_mux_clks[] __initconst = {
        MUX(MOUT_FSYS1_PHYCLK_SEL1, "mout_fsys1_phyclk_sel1",
                mout_fsys1_group_p, MUX_SEL_FSYS10, 16, 2),
        MUX(0, "mout_fsys1_phyclk_sel0", mout_fsys1_group_p,
@@ -1049,12 +1050,12 @@ static struct samsung_mux_clock fsys1_mux_clks[] __initdata = {
                mout_phyclk_ufs20_tx0_user_p, MUX_SEL_FSYS12, 28, 1),
 };
 
-static struct samsung_div_clock fsys1_div_clks[] __initdata = {
+static const struct samsung_div_clock fsys1_div_clks[] __initconst = {
        DIV(DOUT_PCLK_FSYS1, "dout_pclk_fsys1", "mout_aclk_fsys1_200_user",
                DIV_FSYS1, 0, 2),
 };
 
-static struct samsung_gate_clock fsys1_gate_clks[] __initdata = {
+static const struct samsung_gate_clock fsys1_gate_clks[] __initconst = {
        GATE(SCLK_UFSUNIPRO20_USER, "sclk_ufsunipro20_user",
                "mout_sclk_ufsunipro20_user",
                ENABLE_SCLK_FSYS11, 20, 0, 0),
@@ -1089,7 +1090,7 @@ static struct samsung_gate_clock fsys1_gate_clks[] __initdata = {
                ENABLE_SCLK_FSYS13, 24, CLK_IGNORE_UNUSED, 0),
 };
 
-static struct samsung_cmu_info fsys1_cmu_info __initdata = {
+static const struct samsung_cmu_info fsys1_cmu_info __initconst = {
        .fixed_clks             = fixed_rate_clks_fsys1,
        .nr_fixed_clks          = ARRAY_SIZE(fixed_rate_clks_fsys1),
        .mux_clks               = fsys1_mux_clks,
@@ -1119,22 +1120,22 @@ CLK_OF_DECLARE(exynos7_clk_fsys1, "samsung,exynos7-clock-fsys1",
 /* List of parent clocks for Muxes in CMU_MSCL */
 PNAME(mout_aclk_mscl_532_user_p)       = { "fin_pll", "aclk_mscl_532" };
 
-static unsigned long mscl_clk_regs[] __initdata = {
+static const unsigned long mscl_clk_regs[] __initconst = {
        MUX_SEL_MSCL,
        DIV_MSCL,
        ENABLE_ACLK_MSCL,
        ENABLE_PCLK_MSCL,
 };
 
-static struct samsung_mux_clock mscl_mux_clks[] __initdata = {
+static const struct samsung_mux_clock mscl_mux_clks[] __initconst = {
        MUX(USERMUX_ACLK_MSCL_532, "usermux_aclk_mscl_532",
                mout_aclk_mscl_532_user_p, MUX_SEL_MSCL, 0, 1),
 };
-static struct samsung_div_clock mscl_div_clks[] __initdata = {
+static const struct samsung_div_clock mscl_div_clks[] __initconst = {
        DIV(DOUT_PCLK_MSCL, "dout_pclk_mscl", "usermux_aclk_mscl_532",
                        DIV_MSCL, 0, 3),
 };
-static struct samsung_gate_clock mscl_gate_clks[] __initdata = {
+static const struct samsung_gate_clock mscl_gate_clks[] __initconst = {
 
        GATE(ACLK_MSCL_0, "aclk_mscl_0", "usermux_aclk_mscl_532",
                        ENABLE_ACLK_MSCL, 31, 0, 0),
@@ -1204,7 +1205,7 @@ static struct samsung_gate_clock mscl_gate_clks[] __initdata = {
                        ENABLE_PCLK_MSCL, 20, 0, 0),
 };
 
-static struct samsung_cmu_info mscl_cmu_info __initdata = {
+static const struct samsung_cmu_info mscl_cmu_info __initconst = {
        .mux_clks               = mscl_mux_clks,
        .nr_mux_clks            = ARRAY_SIZE(mscl_mux_clks),
        .div_clks               = mscl_div_clks,
@@ -1238,7 +1239,7 @@ CLK_OF_DECLARE(exynos7_clk_mscl, "samsung,exynos7-clock-mscl",
 PNAME(mout_aud_pll_user_p) = { "fin_pll", "fout_aud_pll" };
 PNAME(mout_aud_group_p) = { "dout_aud_cdclk", "ioclk_audiocdclk0" };
 
-static unsigned long aud_clk_regs[] __initdata = {
+static const unsigned long aud_clk_regs[] __initconst = {
        MUX_SEL_AUD,
        DIV_AUD0,
        DIV_AUD1,
@@ -1247,13 +1248,13 @@ static unsigned long aud_clk_regs[] __initdata = {
        ENABLE_SCLK_AUD,
 };
 
-static struct samsung_mux_clock aud_mux_clks[] __initdata = {
+static const struct samsung_mux_clock aud_mux_clks[] __initconst = {
        MUX(0, "mout_sclk_i2s", mout_aud_group_p, MUX_SEL_AUD, 12, 1),
        MUX(0, "mout_sclk_pcm", mout_aud_group_p, MUX_SEL_AUD, 16, 1),
        MUX(0, "mout_aud_pll_user", mout_aud_pll_user_p, MUX_SEL_AUD, 20, 1),
 };
 
-static struct samsung_div_clock aud_div_clks[] __initdata = {
+static const struct samsung_div_clock aud_div_clks[] __initconst = {
        DIV(0, "dout_aud_ca5", "mout_aud_pll_user", DIV_AUD0, 0, 4),
        DIV(0, "dout_aclk_aud", "dout_aud_ca5", DIV_AUD0, 4, 4),
        DIV(0, "dout_aud_pclk_dbg", "dout_aud_ca5", DIV_AUD0, 8, 4),
@@ -1265,7 +1266,7 @@ static struct samsung_div_clock aud_div_clks[] __initdata = {
        DIV(0, "dout_aud_cdclk", "mout_aud_pll_user", DIV_AUD1, 24, 4),
 };
 
-static struct samsung_gate_clock aud_gate_clks[] __initdata = {
+static const struct samsung_gate_clock aud_gate_clks[] __initconst = {
        GATE(SCLK_PCM, "sclk_pcm", "dout_sclk_pcm",
                        ENABLE_SCLK_AUD, 27, CLK_SET_RATE_PARENT, 0),
        GATE(SCLK_I2S, "sclk_i2s", "dout_sclk_i2s",
@@ -1293,7 +1294,7 @@ static struct samsung_gate_clock aud_gate_clks[] __initdata = {
        GATE(ACLK_ADMA, "aclk_dmac", "dout_aclk_aud", ENABLE_ACLK_AUD, 31, 0, 0),
 };
 
-static struct samsung_cmu_info aud_cmu_info __initdata = {
+static const struct samsung_cmu_info aud_cmu_info __initconst = {
        .mux_clks               = aud_mux_clks,
        .nr_mux_clks            = ARRAY_SIZE(aud_mux_clks),
        .div_clks               = aud_div_clks,
index b7dd396100d8118381caebffade2ff7e3acf831d..48139bd510f1078ccc80873ddaa1369a46b024a0 100644 (file)
@@ -79,7 +79,7 @@ static unsigned long samsung_pll2126_recalc_rate(struct clk_hw *hw,
        u32 pll_con, mdiv, pdiv, sdiv;
        u64 fvco = parent_rate;
 
-       pll_con = __raw_readl(pll->con_reg);
+       pll_con = readl_relaxed(pll->con_reg);
        mdiv = (pll_con >> PLL2126_MDIV_SHIFT) & PLL2126_MDIV_MASK;
        pdiv = (pll_con >> PLL2126_PDIV_SHIFT) & PLL2126_PDIV_MASK;
        sdiv = (pll_con >> PLL2126_SDIV_SHIFT) & PLL2126_SDIV_MASK;
@@ -112,7 +112,7 @@ static unsigned long samsung_pll3000_recalc_rate(struct clk_hw *hw,
        u32 pll_con, mdiv, pdiv, sdiv;
        u64 fvco = parent_rate;
 
-       pll_con = __raw_readl(pll->con_reg);
+       pll_con = readl_relaxed(pll->con_reg);
        mdiv = (pll_con >> PLL3000_MDIV_SHIFT) & PLL3000_MDIV_MASK;
        pdiv = (pll_con >> PLL3000_PDIV_SHIFT) & PLL3000_PDIV_MASK;
        sdiv = (pll_con >> PLL3000_SDIV_SHIFT) & PLL3000_SDIV_MASK;
@@ -149,7 +149,7 @@ static unsigned long samsung_pll35xx_recalc_rate(struct clk_hw *hw,
        u32 mdiv, pdiv, sdiv, pll_con;
        u64 fvco = parent_rate;
 
-       pll_con = __raw_readl(pll->con_reg);
+       pll_con = readl_relaxed(pll->con_reg);
        mdiv = (pll_con >> PLL35XX_MDIV_SHIFT) & PLL35XX_MDIV_MASK;
        pdiv = (pll_con >> PLL35XX_PDIV_SHIFT) & PLL35XX_PDIV_MASK;
        sdiv = (pll_con >> PLL35XX_SDIV_SHIFT) & PLL35XX_SDIV_MASK;
@@ -186,19 +186,19 @@ static int samsung_pll35xx_set_rate(struct clk_hw *hw, unsigned long drate,
                return -EINVAL;
        }
 
-       tmp = __raw_readl(pll->con_reg);
+       tmp = readl_relaxed(pll->con_reg);
 
        if (!(samsung_pll35xx_mp_change(rate, tmp))) {
                /* If only s change, change just s value only*/
                tmp &= ~(PLL35XX_SDIV_MASK << PLL35XX_SDIV_SHIFT);
                tmp |= rate->sdiv << PLL35XX_SDIV_SHIFT;
-               __raw_writel(tmp, pll->con_reg);
+               writel_relaxed(tmp, pll->con_reg);
 
                return 0;
        }
 
        /* Set PLL lock time. */
-       __raw_writel(rate->pdiv * PLL35XX_LOCK_FACTOR,
+       writel_relaxed(rate->pdiv * PLL35XX_LOCK_FACTOR,
                        pll->lock_reg);
 
        /* Change PLL PMS values */
@@ -208,12 +208,12 @@ static int samsung_pll35xx_set_rate(struct clk_hw *hw, unsigned long drate,
        tmp |= (rate->mdiv << PLL35XX_MDIV_SHIFT) |
                        (rate->pdiv << PLL35XX_PDIV_SHIFT) |
                        (rate->sdiv << PLL35XX_SDIV_SHIFT);
-       __raw_writel(tmp, pll->con_reg);
+       writel_relaxed(tmp, pll->con_reg);
 
        /* wait_lock_time */
        do {
                cpu_relax();
-               tmp = __raw_readl(pll->con_reg);
+               tmp = readl_relaxed(pll->con_reg);
        } while (!(tmp & (PLL35XX_LOCK_STAT_MASK
                                << PLL35XX_LOCK_STAT_SHIFT)));
        return 0;
@@ -253,8 +253,8 @@ static unsigned long samsung_pll36xx_recalc_rate(struct clk_hw *hw,
        s16 kdiv;
        u64 fvco = parent_rate;
 
-       pll_con0 = __raw_readl(pll->con_reg);
-       pll_con1 = __raw_readl(pll->con_reg + 4);
+       pll_con0 = readl_relaxed(pll->con_reg);
+       pll_con1 = readl_relaxed(pll->con_reg + 4);
        mdiv = (pll_con0 >> PLL36XX_MDIV_SHIFT) & PLL36XX_MDIV_MASK;
        pdiv = (pll_con0 >> PLL36XX_PDIV_SHIFT) & PLL36XX_PDIV_MASK;
        sdiv = (pll_con0 >> PLL36XX_SDIV_SHIFT) & PLL36XX_SDIV_MASK;
@@ -294,20 +294,20 @@ static int samsung_pll36xx_set_rate(struct clk_hw *hw, unsigned long drate,
                return -EINVAL;
        }
 
-       pll_con0 = __raw_readl(pll->con_reg);
-       pll_con1 = __raw_readl(pll->con_reg + 4);
+       pll_con0 = readl_relaxed(pll->con_reg);
+       pll_con1 = readl_relaxed(pll->con_reg + 4);
 
        if (!(samsung_pll36xx_mpk_change(rate, pll_con0, pll_con1))) {
                /* If only s change, change just s value only*/
                pll_con0 &= ~(PLL36XX_SDIV_MASK << PLL36XX_SDIV_SHIFT);
                pll_con0 |= (rate->sdiv << PLL36XX_SDIV_SHIFT);
-               __raw_writel(pll_con0, pll->con_reg);
+               writel_relaxed(pll_con0, pll->con_reg);
 
                return 0;
        }
 
        /* Set PLL lock time. */
-       __raw_writel(rate->pdiv * PLL36XX_LOCK_FACTOR, pll->lock_reg);
+       writel_relaxed(rate->pdiv * PLL36XX_LOCK_FACTOR, pll->lock_reg);
 
         /* Change PLL PMS values */
        pll_con0 &= ~((PLL36XX_MDIV_MASK << PLL36XX_MDIV_SHIFT) |
@@ -316,16 +316,16 @@ static int samsung_pll36xx_set_rate(struct clk_hw *hw, unsigned long drate,
        pll_con0 |= (rate->mdiv << PLL36XX_MDIV_SHIFT) |
                        (rate->pdiv << PLL36XX_PDIV_SHIFT) |
                        (rate->sdiv << PLL36XX_SDIV_SHIFT);
-       __raw_writel(pll_con0, pll->con_reg);
+       writel_relaxed(pll_con0, pll->con_reg);
 
        pll_con1 &= ~(PLL36XX_KDIV_MASK << PLL36XX_KDIV_SHIFT);
        pll_con1 |= rate->kdiv << PLL36XX_KDIV_SHIFT;
-       __raw_writel(pll_con1, pll->con_reg + 4);
+       writel_relaxed(pll_con1, pll->con_reg + 4);
 
        /* wait_lock_time */
        do {
                cpu_relax();
-               tmp = __raw_readl(pll->con_reg);
+               tmp = readl_relaxed(pll->con_reg);
        } while (!(tmp & (1 << PLL36XX_LOCK_STAT_SHIFT)));
 
        return 0;
@@ -366,7 +366,7 @@ static unsigned long samsung_pll45xx_recalc_rate(struct clk_hw *hw,
        u32 mdiv, pdiv, sdiv, pll_con;
        u64 fvco = parent_rate;
 
-       pll_con = __raw_readl(pll->con_reg);
+       pll_con = readl_relaxed(pll->con_reg);
        mdiv = (pll_con >> PLL45XX_MDIV_SHIFT) & PLL45XX_MDIV_MASK;
        pdiv = (pll_con >> PLL45XX_PDIV_SHIFT) & PLL45XX_PDIV_MASK;
        sdiv = (pll_con >> PLL45XX_SDIV_SHIFT) & PLL45XX_SDIV_MASK;
@@ -409,14 +409,14 @@ static int samsung_pll45xx_set_rate(struct clk_hw *hw, unsigned long drate,
                return -EINVAL;
        }
 
-       con0 = __raw_readl(pll->con_reg);
-       con1 = __raw_readl(pll->con_reg + 0x4);
+       con0 = readl_relaxed(pll->con_reg);
+       con1 = readl_relaxed(pll->con_reg + 0x4);
 
        if (!(samsung_pll45xx_mp_change(con0, con1, rate))) {
                /* If only s change, change just s value only*/
                con0 &= ~(PLL45XX_SDIV_MASK << PLL45XX_SDIV_SHIFT);
                con0 |= rate->sdiv << PLL45XX_SDIV_SHIFT;
-               __raw_writel(con0, pll->con_reg);
+               writel_relaxed(con0, pll->con_reg);
 
                return 0;
        }
@@ -430,29 +430,29 @@ static int samsung_pll45xx_set_rate(struct clk_hw *hw, unsigned long drate,
                        (rate->sdiv << PLL45XX_SDIV_SHIFT);
 
        /* Set PLL AFC value. */
-       con1 = __raw_readl(pll->con_reg + 0x4);
+       con1 = readl_relaxed(pll->con_reg + 0x4);
        con1 &= ~(PLL45XX_AFC_MASK << PLL45XX_AFC_SHIFT);
        con1 |= (rate->afc << PLL45XX_AFC_SHIFT);
 
        /* Set PLL lock time. */
        switch (pll->type) {
        case pll_4502:
-               __raw_writel(rate->pdiv * PLL4502_LOCK_FACTOR, pll->lock_reg);
+               writel_relaxed(rate->pdiv * PLL4502_LOCK_FACTOR, pll->lock_reg);
                break;
        case pll_4508:
-               __raw_writel(rate->pdiv * PLL4508_LOCK_FACTOR, pll->lock_reg);
+               writel_relaxed(rate->pdiv * PLL4508_LOCK_FACTOR, pll->lock_reg);
                break;
        default:
                break;
        }
 
        /* Set new configuration. */
-       __raw_writel(con1, pll->con_reg + 0x4);
-       __raw_writel(con0, pll->con_reg);
+       writel_relaxed(con1, pll->con_reg + 0x4);
+       writel_relaxed(con0, pll->con_reg);
 
        /* Wait for locking. */
        start = ktime_get();
-       while (!(__raw_readl(pll->con_reg) & PLL45XX_LOCKED)) {
+       while (!(readl_relaxed(pll->con_reg) & PLL45XX_LOCKED)) {
                ktime_t delta = ktime_sub(ktime_get(), start);
 
                if (ktime_to_ms(delta) > PLL_TIMEOUT_MS) {
@@ -513,8 +513,8 @@ static unsigned long samsung_pll46xx_recalc_rate(struct clk_hw *hw,
        u32 mdiv, pdiv, sdiv, kdiv, pll_con0, pll_con1, shift;
        u64 fvco = parent_rate;
 
-       pll_con0 = __raw_readl(pll->con_reg);
-       pll_con1 = __raw_readl(pll->con_reg + 4);
+       pll_con0 = readl_relaxed(pll->con_reg);
+       pll_con1 = readl_relaxed(pll->con_reg + 4);
        mdiv = (pll_con0 >> PLL46XX_MDIV_SHIFT) & ((pll->type == pll_1460x) ?
                                PLL1460X_MDIV_MASK : PLL46XX_MDIV_MASK);
        pdiv = (pll_con0 >> PLL46XX_PDIV_SHIFT) & PLL46XX_PDIV_MASK;
@@ -560,14 +560,14 @@ static int samsung_pll46xx_set_rate(struct clk_hw *hw, unsigned long drate,
                return -EINVAL;
        }
 
-       con0 = __raw_readl(pll->con_reg);
-       con1 = __raw_readl(pll->con_reg + 0x4);
+       con0 = readl_relaxed(pll->con_reg);
+       con1 = readl_relaxed(pll->con_reg + 0x4);
 
        if (!(samsung_pll46xx_mpk_change(con0, con1, rate))) {
                /* If only s change, change just s value only*/
                con0 &= ~(PLL46XX_SDIV_MASK << PLL46XX_SDIV_SHIFT);
                con0 |= rate->sdiv << PLL46XX_SDIV_SHIFT;
-               __raw_writel(con0, pll->con_reg);
+               writel_relaxed(con0, pll->con_reg);
 
                return 0;
        }
@@ -596,7 +596,7 @@ static int samsung_pll46xx_set_rate(struct clk_hw *hw, unsigned long drate,
                        (rate->sdiv << PLL46XX_SDIV_SHIFT);
 
        /* Set PLL K, MFR and MRR values. */
-       con1 = __raw_readl(pll->con_reg + 0x4);
+       con1 = readl_relaxed(pll->con_reg + 0x4);
        con1 &= ~((PLL46XX_KDIV_MASK << PLL46XX_KDIV_SHIFT) |
                        (PLL46XX_MFR_MASK << PLL46XX_MFR_SHIFT) |
                        (PLL46XX_MRR_MASK << PLL46XX_MRR_SHIFT));
@@ -605,13 +605,13 @@ static int samsung_pll46xx_set_rate(struct clk_hw *hw, unsigned long drate,
                        (rate->mrr << PLL46XX_MRR_SHIFT);
 
        /* Write configuration to PLL */
-       __raw_writel(lock, pll->lock_reg);
-       __raw_writel(con0, pll->con_reg);
-       __raw_writel(con1, pll->con_reg + 0x4);
+       writel_relaxed(lock, pll->lock_reg);
+       writel_relaxed(con0, pll->con_reg);
+       writel_relaxed(con1, pll->con_reg + 0x4);
 
        /* Wait for locking. */
        start = ktime_get();
-       while (!(__raw_readl(pll->con_reg) & PLL46XX_LOCKED)) {
+       while (!(readl_relaxed(pll->con_reg) & PLL46XX_LOCKED)) {
                ktime_t delta = ktime_sub(ktime_get(), start);
 
                if (ktime_to_ms(delta) > PLL_TIMEOUT_MS) {
@@ -656,7 +656,7 @@ static unsigned long samsung_pll6552_recalc_rate(struct clk_hw *hw,
        u32 mdiv, pdiv, sdiv, pll_con;
        u64 fvco = parent_rate;
 
-       pll_con = __raw_readl(pll->con_reg);
+       pll_con = readl_relaxed(pll->con_reg);
        if (pll->type == pll_6552_s3c2416) {
                mdiv = (pll_con >> PLL6552_MDIV_SHIFT_2416) & PLL6552_MDIV_MASK;
                pdiv = (pll_con >> PLL6552_PDIV_SHIFT_2416) & PLL6552_PDIV_MASK;
@@ -696,8 +696,8 @@ static unsigned long samsung_pll6553_recalc_rate(struct clk_hw *hw,
        u32 mdiv, pdiv, sdiv, kdiv, pll_con0, pll_con1;
        u64 fvco = parent_rate;
 
-       pll_con0 = __raw_readl(pll->con_reg);
-       pll_con1 = __raw_readl(pll->con_reg + 0x4);
+       pll_con0 = readl_relaxed(pll->con_reg);
+       pll_con1 = readl_relaxed(pll->con_reg + 0x4);
        mdiv = (pll_con0 >> PLL6553_MDIV_SHIFT) & PLL6553_MDIV_MASK;
        pdiv = (pll_con0 >> PLL6553_PDIV_SHIFT) & PLL6553_PDIV_MASK;
        sdiv = (pll_con0 >> PLL6553_SDIV_SHIFT) & PLL6553_SDIV_MASK;
@@ -734,7 +734,7 @@ static unsigned long samsung_s3c2410_pll_recalc_rate(struct clk_hw *hw,
        u32 pll_con, mdiv, pdiv, sdiv;
        u64 fvco = parent_rate;
 
-       pll_con = __raw_readl(pll->con_reg);
+       pll_con = readl_relaxed(pll->con_reg);
        mdiv = (pll_con >> PLLS3C2410_MDIV_SHIFT) & PLLS3C2410_MDIV_MASK;
        pdiv = (pll_con >> PLLS3C2410_PDIV_SHIFT) & PLLS3C2410_PDIV_MASK;
        sdiv = (pll_con >> PLLS3C2410_SDIV_SHIFT) & PLLS3C2410_SDIV_MASK;
@@ -752,7 +752,7 @@ static unsigned long samsung_s3c2440_mpll_recalc_rate(struct clk_hw *hw,
        u32 pll_con, mdiv, pdiv, sdiv;
        u64 fvco = parent_rate;
 
-       pll_con = __raw_readl(pll->con_reg);
+       pll_con = readl_relaxed(pll->con_reg);
        mdiv = (pll_con >> PLLS3C2410_MDIV_SHIFT) & PLLS3C2410_MDIV_MASK;
        pdiv = (pll_con >> PLLS3C2410_PDIV_SHIFT) & PLLS3C2410_PDIV_MASK;
        sdiv = (pll_con >> PLLS3C2410_SDIV_SHIFT) & PLLS3C2410_SDIV_MASK;
@@ -778,7 +778,7 @@ static int samsung_s3c2410_pll_set_rate(struct clk_hw *hw, unsigned long drate,
                return -EINVAL;
        }
 
-       tmp = __raw_readl(pll->con_reg);
+       tmp = readl_relaxed(pll->con_reg);
 
        /* Change PLL PMS values */
        tmp &= ~((PLLS3C2410_MDIV_MASK << PLLS3C2410_MDIV_SHIFT) |
@@ -787,7 +787,7 @@ static int samsung_s3c2410_pll_set_rate(struct clk_hw *hw, unsigned long drate,
        tmp |= (rate->mdiv << PLLS3C2410_MDIV_SHIFT) |
                        (rate->pdiv << PLLS3C2410_PDIV_SHIFT) |
                        (rate->sdiv << PLLS3C2410_SDIV_SHIFT);
-       __raw_writel(tmp, pll->con_reg);
+       writel_relaxed(tmp, pll->con_reg);
 
        /* Time to settle according to the manual */
        udelay(300);
@@ -798,7 +798,7 @@ static int samsung_s3c2410_pll_set_rate(struct clk_hw *hw, unsigned long drate,
 static int samsung_s3c2410_pll_enable(struct clk_hw *hw, int bit, bool enable)
 {
        struct samsung_clk_pll *pll = to_clk_pll(hw);
-       u32 pll_en = __raw_readl(pll->lock_reg + PLLS3C2410_ENABLE_REG_OFFSET);
+       u32 pll_en = readl_relaxed(pll->lock_reg + PLLS3C2410_ENABLE_REG_OFFSET);
        u32 pll_en_orig = pll_en;
 
        if (enable)
@@ -806,7 +806,7 @@ static int samsung_s3c2410_pll_enable(struct clk_hw *hw, int bit, bool enable)
        else
                pll_en |= BIT(bit);
 
-       __raw_writel(pll_en, pll->lock_reg + PLLS3C2410_ENABLE_REG_OFFSET);
+       writel_relaxed(pll_en, pll->lock_reg + PLLS3C2410_ENABLE_REG_OFFSET);
 
        /* if we started the UPLL, then allow to settle */
        if (enable && (pll_en_orig & BIT(bit)))
@@ -905,7 +905,7 @@ static unsigned long samsung_pll2550x_recalc_rate(struct clk_hw *hw,
        u32 r, p, m, s, pll_stat;
        u64 fvco = parent_rate;
 
-       pll_stat = __raw_readl(pll->reg_base + pll->offset * 3);
+       pll_stat = readl_relaxed(pll->reg_base + pll->offset * 3);
        r = (pll_stat >> PLL2550X_R_SHIFT) & PLL2550X_R_MASK;
        if (!r)
                return 0;
@@ -983,7 +983,7 @@ static unsigned long samsung_pll2550xx_recalc_rate(struct clk_hw *hw,
        u32 mdiv, pdiv, sdiv, pll_con;
        u64 fvco = parent_rate;
 
-       pll_con = __raw_readl(pll->con_reg);
+       pll_con = readl_relaxed(pll->con_reg);
        mdiv = (pll_con >> PLL2550XX_M_SHIFT) & PLL2550XX_M_MASK;
        pdiv = (pll_con >> PLL2550XX_P_SHIFT) & PLL2550XX_P_MASK;
        sdiv = (pll_con >> PLL2550XX_S_SHIFT) & PLL2550XX_S_MASK;
@@ -1019,19 +1019,19 @@ static int samsung_pll2550xx_set_rate(struct clk_hw *hw, unsigned long drate,
                return -EINVAL;
        }
 
-       tmp = __raw_readl(pll->con_reg);
+       tmp = readl_relaxed(pll->con_reg);
 
        if (!(samsung_pll2550xx_mp_change(rate->mdiv, rate->pdiv, tmp))) {
                /* If only s change, change just s value only*/
                tmp &= ~(PLL2550XX_S_MASK << PLL2550XX_S_SHIFT);
                tmp |= rate->sdiv << PLL2550XX_S_SHIFT;
-               __raw_writel(tmp, pll->con_reg);
+               writel_relaxed(tmp, pll->con_reg);
 
                return 0;
        }
 
        /* Set PLL lock time. */
-       __raw_writel(rate->pdiv * PLL2550XX_LOCK_FACTOR, pll->lock_reg);
+       writel_relaxed(rate->pdiv * PLL2550XX_LOCK_FACTOR, pll->lock_reg);
 
        /* Change PLL PMS values */
        tmp &= ~((PLL2550XX_M_MASK << PLL2550XX_M_SHIFT) |
@@ -1040,12 +1040,12 @@ static int samsung_pll2550xx_set_rate(struct clk_hw *hw, unsigned long drate,
        tmp |= (rate->mdiv << PLL2550XX_M_SHIFT) |
                        (rate->pdiv << PLL2550XX_P_SHIFT) |
                        (rate->sdiv << PLL2550XX_S_SHIFT);
-       __raw_writel(tmp, pll->con_reg);
+       writel_relaxed(tmp, pll->con_reg);
 
        /* wait_lock_time */
        do {
                cpu_relax();
-               tmp = __raw_readl(pll->con_reg);
+               tmp = readl_relaxed(pll->con_reg);
        } while (!(tmp & (PLL2550XX_LOCK_STAT_MASK
                        << PLL2550XX_LOCK_STAT_SHIFT)));
 
@@ -1089,8 +1089,8 @@ static unsigned long samsung_pll2650xx_recalc_rate(struct clk_hw *hw,
        s16 kdiv;
        u64 fvco = parent_rate;
 
-       pll_con0 = __raw_readl(pll->con_reg);
-       pll_con2 = __raw_readl(pll->con_reg + 8);
+       pll_con0 = readl_relaxed(pll->con_reg);
+       pll_con2 = readl_relaxed(pll->con_reg + 8);
        mdiv = (pll_con0 >> PLL2650XX_MDIV_SHIFT) & PLL2650XX_MDIV_MASK;
        pdiv = (pll_con0 >> PLL2650XX_PDIV_SHIFT) & PLL2650XX_PDIV_MASK;
        sdiv = (pll_con0 >> PLL2650XX_SDIV_SHIFT) & PLL2650XX_SDIV_MASK;
@@ -1117,8 +1117,8 @@ static int samsung_pll2650xx_set_rate(struct clk_hw *hw, unsigned long drate,
                return -EINVAL;
        }
 
-       pll_con0 = __raw_readl(pll->con_reg);
-       pll_con2 = __raw_readl(pll->con_reg + 8);
+       pll_con0 = readl_relaxed(pll->con_reg);
+       pll_con2 = readl_relaxed(pll->con_reg + 8);
 
         /* Change PLL PMS values */
        pll_con0 &= ~(PLL2650XX_MDIV_MASK << PLL2650XX_MDIV_SHIFT |
@@ -1135,13 +1135,13 @@ static int samsung_pll2650xx_set_rate(struct clk_hw *hw, unsigned long drate,
                        << PLL2650XX_KDIV_SHIFT;
 
        /* Set PLL lock time. */
-       __raw_writel(PLL2650XX_LOCK_FACTOR * rate->pdiv, pll->lock_reg);
+       writel_relaxed(PLL2650XX_LOCK_FACTOR * rate->pdiv, pll->lock_reg);
 
-       __raw_writel(pll_con0, pll->con_reg);
-       __raw_writel(pll_con2, pll->con_reg + 8);
+       writel_relaxed(pll_con0, pll->con_reg);
+       writel_relaxed(pll_con2, pll->con_reg + 8);
 
        do {
-               tmp = __raw_readl(pll->con_reg);
+               tmp = readl_relaxed(pll->con_reg);
        } while (!(tmp & (0x1 << PLL2650XX_PLL_LOCKTIME_SHIFT)));
 
        return 0;
index ec6fb14d951c728044e477265639fe18881da413..ae9a595c72d0e3489036b93aba3acae2c934a9e9 100644 (file)
@@ -428,8 +428,9 @@ MODULE_DEVICE_TABLE(platform, s3c24xx_dclk_driver_ids);
 
 static struct platform_driver s3c24xx_dclk_driver = {
        .driver = {
-               .name           = "s3c24xx-dclk",
-               .pm             = &s3c24xx_dclk_pm_ops,
+               .name                   = "s3c24xx-dclk",
+               .pm                     = &s3c24xx_dclk_pm_ops,
+               .suppress_bind_attrs    = true,
        },
        .probe = s3c24xx_dclk_probe,
        .remove = s3c24xx_dclk_remove,
index d7b011c1fcf8859bbddd514a361d8d39e00f11ae..d7a1e772d95a97d67c8b6da5104af27358a7145a 100644 (file)
@@ -374,8 +374,6 @@ void __init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f,
        }
 
        ctx = samsung_clk_init(np, reg_base, NR_CLKS);
-       if (!ctx)
-               panic("%s: unable to allocate context.\n", __func__);
 
        /* Register external clocks only in non-dt cases */
        if (!np)
index effe3736ec6b69bfa753e55d54e6615fde1caa98..ec873ee15d377b6f720e319cb6327744b4489d99 100644 (file)
@@ -265,8 +265,6 @@ void __init s3c2412_common_clk_init(struct device_node *np, unsigned long xti_f,
        }
 
        ctx = samsung_clk_init(np, reg_base, NR_CLKS);
-       if (!ctx)
-               panic("%s: unable to allocate context.\n", __func__);
 
        /* Register external clocks only in non-dt cases */
        if (!np)
index 37562783b25e1733a36ac86b94ac31892ab002b9..5e24a17e10e676e2e76ae5efec06af0d9eb0e847 100644 (file)
@@ -400,8 +400,6 @@ void __init s3c2443_common_clk_init(struct device_node *np, unsigned long xti_f,
        }
 
        ctx = samsung_clk_init(np, reg_base, NR_CLKS);
-       if (!ctx)
-               panic("%s: unable to allocate context.\n", __func__);
 
        /* Register external clocks only in non-dt cases */
        if (!np)
index 60aa775bd3745de6e6ce514b16e2c57be9a321cf..a48bd5f173301e9c0d1c21a94f0e27e52eeb6a9d 100644 (file)
@@ -471,8 +471,6 @@ void __init s3c64xx_clk_init(struct device_node *np, unsigned long xtal_f,
        }
 
        ctx = samsung_clk_init(np, reg_base, NR_CLKS);
-       if (!ctx)
-               panic("%s: unable to allocate context.\n", __func__);
 
        /* Register external clocks. */
        if (!np)
index 52302262045d4cbd9bca00cda8d79d597f8cd14e..fd2725710a6fa968437e45a108555a7eb506dbc2 100644 (file)
@@ -784,8 +784,6 @@ static void __init __s5pv210_clk_init(struct device_node *np,
        struct samsung_clk_provider *ctx;
 
        ctx = samsung_clk_init(np, reg_base, NR_CLKS);
-       if (!ctx)
-               panic("%s: unable to allocate context.\n", __func__);
 
        samsung_clk_register_mux(ctx, early_mux_clks,
                                        ARRAY_SIZE(early_mux_clks));
index f38a6c49f7449cc1293910ec5c9eacf8df8544aa..b7d87d6db9dc4de9cc186bdd2717bc5edb958245 100644 (file)
@@ -346,9 +346,9 @@ static struct syscore_ops samsung_clk_syscore_ops = {
        .resume = samsung_clk_resume,
 };
 
-static void samsung_clk_sleep_init(void __iomem *reg_base,
-               const unsigned long *rdump,
-               unsigned long nr_rdump)
+void samsung_clk_sleep_init(void __iomem *reg_base,
+                       const unsigned long *rdump,
+                       unsigned long nr_rdump)
 {
        struct samsung_clock_reg_cache *reg_cache;
 
@@ -370,9 +370,9 @@ static void samsung_clk_sleep_init(void __iomem *reg_base,
 }
 
 #else
-static void samsung_clk_sleep_init(void __iomem *reg_base,
-               const unsigned long *rdump,
-               unsigned long nr_rdump) {}
+void samsung_clk_sleep_init(void __iomem *reg_base,
+                       const unsigned long *rdump,
+                       unsigned long nr_rdump) {}
 #endif
 
 /*
@@ -381,7 +381,7 @@ static void samsung_clk_sleep_init(void __iomem *reg_base,
  */
 struct samsung_clk_provider * __init samsung_cmu_register_one(
                        struct device_node *np,
-                       struct samsung_cmu_info *cmu)
+                       const struct samsung_cmu_info *cmu)
 {
        void __iomem *reg_base;
        struct samsung_clk_provider *ctx;
index aa872d2c51052a7f81181aabd57b249c55ea0afc..da3bdebabf1e32674c6875fb059461e09fef56ae 100644 (file)
@@ -261,7 +261,7 @@ struct samsung_gate_clock {
 #define GATE_DA(_id, dname, cname, pname, o, b, f, gf, a)      \
        __GATE(_id, dname, cname, pname, o, b, f, gf, a)
 
-#define PNAME(x) static const char *x[] __initdata
+#define PNAME(x) static const char * const x[] __initconst
 
 /**
  * struct samsung_clk_reg_dump: register dump of clock controller registers.
@@ -330,28 +330,28 @@ struct samsung_clock_reg_cache {
 
 struct samsung_cmu_info {
        /* list of pll clocks and respective count */
-       struct samsung_pll_clock *pll_clks;
+       const struct samsung_pll_clock *pll_clks;
        unsigned int nr_pll_clks;
        /* list of mux clocks and respective count */
-       struct samsung_mux_clock *mux_clks;
+       const struct samsung_mux_clock *mux_clks;
        unsigned int nr_mux_clks;
        /* list of div clocks and respective count */
-       struct samsung_div_clock *div_clks;
+       const struct samsung_div_clock *div_clks;
        unsigned int nr_div_clks;
        /* list of gate clocks and respective count */
-       struct samsung_gate_clock *gate_clks;
+       const struct samsung_gate_clock *gate_clks;
        unsigned int nr_gate_clks;
        /* list of fixed clocks and respective count */
-       struct samsung_fixed_rate_clock *fixed_clks;
+       const struct samsung_fixed_rate_clock *fixed_clks;
        unsigned int nr_fixed_clks;
        /* list of fixed factor clocks and respective count */
-       struct samsung_fixed_factor_clock *fixed_factor_clks;
+       const struct samsung_fixed_factor_clock *fixed_factor_clks;
        unsigned int nr_fixed_factor_clks;
        /* total number of clocks with IDs assigned*/
        unsigned int nr_clk_ids;
 
        /* list and number of clocks registers */
-       unsigned long *clk_regs;
+       const unsigned long *clk_regs;
        unsigned int nr_clk_regs;
 };
 
@@ -395,10 +395,14 @@ extern void __init samsung_clk_register_pll(struct samsung_clk_provider *ctx,
 
 extern struct samsung_clk_provider __init *samsung_cmu_register_one(
                        struct device_node *,
-                       struct samsung_cmu_info *);
+                       const struct samsung_cmu_info *);
 
 extern unsigned long _get_rate(const char *clk_name);
 
+extern void samsung_clk_sleep_init(void __iomem *reg_base,
+                       const unsigned long *rdump,
+                       unsigned long nr_rdump);
+
 extern void samsung_clk_save(void __iomem *base,
                        struct samsung_clk_reg_dump *rd,
                        unsigned int num_regs);
index 9b180f032e2db394b817702c3a0264eaccca5a96..85b467b3a20718be416386713b6b362d67c5b02b 100644 (file)
@@ -1,33 +1,65 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 Krzysztof Kozlowski
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Device Tree binding constants for Exynos5421 clock controller.
+*/
+
 #ifndef _DT_BINDINGS_CLOCK_EXYNOS_5410_H
 #define _DT_BINDINGS_CLOCK_EXYNOS_5410_H
 
 /* core clocks */
-#define CLK_FIN_PLL 1
-#define CLK_FOUT_APLL 2
-#define CLK_FOUT_CPLL 3
-#define CLK_FOUT_MPLL 4
-#define CLK_FOUT_BPLL 5
-#define CLK_FOUT_KPLL 6
+#define CLK_FIN_PLL            1
+#define CLK_FOUT_APLL          2
+#define CLK_FOUT_CPLL          3
+#define CLK_FOUT_MPLL          4
+#define CLK_FOUT_BPLL          5
+#define CLK_FOUT_KPLL          6
 
 /* gate for special clocks (sclk) */
-#define CLK_SCLK_UART0 128
-#define CLK_SCLK_UART1 129
-#define CLK_SCLK_UART2 130
-#define CLK_SCLK_UART3 131
-#define CLK_SCLK_MMC0 132
-#define CLK_SCLK_MMC1 133
-#define CLK_SCLK_MMC2 134
+#define CLK_SCLK_UART0         128
+#define CLK_SCLK_UART1         129
+#define CLK_SCLK_UART2         130
+#define CLK_SCLK_UART3         131
+#define CLK_SCLK_MMC0          132
+#define CLK_SCLK_MMC1          133
+#define CLK_SCLK_MMC2          134
+#define CLK_SCLK_USBD300       150
+#define CLK_SCLK_USBD301       151
+#define CLK_SCLK_USBPHY300     152
+#define CLK_SCLK_USBPHY301     153
+#define CLK_SCLK_PWM           155
 
 /* gate clocks */
-#define CLK_UART0 257
-#define CLK_UART1 258
-#define CLK_UART2 259
-#define CLK_UART3 260
-#define CLK_MCT 315
-#define CLK_MMC0 351
-#define CLK_MMC1 352
-#define CLK_MMC2 353
+#define CLK_UART0              257
+#define CLK_UART1              258
+#define CLK_UART2              259
+#define CLK_I2C0               261
+#define CLK_I2C1               262
+#define CLK_I2C2               263
+#define CLK_I2C3               264
+#define CLK_USI0               265
+#define CLK_USI1               266
+#define CLK_USI2               267
+#define CLK_USI3               268
+#define CLK_UART3              260
+#define CLK_PWM                        279
+#define CLK_MCT                        315
+#define CLK_WDT                        316
+#define CLK_RTC                        317
+#define CLK_TMU                        318
+#define CLK_MMC0               351
+#define CLK_MMC1               352
+#define CLK_MMC2               353
+#define CLK_USBH20             365
+#define CLK_USBD300            366
+#define CLK_USBD301            367
+#define CLK_SSS                        471
 
-#define CLK_NR_CLKS 512
+#define CLK_NR_CLKS            512
 
 #endif /* _DT_BINDINGS_CLOCK_EXYNOS_5410_H */
index 8e024fea26e7e59bbe3fdee61544b0d25a1c49c2..4fa6bb2136e373205d47e592eb441db003c4d3df 100644 (file)
 #define CLK_SCLK_UFSUNIPRO             112
 #define CLK_SCLK_USBHOST30             113
 #define CLK_SCLK_USBDRD30              114
+#define CLK_PCIE                       115
 
-#define FSYS_NR_CLK                    115
+#define FSYS_NR_CLK                    116
 
 /* CMU_G2D */
 #define CLK_MUX_ACLK_G2D_266_USER      1
diff --git a/include/dt-bindings/clock/gxbb-clkc.h b/include/dt-bindings/clock/gxbb-clkc.h
new file mode 100644 (file)
index 0000000..f889d80
--- /dev/null
@@ -0,0 +1,12 @@
+/*
+ * GXBB clock tree IDs
+ */
+
+#ifndef __GXBB_CLKC_H
+#define __GXBB_CLKC_H
+
+#define CLKID_CPUCLK           1
+#define CLKID_CLK81            12
+#define CLKID_ETH              36
+
+#endif /* __GXBB_CLKC_H */
index bd2720d58e0c3a21363fba9e0951d9e42a03c2d9..595a58d0969ac5d79473686192d17ac5face9b43 100644 (file)
@@ -19,7 +19,9 @@
 #define CLKID_MALI             11
 #define CLKID_CPUCLK           12
 #define CLKID_ZERO             13
+#define CLKID_MPEG_SEL         14
+#define CLKID_MPEG_DIV         15
 
-#define CLK_NR_CLKS            (CLKID_ZERO + 1)
+#define CLK_NR_CLKS            (CLKID_MPEG_DIV + 1)
 
 #endif /* __MESON8B_CLKC_H */
diff --git a/include/dt-bindings/clock/r8a7796-cpg-mssr.h b/include/dt-bindings/clock/r8a7796-cpg-mssr.h
new file mode 100644 (file)
index 0000000..1e59426
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2016 Renesas Electronics Corp.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+#ifndef __DT_BINDINGS_CLOCK_R8A7796_CPG_MSSR_H__
+#define __DT_BINDINGS_CLOCK_R8A7796_CPG_MSSR_H__
+
+#include <dt-bindings/clock/renesas-cpg-mssr.h>
+
+/* r8a7796 CPG Core Clocks */
+#define R8A7796_CLK_Z                  0
+#define R8A7796_CLK_Z2                 1
+#define R8A7796_CLK_ZR                 2
+#define R8A7796_CLK_ZG                 3
+#define R8A7796_CLK_ZTR                        4
+#define R8A7796_CLK_ZTRD2              5
+#define R8A7796_CLK_ZT                 6
+#define R8A7796_CLK_ZX                 7
+#define R8A7796_CLK_S0D1               8
+#define R8A7796_CLK_S0D2               9
+#define R8A7796_CLK_S0D3               10
+#define R8A7796_CLK_S0D4               11
+#define R8A7796_CLK_S0D6               12
+#define R8A7796_CLK_S0D8               13
+#define R8A7796_CLK_S0D12              14
+#define R8A7796_CLK_S1D1               15
+#define R8A7796_CLK_S1D2               16
+#define R8A7796_CLK_S1D4               17
+#define R8A7796_CLK_S2D1               18
+#define R8A7796_CLK_S2D2               19
+#define R8A7796_CLK_S2D4               20
+#define R8A7796_CLK_S3D1               21
+#define R8A7796_CLK_S3D2               22
+#define R8A7796_CLK_S3D4               23
+#define R8A7796_CLK_LB                 24
+#define R8A7796_CLK_CL                 25
+#define R8A7796_CLK_ZB3                        26
+#define R8A7796_CLK_ZB3D2              27
+#define R8A7796_CLK_ZB3D4              28
+#define R8A7796_CLK_CR                 29
+#define R8A7796_CLK_CRD2               30
+#define R8A7796_CLK_SD0H               31
+#define R8A7796_CLK_SD0                        32
+#define R8A7796_CLK_SD1H               33
+#define R8A7796_CLK_SD1                        34
+#define R8A7796_CLK_SD2H               35
+#define R8A7796_CLK_SD2                        36
+#define R8A7796_CLK_SD3H               37
+#define R8A7796_CLK_SD3                        38
+#define R8A7796_CLK_SSP2               39
+#define R8A7796_CLK_SSP1               40
+#define R8A7796_CLK_SSPRS              41
+#define R8A7796_CLK_RPC                        42
+#define R8A7796_CLK_RPCD2              43
+#define R8A7796_CLK_MSO                        44
+#define R8A7796_CLK_CANFD              45
+#define R8A7796_CLK_HDMI               46
+#define R8A7796_CLK_CSI0               47
+#define R8A7796_CLK_CSIREF             48
+#define R8A7796_CLK_CP                 49
+#define R8A7796_CLK_CPEX               50
+#define R8A7796_CLK_R                  51
+#define R8A7796_CLK_OSC                        52
+
+#endif /* __DT_BINDINGS_CLOCK_R8A7796_CPG_MSSR_H__ */
index 0c72204c75fc9428f08c9e63667bf75dee0bc153..fb39d5add173f94a3f9be0e77455e0f5b54764d8 100644 (file)
@@ -25,7 +25,7 @@
 #define CLK_SET_PARENT_GATE    BIT(1) /* must be gated across re-parent */
 #define CLK_SET_RATE_PARENT    BIT(2) /* propagate rate change up one level */
 #define CLK_IGNORE_UNUSED      BIT(3) /* do not gate even if unused */
-#define CLK_IS_ROOT            BIT(4) /* Deprecated: Don't use */
+                               /* unused */
 #define CLK_IS_BASIC           BIT(5) /* Basic clk, can't do a to_clk_foo() */
 #define CLK_GET_RATE_NOCACHE   BIT(6) /* do not use the cached clk rate */
 #define CLK_SET_RATE_NO_REPARENT BIT(7) /* don't re-parent on rate change */
This page took 0.177224 seconds and 5 git commands to generate.