[U-Boot] [U-Boot, v3] rockchip: rk3288: Add reset reason detection

Philipp Tomsich philipp.tomsich at theobroma-systems.com
Fri Aug 18 13:10:41 UTC 2017



On Thu, 3 Aug 2017, Wadim Egorov wrote:

> Sometimes it's helpful to know the reset reason caused in the SoC.
> Add reset reason detection for the RK3288 SoC.
> This will set an environment variable which represents the reset reason.
>
> Signed-off-by: Wadim Egorov <w.egorov at phytec.de>
> Acked-by: Philipp Tomsich <philipp.tomsich at theobroma-systems.com>
> ---
> Changes in v3:
> - Fixed typo in commit message
> - Use enum for CRU_GLB_RST_ST register decoding

The changes requested by Simon are still pending.
Plus a few more comments from me below...

>
> ---
> arch/arm/include/asm/arch-rockchip/cru_rk3288.h | 12 +++++++++
> arch/arm/mach-rockchip/rk3288-board.c           | 35 +++++++++++++++++++++++++
> 2 files changed, 47 insertions(+)
>
> diff --git a/arch/arm/include/asm/arch-rockchip/cru_rk3288.h b/arch/arm/include/asm/arch-rockchip/cru_rk3288.h
> index cb0a935..a52986b 100644
> --- a/arch/arm/include/asm/arch-rockchip/cru_rk3288.h
> +++ b/arch/arm/include/asm/arch-rockchip/cru_rk3288.h
> @@ -220,4 +220,16 @@ enum {
> 	CLKF_MASK		= 0x1fff << CLKF_SHIFT,

GENMASK?

> };
>
> +/* CRU_GLB_RST_ST */
> +enum {
> +	GLB_POR_RST,
> +	FST_GLB_RST_ST,
> +	SND_GLB_RST_ST,

Shouldn't SND_GLB_RST_ST be BIT(1)?

> +	FST_GLB_TSADC_RST_ST	= 0x4,
> +	SND_GLB_TSADC_RST_ST	= 0x8,
> +	FST_GLB_WDT_RST_ST	= 0x10,
> +	SND_GLB_WDT_RST_ST	= 0x20,

BIT(...)?

> +	GLB_RST_ST_MASK		= 0x3f,
> +};
> +
> #endif
> diff --git a/arch/arm/mach-rockchip/rk3288-board.c b/arch/arm/mach-rockchip/rk3288-board.c
> index 613967c..1ac70ff 100644
> --- a/arch/arm/mach-rockchip/rk3288-board.c
> +++ b/arch/arm/mach-rockchip/rk3288-board.c
> @@ -11,6 +11,7 @@
> #include <syscon.h>
> #include <asm/io.h>
> #include <asm/arch/clock.h>
> +#include <asm/arch/cru_rk3288.h>
> #include <asm/arch/periph.h>
> #include <asm/arch/pmu_rk3288.h>
> #include <asm/arch/qos_rk3288.h>
> @@ -70,10 +71,44 @@ int rk3288_qos_init(void)
> 	return 0;
> }
>
> +static void rk3288_detect_reset_reason(void)
> +{
> +	struct rk3288_cru *cru = rockchip_get_cru();
> +	if (IS_ERR(cru))
> +		return;
> +
> +	switch (cru->cru_glb_rst_st) {
> +	case GLB_POR_RST:
> +		setenv("reset_reason", "POR");
> +		break;
> +	case FST_GLB_RST_ST:
> +	case SND_GLB_RST_ST:
> +		setenv("reset_reason", "RST");
> +		break;
> +	case FST_GLB_TSADC_RST_ST:
> +	case SND_GLB_TSADC_RST_ST:
> +		setenv("reset_reason", "THERMAL");
> +		break;
> +	case FST_GLB_WDT_RST_ST:
> +	case SND_GLB_WDT_RST_ST:
> +		setenv("reset_reason", "WDOG");
> +		break;
> +	default:
> +		setenv("reset_reason", "unknown reset");
> +	}
> +
> +	/*
> +	 * Clear cru_glb_rst_st, so we can determine the last reset cause
> +	 * for following resets.
> +	 */
> +	rk_clrreg(&cru->cru_glb_rst_st, GLB_RST_ST_MASK);
> +}
> +
> int board_late_init(void)
> {
> 	setup_boot_mode();
> 	rk3288_qos_init();
> +	rk3288_detect_reset_reason();
>
> 	return rk_board_late_init();
> }
>


More information about the U-Boot mailing list