xref: /rk3399_rockchip-uboot/arch/arm/mach-socfpga/reset_manager_gen5.c (revision 753a4dde970c2bc9022321f1093e544e3a150f6e)
1*2b09ea48SLey Foon Tan /*
2*2b09ea48SLey Foon Tan  *  Copyright (C) 2013 Altera Corporation <www.altera.com>
3*2b09ea48SLey Foon Tan  *
4*2b09ea48SLey Foon Tan  * SPDX-License-Identifier:	GPL-2.0+
5*2b09ea48SLey Foon Tan  */
6*2b09ea48SLey Foon Tan 
7*2b09ea48SLey Foon Tan 
8*2b09ea48SLey Foon Tan #include <common.h>
9*2b09ea48SLey Foon Tan #include <asm/io.h>
10*2b09ea48SLey Foon Tan #include <asm/arch/fpga_manager.h>
11*2b09ea48SLey Foon Tan #include <asm/arch/reset_manager.h>
12*2b09ea48SLey Foon Tan #include <asm/arch/system_manager.h>
13*2b09ea48SLey Foon Tan 
14*2b09ea48SLey Foon Tan DECLARE_GLOBAL_DATA_PTR;
15*2b09ea48SLey Foon Tan 
16*2b09ea48SLey Foon Tan static const struct socfpga_reset_manager *reset_manager_base =
17*2b09ea48SLey Foon Tan 		(void *)SOCFPGA_RSTMGR_ADDRESS;
18*2b09ea48SLey Foon Tan static const struct socfpga_system_manager *sysmgr_regs =
19*2b09ea48SLey Foon Tan 	(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
20*2b09ea48SLey Foon Tan 
21*2b09ea48SLey Foon Tan /* Assert or de-assert SoCFPGA reset manager reset. */
socfpga_per_reset(u32 reset,int set)22*2b09ea48SLey Foon Tan void socfpga_per_reset(u32 reset, int set)
23*2b09ea48SLey Foon Tan {
24*2b09ea48SLey Foon Tan 	const u32 *reg;
25*2b09ea48SLey Foon Tan 	u32 rstmgr_bank = RSTMGR_BANK(reset);
26*2b09ea48SLey Foon Tan 
27*2b09ea48SLey Foon Tan 	switch (rstmgr_bank) {
28*2b09ea48SLey Foon Tan 	case 0:
29*2b09ea48SLey Foon Tan 		reg = &reset_manager_base->mpu_mod_reset;
30*2b09ea48SLey Foon Tan 		break;
31*2b09ea48SLey Foon Tan 	case 1:
32*2b09ea48SLey Foon Tan 		reg = &reset_manager_base->per_mod_reset;
33*2b09ea48SLey Foon Tan 		break;
34*2b09ea48SLey Foon Tan 	case 2:
35*2b09ea48SLey Foon Tan 		reg = &reset_manager_base->per2_mod_reset;
36*2b09ea48SLey Foon Tan 		break;
37*2b09ea48SLey Foon Tan 	case 3:
38*2b09ea48SLey Foon Tan 		reg = &reset_manager_base->brg_mod_reset;
39*2b09ea48SLey Foon Tan 		break;
40*2b09ea48SLey Foon Tan 	case 4:
41*2b09ea48SLey Foon Tan 		reg = &reset_manager_base->misc_mod_reset;
42*2b09ea48SLey Foon Tan 		break;
43*2b09ea48SLey Foon Tan 
44*2b09ea48SLey Foon Tan 	default:
45*2b09ea48SLey Foon Tan 		return;
46*2b09ea48SLey Foon Tan 	}
47*2b09ea48SLey Foon Tan 
48*2b09ea48SLey Foon Tan 	if (set)
49*2b09ea48SLey Foon Tan 		setbits_le32(reg, 1 << RSTMGR_RESET(reset));
50*2b09ea48SLey Foon Tan 	else
51*2b09ea48SLey Foon Tan 		clrbits_le32(reg, 1 << RSTMGR_RESET(reset));
52*2b09ea48SLey Foon Tan }
53*2b09ea48SLey Foon Tan 
54*2b09ea48SLey Foon Tan /*
55*2b09ea48SLey Foon Tan  * Assert reset on every peripheral but L4WD0.
56*2b09ea48SLey Foon Tan  * Watchdog must be kept intact to prevent glitches
57*2b09ea48SLey Foon Tan  * and/or hangs.
58*2b09ea48SLey Foon Tan  */
socfpga_per_reset_all(void)59*2b09ea48SLey Foon Tan void socfpga_per_reset_all(void)
60*2b09ea48SLey Foon Tan {
61*2b09ea48SLey Foon Tan 	const u32 l4wd0 = 1 << RSTMGR_RESET(SOCFPGA_RESET(L4WD0));
62*2b09ea48SLey Foon Tan 
63*2b09ea48SLey Foon Tan 	writel(~l4wd0, &reset_manager_base->per_mod_reset);
64*2b09ea48SLey Foon Tan 	writel(0xffffffff, &reset_manager_base->per2_mod_reset);
65*2b09ea48SLey Foon Tan }
66*2b09ea48SLey Foon Tan 
67*2b09ea48SLey Foon Tan /*
68*2b09ea48SLey Foon Tan  * Release peripherals from reset based on handoff
69*2b09ea48SLey Foon Tan  */
reset_deassert_peripherals_handoff(void)70*2b09ea48SLey Foon Tan void reset_deassert_peripherals_handoff(void)
71*2b09ea48SLey Foon Tan {
72*2b09ea48SLey Foon Tan 	writel(0, &reset_manager_base->per_mod_reset);
73*2b09ea48SLey Foon Tan }
74*2b09ea48SLey Foon Tan 
75*2b09ea48SLey Foon Tan #if defined(CONFIG_SOCFPGA_VIRTUAL_TARGET)
socfpga_bridges_reset(int enable)76*2b09ea48SLey Foon Tan void socfpga_bridges_reset(int enable)
77*2b09ea48SLey Foon Tan {
78*2b09ea48SLey Foon Tan 	/* For SoCFPGA-VT, this is NOP. */
79*2b09ea48SLey Foon Tan 	return;
80*2b09ea48SLey Foon Tan }
81*2b09ea48SLey Foon Tan #else
82*2b09ea48SLey Foon Tan 
83*2b09ea48SLey Foon Tan #define L3REGS_REMAP_LWHPS2FPGA_MASK	0x10
84*2b09ea48SLey Foon Tan #define L3REGS_REMAP_HPS2FPGA_MASK	0x08
85*2b09ea48SLey Foon Tan #define L3REGS_REMAP_OCRAM_MASK		0x01
86*2b09ea48SLey Foon Tan 
socfpga_bridges_reset(int enable)87*2b09ea48SLey Foon Tan void socfpga_bridges_reset(int enable)
88*2b09ea48SLey Foon Tan {
89*2b09ea48SLey Foon Tan 	const u32 l3mask = L3REGS_REMAP_LWHPS2FPGA_MASK |
90*2b09ea48SLey Foon Tan 				L3REGS_REMAP_HPS2FPGA_MASK |
91*2b09ea48SLey Foon Tan 				L3REGS_REMAP_OCRAM_MASK;
92*2b09ea48SLey Foon Tan 
93*2b09ea48SLey Foon Tan 	if (enable) {
94*2b09ea48SLey Foon Tan 		/* brdmodrst */
95*2b09ea48SLey Foon Tan 		writel(0xffffffff, &reset_manager_base->brg_mod_reset);
96*2b09ea48SLey Foon Tan 	} else {
97*2b09ea48SLey Foon Tan 		writel(0, &sysmgr_regs->iswgrp_handoff[0]);
98*2b09ea48SLey Foon Tan 		writel(l3mask, &sysmgr_regs->iswgrp_handoff[1]);
99*2b09ea48SLey Foon Tan 
100*2b09ea48SLey Foon Tan 		/* Check signal from FPGA. */
101*2b09ea48SLey Foon Tan 		if (!fpgamgr_test_fpga_ready()) {
102*2b09ea48SLey Foon Tan 			/* FPGA not ready, do nothing. We allow system to boot
103*2b09ea48SLey Foon Tan 			 * without FPGA ready. So, return 0 instead of error. */
104*2b09ea48SLey Foon Tan 			printf("%s: FPGA not ready, aborting.\n", __func__);
105*2b09ea48SLey Foon Tan 			return;
106*2b09ea48SLey Foon Tan 		}
107*2b09ea48SLey Foon Tan 
108*2b09ea48SLey Foon Tan 		/* brdmodrst */
109*2b09ea48SLey Foon Tan 		writel(0, &reset_manager_base->brg_mod_reset);
110*2b09ea48SLey Foon Tan 
111*2b09ea48SLey Foon Tan 		/* Remap the bridges into memory map */
112*2b09ea48SLey Foon Tan 		writel(l3mask, SOCFPGA_L3REGS_ADDRESS);
113*2b09ea48SLey Foon Tan 	}
114*2b09ea48SLey Foon Tan 	return;
115*2b09ea48SLey Foon Tan }
116*2b09ea48SLey Foon Tan #endif
117