[PATCH v3 4/5] rockchip: Add common reset cause
Kever Yang
kever.yang at rock-chips.com
Mon Jan 6 10:24:59 CET 2020
On 2019/12/30 上午3:07, Jagan Teki wrote:
> Add cpu reset cause in common cpu-info file.
>
> This would help to print the reset cause for
> various resets.
>
> Right now it support rk3288, rk3399. rest of rockchip
> platforms doesn't have reset cause support ye but this
> code is more feasible to extend the same.
>
> Signed-off-by: Jagan Teki <jagan at amarulasolutions.com>
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>
Thanks,
- Kever
> ---
> arch/arm/include/asm/arch-rockchip/cru.h | 12 +++++
> .../include/asm/arch-rockchip/cru_rk3288.h | 14 +-----
> arch/arm/mach-rockchip/cpu-info.c | 49 +++++++++++++++++++
> arch/arm/mach-rockchip/rk3288/rk3288.c | 39 ---------------
> 4 files changed, 62 insertions(+), 52 deletions(-)
>
> diff --git a/arch/arm/include/asm/arch-rockchip/cru.h b/arch/arm/include/asm/arch-rockchip/cru.h
> index 5ed3fbfd07..e1dd9a89c2 100644
> --- a/arch/arm/include/asm/arch-rockchip/cru.h
> +++ b/arch/arm/include/asm/arch-rockchip/cru.h
> @@ -13,4 +13,16 @@
> # include <asm/arch-rockchip/cru_rk3399.h>
> #endif
>
> +/* CRU_GLB_RST_ST */
> +enum {
> + GLB_POR_RST,
> + FST_GLB_RST_ST = BIT(0),
> + SND_GLB_RST_ST = BIT(1),
> + FST_GLB_TSADC_RST_ST = BIT(2),
> + SND_GLB_TSADC_RST_ST = BIT(3),
> + FST_GLB_WDT_RST_ST = BIT(4),
> + SND_GLB_WDT_RST_ST = BIT(5),
> + GLB_RST_ST_MASK = GENMASK(5, 0),
> +};
> +
> #endif /* _ROCKCHIP_CLOCK_H */
> diff --git a/arch/arm/include/asm/arch-rockchip/cru_rk3288.h b/arch/arm/include/asm/arch-rockchip/cru_rk3288.h
> index 7aa6efe46c..412b73e55f 100644
> --- a/arch/arm/include/asm/arch-rockchip/cru_rk3288.h
> +++ b/arch/arm/include/asm/arch-rockchip/cru_rk3288.h
> @@ -51,7 +51,7 @@ struct rockchip_cru {
> u32 cru_glb_cnt_th;
> u32 cru_glb_rst_con;
> u32 reserved3;
> - u32 cru_glb_rst_st;
> + u32 glb_rst_st;
> u32 reserved4;
> u32 cru_sdmmc_con[2];
> u32 cru_sdio0_con[2];
> @@ -227,16 +227,4 @@ enum {
> CLKF_MASK = 0x1fff << CLKF_SHIFT,
> };
>
> -/* CRU_GLB_RST_ST */
> -enum {
> - GLB_POR_RST,
> - FST_GLB_RST_ST = BIT(0),
> - SND_GLB_RST_ST = BIT(1),
> - FST_GLB_TSADC_RST_ST = BIT(2),
> - SND_GLB_TSADC_RST_ST = BIT(3),
> - FST_GLB_WDT_RST_ST = BIT(4),
> - SND_GLB_WDT_RST_ST = BIT(5),
> - GLB_RST_ST_MASK = GENMASK(5, 0),
> -};
> -
> #endif
> diff --git a/arch/arm/mach-rockchip/cpu-info.c b/arch/arm/mach-rockchip/cpu-info.c
> index 9bccbd4f68..4b0e99299a 100644
> --- a/arch/arm/mach-rockchip/cpu-info.c
> +++ b/arch/arm/mach-rockchip/cpu-info.c
> @@ -5,10 +5,59 @@
> */
>
> #include <common.h>
> +#include <asm/io.h>
> +#include <asm/arch-rockchip/clock.h>
> +#include <asm/arch-rockchip/cru.h>
> +#include <asm/arch-rockchip/hardware.h>
> +#include <linux/err.h>
> +
> +static char *get_reset_cause(void)
> +{
> + struct rockchip_cru *cru = rockchip_get_cru();
> + char *cause = NULL;
> +
> + if (IS_ERR(cru))
> + return cause;
> +
> + switch (cru->glb_rst_st) {
> + case GLB_POR_RST:
> + cause = "POR";
> + break;
> + case FST_GLB_RST_ST:
> + case SND_GLB_RST_ST:
> + cause = "RST";
> + break;
> + case FST_GLB_TSADC_RST_ST:
> + case SND_GLB_TSADC_RST_ST:
> + cause = "THERMAL";
> + break;
> + case FST_GLB_WDT_RST_ST:
> + case SND_GLB_WDT_RST_ST:
> + cause = "WDOG";
> + break;
> + default:
> + cause = "unknown reset";
> + }
> +
> + /**
> + * reset_reason env is used by rk3288, due to special use case
> + * to figure it the boot behavior. so keep this as it is.
> + */
> + env_set("reset_reason", cause);
> +
> + /*
> + * Clear glb_rst_st, so we can determine the last reset cause
> + * for following resets.
> + */
> + rk_clrreg(&cru->glb_rst_st, GLB_RST_ST_MASK);
> +
> + return cause;
> +}
>
> int print_cpuinfo(void)
> {
> printf("SoC: Rockchip %s\n", CONFIG_SYS_SOC);
> + printf("Reset cause: %s\n", get_reset_cause());
>
> /* TODO print operating temparature and clock */
>
> diff --git a/arch/arm/mach-rockchip/rk3288/rk3288.c b/arch/arm/mach-rockchip/rk3288/rk3288.c
> index 47ee5d440b..18ea7f35fb 100644
> --- a/arch/arm/mach-rockchip/rk3288/rk3288.c
> +++ b/arch/arm/mach-rockchip/rk3288/rk3288.c
> @@ -102,43 +102,6 @@ void board_debug_uart_init(void)
> }
> #endif
>
> -static void rk3288_detect_reset_reason(void)
> -{
> - struct rockchip_cru *cru = rockchip_get_cru();
> - const char *reason;
> -
> - if (IS_ERR(cru))
> - return;
> -
> - switch (cru->cru_glb_rst_st) {
> - case GLB_POR_RST:
> - reason = "POR";
> - break;
> - case FST_GLB_RST_ST:
> - case SND_GLB_RST_ST:
> - reason = "RST";
> - break;
> - case FST_GLB_TSADC_RST_ST:
> - case SND_GLB_TSADC_RST_ST:
> - reason = "THERMAL";
> - break;
> - case FST_GLB_WDT_RST_ST:
> - case SND_GLB_WDT_RST_ST:
> - reason = "WDOG";
> - break;
> - default:
> - reason = "unknown reset";
> - }
> -
> - env_set("reset_reason", reason);
> -
> - /*
> - * 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);
> -}
> -
> __weak int rk3288_board_late_init(void)
> {
> return 0;
> @@ -146,8 +109,6 @@ __weak int rk3288_board_late_init(void)
>
> int rk_board_late_init(void)
> {
> - rk3288_detect_reset_reason();
> -
> return rk3288_board_late_init();
> }
>
More information about the U-Boot
mailing list