arm: socfpga: Restructure reset manager driver
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>
This commit is contained in:
		
							parent
							
								
									de77811589
								
							
						
					
					
						commit
						2b09ea48dd
					
				|  | @ -14,7 +14,7 @@ obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o | ||||||
| 
 | 
 | ||||||
| # QTS-generated config file wrappers
 | # QTS-generated config file wrappers
 | ||||||
| obj-$(CONFIG_TARGET_SOCFPGA_GEN5)	+= scan_manager.o wrap_pll_config.o \
 | 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	\
 | obj-$(CONFIG_SPL_BUILD) += wrap_iocsr_config.o wrap_pinmux_config.o	\
 | ||||||
| 			   wrap_sdram_config.o | 			   wrap_sdram_config.o | ||||||
| CFLAGS_wrap_iocsr_config.o	+= -I$(srctree)/board/$(BOARDDIR) | CFLAGS_wrap_iocsr_config.o	+= -I$(srctree)/board/$(BOARDDIR) | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /*
 | /*
 | ||||||
|  *  Copyright (C) 2012 Altera Corporation <www.altera.com> |  *  Copyright (C) 2012-2017 Altera Corporation <www.altera.com> | ||||||
|  * |  * | ||||||
|  * SPDX-License-Identifier:	GPL-2.0+ |  * SPDX-License-Identifier:	GPL-2.0+ | ||||||
|  */ |  */ | ||||||
|  | @ -8,27 +8,10 @@ | ||||||
| #define _RESET_MANAGER_H_ | #define _RESET_MANAGER_H_ | ||||||
| 
 | 
 | ||||||
| void reset_cpu(ulong addr); | 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(u32 reset, int set); | ||||||
| void socfpga_per_reset_all(void); | 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) | #if defined(CONFIG_SOCFPGA_VIRTUAL_TARGET) | ||||||
| #define RSTMGR_CTRL_SWWARMRSTREQ_LSB 2 | #define RSTMGR_CTRL_SWWARMRSTREQ_LSB 2 | ||||||
| #else | #else | ||||||
|  | @ -55,28 +38,11 @@ struct socfpga_reset_manager { | ||||||
| #define RSTMGR_BANK(_reset)			\ | #define RSTMGR_BANK(_reset)			\ | ||||||
| 	(((_reset) >> RSTMGR_BANK_OFFSET) & RSTMGR_BANK_MASK) | 	(((_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. */ | /* Create a human-readable reference to SoCFPGA reset. */ | ||||||
| #define SOCFPGA_RESET(_name)	RSTMGR_##_name | #define SOCFPGA_RESET(_name)	RSTMGR_##_name | ||||||
| 
 | 
 | ||||||
|  | #if defined(CONFIG_TARGET_SOCFPGA_GEN5) | ||||||
|  | #include <asm/arch/reset_manager_gen5.h> | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #endif /* _RESET_MANAGER_H_ */ | #endif /* _RESET_MANAGER_H_ */ | ||||||
|  |  | ||||||
|  | @ -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_ */ | ||||||
|  | @ -7,53 +7,12 @@ | ||||||
| 
 | 
 | ||||||
| #include <common.h> | #include <common.h> | ||||||
| #include <asm/io.h> | #include <asm/io.h> | ||||||
| #include <asm/arch/fpga_manager.h> |  | ||||||
| #include <asm/arch/reset_manager.h> | #include <asm/arch/reset_manager.h> | ||||||
| #include <asm/arch/system_manager.h> |  | ||||||
| 
 | 
 | ||||||
| DECLARE_GLOBAL_DATA_PTR; | DECLARE_GLOBAL_DATA_PTR; | ||||||
| 
 | 
 | ||||||
| static const struct socfpga_reset_manager *reset_manager_base = | static const struct socfpga_reset_manager *reset_manager_base = | ||||||
| 		(void *)SOCFPGA_RSTMGR_ADDRESS; | 		(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 |  * Write the reset manager register to cause reset | ||||||
|  | @ -61,7 +20,7 @@ void socfpga_per_reset_all(void) | ||||||
| void reset_cpu(ulong addr) | void reset_cpu(ulong addr) | ||||||
| { | { | ||||||
| 	/* request a warm reset */ | 	/* request a warm reset */ | ||||||
| 	writel((1 << RSTMGR_CTRL_SWWARMRSTREQ_LSB), | 	writel(1 << RSTMGR_CTRL_SWWARMRSTREQ_LSB, | ||||||
| 	       &reset_manager_base->ctrl); | 	       &reset_manager_base->ctrl); | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * infinite loop here as watchdog will trigger and reset | 	 * infinite loop here as watchdog will trigger and reset | ||||||
|  | @ -70,51 +29,3 @@ void reset_cpu(ulong addr) | ||||||
| 	while (1) | 	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 |  | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
		Loading…
	
		Reference in New Issue