Move rockchip_get_reset_cause() implementation to SoC-specific source files, leaving a dummy weak common implementation in cpu-info.c file: an effective common implementation is not feasible due SoC differences. BTW the existing ones for RK3568 and RK3588 need to be fixed/improved because their CRU_GLB_RST_ST registers differ from the one common to RK3288 and RK3399 on which the implementation is based.
Moreover, now all the Rockchip SoC board configurations can select the DISPLAY_CPUINFO config option and compile cpu-info.c successfully which provides print_cpuinfo(). Previously, boards with SoC other than RK3288 RK3399 RK3568 and RK3588 could not have DISPLAY_CPUINFO selected. Signed-off-by: Massimo Pegorer <[email protected]> --- arch/arm/mach-rockchip/cpu-info.c | 44 ++---------------------------- arch/arm/mach-rockchip/rk3288/clk_rk3288.c | 35 ++++++++++++++++++++++++ arch/arm/mach-rockchip/rk3399/clk_rk3399.c | 35 ++++++++++++++++++++++++ arch/arm/mach-rockchip/rk3568/clk_rk3568.c | 35 ++++++++++++++++++++++++ arch/arm/mach-rockchip/rk3588/clk_rk3588.c | 35 ++++++++++++++++++++++++ 5 files changed, 142 insertions(+), 42 deletions(-) diff --git a/arch/arm/mach-rockchip/cpu-info.c b/arch/arm/mach-rockchip/cpu-info.c index 2ec96a20c3d..b6e3d9ff964 100644 --- a/arch/arm/mach-rockchip/cpu-info.c +++ b/arch/arm/mach-rockchip/cpu-info.c @@ -10,49 +10,9 @@ #include <asm/arch-rockchip/hardware.h> #include <linux/err.h> -#if defined(CONFIG_ROCKCHIP_RK3288) -# include <asm/arch-rockchip/cru_rk3288.h> -#elif defined(CONFIG_ROCKCHIP_RK3399) -# include <asm/arch-rockchip/cru_rk3399.h> -#elif defined(CONFIG_ROCKCHIP_RK3568) -#include <asm/arch-rockchip/cru_rk3568.h> -#elif defined(CONFIG_ROCKCHIP_RK3588) -#include <asm/arch-rockchip/cru_rk3588.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), -}; - -enum rockchip_rst_cause rockchip_get_reset_cause(void) +__weak enum rockchip_rst_cause rockchip_get_reset_cause(void) { - struct rockchip_cru *cru = rockchip_get_cru(); - - if (IS_ERR(cru)) - return RST_CAUSE_UNAVAILABLE; - - switch (cru->glb_rst_st) { - case GLB_POR_RST: - return RST_CAUSE_POR; - case FST_GLB_RST_ST: - case SND_GLB_RST_ST: - return RST_CAUSE_REG; - case FST_GLB_TSADC_RST_ST: - case SND_GLB_TSADC_RST_ST: - return RST_CAUSE_THERMAL; - case FST_GLB_WDT_RST_ST: - case SND_GLB_WDT_RST_ST: - return RST_CAUSE_WDOG; - } - - return RST_CAUSE_UNKNOWN; + return RST_CAUSE_UNAVAILABLE; } #if IS_ENABLED(CONFIG_DISPLAY_CPUINFO) diff --git a/arch/arm/mach-rockchip/rk3288/clk_rk3288.c b/arch/arm/mach-rockchip/rk3288/clk_rk3288.c index d725730f5bd..a245d865a0b 100644 --- a/arch/arm/mach-rockchip/rk3288/clk_rk3288.c +++ b/arch/arm/mach-rockchip/rk3288/clk_rk3288.c @@ -30,3 +30,38 @@ void *rockchip_get_cru(void) return priv->cru; } + +/* 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), +}; + +enum rockchip_rst_cause rockchip_get_reset_cause(void) +{ + struct rockchip_cru *cru = rockchip_get_cru(); + + if (IS_ERR(cru)) + return RST_CAUSE_UNAVAILABLE; + + switch (cru->glb_rst_st) { + case GLB_POR_RST: + return RST_CAUSE_POR; + case FST_GLB_RST_ST: + case SND_GLB_RST_ST: + return RST_CAUSE_REG; + case FST_GLB_TSADC_RST_ST: + case SND_GLB_TSADC_RST_ST: + return RST_CAUSE_THERMAL; + case FST_GLB_WDT_RST_ST: + case SND_GLB_WDT_RST_ST: + return RST_CAUSE_WDOG; + } + + return RST_CAUSE_UNKNOWN; +} diff --git a/arch/arm/mach-rockchip/rk3399/clk_rk3399.c b/arch/arm/mach-rockchip/rk3399/clk_rk3399.c index 170071d243d..afd57b2e354 100644 --- a/arch/arm/mach-rockchip/rk3399/clk_rk3399.c +++ b/arch/arm/mach-rockchip/rk3399/clk_rk3399.c @@ -51,3 +51,38 @@ void *rockchip_get_pmucru(void) return priv->pmucru; } + +/* 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), +}; + +enum rockchip_rst_cause rockchip_get_reset_cause(void) +{ + struct rockchip_cru *cru = rockchip_get_cru(); + + if (IS_ERR(cru)) + return RST_CAUSE_UNAVAILABLE; + + switch (cru->glb_rst_st) { + case GLB_POR_RST: + return RST_CAUSE_POR; + case FST_GLB_RST_ST: + case SND_GLB_RST_ST: + return RST_CAUSE_REG; + case FST_GLB_TSADC_RST_ST: + case SND_GLB_TSADC_RST_ST: + return RST_CAUSE_THERMAL; + case FST_GLB_WDT_RST_ST: + case SND_GLB_WDT_RST_ST: + return RST_CAUSE_WDOG; + } + + return RST_CAUSE_UNKNOWN; +} diff --git a/arch/arm/mach-rockchip/rk3568/clk_rk3568.c b/arch/arm/mach-rockchip/rk3568/clk_rk3568.c index 1c6b2ece602..e10bcef727d 100644 --- a/arch/arm/mach-rockchip/rk3568/clk_rk3568.c +++ b/arch/arm/mach-rockchip/rk3568/clk_rk3568.c @@ -50,3 +50,38 @@ void *rockchip_get_pmucru(void) return priv->pmucru; } + +/* 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), +}; + +enum rockchip_rst_cause rockchip_get_reset_cause(void) +{ + struct rockchip_cru *cru = rockchip_get_cru(); + + if (IS_ERR(cru)) + return RST_CAUSE_UNAVAILABLE; + + switch (cru->glb_rst_st) { + case GLB_POR_RST: + return RST_CAUSE_POR; + case FST_GLB_RST_ST: + case SND_GLB_RST_ST: + return RST_CAUSE_REG; + case FST_GLB_TSADC_RST_ST: + case SND_GLB_TSADC_RST_ST: + return RST_CAUSE_THERMAL; + case FST_GLB_WDT_RST_ST: + case SND_GLB_WDT_RST_ST: + return RST_CAUSE_WDOG; + } + + return RST_CAUSE_UNKNOWN; +} diff --git a/arch/arm/mach-rockchip/rk3588/clk_rk3588.c b/arch/arm/mach-rockchip/rk3588/clk_rk3588.c index 250ec423bd2..5698b16db58 100644 --- a/arch/arm/mach-rockchip/rk3588/clk_rk3588.c +++ b/arch/arm/mach-rockchip/rk3588/clk_rk3588.c @@ -29,3 +29,38 @@ void *rockchip_get_cru(void) return priv->cru; } + +/* 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), +}; + +enum rockchip_rst_cause rockchip_get_reset_cause(void) +{ + struct rockchip_cru *cru = rockchip_get_cru(); + + if (IS_ERR(cru)) + return RST_CAUSE_UNAVAILABLE; + + switch (cru->glb_rst_st) { + case GLB_POR_RST: + return RST_CAUSE_POR; + case FST_GLB_RST_ST: + case SND_GLB_RST_ST: + return RST_CAUSE_REG; + case FST_GLB_TSADC_RST_ST: + case SND_GLB_TSADC_RST_ST: + return RST_CAUSE_THERMAL; + case FST_GLB_WDT_RST_ST: + case SND_GLB_WDT_RST_ST: + return RST_CAUSE_WDOG; + } + + return RST_CAUSE_UNKNOWN; +} -- 2.34.1
