devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/5] power: reset: sc27xx: Add SC2730 and reboot support
@ 2025-09-26 16:23 Otto Pflüger
  2025-09-26 16:23 ` [PATCH 1/5] dt-bindings: power: reset: Add SC27xx series PMIC poweroff Otto Pflüger
                   ` (4 more replies)
  0 siblings, 5 replies; 12+ messages in thread
From: Otto Pflüger @ 2025-09-26 16:23 UTC (permalink / raw)
  To: Sebastian Reichel, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Orson Zhai, Baolin Wang, Chunyan Zhang, Lee Jones
  Cc: linux-pm, devicetree, linux-kernel, Otto Pflüger

Implement poweroff and reboot support for the SC2730 PMIC in the
existing driver for the SC27xx series. Add missing device tree bindings
and compatibles.

For some reason, a reboot implementation for SC2731 already exists in
the SPI driver used for communicating with the PMIC
(drivers/spi/spi-sprd-adi.c). This obviously does not belong there, but
it appears that SC2731 has no dedicated reboot registers and requires
triggering the PMIC watchdog for a reboot. Since there is no driver for
the PMIC watchdog yet, keep that code unmodified and only implement
reboot for SC2730 here. Once a watchdog driver is implemented, the
duplicate code for setting the reboot mode can be removed from the SPI
driver.

Signed-off-by: Otto Pflüger <otto.pflueger@abscue.de>
---
Otto Pflüger (5):
      dt-bindings: power: reset: Add SC27xx series PMIC poweroff
      dt-bindings: mfd: sc2731: Reference sprd,sc2731-poweroff
      power: reset: sc27xx: Use devm_register_sys_off_handler
      power: reset: sc27xx: Add support for SC2730 and OF match table
      power: reset: sc27xx: Add reboot support for SC2730

 .../devicetree/bindings/mfd/sprd,sc2731.yaml       |   8 +
 .../bindings/power/reset/sprd,sc2731-poweroff.yaml |  22 +++
 drivers/power/reset/sc27xx-poweroff.c              | 170 +++++++++++++++++++--
 3 files changed, 188 insertions(+), 12 deletions(-)
---
base-commit: 8e2755d7779a95dd61d8997ebce33ff8b1efd3fb
change-id: 20250926-sc2730-reboot-7f39a025547d

Best regards,
-- 
Otto Pflüger <otto.pflueger@abscue.de>


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 1/5] dt-bindings: power: reset: Add SC27xx series PMIC poweroff
  2025-09-26 16:23 [PATCH 0/5] power: reset: sc27xx: Add SC2730 and reboot support Otto Pflüger
@ 2025-09-26 16:23 ` Otto Pflüger
  2025-09-26 16:23 ` [PATCH 2/5] dt-bindings: mfd: sc2731: Reference sprd,sc2731-poweroff Otto Pflüger
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 12+ messages in thread
From: Otto Pflüger @ 2025-09-26 16:23 UTC (permalink / raw)
  To: Sebastian Reichel, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Orson Zhai, Baolin Wang, Chunyan Zhang, Lee Jones
  Cc: linux-pm, devicetree, linux-kernel, Otto Pflüger

Add power off bindings for the Unisoc SC27xx series PMICs, such as
SC2731 and SC2730.

Signed-off-by: Otto Pflüger <otto.pflueger@abscue.de>
---
 .../bindings/power/reset/sprd,sc2731-poweroff.yaml | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/Documentation/devicetree/bindings/power/reset/sprd,sc2731-poweroff.yaml b/Documentation/devicetree/bindings/power/reset/sprd,sc2731-poweroff.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..2db8bee47e17863b9a0d7af4945d3c32e67122ce
--- /dev/null
+++ b/Documentation/devicetree/bindings/power/reset/sprd,sc2731-poweroff.yaml
@@ -0,0 +1,22 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/power/reset/sprd,sc2731-poweroff.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Unisoc SC27xx series PMIC power off
+
+maintainers:
+  - Otto Pflüger <otto.pflueger@abscue.de>
+
+properties:
+  compatible:
+    enum:
+      - sprd,sc2730-poweroff
+      - sprd,sc2731-poweroff
+
+required:
+  - compatible
+
+additionalProperties: false
+...

-- 
2.50.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/5] dt-bindings: mfd: sc2731: Reference sprd,sc2731-poweroff
  2025-09-26 16:23 [PATCH 0/5] power: reset: sc27xx: Add SC2730 and reboot support Otto Pflüger
  2025-09-26 16:23 ` [PATCH 1/5] dt-bindings: power: reset: Add SC27xx series PMIC poweroff Otto Pflüger
@ 2025-09-26 16:23 ` Otto Pflüger
  2025-10-02  2:53   ` Rob Herring
  2025-09-26 16:23 ` [PATCH 3/5] power: reset: sc27xx: Use devm_register_sys_off_handler Otto Pflüger
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 12+ messages in thread
From: Otto Pflüger @ 2025-09-26 16:23 UTC (permalink / raw)
  To: Sebastian Reichel, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Orson Zhai, Baolin Wang, Chunyan Zhang, Lee Jones
  Cc: linux-pm, devicetree, linux-kernel, Otto Pflüger

Reference the new sprd,sc2731-poweroff bindings and add an example.

Signed-off-by: Otto Pflüger <otto.pflueger@abscue.de>
---
 Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml b/Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml
index b023e1ef8d3ccdb1d82d64ed1a60d5a712a1b910..a78d7e26b3a2c77b84da84fc23e52f3a22ab14df 100644
--- a/Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml
+++ b/Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml
@@ -52,6 +52,10 @@ properties:
   '#size-cells':
     const: 0
 
+  poweroff:
+    type: object
+    $ref: /schemas/power/reset/sprd,sc2731-poweroff.yaml#
+
   regulators:
     type: object
     $ref: /schemas/regulator/sprd,sc2731-regulator.yaml#
@@ -221,6 +225,10 @@ examples:
           reg = <0xec8>;
         };
 
+        poweroff {
+          compatible = "sprd,sc2731-poweroff";
+        };
+
         regulators {
           compatible = "sprd,sc2731-regulator";
 

-- 
2.50.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3/5] power: reset: sc27xx: Use devm_register_sys_off_handler
  2025-09-26 16:23 [PATCH 0/5] power: reset: sc27xx: Add SC2730 and reboot support Otto Pflüger
  2025-09-26 16:23 ` [PATCH 1/5] dt-bindings: power: reset: Add SC27xx series PMIC poweroff Otto Pflüger
  2025-09-26 16:23 ` [PATCH 2/5] dt-bindings: mfd: sc2731: Reference sprd,sc2731-poweroff Otto Pflüger
@ 2025-09-26 16:23 ` Otto Pflüger
  2025-09-30  3:23   ` Baolin Wang
  2025-09-26 16:23 ` [PATCH 4/5] power: reset: sc27xx: Add support for SC2730 and OF match table Otto Pflüger
  2025-09-26 16:23 ` [PATCH 5/5] power: reset: sc27xx: Add reboot support for SC2730 Otto Pflüger
  4 siblings, 1 reply; 12+ messages in thread
From: Otto Pflüger @ 2025-09-26 16:23 UTC (permalink / raw)
  To: Sebastian Reichel, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Orson Zhai, Baolin Wang, Chunyan Zhang, Lee Jones
  Cc: linux-pm, devicetree, linux-kernel, Otto Pflüger

Use the new device life-cycle managed register function to remove the
need for global variables in the driver.

Signed-off-by: Otto Pflüger <otto.pflueger@abscue.de>
---
 drivers/power/reset/sc27xx-poweroff.c | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/drivers/power/reset/sc27xx-poweroff.c b/drivers/power/reset/sc27xx-poweroff.c
index 90287c31992c4889f9241e82a21a1949ecca7702..20eb9f32cb2b99adeb16502172adf9d6257cd05f 100644
--- a/drivers/power/reset/sc27xx-poweroff.c
+++ b/drivers/power/reset/sc27xx-poweroff.c
@@ -9,6 +9,7 @@
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/pm.h>
+#include <linux/reboot.h>
 #include <linux/regmap.h>
 #include <linux/syscore_ops.h>
 
@@ -17,8 +18,6 @@
 #define SC27XX_SLP_CTRL		0xdf0
 #define SC27XX_LDO_XTL_EN	BIT(3)
 
-static struct regmap *regmap;
-
 /*
  * On Spreadtrum platform, we need power off system through external SC27xx
  * series PMICs, and it is one similar SPI bus mapped by regmap to access PMIC,
@@ -44,26 +43,37 @@ static struct syscore_ops poweroff_syscore_ops = {
 	.shutdown = sc27xx_poweroff_shutdown,
 };
 
-static void sc27xx_poweroff_do_poweroff(void)
+static int sc27xx_poweroff_do_poweroff(struct sys_off_data *off_data)
 {
+	struct regmap *regmap = off_data->cb_data;
+
 	/* Disable the external subsys connection's power firstly */
 	regmap_write(regmap, SC27XX_SLP_CTRL, SC27XX_LDO_XTL_EN);
 
 	regmap_write(regmap, SC27XX_PWR_PD_HW, SC27XX_PWR_OFF_EN);
+
+	mdelay(1000);
+
+	pr_emerg("Unable to poweroff system\n");
+
+	return NOTIFY_DONE;
 }
 
 static int sc27xx_poweroff_probe(struct platform_device *pdev)
 {
-	if (regmap)
-		return -EINVAL;
+	struct regmap *regmap;
 
 	regmap = dev_get_regmap(pdev->dev.parent, NULL);
 	if (!regmap)
 		return -ENODEV;
 
-	pm_power_off = sc27xx_poweroff_do_poweroff;
 	register_syscore_ops(&poweroff_syscore_ops);
-	return 0;
+
+	return devm_register_sys_off_handler(&pdev->dev,
+					     SYS_OFF_MODE_POWER_OFF,
+					     SYS_OFF_PRIO_DEFAULT,
+					     sc27xx_poweroff_do_poweroff,
+					     regmap);
 }
 
 static struct platform_driver sc27xx_poweroff_driver = {

-- 
2.50.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 4/5] power: reset: sc27xx: Add support for SC2730 and OF match table
  2025-09-26 16:23 [PATCH 0/5] power: reset: sc27xx: Add SC2730 and reboot support Otto Pflüger
                   ` (2 preceding siblings ...)
  2025-09-26 16:23 ` [PATCH 3/5] power: reset: sc27xx: Use devm_register_sys_off_handler Otto Pflüger
@ 2025-09-26 16:23 ` Otto Pflüger
  2025-09-30  3:30   ` Baolin Wang
  2025-09-26 16:23 ` [PATCH 5/5] power: reset: sc27xx: Add reboot support for SC2730 Otto Pflüger
  4 siblings, 1 reply; 12+ messages in thread
From: Otto Pflüger @ 2025-09-26 16:23 UTC (permalink / raw)
  To: Sebastian Reichel, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Orson Zhai, Baolin Wang, Chunyan Zhang, Lee Jones
  Cc: linux-pm, devicetree, linux-kernel, Otto Pflüger

Add register definitions for the SC2730 PMIC. Introduce a new struct
sc27xx_poweroff_data for passing register information to the poweroff
handler. Implement device tree matching to distinguish between SC2730
and SC2731 and to probe the driver automatically.

Signed-off-by: Otto Pflüger <otto.pflueger@abscue.de>
---
 drivers/power/reset/sc27xx-poweroff.c | 67 +++++++++++++++++++++++++++++------
 1 file changed, 57 insertions(+), 10 deletions(-)

diff --git a/drivers/power/reset/sc27xx-poweroff.c b/drivers/power/reset/sc27xx-poweroff.c
index 20eb9f32cb2b99adeb16502172adf9d6257cd05f..5937f40021817ea38453705fcef6485ce79ac14c 100644
--- a/drivers/power/reset/sc27xx-poweroff.c
+++ b/drivers/power/reset/sc27xx-poweroff.c
@@ -7,16 +7,33 @@
 #include <linux/cpu.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
+#include <linux/of.h>
 #include <linux/platform_device.h>
 #include <linux/pm.h>
 #include <linux/reboot.h>
 #include <linux/regmap.h>
 #include <linux/syscore_ops.h>
 
-#define SC27XX_PWR_PD_HW	0xc2c
+#define SC2730_PWR_PD_HW	0x1820
+#define SC2730_SLP_CTRL		0x1a48
+#define SC2730_LDO_XTL_EN	BIT(2)
+
+#define SC2731_PWR_PD_HW	0xc2c
+#define SC2731_SLP_CTRL		0xdf0
+#define SC2731_LDO_XTL_EN	BIT(3)
+
 #define SC27XX_PWR_OFF_EN	BIT(0)
-#define SC27XX_SLP_CTRL		0xdf0
-#define SC27XX_LDO_XTL_EN	BIT(3)
+
+struct sc27xx_poweroff_reg_info {
+	u32 poweroff_reg;
+	u32 slp_ctrl_reg;
+	u32 ldo_xtl_en;
+};
+
+struct sc27xx_poweroff_data {
+	struct regmap *regmap;
+	const struct sc27xx_poweroff_reg_info *regs;
+};
 
 /*
  * On Spreadtrum platform, we need power off system through external SC27xx
@@ -45,12 +62,14 @@ static struct syscore_ops poweroff_syscore_ops = {
 
 static int sc27xx_poweroff_do_poweroff(struct sys_off_data *off_data)
 {
-	struct regmap *regmap = off_data->cb_data;
+	struct sc27xx_poweroff_data *data = off_data->cb_data;
 
 	/* Disable the external subsys connection's power firstly */
-	regmap_write(regmap, SC27XX_SLP_CTRL, SC27XX_LDO_XTL_EN);
+	regmap_write(data->regmap, data->regs->slp_ctrl_reg,
+		     data->regs->ldo_xtl_en);
 
-	regmap_write(regmap, SC27XX_PWR_PD_HW, SC27XX_PWR_OFF_EN);
+	regmap_write(data->regmap, data->regs->poweroff_reg,
+		     SC27XX_PWR_OFF_EN);
 
 	mdelay(1000);
 
@@ -61,10 +80,18 @@ static int sc27xx_poweroff_do_poweroff(struct sys_off_data *off_data)
 
 static int sc27xx_poweroff_probe(struct platform_device *pdev)
 {
-	struct regmap *regmap;
+	struct sc27xx_poweroff_data *data;
 
-	regmap = dev_get_regmap(pdev->dev.parent, NULL);
-	if (!regmap)
+	data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
+	if (!data)
+		return -ENOMEM;
+
+	data->regs = of_device_get_match_data(&pdev->dev);
+	if (!data->regs)
+		return -EINVAL;
+
+	data->regmap = dev_get_regmap(pdev->dev.parent, NULL);
+	if (!data->regmap)
 		return -ENODEV;
 
 	register_syscore_ops(&poweroff_syscore_ops);
@@ -73,13 +100,33 @@ static int sc27xx_poweroff_probe(struct platform_device *pdev)
 					     SYS_OFF_MODE_POWER_OFF,
 					     SYS_OFF_PRIO_DEFAULT,
 					     sc27xx_poweroff_do_poweroff,
-					     regmap);
+					     data);
 }
 
+static const struct sc27xx_poweroff_reg_info sc2730_pwr_regs = {
+	.poweroff_reg = SC2730_PWR_PD_HW,
+	.slp_ctrl_reg = SC2730_SLP_CTRL,
+	.ldo_xtl_en = SC2730_LDO_XTL_EN,
+};
+
+static const struct sc27xx_poweroff_reg_info sc2731_pwr_regs = {
+	.poweroff_reg = SC2731_PWR_PD_HW,
+	.slp_ctrl_reg = SC2731_SLP_CTRL,
+	.ldo_xtl_en = SC2731_LDO_XTL_EN,
+};
+
+static const struct of_device_id sc27xx_poweroff_of_match[] = {
+	{ .compatible = "sprd,sc2730-poweroff", .data = &sc2730_pwr_regs },
+	{ .compatible = "sprd,sc2731-poweroff", .data = &sc2731_pwr_regs },
+	{ }
+};
+MODULE_DEVICE_TABLE(of, sc27xx_poweroff_of_match);
+
 static struct platform_driver sc27xx_poweroff_driver = {
 	.probe = sc27xx_poweroff_probe,
 	.driver = {
 		.name = "sc27xx-poweroff",
+		.of_match_table = sc27xx_poweroff_of_match,
 	},
 };
 module_platform_driver(sc27xx_poweroff_driver);

-- 
2.50.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 5/5] power: reset: sc27xx: Add reboot support for SC2730
  2025-09-26 16:23 [PATCH 0/5] power: reset: sc27xx: Add SC2730 and reboot support Otto Pflüger
                   ` (3 preceding siblings ...)
  2025-09-26 16:23 ` [PATCH 4/5] power: reset: sc27xx: Add support for SC2730 and OF match table Otto Pflüger
@ 2025-09-26 16:23 ` Otto Pflüger
  4 siblings, 0 replies; 12+ messages in thread
From: Otto Pflüger @ 2025-09-26 16:23 UTC (permalink / raw)
  To: Sebastian Reichel, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Orson Zhai, Baolin Wang, Chunyan Zhang, Lee Jones
  Cc: linux-pm, devicetree, linux-kernel, Otto Pflüger

Unlike SC2731, the SC2730 PMIC also provides dedicated registers for
resetting the hardware. Use them to implement reboot support.

Signed-off-by: Otto Pflüger <otto.pflueger@abscue.de>
---
 drivers/power/reset/sc27xx-poweroff.c | 89 +++++++++++++++++++++++++++++++++++
 1 file changed, 89 insertions(+)

diff --git a/drivers/power/reset/sc27xx-poweroff.c b/drivers/power/reset/sc27xx-poweroff.c
index 5937f40021817ea38453705fcef6485ce79ac14c..1dfa54675b3e7b8b79212dc9950d97b726dd5acc 100644
--- a/drivers/power/reset/sc27xx-poweroff.c
+++ b/drivers/power/reset/sc27xx-poweroff.c
@@ -18,16 +18,42 @@
 #define SC2730_SLP_CTRL		0x1a48
 #define SC2730_LDO_XTL_EN	BIT(2)
 
+#define SC2730_SOFT_RST_HW	0x1824
+#define SC2730_RST_STATUS	0x1bac
+#define SC2730_SWRST_CTRL0	0x1bf8
+
 #define SC2731_PWR_PD_HW	0xc2c
 #define SC2731_SLP_CTRL		0xdf0
 #define SC2731_LDO_XTL_EN	BIT(3)
 
 #define SC27XX_PWR_OFF_EN	BIT(0)
+#define SC27XX_SOFT_RST_EN	BIT(4)
+#define SC27XX_RESET		BIT(0)
+
+#define HWRST_STATUS_SECURITY		0x02
+#define HWRST_STATUS_RECOVERY		0x20
+#define HWRST_STATUS_NORMAL		0x40
+#define HWRST_STATUS_ALARM		0x50
+#define HWRST_STATUS_SLEEP		0x60
+#define HWRST_STATUS_FASTBOOT		0x30
+#define HWRST_STATUS_SPECIAL		0x70
+#define HWRST_STATUS_PANIC		0x80
+#define HWRST_STATUS_CFTREBOOT		0x90
+#define HWRST_STATUS_AUTODLOADER	0xa0
+#define HWRST_STATUS_IQMODE		0xb0
+#define HWRST_STATUS_SPRDISK		0xc0
+#define HWRST_STATUS_FACTORYTEST	0xe0
+#define HWRST_STATUS_WATCHDOG		0xf0
+#define HWRST_STATUS_MASK		0xf0
 
 struct sc27xx_poweroff_reg_info {
 	u32 poweroff_reg;
 	u32 slp_ctrl_reg;
 	u32 ldo_xtl_en;
+
+	u32 reset_reg;
+	u32 rst_sts_reg;
+	u32 swrst_ctrl_reg;
 };
 
 struct sc27xx_poweroff_data {
@@ -78,9 +104,59 @@ static int sc27xx_poweroff_do_poweroff(struct sys_off_data *off_data)
 	return NOTIFY_DONE;
 }
 
+static int sc27xx_restart(struct sys_off_data *off_data)
+{
+	struct sc27xx_poweroff_data *data = off_data->cb_data;
+	u32 reboot_mode = 0;
+
+	if (!off_data->cmd)
+		reboot_mode = HWRST_STATUS_NORMAL;
+	else if (!strcmp(off_data->cmd, "recovery"))
+		reboot_mode = HWRST_STATUS_RECOVERY;
+	else if (!strcmp(off_data->cmd, "alarm"))
+		reboot_mode = HWRST_STATUS_ALARM;
+	else if (!strcmp(off_data->cmd, "fastsleep"))
+		reboot_mode = HWRST_STATUS_SLEEP;
+	else if (!strcmp(off_data->cmd, "bootloader"))
+		reboot_mode = HWRST_STATUS_FASTBOOT;
+	else if (!strcmp(off_data->cmd, "panic"))
+		reboot_mode = HWRST_STATUS_PANIC;
+	else if (!strcmp(off_data->cmd, "special"))
+		reboot_mode = HWRST_STATUS_SPECIAL;
+	else if (!strcmp(off_data->cmd, "cftreboot"))
+		reboot_mode = HWRST_STATUS_CFTREBOOT;
+	else if (!strcmp(off_data->cmd, "autodloader"))
+		reboot_mode = HWRST_STATUS_AUTODLOADER;
+	else if (!strcmp(off_data->cmd, "iqmode"))
+		reboot_mode = HWRST_STATUS_IQMODE;
+	else if (!strcmp(off_data->cmd, "sprdisk"))
+		reboot_mode = HWRST_STATUS_SPRDISK;
+	else if (!strcmp(off_data->cmd, "tospanic"))
+		reboot_mode = HWRST_STATUS_SECURITY;
+	else if (!strcmp(off_data->cmd, "factorytest"))
+		reboot_mode = HWRST_STATUS_FACTORYTEST;
+	else
+		reboot_mode = HWRST_STATUS_NORMAL;
+
+	regmap_update_bits(data->regmap, data->regs->rst_sts_reg,
+			   HWRST_STATUS_MASK, reboot_mode);
+
+	regmap_set_bits(data->regmap, data->regs->swrst_ctrl_reg,
+			SC27XX_SOFT_RST_EN);
+
+	regmap_write(data->regmap, data->regs->reset_reg, SC27XX_RESET);
+
+	mdelay(1000);
+
+	pr_emerg("Unable to restart system\n");
+
+	return NOTIFY_DONE;
+}
+
 static int sc27xx_poweroff_probe(struct platform_device *pdev)
 {
 	struct sc27xx_poweroff_data *data;
+	int ret;
 
 	data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
 	if (!data)
@@ -96,6 +172,15 @@ static int sc27xx_poweroff_probe(struct platform_device *pdev)
 
 	register_syscore_ops(&poweroff_syscore_ops);
 
+	if (data->regs->reset_reg) {
+		ret = devm_register_sys_off_handler(&pdev->dev,
+						    SYS_OFF_MODE_RESTART,
+						    192, sc27xx_restart,
+						    data);
+		if (ret)
+			return ret;
+	}
+
 	return devm_register_sys_off_handler(&pdev->dev,
 					     SYS_OFF_MODE_POWER_OFF,
 					     SYS_OFF_PRIO_DEFAULT,
@@ -107,6 +192,10 @@ static const struct sc27xx_poweroff_reg_info sc2730_pwr_regs = {
 	.poweroff_reg = SC2730_PWR_PD_HW,
 	.slp_ctrl_reg = SC2730_SLP_CTRL,
 	.ldo_xtl_en = SC2730_LDO_XTL_EN,
+
+	.reset_reg = SC2730_SOFT_RST_HW,
+	.rst_sts_reg = SC2730_RST_STATUS,
+	.swrst_ctrl_reg = SC2730_SWRST_CTRL0,
 };
 
 static const struct sc27xx_poweroff_reg_info sc2731_pwr_regs = {

-- 
2.50.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/5] power: reset: sc27xx: Use devm_register_sys_off_handler
  2025-09-26 16:23 ` [PATCH 3/5] power: reset: sc27xx: Use devm_register_sys_off_handler Otto Pflüger
@ 2025-09-30  3:23   ` Baolin Wang
  0 siblings, 0 replies; 12+ messages in thread
From: Baolin Wang @ 2025-09-30  3:23 UTC (permalink / raw)
  To: Otto Pflüger, Sebastian Reichel, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Orson Zhai, Chunyan Zhang,
	Lee Jones
  Cc: linux-pm, devicetree, linux-kernel



On 2025/9/27 00:23, Otto Pflüger wrote:
> Use the new device life-cycle managed register function to remove the
> need for global variables in the driver.
> 
> Signed-off-by: Otto Pflüger <otto.pflueger@abscue.de>
> ---

LGTM. Thanks.
Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>

>   drivers/power/reset/sc27xx-poweroff.c | 24 +++++++++++++++++-------
>   1 file changed, 17 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/power/reset/sc27xx-poweroff.c b/drivers/power/reset/sc27xx-poweroff.c
> index 90287c31992c4889f9241e82a21a1949ecca7702..20eb9f32cb2b99adeb16502172adf9d6257cd05f 100644
> --- a/drivers/power/reset/sc27xx-poweroff.c
> +++ b/drivers/power/reset/sc27xx-poweroff.c
> @@ -9,6 +9,7 @@
>   #include <linux/module.h>
>   #include <linux/platform_device.h>
>   #include <linux/pm.h>
> +#include <linux/reboot.h>
>   #include <linux/regmap.h>
>   #include <linux/syscore_ops.h>
>   
> @@ -17,8 +18,6 @@
>   #define SC27XX_SLP_CTRL		0xdf0
>   #define SC27XX_LDO_XTL_EN	BIT(3)
>   
> -static struct regmap *regmap;
> -
>   /*
>    * On Spreadtrum platform, we need power off system through external SC27xx
>    * series PMICs, and it is one similar SPI bus mapped by regmap to access PMIC,
> @@ -44,26 +43,37 @@ static struct syscore_ops poweroff_syscore_ops = {
>   	.shutdown = sc27xx_poweroff_shutdown,
>   };
>   
> -static void sc27xx_poweroff_do_poweroff(void)
> +static int sc27xx_poweroff_do_poweroff(struct sys_off_data *off_data)
>   {
> +	struct regmap *regmap = off_data->cb_data;
> +
>   	/* Disable the external subsys connection's power firstly */
>   	regmap_write(regmap, SC27XX_SLP_CTRL, SC27XX_LDO_XTL_EN);
>   
>   	regmap_write(regmap, SC27XX_PWR_PD_HW, SC27XX_PWR_OFF_EN);
> +
> +	mdelay(1000);
> +
> +	pr_emerg("Unable to poweroff system\n");
> +
> +	return NOTIFY_DONE;
>   }
>   
>   static int sc27xx_poweroff_probe(struct platform_device *pdev)
>   {
> -	if (regmap)
> -		return -EINVAL;
> +	struct regmap *regmap;
>   
>   	regmap = dev_get_regmap(pdev->dev.parent, NULL);
>   	if (!regmap)
>   		return -ENODEV;
>   
> -	pm_power_off = sc27xx_poweroff_do_poweroff;
>   	register_syscore_ops(&poweroff_syscore_ops);
> -	return 0;
> +
> +	return devm_register_sys_off_handler(&pdev->dev,
> +					     SYS_OFF_MODE_POWER_OFF,
> +					     SYS_OFF_PRIO_DEFAULT,
> +					     sc27xx_poweroff_do_poweroff,
> +					     regmap);
>   }
>   
>   static struct platform_driver sc27xx_poweroff_driver = {
> 


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 4/5] power: reset: sc27xx: Add support for SC2730 and OF match table
  2025-09-26 16:23 ` [PATCH 4/5] power: reset: sc27xx: Add support for SC2730 and OF match table Otto Pflüger
@ 2025-09-30  3:30   ` Baolin Wang
  2025-09-30  5:30     ` Otto Pflüger
  0 siblings, 1 reply; 12+ messages in thread
From: Baolin Wang @ 2025-09-30  3:30 UTC (permalink / raw)
  To: Otto Pflüger, Sebastian Reichel, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Orson Zhai, Chunyan Zhang,
	Lee Jones
  Cc: linux-pm, devicetree, linux-kernel



On 2025/9/27 00:23, Otto Pflüger wrote:
> Add register definitions for the SC2730 PMIC. Introduce a new struct
> sc27xx_poweroff_data for passing register information to the poweroff
> handler. Implement device tree matching to distinguish between SC2730
> and SC2731 and to probe the driver automatically.
> 
> Signed-off-by: Otto Pflüger <otto.pflueger@abscue.de>
> ---

If I remember correctly, the original driver supported SC2730 and SC2731 
chips. Are you sure the current changes are still needed? Have you 
tested them on the SC2730 chip?


config POWER_RESET_SC27XX
         tristate "Spreadtrum SC27xx PMIC power-off driver"
         depends on MFD_SC27XX_PMIC || COMPILE_TEST
         help
           This driver supports powering off a system through
           Spreadtrum SC27xx series PMICs. The SC27xx series
           PMICs includes the SC2720, SC2721, SC2723, SC2730
           and SC2731 chips.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 4/5] power: reset: sc27xx: Add support for SC2730 and OF match table
  2025-09-30  3:30   ` Baolin Wang
@ 2025-09-30  5:30     ` Otto Pflüger
  2025-10-14  1:44       ` Baolin Wang
  0 siblings, 1 reply; 12+ messages in thread
From: Otto Pflüger @ 2025-09-30  5:30 UTC (permalink / raw)
  To: Baolin Wang
  Cc: Sebastian Reichel, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Orson Zhai, Chunyan Zhang, Lee Jones, linux-pm, devicetree,
	linux-kernel

On Tue, Sep 30, 2025 at 11:30:16AM +0800, Baolin Wang wrote:
> 
> If I remember correctly, the original driver supported SC2730 and SC2731
> chips. Are you sure the current changes are still needed? Have you tested
> them on the SC2730 chip?
> 
> 
> config POWER_RESET_SC27XX
>         tristate "Spreadtrum SC27xx PMIC power-off driver"
>         depends on MFD_SC27XX_PMIC || COMPILE_TEST
>         help
>           This driver supports powering off a system through
>           Spreadtrum SC27xx series PMICs. The SC27xx series
>           PMICs includes the SC2720, SC2721, SC2723, SC2730
>           and SC2731 chips.

The driver was hard-coded to use registers 0xc2c and 0xdf0. SC2730 has
different registers, which were added to the downstream version of the
driver in [1]. I have tested this with a UMS9230 phone which has an
SC2730 PMIC according to the device tree.

[1]: https://github.com/MotorolaMobilityLLC/kernel-sprd/commit/6165e1afe3eba33089fecc86767d47af9ab176d6

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/5] dt-bindings: mfd: sc2731: Reference sprd,sc2731-poweroff
  2025-09-26 16:23 ` [PATCH 2/5] dt-bindings: mfd: sc2731: Reference sprd,sc2731-poweroff Otto Pflüger
@ 2025-10-02  2:53   ` Rob Herring
  0 siblings, 0 replies; 12+ messages in thread
From: Rob Herring @ 2025-10-02  2:53 UTC (permalink / raw)
  To: Otto Pflüger
  Cc: Sebastian Reichel, Krzysztof Kozlowski, Conor Dooley, Orson Zhai,
	Baolin Wang, Chunyan Zhang, Lee Jones, linux-pm, devicetree,
	linux-kernel

On Fri, Sep 26, 2025 at 06:23:24PM +0200, Otto Pflüger wrote:
> Reference the new sprd,sc2731-poweroff bindings and add an example.
> 
> Signed-off-by: Otto Pflüger <otto.pflueger@abscue.de>
> ---
>  Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml b/Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml
> index b023e1ef8d3ccdb1d82d64ed1a60d5a712a1b910..a78d7e26b3a2c77b84da84fc23e52f3a22ab14df 100644
> --- a/Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml
> +++ b/Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml
> @@ -52,6 +52,10 @@ properties:
>    '#size-cells':
>      const: 0
>  
> +  poweroff:
> +    type: object
> +    $ref: /schemas/power/reset/sprd,sc2731-poweroff.yaml#

You don't need a child node here as there's no DT resources. Just make 
the parent node the power off provider.

IOW, a node with only a compatible property is pretty much always wrong 
(though yes, you can find examples).

> +
>    regulators:
>      type: object
>      $ref: /schemas/regulator/sprd,sc2731-regulator.yaml#
> @@ -221,6 +225,10 @@ examples:
>            reg = <0xec8>;
>          };
>  
> +        poweroff {
> +          compatible = "sprd,sc2731-poweroff";
> +        };
> +
>          regulators {
>            compatible = "sprd,sc2731-regulator";
>  
> 
> -- 
> 2.50.0
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 4/5] power: reset: sc27xx: Add support for SC2730 and OF match table
  2025-09-30  5:30     ` Otto Pflüger
@ 2025-10-14  1:44       ` Baolin Wang
  2025-10-14  6:10         ` Otto Pflüger
  0 siblings, 1 reply; 12+ messages in thread
From: Baolin Wang @ 2025-10-14  1:44 UTC (permalink / raw)
  To: Otto Pflüger
  Cc: Sebastian Reichel, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Orson Zhai, Chunyan Zhang, Lee Jones, linux-pm, devicetree,
	linux-kernel



On 2025/9/30 13:30, Otto Pflüger wrote:
> On Tue, Sep 30, 2025 at 11:30:16AM +0800, Baolin Wang wrote:
>>
>> If I remember correctly, the original driver supported SC2730 and SC2731
>> chips. Are you sure the current changes are still needed? Have you tested
>> them on the SC2730 chip?
>>
>>
>> config POWER_RESET_SC27XX
>>          tristate "Spreadtrum SC27xx PMIC power-off driver"
>>          depends on MFD_SC27XX_PMIC || COMPILE_TEST
>>          help
>>            This driver supports powering off a system through
>>            Spreadtrum SC27xx series PMICs. The SC27xx series
>>            PMICs includes the SC2720, SC2721, SC2723, SC2730
>>            and SC2731 chips.
> 
> The driver was hard-coded to use registers 0xc2c and 0xdf0. SC2730 has
> different registers, which were added to the downstream version of the
> driver in [1]. I have tested this with a UMS9230 phone which has an
> SC2730 PMIC according to the device tree.
> 
> [1]: https://github.com/MotorolaMobilityLLC/kernel-sprd/commit/6165e1afe3eba33089fecc86767d47af9ab176d6

OK. Thanks.
Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 4/5] power: reset: sc27xx: Add support for SC2730 and OF match table
  2025-10-14  1:44       ` Baolin Wang
@ 2025-10-14  6:10         ` Otto Pflüger
  0 siblings, 0 replies; 12+ messages in thread
From: Otto Pflüger @ 2025-10-14  6:10 UTC (permalink / raw)
  To: Baolin Wang
  Cc: Sebastian Reichel, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Orson Zhai, Chunyan Zhang, Lee Jones, linux-pm, devicetree,
	linux-kernel

On Tue, Oct 14, 2025 at 09:44:15AM +0800, Baolin Wang wrote:
> [...]
> > 
> > The driver was hard-coded to use registers 0xc2c and 0xdf0. SC2730 has
> > different registers, which were added to the downstream version of the
> > driver in [1]. I have tested this with a UMS9230 phone which has an
> > SC2730 PMIC according to the device tree.
> > 
> > [1]: https://github.com/MotorolaMobilityLLC/kernel-sprd/commit/6165e1afe3eba33089fecc86767d47af9ab176d6
> 
> OK. Thanks.
> Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>

Please note that due to the feedback about the use of empty device tree
nodes, I have switched to a different approach and sent an alternative
patch as a follow-up to this one:

https://lore.kernel.org/all/20251007-sc27xx-mfd-poweroff-v1-0-89a2f919b731@abscue.de/

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2025-10-14  6:11 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-26 16:23 [PATCH 0/5] power: reset: sc27xx: Add SC2730 and reboot support Otto Pflüger
2025-09-26 16:23 ` [PATCH 1/5] dt-bindings: power: reset: Add SC27xx series PMIC poweroff Otto Pflüger
2025-09-26 16:23 ` [PATCH 2/5] dt-bindings: mfd: sc2731: Reference sprd,sc2731-poweroff Otto Pflüger
2025-10-02  2:53   ` Rob Herring
2025-09-26 16:23 ` [PATCH 3/5] power: reset: sc27xx: Use devm_register_sys_off_handler Otto Pflüger
2025-09-30  3:23   ` Baolin Wang
2025-09-26 16:23 ` [PATCH 4/5] power: reset: sc27xx: Add support for SC2730 and OF match table Otto Pflüger
2025-09-30  3:30   ` Baolin Wang
2025-09-30  5:30     ` Otto Pflüger
2025-10-14  1:44       ` Baolin Wang
2025-10-14  6:10         ` Otto Pflüger
2025-09-26 16:23 ` [PATCH 5/5] power: reset: sc27xx: Add reboot support for SC2730 Otto Pflüger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).