summaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-socfpga/cyclone5-init.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-socfpga/cyclone5-init.c')
-rw-r--r--arch/arm/mach-socfpga/cyclone5-init.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/arch/arm/mach-socfpga/cyclone5-init.c b/arch/arm/mach-socfpga/cyclone5-init.c
new file mode 100644
index 0000000000..412808b841
--- /dev/null
+++ b/arch/arm/mach-socfpga/cyclone5-init.c
@@ -0,0 +1,58 @@
+#include <debug_ll.h>
+#include <common.h>
+#include <init.h>
+#include <io.h>
+#include <mach/cyclone5-freeze-controller.h>
+#include <mach/cyclone5-system-manager.h>
+#include <mach/cyclone5-clock-manager.h>
+#include <mach/cyclone5-reset-manager.h>
+#include <mach/cyclone5-scan-manager.h>
+#include <mach/generic.h>
+
+void socfpga_lowlevel_init(struct socfpga_cm_config *cm_config,
+ struct socfpga_io_config *io_config)
+{
+ uint32_t val;
+
+ val = 0xffffffff;
+ val &= ~(1 << RSTMGR_PERMODRST_L4WD0_LSB);
+ val &= ~(1 << RSTMGR_PERMODRST_OSC1TIMER0_LSB);
+ writel(val, CYCLONE5_RSTMGR_ADDRESS + RESET_MGR_PER_MOD_RESET_OFS);
+
+ /* freeze all IO banks */
+ sys_mgr_frzctrl_freeze_req(FREEZE_CHANNEL_0);
+ sys_mgr_frzctrl_freeze_req(FREEZE_CHANNEL_1);
+ sys_mgr_frzctrl_freeze_req(FREEZE_CHANNEL_2);
+ sys_mgr_frzctrl_freeze_req(FREEZE_CHANNEL_3);
+
+ writel(~0, CYCLONE5_RSTMGR_ADDRESS + RESET_MGR_BRG_MOD_RESET_OFS);
+
+ debug("Reconfigure Clock Manager\n");
+
+ /* reconfigure the PLLs */
+ socfpga_cm_basic_init(cm_config);
+
+ debug("Configure IOCSR\n");
+ /* configure the IOCSR through scan chain */
+ scan_mgr_io_scan_chain_prg(IO_SCAN_CHAIN_0, CONFIG_HPS_IOCSR_SCANCHAIN0_LENGTH, io_config->iocsr_emac_mixed2);
+ scan_mgr_io_scan_chain_prg(IO_SCAN_CHAIN_1, CONFIG_HPS_IOCSR_SCANCHAIN1_LENGTH, io_config->iocsr_mixed1_flash);
+ scan_mgr_io_scan_chain_prg(IO_SCAN_CHAIN_2, CONFIG_HPS_IOCSR_SCANCHAIN2_LENGTH, io_config->iocsr_general);
+ scan_mgr_io_scan_chain_prg(IO_SCAN_CHAIN_3, CONFIG_HPS_IOCSR_SCANCHAIN3_LENGTH, io_config->iocsr_ddr);
+
+ /* configure the pin muxing through system manager */
+ socfpga_sysmgr_pinmux_init(io_config->pinmux, io_config->num_pin);
+
+ writel(RSTMGR_PERMODRST_L4WD0 | RSTMGR_PERMODRST_L4WD1,
+ CYCLONE5_RSTMGR_ADDRESS + RESET_MGR_PER_MOD_RESET_OFS);
+
+ /* unfreeze / thaw all IO banks */
+ sys_mgr_frzctrl_thaw_req(FREEZE_CHANNEL_0);
+ sys_mgr_frzctrl_thaw_req(FREEZE_CHANNEL_1);
+ sys_mgr_frzctrl_thaw_req(FREEZE_CHANNEL_2);
+ sys_mgr_frzctrl_thaw_req(FREEZE_CHANNEL_3);
+
+ writel(0x18, CYCLONE5_L3REGS_ADDRESS);
+ writel(0x1, 0xfffefc00);
+
+ INIT_LL();
+}