Message ID | 20220513092446.1620-1-qianfanguijin@163.com |
---|---|
State | Superseded |
Delegated to: | Andre Przywara |
Headers | show |
Series | [v1] sunxi: psci: Fix sunxi_power_switch on sun8i-r40 platform | expand |
On Fri, May 13, 2022 at 10:25 AM <qianfanguijin@163.com> wrote: > > From: qianfan Zhao <qianfanguijin@163.com> > > linux system will dead if we offline one of the cpu on R40 based board: Minor nit this should read "will die" not "will dead" > eg: echo 0 > /sys/devices/system/cpu/cpu3/online > > Fixed sunxi_power_switch based on allwinner lichee 3.10 kernel driver. > > Signed-off-by: qianfan Zhao <qianfanguijin@163.com> > --- > arch/arm/cpu/armv7/sunxi/psci.c | 24 +++++++++++++++++++----- > 1 file changed, 19 insertions(+), 5 deletions(-) > > diff --git a/arch/arm/cpu/armv7/sunxi/psci.c b/arch/arm/cpu/armv7/sunxi/psci.c > index 1ac50f558a..63186a9388 100644 > --- a/arch/arm/cpu/armv7/sunxi/psci.c > +++ b/arch/arm/cpu/armv7/sunxi/psci.c > @@ -79,8 +79,7 @@ static void __secure __mdelay(u32 ms) > static void __secure clamp_release(u32 __maybe_unused *clamp) > { > #if defined(CONFIG_MACH_SUN6I) || defined(CONFIG_MACH_SUN7I) || \ > - defined(CONFIG_MACH_SUN8I_H3) || \ > - defined(CONFIG_MACH_SUN8I_R40) > + defined(CONFIG_MACH_SUN8I_H3) > u32 tmp = 0x1ff; > do { > tmp >>= 1; > @@ -88,15 +87,30 @@ static void __secure clamp_release(u32 __maybe_unused *clamp) > } while (tmp); > > __mdelay(10); > +#elif defined(CONFIG_MACH_SUN8I_R40) > + u8 i, tmp = 0xfe; > + > + for (i = 0; i < 5; i++) { /* 0xfe, 0xf8, 0xe0, 0x80, 0x00 */ > + writel(tmp, clamp); > + tmp <<= 2; > + } > + > + while (0x00 != readl(clamp)) { > + ; > + } > #endif > } > > static void __secure clamp_set(u32 __maybe_unused *clamp) > { > #if defined(CONFIG_MACH_SUN6I) || defined(CONFIG_MACH_SUN7I) || \ > - defined(CONFIG_MACH_SUN8I_H3) || \ > - defined(CONFIG_MACH_SUN8I_R40) > + defined(CONFIG_MACH_SUN8I_H3) > writel(0xff, clamp); > +#elif defined(CONFIG_MACH_SUN8I_R40) > + writel(0xff, clamp); > + while (0xff != readl(clamp)) { > + ; > + } > #endif > } > > @@ -153,7 +167,7 @@ static void __secure sunxi_cpu_set_power(int cpu, bool on) > > sunxi_power_switch((void *)cpucfg + SUN8I_R40_PWR_CLAMP(cpu), > (void *)cpucfg + SUN8I_R40_PWROFF, > - on, 0); > + on, cpu); > } > #else /* ! CONFIG_MACH_SUN7I && ! CONFIG_MACH_SUN8I_R40 */ > static void __secure sunxi_cpu_set_power(int cpu, bool on) > -- > 2.25.1 >
diff --git a/arch/arm/cpu/armv7/sunxi/psci.c b/arch/arm/cpu/armv7/sunxi/psci.c index 1ac50f558a..63186a9388 100644 --- a/arch/arm/cpu/armv7/sunxi/psci.c +++ b/arch/arm/cpu/armv7/sunxi/psci.c @@ -79,8 +79,7 @@ static void __secure __mdelay(u32 ms) static void __secure clamp_release(u32 __maybe_unused *clamp) { #if defined(CONFIG_MACH_SUN6I) || defined(CONFIG_MACH_SUN7I) || \ - defined(CONFIG_MACH_SUN8I_H3) || \ - defined(CONFIG_MACH_SUN8I_R40) + defined(CONFIG_MACH_SUN8I_H3) u32 tmp = 0x1ff; do { tmp >>= 1; @@ -88,15 +87,30 @@ static void __secure clamp_release(u32 __maybe_unused *clamp) } while (tmp); __mdelay(10); +#elif defined(CONFIG_MACH_SUN8I_R40) + u8 i, tmp = 0xfe; + + for (i = 0; i < 5; i++) { /* 0xfe, 0xf8, 0xe0, 0x80, 0x00 */ + writel(tmp, clamp); + tmp <<= 2; + } + + while (0x00 != readl(clamp)) { + ; + } #endif } static void __secure clamp_set(u32 __maybe_unused *clamp) { #if defined(CONFIG_MACH_SUN6I) || defined(CONFIG_MACH_SUN7I) || \ - defined(CONFIG_MACH_SUN8I_H3) || \ - defined(CONFIG_MACH_SUN8I_R40) + defined(CONFIG_MACH_SUN8I_H3) writel(0xff, clamp); +#elif defined(CONFIG_MACH_SUN8I_R40) + writel(0xff, clamp); + while (0xff != readl(clamp)) { + ; + } #endif } @@ -153,7 +167,7 @@ static void __secure sunxi_cpu_set_power(int cpu, bool on) sunxi_power_switch((void *)cpucfg + SUN8I_R40_PWR_CLAMP(cpu), (void *)cpucfg + SUN8I_R40_PWROFF, - on, 0); + on, cpu); } #else /* ! CONFIG_MACH_SUN7I && ! CONFIG_MACH_SUN8I_R40 */ static void __secure sunxi_cpu_set_power(int cpu, bool on)