diff mbox series

[v1] sunxi: psci: Fix sunxi_power_switch on sun8i-r40 platform

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

Commit Message

qianfan May 13, 2022, 9:24 a.m. UTC
From: qianfan Zhao <qianfanguijin@163.com>

linux system will dead if we offline one of the cpu on R40 based board:
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(-)

Comments

Peter Robinson May 13, 2022, 11:23 a.m. UTC | #1
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 mbox series

Patch

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)