提交 68e1747f 编写于 作者: C Chin Liang See 提交者: Albert ARIBAUD

socfpga: Creating driver for Reset Manager

Consolidating reset code into reset_manager.c. Also
separating reset configuration for virtual target and
real hardware Cyclone V development kit
Signed-off-by: NChin Liang See <clsee@altera.com>
Reviewed-by: NPavel Machek <pavel@denx.de>
Cc: Wolfgang Denk <wd@denx.de>
Cc: Pavel Machek <pavel@denx.de>
Cc: Dinh Nguyen <dinguyen@altera.com>
Cc: Tom Rini <trini@ti.com>
Cc: Albert Aribaud <albert.u.boot@aribaud.net>
上级 31ad864e
...@@ -13,7 +13,7 @@ include $(TOPDIR)/config.mk ...@@ -13,7 +13,7 @@ include $(TOPDIR)/config.mk
LIB = $(obj)lib$(SOC).o LIB = $(obj)lib$(SOC).o
SOBJS := lowlevel_init.o SOBJS := lowlevel_init.o
COBJS-y := misc.o timer.o COBJS-y := misc.o timer.o reset_manager.o
COBJS-$(CONFIG_SPL_BUILD) += spl.o COBJS-$(CONFIG_SPL_BUILD) += spl.o
COBJS := $(COBJS-y) COBJS := $(COBJS-y)
......
...@@ -6,36 +6,9 @@ ...@@ -6,36 +6,9 @@
#include <common.h> #include <common.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/arch/reset_manager.h>
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
static const struct socfpga_reset_manager *reset_manager_base =
(void *)SOCFPGA_RSTMGR_ADDRESS;
/*
* Write the reset manager register to cause reset
*/
void reset_cpu(ulong addr)
{
/* request a warm reset */
writel(RSTMGR_CTRL_SWWARMRSTREQ_LSB, &reset_manager_base->ctrl);
/*
* infinite loop here as watchdog will trigger and reset
* the processor
*/
while (1)
;
}
/*
* Release peripherals from reset based on handoff
*/
void reset_deassert_peripherals_handoff(void)
{
writel(0, &reset_manager_base->per_mod_reset);
}
int dram_init(void) int dram_init(void)
{ {
gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE); gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE);
......
/*
* Copyright (C) 2013 Altera Corporation <www.altera.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <asm/io.h>
#include <asm/arch/reset_manager.h>
DECLARE_GLOBAL_DATA_PTR;
static const struct socfpga_reset_manager *reset_manager_base =
(void *)SOCFPGA_RSTMGR_ADDRESS;
/*
* Write the reset manager register to cause reset
*/
void reset_cpu(ulong addr)
{
/* request a warm reset */
writel((1 << RSTMGR_CTRL_SWWARMRSTREQ_LSB),
&reset_manager_base->ctrl);
/*
* infinite loop here as watchdog will trigger and reset
* the processor
*/
while (1)
;
}
/*
* Release peripherals from reset based on handoff
*/
void reset_deassert_peripherals_handoff(void)
{
writel(0, &reset_manager_base->per_mod_reset);
}
...@@ -11,16 +11,20 @@ void reset_cpu(ulong addr); ...@@ -11,16 +11,20 @@ void reset_cpu(ulong addr);
void reset_deassert_peripherals_handoff(void); void reset_deassert_peripherals_handoff(void);
struct socfpga_reset_manager { struct socfpga_reset_manager {
u32 padding1; u32 status;
u32 ctrl; u32 ctrl;
u32 padding2; u32 counts;
u32 padding3; u32 padding1;
u32 mpu_mod_reset; u32 mpu_mod_reset;
u32 per_mod_reset; u32 per_mod_reset;
u32 per2_mod_reset; u32 per2_mod_reset;
u32 brg_mod_reset; u32 brg_mod_reset;
}; };
#if defined(CONFIG_SOCFPGA_VIRTUAL_TARGET)
#define RSTMGR_CTRL_SWWARMRSTREQ_LSB 2
#else
#define RSTMGR_CTRL_SWWARMRSTREQ_LSB 1 #define RSTMGR_CTRL_SWWARMRSTREQ_LSB 1
#endif
#endif /* _RESET_MANAGER_H_ */ #endif /* _RESET_MANAGER_H_ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册