Since we will have the need to access OCOTP fuse registers from
multiple places move the ocotp initialization and register access code
to a new file and provide interfaces for it.

Signed-off-by: Octavian Purdila <octavian.purd...@nxp.com>
---
 arch/arm/mach-imx/Kconfig       |  5 +++++
 arch/arm/mach-imx/Makefile      |  1 +
 arch/arm/mach-imx/common.h      |  2 ++
 arch/arm/mach-imx/mach-imx6q.c  | 20 ++------------------
 arch/arm/mach-imx/mach-imx6sl.c |  1 +
 arch/arm/mach-imx/mach-imx6sx.c |  1 +
 arch/arm/mach-imx/mach-imx7d.c  |  1 +
 arch/arm/mach-imx/ocotp.c       | 40 ++++++++++++++++++++++++++++++++++++++++
 8 files changed, 53 insertions(+), 18 deletions(-)
 create mode 100644 arch/arm/mach-imx/ocotp.c

diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
index 0ac05a0..1fb36ee 100644
--- a/arch/arm/mach-imx/Kconfig
+++ b/arch/arm/mach-imx/Kconfig
@@ -58,6 +58,9 @@ config HAVE_IMX_SRC
        def_bool y if SMP
        select ARCH_HAS_RESET_CONTROLLER
 
+config HAVE_IMX_OCOTP
+       bool
+
 config IMX_HAVE_IOMUX_V1
        bool
 
@@ -492,6 +495,7 @@ config SOC_IMX6
        select HAVE_IMX_SRC
        select MFD_SYSCON
        select PL310_ERRATA_769419 if CACHE_L2X0
+       select HAVE_IMX_OCOTP
 
 config SOC_IMX6Q
        bool "i.MX6 Quad/DualLite support"
@@ -537,6 +541,7 @@ config SOC_IMX7D
        select HAVE_IMX_ANATOP
        select HAVE_IMX_MMDC
        select HAVE_IMX_SRC
+       select HAVE_IMX_OCOTP
        help
                This enables support for Freescale i.MX7 Dual processor.
 
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
index cab1289..feef1cf 100644
--- a/arch/arm/mach-imx/Makefile
+++ b/arch/arm/mach-imx/Makefile
@@ -70,6 +70,7 @@ obj-$(CONFIG_HAVE_IMX_ANATOP) += anatop.o
 obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o
 obj-$(CONFIG_HAVE_IMX_MMDC) += mmdc.o
 obj-$(CONFIG_HAVE_IMX_SRC) += src.o
+obj-$(CONFIG_HAVE_IMX_OCOTP) += ocotp.o
 ifneq ($(CONFIG_SOC_IMX6)$(CONFIG_SOC_LS1021A),)
 AFLAGS_headsmp.o :=-Wa,-march=armv7-a
 obj-$(CONFIG_SMP) += headsmp.o platsmp.o
diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h
index c4436d9..fc78d4d0 100644
--- a/arch/arm/mach-imx/common.h
+++ b/arch/arm/mach-imx/common.h
@@ -103,6 +103,8 @@ void imx_gpc_hwirq_unmask(unsigned int hwirq);
 void imx_anatop_init(void);
 void imx_anatop_pre_suspend(void);
 void imx_anatop_post_resume(void);
+void imx_ocotp_init(const char *ocotp_compat);
+u32 imx_ocotp_read(u32 offset);
 int imx6_set_lpm(enum mxc_cpu_pwr_mode mode);
 void imx6_set_int_mem_clk_lpm(bool enable);
 void imx6sl_set_wait_clk(bool enter);
diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c
index 97fd251..51f6c19 100644
--- a/arch/arm/mach-imx/mach-imx6q.c
+++ b/arch/arm/mach-imx/mach-imx6q.c
@@ -280,6 +280,7 @@ static void __init imx6q_init_machine(void)
 
        of_platform_default_populate(NULL, NULL, parent);
 
+       imx_ocotp_init("fsl,imx6q-ocotp");
        imx_anatop_init();
        cpu_is_imx6q() ?  imx6q_pm_init() : imx6dl_pm_init();
        imx6q_1588_init();
@@ -294,22 +295,8 @@ static void __init imx6q_init_machine(void)
 
 static void __init imx6q_opp_check_speed_grading(struct device *cpu_dev)
 {
-       struct device_node *np;
-       void __iomem *base;
        u32 val;
 
-       np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-ocotp");
-       if (!np) {
-               pr_warn("failed to find ocotp node\n");
-               return;
-       }
-
-       base = of_iomap(np, 0);
-       if (!base) {
-               pr_warn("failed to map ocotp\n");
-               goto put_node;
-       }
-
        /*
         * SPEED_GRADING[1:0] defines the max speed of ARM:
         * 2b'11: 1200000000Hz;
@@ -318,7 +305,7 @@ static void __init imx6q_opp_check_speed_grading(struct 
device *cpu_dev)
         * 2b'00: 792000000Hz;
         * We need to set the max speed of ARM according to fuse map.
         */
-       val = readl_relaxed(base + OCOTP_CFG3);
+       val = imx_ocotp_read(OCOTP_CFG3);
        val >>= OCOTP_CFG3_SPEED_SHIFT;
        val &= 0x3;
 
@@ -333,9 +320,6 @@ static void __init imx6q_opp_check_speed_grading(struct 
device *cpu_dev)
                        if (dev_pm_opp_disable(cpu_dev, 852000000))
                                pr_warn("failed to disable 852 MHz OPP\n");
        }
-       iounmap(base);
-put_node:
-       of_node_put(np);
 }
 
 static void __init imx6q_opp_init(void)
diff --git a/arch/arm/mach-imx/mach-imx6sl.c b/arch/arm/mach-imx/mach-imx6sl.c
index 0408490..01558df 100644
--- a/arch/arm/mach-imx/mach-imx6sl.c
+++ b/arch/arm/mach-imx/mach-imx6sl.c
@@ -54,6 +54,7 @@ static void __init imx6sl_init_machine(void)
 
        of_platform_default_populate(NULL, NULL, parent);
 
+       imx_ocotp_init("fsl,imx6sl-ocotp");
        imx6sl_fec_init();
        imx_anatop_init();
        imx6sl_pm_init();
diff --git a/arch/arm/mach-imx/mach-imx6sx.c b/arch/arm/mach-imx/mach-imx6sx.c
index 7f52d9b..acb73c1 100644
--- a/arch/arm/mach-imx/mach-imx6sx.c
+++ b/arch/arm/mach-imx/mach-imx6sx.c
@@ -74,6 +74,7 @@ static void __init imx6sx_init_machine(void)
 
        of_platform_default_populate(NULL, NULL, parent);
 
+       imx_ocotp_init("fsl,imx6sx-ocotp");
        imx6sx_enet_init();
        imx_anatop_init();
        imx6sx_pm_init();
diff --git a/arch/arm/mach-imx/mach-imx7d.c b/arch/arm/mach-imx/mach-imx7d.c
index 26ca744..c29c771 100644
--- a/arch/arm/mach-imx/mach-imx7d.c
+++ b/arch/arm/mach-imx/mach-imx7d.c
@@ -93,6 +93,7 @@ static void __init imx7d_init_machine(void)
        if (parent == NULL)
                pr_warn("failed to initialize soc device\n");
 
+       imx_ocotp_init("fsl,imx7d-ocotp");
        imx_anatop_init();
        imx7d_enet_init();
 }
diff --git a/arch/arm/mach-imx/ocotp.c b/arch/arm/mach-imx/ocotp.c
new file mode 100644
index 0000000..e73f0e8
--- /dev/null
+++ b/arch/arm/mach-imx/ocotp.c
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2016 Freescale Semiconductor, Inc.
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+
+static void __iomem *ocotp_base;
+
+void __init imx_ocotp_init(const char *compat)
+{
+       struct device_node *ocotp_np;
+
+       ocotp_np = of_find_compatible_node(NULL, NULL, compat);
+       if (!ocotp_np) {
+               pr_warn("failed to find ocotp node\n");
+               return;
+       }
+
+       ocotp_base = of_iomap(ocotp_np, 0);
+       if (!ocotp_base)
+               pr_warn("failed to map ocotp\n");
+
+       of_node_put(ocotp_np);
+}
+
+u32 imx_ocotp_read(u32 offset)
+{
+       if (WARN_ON(!ocotp_base))
+               return 0;
+
+       return readl_relaxed(ocotp_base + offset);
+}
-- 
2.7.4

Reply via email to