Input: pm8941-pwrkey - respect reboot_mode for warm reset

Started by Shawn Guo on Jun 29, 2021 · 4 messages from 2 authors · Last reply Feb 26, 2022

Subsystems (3)

Maintainers (2)

STALE1722d

open the first message on its own page

Message details and related content
On some devices, e.g. Sony Xperia M4 Aqua, warm reset is used to reboot
device into bootloader and recovery mode.  Instead of always doing hard
reset, add a check on reboot_mode for possible warm reset.

Signed-off-by: Shawn Guo <redacted>
---
 drivers/input/misc/pm8941-pwrkey.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/input/misc/pm8941-pwrkey.c b/drivers/input/misc/pm8941-pwrkey.c
index cf8104454e74..9b14d6eb1918 100644
--- a/drivers/input/misc/pm8941-pwrkey.c
+++ b/drivers/input/misc/pm8941-pwrkey.c
@@ -27,6 +27,7 @@
 #define PON_PS_HOLD_RST_CTL2		0x5b
 #define  PON_PS_HOLD_ENABLE		BIT(7)
 #define  PON_PS_HOLD_TYPE_MASK		0x0f
+#define  PON_PS_HOLD_TYPE_WARM_RESET	1
 #define  PON_PS_HOLD_TYPE_SHUTDOWN	4
 #define  PON_PS_HOLD_TYPE_HARD_RESET	7
 
@@ -93,7 +94,10 @@ static int pm8941_reboot_notify(struct notifier_block *nb,
 		break;
 	case SYS_RESTART:
 	default:
-		reset_type = PON_PS_HOLD_TYPE_HARD_RESET;
+		if (reboot_mode == REBOOT_WARM)
+			reset_type = PON_PS_HOLD_TYPE_WARM_RESET;
+		else
+			reset_type = PON_PS_HOLD_TYPE_HARD_RESET;
 		break;
 	}
 
-- 
2.17.1
Message details and related content
Hi Shawn,

On Dienstag, 29. Juni 2021 05:05:09 CEST Shawn Guo wrote:
quoted hunk
On some devices, e.g. Sony Xperia M4 Aqua, warm reset is used to reboot
device into bootloader and recovery mode.  Instead of always doing hard
reset, add a check on reboot_mode for possible warm reset.

Signed-off-by: Shawn Guo <redacted>
---
 drivers/input/misc/pm8941-pwrkey.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/input/misc/pm8941-pwrkey.c
b/drivers/input/misc/pm8941-pwrkey.c index cf8104454e74..9b14d6eb1918
100644
--- a/drivers/input/misc/pm8941-pwrkey.c
+++ b/drivers/input/misc/pm8941-pwrkey.c
@@ -27,6 +27,7 @@
 #define PON_PS_HOLD_RST_CTL2		0x5b
 #define  PON_PS_HOLD_ENABLE		BIT(7)
 #define  PON_PS_HOLD_TYPE_MASK		0x0f
+#define  PON_PS_HOLD_TYPE_WARM_RESET	1
 #define  PON_PS_HOLD_TYPE_SHUTDOWN	4
 #define  PON_PS_HOLD_TYPE_HARD_RESET	7
@@ -93,7 +94,10 @@ static int pm8941_reboot_notify(struct notifier_block
*nb, break;
 	case SYS_RESTART:
 	default:
-		reset_type = PON_PS_HOLD_TYPE_HARD_RESET;
+		if (reboot_mode == REBOOT_WARM)
This doesn't compile with CONFIG_INPUT_PM8941_PWRKEY=m

 ERROR: modpost: "reboot_mode" [drivers/input/misc/pm8941-pwrkey.ko] undefined!

Also just to clarify, this is supposed to trigger when rebooting with 
LINUX_REBOOT_CMD_RESTART2 and adding an argument that way, right?

Regards
Luca
quoted hunk
+			reset_type = PON_PS_HOLD_TYPE_WARM_RESET;
+		else
+			reset_type = PON_PS_HOLD_TYPE_HARD_RESET;
 		break;
 	}


Message details and related content
Hi Luca,

On Sun, Jul 11, 2021 at 11:57:25AM +0200, Luca Weiss wrote:
Hi Shawn,

On Dienstag, 29. Juni 2021 05:05:09 CEST Shawn Guo wrote:
quoted
On some devices, e.g. Sony Xperia M4 Aqua, warm reset is used to reboot
device into bootloader and recovery mode.  Instead of always doing hard
reset, add a check on reboot_mode for possible warm reset.

Signed-off-by: Shawn Guo <redacted>
---
 drivers/input/misc/pm8941-pwrkey.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/input/misc/pm8941-pwrkey.c
b/drivers/input/misc/pm8941-pwrkey.c index cf8104454e74..9b14d6eb1918
100644
--- a/drivers/input/misc/pm8941-pwrkey.c
+++ b/drivers/input/misc/pm8941-pwrkey.c
@@ -27,6 +27,7 @@
 #define PON_PS_HOLD_RST_CTL2		0x5b
 #define  PON_PS_HOLD_ENABLE		BIT(7)
 #define  PON_PS_HOLD_TYPE_MASK		0x0f
+#define  PON_PS_HOLD_TYPE_WARM_RESET	1
 #define  PON_PS_HOLD_TYPE_SHUTDOWN	4
 #define  PON_PS_HOLD_TYPE_HARD_RESET	7
@@ -93,7 +94,10 @@ static int pm8941_reboot_notify(struct notifier_block
*nb, break;
 	case SYS_RESTART:
 	default:
-		reset_type = PON_PS_HOLD_TYPE_HARD_RESET;
+		if (reboot_mode == REBOOT_WARM)
This doesn't compile with CONFIG_INPUT_PM8941_PWRKEY=m

 ERROR: modpost: "reboot_mode" [drivers/input/misc/pm8941-pwrkey.ko] undefined!
Thanks for the report!  I will add a patch to export the symbol.
Also just to clarify, this is supposed to trigger when rebooting with 
LINUX_REBOOT_CMD_RESTART2 and adding an argument that way, right?
With either of the following two methods, 'reboot_mode' will be turned
into REBOOT_WARM.

- Boot kernel with 'reboot=warm' on cmdline

- Set warm mode via sysfs entry
  $ echo warm > /sys/kernel/reboot/mode

Shawn
Message details and related content
Hi Shawn,

On Mittwoch, 14. Juli 2021 11:40:46 CET Shawn Guo wrote:
Hi Luca,

On Sun, Jul 11, 2021 at 11:57:25AM +0200, Luca Weiss wrote:
quoted
Hi Shawn,

On Dienstag, 29. Juni 2021 05:05:09 CEST Shawn Guo wrote:
quoted
On some devices, e.g. Sony Xperia M4 Aqua, warm reset is used to reboot
device into bootloader and recovery mode.  Instead of always doing hard
reset, add a check on reboot_mode for possible warm reset.

Signed-off-by: Shawn Guo <redacted>
---

 drivers/input/misc/pm8941-pwrkey.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/input/misc/pm8941-pwrkey.c
b/drivers/input/misc/pm8941-pwrkey.c index cf8104454e74..9b14d6eb1918
100644
--- a/drivers/input/misc/pm8941-pwrkey.c
+++ b/drivers/input/misc/pm8941-pwrkey.c
@@ -27,6 +27,7 @@

 #define PON_PS_HOLD_RST_CTL2		0x5b
 #define  PON_PS_HOLD_ENABLE		BIT(7)
 #define  PON_PS_HOLD_TYPE_MASK		0x0f

+#define  PON_PS_HOLD_TYPE_WARM_RESET	1

 #define  PON_PS_HOLD_TYPE_SHUTDOWN	4
 #define  PON_PS_HOLD_TYPE_HARD_RESET	7
@@ -93,7 +94,10 @@ static int pm8941_reboot_notify(struct notifier_block
*nb, break;

 	case SYS_RESTART:

 	default:
-		reset_type = PON_PS_HOLD_TYPE_HARD_RESET;
+		if (reboot_mode == REBOOT_WARM)

17 more quoted lines

+CC Sebastian Reichel

Do you have an idea how this situation should look from user space? Just using 
LINUX_REBOOT_CMD_RESTART2 with the param won't work if the reboot mode also 
has to be set to work - but that's also not the case on all boards.

Just LINUX_REBOOT_CMD_RESTART2 works fine on newer qcom SoCs that iirc store it 
in a pmic register that seems to survive a hard reboot.

Would it be a good idea to introduce a new dt property for e.g.
syscon-reboot-mode that makes it switch to warm reboot mode when a reboot mode 
is passed to the kernel? That way user space wouldn't need to care whether a 
particular board needs warm reboot or can just use the default hard reboot.

Regards
Luca
Shawn


Keyboard shortcuts
hback out one level
jnext message in thread / next series-diff position
kprevious message in thread / previous series-diff position
ldrill in
Escclose help / fold thread tree
?toggle this help