1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+ 24ddd541dSLey Foon Tan /* 34ddd541dSLey Foon Tan * Copyright (C) 2013-2017 Altera Corporation <www.altera.com> 44ddd541dSLey Foon Tan */ 54ddd541dSLey Foon Tan 64ddd541dSLey Foon Tan #include <common.h> 74ddd541dSLey Foon Tan #include <asm/io.h> 84ddd541dSLey Foon Tan #include <asm/arch/system_manager.h> 94ddd541dSLey Foon Tan #include <asm/arch/fpga_manager.h> 104ddd541dSLey Foon Tan 114ddd541dSLey Foon Tan static struct socfpga_system_manager *sysmgr_regs = 124ddd541dSLey Foon Tan (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS; 134ddd541dSLey Foon Tan 144ddd541dSLey Foon Tan /* 154ddd541dSLey Foon Tan * Populate the value for SYSMGR.FPGAINTF.MODULE based on pinmux setting. 164ddd541dSLey Foon Tan * The value is not wrote to SYSMGR.FPGAINTF.MODULE but 174ddd541dSLey Foon Tan * CONFIG_SYSMGR_ISWGRP_HANDOFF. 184ddd541dSLey Foon Tan */ populate_sysmgr_fpgaintf_module(void)194ddd541dSLey Foon Tanstatic void populate_sysmgr_fpgaintf_module(void) 204ddd541dSLey Foon Tan { 214ddd541dSLey Foon Tan u32 handoff_val = 0; 224ddd541dSLey Foon Tan 234ddd541dSLey Foon Tan /* ISWGRP_HANDOFF_FPGAINTF */ 244ddd541dSLey Foon Tan writel(0, &sysmgr_regs->iswgrp_handoff[2]); 254ddd541dSLey Foon Tan 264ddd541dSLey Foon Tan /* Enable the signal for those HPS peripherals that use FPGA. */ 274ddd541dSLey Foon Tan if (readl(&sysmgr_regs->nandusefpga) == SYSMGR_FPGAINTF_USEFPGA) 284ddd541dSLey Foon Tan handoff_val |= SYSMGR_FPGAINTF_NAND; 294ddd541dSLey Foon Tan if (readl(&sysmgr_regs->rgmii1usefpga) == SYSMGR_FPGAINTF_USEFPGA) 304ddd541dSLey Foon Tan handoff_val |= SYSMGR_FPGAINTF_EMAC1; 314ddd541dSLey Foon Tan if (readl(&sysmgr_regs->sdmmcusefpga) == SYSMGR_FPGAINTF_USEFPGA) 324ddd541dSLey Foon Tan handoff_val |= SYSMGR_FPGAINTF_SDMMC; 334ddd541dSLey Foon Tan if (readl(&sysmgr_regs->rgmii0usefpga) == SYSMGR_FPGAINTF_USEFPGA) 344ddd541dSLey Foon Tan handoff_val |= SYSMGR_FPGAINTF_EMAC0; 354ddd541dSLey Foon Tan if (readl(&sysmgr_regs->spim0usefpga) == SYSMGR_FPGAINTF_USEFPGA) 364ddd541dSLey Foon Tan handoff_val |= SYSMGR_FPGAINTF_SPIM0; 374ddd541dSLey Foon Tan if (readl(&sysmgr_regs->spim1usefpga) == SYSMGR_FPGAINTF_USEFPGA) 384ddd541dSLey Foon Tan handoff_val |= SYSMGR_FPGAINTF_SPIM1; 394ddd541dSLey Foon Tan 404ddd541dSLey Foon Tan /* populate (not writing) the value for SYSMGR.FPGAINTF.MODULE 414ddd541dSLey Foon Tan based on pinmux setting */ 424ddd541dSLey Foon Tan setbits_le32(&sysmgr_regs->iswgrp_handoff[2], handoff_val); 434ddd541dSLey Foon Tan 444ddd541dSLey Foon Tan handoff_val = readl(&sysmgr_regs->iswgrp_handoff[2]); 454ddd541dSLey Foon Tan if (fpgamgr_test_fpga_ready()) { 464ddd541dSLey Foon Tan /* Enable the required signals only */ 474ddd541dSLey Foon Tan writel(handoff_val, &sysmgr_regs->fpgaintfgrp_module); 484ddd541dSLey Foon Tan } 494ddd541dSLey Foon Tan } 504ddd541dSLey Foon Tan 514ddd541dSLey Foon Tan /* 524ddd541dSLey Foon Tan * Configure all the pin muxes 534ddd541dSLey Foon Tan */ sysmgr_pinmux_init(void)544ddd541dSLey Foon Tanvoid sysmgr_pinmux_init(void) 554ddd541dSLey Foon Tan { 564ddd541dSLey Foon Tan u32 regs = (u32)&sysmgr_regs->emacio[0]; 574ddd541dSLey Foon Tan const u8 *sys_mgr_init_table; 584ddd541dSLey Foon Tan unsigned int len; 594ddd541dSLey Foon Tan int i; 604ddd541dSLey Foon Tan 614ddd541dSLey Foon Tan sysmgr_get_pinmux_table(&sys_mgr_init_table, &len); 624ddd541dSLey Foon Tan 634ddd541dSLey Foon Tan for (i = 0; i < len; i++) { 644ddd541dSLey Foon Tan writel(sys_mgr_init_table[i], regs); 654ddd541dSLey Foon Tan regs += sizeof(regs); 664ddd541dSLey Foon Tan } 674ddd541dSLey Foon Tan 684ddd541dSLey Foon Tan populate_sysmgr_fpgaintf_module(); 694ddd541dSLey Foon Tan } 704ddd541dSLey Foon Tan 714ddd541dSLey Foon Tan /* 724ddd541dSLey Foon Tan * This bit allows the bootrom to configure the IOs after a warm reset. 734ddd541dSLey Foon Tan */ sysmgr_config_warmrstcfgio(int enable)744ddd541dSLey Foon Tanvoid sysmgr_config_warmrstcfgio(int enable) 754ddd541dSLey Foon Tan { 764ddd541dSLey Foon Tan if (enable) 774ddd541dSLey Foon Tan setbits_le32(&sysmgr_regs->romcodegrp_ctrl, 784ddd541dSLey Foon Tan SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGIO); 794ddd541dSLey Foon Tan else 804ddd541dSLey Foon Tan clrbits_le32(&sysmgr_regs->romcodegrp_ctrl, 814ddd541dSLey Foon Tan SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGIO); 824ddd541dSLey Foon Tan } 83