1 /* 2 * Copyright (C) 2013-2017 Altera Corporation <www.altera.com> 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6 7 #include <common.h> 8 #include <asm/io.h> 9 #include <asm/arch/system_manager.h> 10 #include <asm/arch/fpga_manager.h> 11 12 DECLARE_GLOBAL_DATA_PTR; 13 14 static struct socfpga_system_manager *sysmgr_regs = 15 (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS; 16 17 /* 18 * Populate the value for SYSMGR.FPGAINTF.MODULE based on pinmux setting. 19 * The value is not wrote to SYSMGR.FPGAINTF.MODULE but 20 * CONFIG_SYSMGR_ISWGRP_HANDOFF. 21 */ 22 static void populate_sysmgr_fpgaintf_module(void) 23 { 24 u32 handoff_val = 0; 25 26 /* ISWGRP_HANDOFF_FPGAINTF */ 27 writel(0, &sysmgr_regs->iswgrp_handoff[2]); 28 29 /* Enable the signal for those HPS peripherals that use FPGA. */ 30 if (readl(&sysmgr_regs->nandusefpga) == SYSMGR_FPGAINTF_USEFPGA) 31 handoff_val |= SYSMGR_FPGAINTF_NAND; 32 if (readl(&sysmgr_regs->rgmii1usefpga) == SYSMGR_FPGAINTF_USEFPGA) 33 handoff_val |= SYSMGR_FPGAINTF_EMAC1; 34 if (readl(&sysmgr_regs->sdmmcusefpga) == SYSMGR_FPGAINTF_USEFPGA) 35 handoff_val |= SYSMGR_FPGAINTF_SDMMC; 36 if (readl(&sysmgr_regs->rgmii0usefpga) == SYSMGR_FPGAINTF_USEFPGA) 37 handoff_val |= SYSMGR_FPGAINTF_EMAC0; 38 if (readl(&sysmgr_regs->spim0usefpga) == SYSMGR_FPGAINTF_USEFPGA) 39 handoff_val |= SYSMGR_FPGAINTF_SPIM0; 40 if (readl(&sysmgr_regs->spim1usefpga) == SYSMGR_FPGAINTF_USEFPGA) 41 handoff_val |= SYSMGR_FPGAINTF_SPIM1; 42 43 /* populate (not writing) the value for SYSMGR.FPGAINTF.MODULE 44 based on pinmux setting */ 45 setbits_le32(&sysmgr_regs->iswgrp_handoff[2], handoff_val); 46 47 handoff_val = readl(&sysmgr_regs->iswgrp_handoff[2]); 48 if (fpgamgr_test_fpga_ready()) { 49 /* Enable the required signals only */ 50 writel(handoff_val, &sysmgr_regs->fpgaintfgrp_module); 51 } 52 } 53 54 /* 55 * Configure all the pin muxes 56 */ 57 void sysmgr_pinmux_init(void) 58 { 59 u32 regs = (u32)&sysmgr_regs->emacio[0]; 60 const u8 *sys_mgr_init_table; 61 unsigned int len; 62 int i; 63 64 sysmgr_get_pinmux_table(&sys_mgr_init_table, &len); 65 66 for (i = 0; i < len; i++) { 67 writel(sys_mgr_init_table[i], regs); 68 regs += sizeof(regs); 69 } 70 71 populate_sysmgr_fpgaintf_module(); 72 } 73 74 /* 75 * This bit allows the bootrom to configure the IOs after a warm reset. 76 */ 77 void sysmgr_config_warmrstcfgio(int enable) 78 { 79 if (enable) 80 setbits_le32(&sysmgr_regs->romcodegrp_ctrl, 81 SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGIO); 82 else 83 clrbits_le32(&sysmgr_regs->romcodegrp_ctrl, 84 SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGIO); 85 } 86