arm: socfpga: Restructure reset manager driver
authorLey Foon Tan <ley.foon.tan@intel.com>
Tue, 25 Apr 2017 18:44:34 +0000 (02:44 +0800)
committerMarek Vasut <marex@denx.de>
Thu, 18 May 2017 09:33:17 +0000 (11:33 +0200)
Restructure reset manager driver in the preparation to support A10.
Move the Gen5 specific code to gen5 files.

Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>
arch/arm/mach-socfpga/Makefile
arch/arm/mach-socfpga/include/mach/reset_manager.h
arch/arm/mach-socfpga/include/mach/reset_manager_gen5.h [new file with mode: 0644]
arch/arm/mach-socfpga/reset_manager.c
arch/arm/mach-socfpga/reset_manager_gen5.c [new file with mode: 0644]

index b76de4c54d6143d88817cec25dbf43bf0add5e21..97819ac741de8d2211a742e38ddf53fff6a47548 100644 (file)
@@ -14,7 +14,7 @@ obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o
 
 # QTS-generated config file wrappers
 obj-$(CONFIG_TARGET_SOCFPGA_GEN5)      += scan_manager.o wrap_pll_config.o \
-                                          clock_manager_gen5.o
+                                          clock_manager_gen5.o reset_manager_gen5.o
 obj-$(CONFIG_SPL_BUILD) += wrap_iocsr_config.o wrap_pinmux_config.o    \
                           wrap_sdram_config.o
 CFLAGS_wrap_iocsr_config.o     += -I$(srctree)/board/$(BOARDDIR)
index 2f070f291cba56d5c8528d9ca677102d3ddc7fd5..7592e1149a1c955ed5bb5673da8d4aeb448eb8b0 100644 (file)
@@ -1,34 +1,17 @@
 /*
- *  Copyright (C) 2012 Altera Corporation <www.altera.com>
+ *  Copyright (C) 2012-2017 Altera Corporation <www.altera.com>
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
-#ifndef        _RESET_MANAGER_H_
-#define        _RESET_MANAGER_H_
+#ifndef _RESET_MANAGER_H_
+#define _RESET_MANAGER_H_
 
 void reset_cpu(ulong addr);
-void reset_deassert_peripherals_handoff(void);
-
-void socfpga_bridges_reset(int enable);
 
 void socfpga_per_reset(u32 reset, int set);
 void socfpga_per_reset_all(void);
 
-struct socfpga_reset_manager {
-       u32     status;
-       u32     ctrl;
-       u32     counts;
-       u32     padding1;
-       u32     mpu_mod_reset;
-       u32     per_mod_reset;
-       u32     per2_mod_reset;
-       u32     brg_mod_reset;
-       u32     misc_mod_reset;
-       u32     padding2[12];
-       u32     tstscratch;
-};
-
 #if defined(CONFIG_SOCFPGA_VIRTUAL_TARGET)
 #define RSTMGR_CTRL_SWWARMRSTREQ_LSB 2
 #else
@@ -55,28 +38,11 @@ struct socfpga_reset_manager {
 #define RSTMGR_BANK(_reset)                    \
        (((_reset) >> RSTMGR_BANK_OFFSET) & RSTMGR_BANK_MASK)
 
-/*
- * SocFPGA Cyclone V/Arria V reset IDs, bank mapping is as follows:
- * 0 ... mpumodrst
- * 1 ... permodrst
- * 2 ... per2modrst
- * 3 ... brgmodrst
- * 4 ... miscmodrst
- */
-#define RSTMGR_EMAC0           RSTMGR_DEFINE(1, 0)
-#define RSTMGR_EMAC1           RSTMGR_DEFINE(1, 1)
-#define RSTMGR_NAND            RSTMGR_DEFINE(1, 4)
-#define RSTMGR_QSPI            RSTMGR_DEFINE(1, 5)
-#define RSTMGR_L4WD0           RSTMGR_DEFINE(1, 6)
-#define RSTMGR_OSC1TIMER0      RSTMGR_DEFINE(1, 8)
-#define RSTMGR_UART0           RSTMGR_DEFINE(1, 16)
-#define RSTMGR_SPIM0           RSTMGR_DEFINE(1, 18)
-#define RSTMGR_SPIM1           RSTMGR_DEFINE(1, 19)
-#define RSTMGR_SDMMC           RSTMGR_DEFINE(1, 22)
-#define RSTMGR_DMA             RSTMGR_DEFINE(1, 28)
-#define RSTMGR_SDR             RSTMGR_DEFINE(1, 29)
-
 /* Create a human-readable reference to SoCFPGA reset. */
 #define SOCFPGA_RESET(_name)   RSTMGR_##_name
 
+#if defined(CONFIG_TARGET_SOCFPGA_GEN5)
+#include <asm/arch/reset_manager_gen5.h>
+#endif
+
 #endif /* _RESET_MANAGER_H_ */
diff --git a/arch/arm/mach-socfpga/include/mach/reset_manager_gen5.h b/arch/arm/mach-socfpga/include/mach/reset_manager_gen5.h
new file mode 100644 (file)
index 0000000..6d9cffe
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ *  Copyright (C) 2012-2017 Altera Corporation <www.altera.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _RESET_MANAGER_GEN5_H_
+#define _RESET_MANAGER_GEN5_H_
+
+#include <dt-bindings/reset/altr,rst-mgr.h>
+
+void reset_deassert_peripherals_handoff(void);
+void socfpga_bridges_reset(int enable);
+
+struct socfpga_reset_manager {
+       u32     status;
+       u32     ctrl;
+       u32     counts;
+       u32     padding1;
+       u32     mpu_mod_reset;
+       u32     per_mod_reset;
+       u32     per2_mod_reset;
+       u32     brg_mod_reset;
+       u32     misc_mod_reset;
+       u32     padding2[12];
+       u32     tstscratch;
+};
+
+/*
+ * SocFPGA Cyclone V/Arria V reset IDs, bank mapping is as follows:
+ * 0 ... mpumodrst
+ * 1 ... permodrst
+ * 2 ... per2modrst
+ * 3 ... brgmodrst
+ * 4 ... miscmodrst
+ */
+#define RSTMGR_EMAC0           RSTMGR_DEFINE(1, 0)
+#define RSTMGR_EMAC1           RSTMGR_DEFINE(1, 1)
+#define RSTMGR_NAND            RSTMGR_DEFINE(1, 4)
+#define RSTMGR_QSPI            RSTMGR_DEFINE(1, 5)
+#define RSTMGR_L4WD0           RSTMGR_DEFINE(1, 6)
+#define RSTMGR_OSC1TIMER0      RSTMGR_DEFINE(1, 8)
+#define RSTMGR_UART0           RSTMGR_DEFINE(1, 16)
+#define RSTMGR_SPIM0           RSTMGR_DEFINE(1, 18)
+#define RSTMGR_SPIM1           RSTMGR_DEFINE(1, 19)
+#define RSTMGR_SDMMC           RSTMGR_DEFINE(1, 22)
+#define RSTMGR_DMA             RSTMGR_DEFINE(1, 28)
+#define RSTMGR_SDR             RSTMGR_DEFINE(1, 29)
+
+#endif /* _RESET_MANAGER_GEN5_H_ */
index b6beaa2f220439a1f5d1c66a1780d2087a4c5f2a..29438ed533d8a7bf7178c2087557307d4673d927 100644 (file)
@@ -7,53 +7,12 @@
 
 #include <common.h>
 #include <asm/io.h>
-#include <asm/arch/fpga_manager.h>
 #include <asm/arch/reset_manager.h>
-#include <asm/arch/system_manager.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
 static const struct socfpga_reset_manager *reset_manager_base =
                (void *)SOCFPGA_RSTMGR_ADDRESS;
-static struct socfpga_system_manager *sysmgr_regs =
-       (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
-
-/* Assert or de-assert SoCFPGA reset manager reset. */
-void socfpga_per_reset(u32 reset, int set)
-{
-       const void *reg;
-
-       if (RSTMGR_BANK(reset) == 0)
-               reg = &reset_manager_base->mpu_mod_reset;
-       else if (RSTMGR_BANK(reset) == 1)
-               reg = &reset_manager_base->per_mod_reset;
-       else if (RSTMGR_BANK(reset) == 2)
-               reg = &reset_manager_base->per2_mod_reset;
-       else if (RSTMGR_BANK(reset) == 3)
-               reg = &reset_manager_base->brg_mod_reset;
-       else if (RSTMGR_BANK(reset) == 4)
-               reg = &reset_manager_base->misc_mod_reset;
-       else    /* Invalid reset register, do nothing */
-               return;
-
-       if (set)
-               setbits_le32(reg, 1 << RSTMGR_RESET(reset));
-       else
-               clrbits_le32(reg, 1 << RSTMGR_RESET(reset));
-}
-
-/*
- * Assert reset on every peripheral but L4WD0.
- * Watchdog must be kept intact to prevent glitches
- * and/or hangs.
- */
-void socfpga_per_reset_all(void)
-{
-       const u32 l4wd0 = 1 << RSTMGR_RESET(SOCFPGA_RESET(L4WD0));
-
-       writel(~l4wd0, &reset_manager_base->per_mod_reset);
-       writel(0xffffffff, &reset_manager_base->per2_mod_reset);
-}
 
 /*
  * Write the reset manager register to cause reset
@@ -61,8 +20,8 @@ void socfpga_per_reset_all(void)
 void reset_cpu(ulong addr)
 {
        /* request a warm reset */
-       writel((1 << RSTMGR_CTRL_SWWARMRSTREQ_LSB),
-               &reset_manager_base->ctrl);
+       writel(1 << RSTMGR_CTRL_SWWARMRSTREQ_LSB,
+              &reset_manager_base->ctrl);
        /*
         * infinite loop here as watchdog will trigger and reset
         * the processor
@@ -70,51 +29,3 @@ void reset_cpu(ulong addr)
        while (1)
                ;
 }
-
-/*
- * Release peripherals from reset based on handoff
- */
-void reset_deassert_peripherals_handoff(void)
-{
-       writel(0, &reset_manager_base->per_mod_reset);
-}
-
-#if defined(CONFIG_SOCFPGA_VIRTUAL_TARGET)
-void socfpga_bridges_reset(int enable)
-{
-       /* For SoCFPGA-VT, this is NOP. */
-}
-#else
-
-#define L3REGS_REMAP_LWHPS2FPGA_MASK   0x10
-#define L3REGS_REMAP_HPS2FPGA_MASK     0x08
-#define L3REGS_REMAP_OCRAM_MASK                0x01
-
-void socfpga_bridges_reset(int enable)
-{
-       const uint32_t l3mask = L3REGS_REMAP_LWHPS2FPGA_MASK |
-                               L3REGS_REMAP_HPS2FPGA_MASK |
-                               L3REGS_REMAP_OCRAM_MASK;
-
-       if (enable) {
-               /* brdmodrst */
-               writel(0xffffffff, &reset_manager_base->brg_mod_reset);
-       } else {
-               writel(0, &sysmgr_regs->iswgrp_handoff[0]);
-               writel(l3mask, &sysmgr_regs->iswgrp_handoff[1]);
-
-               /* Check signal from FPGA. */
-               if (!fpgamgr_test_fpga_ready()) {
-                       /* FPGA not ready, do nothing. */
-                       printf("%s: FPGA not ready, aborting.\n", __func__);
-                       return;
-               }
-
-               /* brdmodrst */
-               writel(0, &reset_manager_base->brg_mod_reset);
-
-               /* Remap the bridges into memory map */
-               writel(l3mask, SOCFPGA_L3REGS_ADDRESS);
-       }
-}
-#endif
diff --git a/arch/arm/mach-socfpga/reset_manager_gen5.c b/arch/arm/mach-socfpga/reset_manager_gen5.c
new file mode 100644 (file)
index 0000000..aa88adb
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ *  Copyright (C) 2013 Altera Corporation <www.altera.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/fpga_manager.h>
+#include <asm/arch/reset_manager.h>
+#include <asm/arch/system_manager.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static const struct socfpga_reset_manager *reset_manager_base =
+               (void *)SOCFPGA_RSTMGR_ADDRESS;
+static const struct socfpga_system_manager *sysmgr_regs =
+       (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
+
+/* Assert or de-assert SoCFPGA reset manager reset. */
+void socfpga_per_reset(u32 reset, int set)
+{
+       const u32 *reg;
+       u32 rstmgr_bank = RSTMGR_BANK(reset);
+
+       switch (rstmgr_bank) {
+       case 0:
+               reg = &reset_manager_base->mpu_mod_reset;
+               break;
+       case 1:
+               reg = &reset_manager_base->per_mod_reset;
+               break;
+       case 2:
+               reg = &reset_manager_base->per2_mod_reset;
+               break;
+       case 3:
+               reg = &reset_manager_base->brg_mod_reset;
+               break;
+       case 4:
+               reg = &reset_manager_base->misc_mod_reset;
+               break;
+
+       default:
+               return;
+       }
+
+       if (set)
+               setbits_le32(reg, 1 << RSTMGR_RESET(reset));
+       else
+               clrbits_le32(reg, 1 << RSTMGR_RESET(reset));
+}
+
+/*
+ * Assert reset on every peripheral but L4WD0.
+ * Watchdog must be kept intact to prevent glitches
+ * and/or hangs.
+ */
+void socfpga_per_reset_all(void)
+{
+       const u32 l4wd0 = 1 << RSTMGR_RESET(SOCFPGA_RESET(L4WD0));
+
+       writel(~l4wd0, &reset_manager_base->per_mod_reset);
+       writel(0xffffffff, &reset_manager_base->per2_mod_reset);
+}
+
+/*
+ * Release peripherals from reset based on handoff
+ */
+void reset_deassert_peripherals_handoff(void)
+{
+       writel(0, &reset_manager_base->per_mod_reset);
+}
+
+#if defined(CONFIG_SOCFPGA_VIRTUAL_TARGET)
+void socfpga_bridges_reset(int enable)
+{
+       /* For SoCFPGA-VT, this is NOP. */
+       return;
+}
+#else
+
+#define L3REGS_REMAP_LWHPS2FPGA_MASK   0x10
+#define L3REGS_REMAP_HPS2FPGA_MASK     0x08
+#define L3REGS_REMAP_OCRAM_MASK                0x01
+
+void socfpga_bridges_reset(int enable)
+{
+       const u32 l3mask = L3REGS_REMAP_LWHPS2FPGA_MASK |
+                               L3REGS_REMAP_HPS2FPGA_MASK |
+                               L3REGS_REMAP_OCRAM_MASK;
+
+       if (enable) {
+               /* brdmodrst */
+               writel(0xffffffff, &reset_manager_base->brg_mod_reset);
+       } else {
+               writel(0, &sysmgr_regs->iswgrp_handoff[0]);
+               writel(l3mask, &sysmgr_regs->iswgrp_handoff[1]);
+
+               /* Check signal from FPGA. */
+               if (!fpgamgr_test_fpga_ready()) {
+                       /* FPGA not ready, do nothing. We allow system to boot
+                        * without FPGA ready. So, return 0 instead of error. */
+                       printf("%s: FPGA not ready, aborting.\n", __func__);
+                       return;
+               }
+
+               /* brdmodrst */
+               writel(0, &reset_manager_base->brg_mod_reset);
+
+               /* Remap the bridges into memory map */
+               writel(l3mask, SOCFPGA_L3REGS_ADDRESS);
+       }
+       return;
+}
+#endif