linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3] mfd: rk808: add reboot support to rk808.c
@ 2021-12-20 17:06 Peter Geis
  2021-12-21 15:56 ` Dmitry Osipenko
  0 siblings, 1 reply; 7+ messages in thread
From: Peter Geis @ 2021-12-20 17:06 UTC (permalink / raw)
  To: Lee Jones
  Cc: Peter Geis, Robin Murphy, Heiko Stuebner, linux-rockchip,
	Nicolas Frattaroli, Dmitry Osipenko, Frank Wunderlich,
	linux-kernel

This adds reboot support to the rk808 pmic driver and enables it for
the rk809 and rk817 devices.
This only enables if the rockchip,system-power-controller flag is set.

Signed-off-by: Peter Geis <pgwipeout@gmail.com>
Signed-off-by: Frank Wunderlich <frank-w@public-files.de>
Reviewed-by: Dmitry Osipenko <digetx@gmail.com>
---
This patch was created to address issues with psci-reset on rk356x
chips. Until the rk356x series ATF open source code is released so we
can fix the issue at the source, this is the only way to ensure reliable
resetting on devices using these chips.

After testing the rk808 (thanks Robin!), it was found DEV_OFF_RST does
not reset the PMIC to a power on state. Since the rk805 and rk818 match
this register layout, I'm removing support for all three in the v2.
It may be possible to add support to them using an RTC wakeup, but that
has not been explored and is outside the scope of this patch.

Changelog:
V4:
- reorder rk808_restart_notify (Thanks Dmitry)
- drop of_property_read_bool before unregister (Good catch Frank)

V3: Thanks Dmitry!
- Adjust priority to be in line with other pmic drivers
- Move ret handling to case switch
- Make default registration debug
- Add unregister function on removal

V2:
- Squash the patch from Frank Wunderlich for rk809 support.
- Remove support for the rk805, rk808, and rk818 devices.
- Only register the reset handler for supported devices.
- Remove unnecessary dev_err and dev_warn statements.
- Register the reset handler directly

 drivers/mfd/rk808.c       | 44 +++++++++++++++++++++++++++++++++++++++
 include/linux/mfd/rk808.h |  1 +
 2 files changed, 45 insertions(+)

diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
index b181fe401330..874d461dda44 100644
--- a/drivers/mfd/rk808.c
+++ b/drivers/mfd/rk808.c
@@ -19,6 +19,7 @@
 #include <linux/module.h>
 #include <linux/of_device.h>
 #include <linux/regmap.h>
+#include <linux/reboot.h>
 
 struct rk808_reg_data {
 	int addr;
@@ -543,6 +544,7 @@ static void rk808_pm_power_off(void)
 		reg = RK808_DEVCTRL_REG,
 		bit = DEV_OFF_RST;
 		break;
+	case RK809_ID:
 	case RK817_ID:
 		reg = RK817_SYS_CFG(3);
 		bit = DEV_OFF;
@@ -559,6 +561,34 @@ static void rk808_pm_power_off(void)
 		dev_err(&rk808_i2c_client->dev, "Failed to shutdown device!\n");
 }
 
+static int rk808_restart_notify(struct notifier_block *this, unsigned long mode, void *cmd)
+{
+	struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
+	unsigned int reg, bit;
+	int ret;
+
+	switch (rk808->variant) {
+	case RK809_ID:
+	case RK817_ID:
+		reg = RK817_SYS_CFG(3);
+		bit = DEV_RST;
+		break;
+
+	default:
+		return NOTIFY_DONE;
+	}
+	ret = regmap_update_bits(rk808->regmap, reg, bit, bit);
+	if (ret)
+		dev_err(&rk808_i2c_client->dev, "Failed to restart device!\n");
+
+	return NOTIFY_DONE;
+}
+
+static struct notifier_block rk808_restart_handler = {
+	.notifier_call = rk808_restart_notify,
+	.priority = 192,
+};
+
 static void rk8xx_shutdown(struct i2c_client *client)
 {
 	struct rk808 *rk808 = i2c_get_clientdata(client);
@@ -727,6 +757,18 @@ static int rk808_probe(struct i2c_client *client,
 	if (of_property_read_bool(np, "rockchip,system-power-controller")) {
 		rk808_i2c_client = client;
 		pm_power_off = rk808_pm_power_off;
+
+		switch (rk808->variant) {
+		case RK809_ID:
+		case RK817_ID:
+			ret = register_restart_handler(&rk808_restart_handler);
+			if (ret)
+				dev_warn(&client->dev, "failed to register restart handler, %d\n", ret);
+			break;
+		default:
+			dev_dbg(&client->dev, "pmic controlled board reset not supported\n");
+			break;
+		}
 	}
 
 	return 0;
@@ -749,6 +791,8 @@ static int rk808_remove(struct i2c_client *client)
 	if (pm_power_off == rk808_pm_power_off)
 		pm_power_off = NULL;
 
+	unregister_restart_handler(&rk808_restart_handler);
+
 	return 0;
 }
 
diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h
index a96e6d43ca06..58602032e642 100644
--- a/include/linux/mfd/rk808.h
+++ b/include/linux/mfd/rk808.h
@@ -373,6 +373,7 @@ enum rk805_reg {
 #define SWITCH2_EN	BIT(6)
 #define SWITCH1_EN	BIT(5)
 #define DEV_OFF_RST	BIT(3)
+#define DEV_RST		BIT(2)
 #define DEV_OFF		BIT(0)
 #define RTC_STOP	BIT(0)
 
-- 
2.25.1


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

* Re: [PATCH v3] mfd: rk808: add reboot support to rk808.c
  2021-12-20 17:06 [PATCH v3] mfd: rk808: add reboot support to rk808.c Peter Geis
@ 2021-12-21 15:56 ` Dmitry Osipenko
  0 siblings, 0 replies; 7+ messages in thread
From: Dmitry Osipenko @ 2021-12-21 15:56 UTC (permalink / raw)
  To: Peter Geis, Lee Jones
  Cc: Robin Murphy, Heiko Stuebner, linux-rockchip, Nicolas Frattaroli,
	Frank Wunderlich, linux-kernel

20.12.2021 20:06, Peter Geis пишет:
> This adds reboot support to the rk808 pmic driver and enables it for
> the rk809 and rk817 devices.
> This only enables if the rockchip,system-power-controller flag is set.
> 
> Signed-off-by: Peter Geis <pgwipeout@gmail.com>
> Signed-off-by: Frank Wunderlich <frank-w@public-files.de>
> Reviewed-by: Dmitry Osipenko <digetx@gmail.com>
> ---
> This patch was created to address issues with psci-reset on rk356x
> chips. Until the rk356x series ATF open source code is released so we
> can fix the issue at the source, this is the only way to ensure reliable
> resetting on devices using these chips.
> 
> After testing the rk808 (thanks Robin!), it was found DEV_OFF_RST does
> not reset the PMIC to a power on state. Since the rk805 and rk818 match
> this register layout, I'm removing support for all three in the v2.
> It may be possible to add support to them using an RTC wakeup, but that
> has not been explored and is outside the scope of this patch.
> 
> Changelog:
> V4:
> - reorder rk808_restart_notify (Thanks Dmitry)
> - drop of_property_read_bool before unregister (Good catch Frank)

Might be better to resend it with v4 in the commit title, to avoid
confusion.

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

* Re: [PATCH v3] mfd: rk808: add reboot support to rk808.c
  2021-12-21  9:10     ` Frank Wunderlich
@ 2021-12-22 11:09       ` Lee Jones
  0 siblings, 0 replies; 7+ messages in thread
From: Lee Jones @ 2021-12-22 11:09 UTC (permalink / raw)
  To: Frank Wunderlich
  Cc: Peter Geis, Robin Murphy, Heiko Stuebner, linux-rockchip,
	Nicolas Frattaroli, Dmitry Osipenko, linux-kernel

On Tue, 21 Dec 2021, Frank Wunderlich wrote:

> Am 21. Dezember 2021 09:48:43 MEZ schrieb Lee Jones <lee.jones@linaro.org>:
> >On Mon, 20 Dec 2021, Frank Wunderlich wrote:
> >
> >> Hi
> >> 
> >> > Gesendet: Montag, 20. Dezember 2021 um 15:46 Uhr
> >> > Von: "Peter Geis" <pgwipeout@gmail.com>
> >> > @@ -749,6 +791,9 @@ static int rk808_remove(struct i2c_client
> >*client)
> >> >  	if (pm_power_off == rk808_pm_power_off)
> >> >  		pm_power_off = NULL;
> >> >
> >> > +	if (of_property_read_bool(np,
> >"rockchip,system-power-controller"))
> >> > +		unregister_restart_handler(&rk808_restart_handler);
> >> > +
> >> >  	return 0;
> >> >  }
> >> 
> >> this change misses a declaration
> >> 
> >> struct device_node *np = client->dev.of_node;
> >
> >How did this compile when you tested it?
> 
> Here i have squashed the change in:
> 
> https://github.com/frank-w/BPI-R2-4.14/commit/06430ffcb6d58d33014fb940256de77807ed620f
> 
> With the change i can compile it...

Not sure I understand.

Please make sure all patches you send for inclusion into the Linux
kernel are fully tested.  They should also be bisectable i.e. not
depend on patches applied *on top*.

> But in v4 (patch is tagged as v3 too) the of_property_read_bool was dropped completely.
> regards Frank

-- 
Lee Jones [李琼斯]
Senior Technical Lead - Developer Services
Linaro.org │ Open source software for Arm SoCs
Follow Linaro: Facebook | Twitter | Blog

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

* Re: [PATCH v3] mfd: rk808: add reboot support to rk808.c
  2021-12-21  8:48   ` Lee Jones
@ 2021-12-21  9:10     ` Frank Wunderlich
  2021-12-22 11:09       ` Lee Jones
  0 siblings, 1 reply; 7+ messages in thread
From: Frank Wunderlich @ 2021-12-21  9:10 UTC (permalink / raw)
  To: Lee Jones
  Cc: Peter Geis, Robin Murphy, Heiko Stuebner, linux-rockchip,
	Nicolas Frattaroli, Dmitry Osipenko, linux-kernel

Am 21. Dezember 2021 09:48:43 MEZ schrieb Lee Jones <lee.jones@linaro.org>:
>On Mon, 20 Dec 2021, Frank Wunderlich wrote:
>
>> Hi
>> 
>> > Gesendet: Montag, 20. Dezember 2021 um 15:46 Uhr
>> > Von: "Peter Geis" <pgwipeout@gmail.com>
>> > @@ -749,6 +791,9 @@ static int rk808_remove(struct i2c_client
>*client)
>> >  	if (pm_power_off == rk808_pm_power_off)
>> >  		pm_power_off = NULL;
>> >
>> > +	if (of_property_read_bool(np,
>"rockchip,system-power-controller"))
>> > +		unregister_restart_handler(&rk808_restart_handler);
>> > +
>> >  	return 0;
>> >  }
>> 
>> this change misses a declaration
>> 
>> struct device_node *np = client->dev.of_node;
>
>How did this compile when you tested it?

Here i have squashed the change in:

https://github.com/frank-w/BPI-R2-4.14/commit/06430ffcb6d58d33014fb940256de77807ed620f

With the change i can compile it...

But in v4 (patch is tagged as v3 too) the of_property_read_bool was dropped completely.
regards Frank

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

* Re: [PATCH v3] mfd: rk808: add reboot support to rk808.c
  2021-12-20 16:33 ` Aw: " Frank Wunderlich
@ 2021-12-21  8:48   ` Lee Jones
  2021-12-21  9:10     ` Frank Wunderlich
  0 siblings, 1 reply; 7+ messages in thread
From: Lee Jones @ 2021-12-21  8:48 UTC (permalink / raw)
  To: Frank Wunderlich
  Cc: Peter Geis, Robin Murphy, Heiko Stuebner, linux-rockchip,
	Nicolas Frattaroli, Dmitry Osipenko, linux-kernel

On Mon, 20 Dec 2021, Frank Wunderlich wrote:

> Hi
> 
> > Gesendet: Montag, 20. Dezember 2021 um 15:46 Uhr
> > Von: "Peter Geis" <pgwipeout@gmail.com>
> > @@ -749,6 +791,9 @@ static int rk808_remove(struct i2c_client *client)
> >  	if (pm_power_off == rk808_pm_power_off)
> >  		pm_power_off = NULL;
> >
> > +	if (of_property_read_bool(np, "rockchip,system-power-controller"))
> > +		unregister_restart_handler(&rk808_restart_handler);
> > +
> >  	return 0;
> >  }
> 
> this change misses a declaration
> 
> struct device_node *np = client->dev.of_node;

How did this compile when you tested it?

-- 
Lee Jones [李琼斯]
Senior Technical Lead - Developer Services
Linaro.org │ Open source software for Arm SoCs
Follow Linaro: Facebook | Twitter | Blog

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

* Re: [PATCH v3] mfd: rk808: add reboot support to rk808.c
  2021-12-20 14:46 Peter Geis
@ 2021-12-20 14:53 ` Dmitry Osipenko
  2021-12-20 16:33 ` Aw: " Frank Wunderlich
  1 sibling, 0 replies; 7+ messages in thread
From: Dmitry Osipenko @ 2021-12-20 14:53 UTC (permalink / raw)
  To: Peter Geis, Lee Jones
  Cc: Robin Murphy, Heiko Stuebner, linux-rockchip, Nicolas Frattaroli,
	Frank Wunderlich, linux-kernel

20.12.2021 17:46, Peter Geis пишет:
> +static int rk808_restart_notify(struct notifier_block *this, unsigned long mode, void *cmd)
> +{
> +	int ret;
> +	unsigned int reg, bit;
> +	struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);

Such code usually should be written in a form of reverse Xmas tree in
kernel, but no need to respin just because of it. The patch looks good
to me, thank you.

Reviewed-by: Dmitry Osipenko <digetx@gmail.com>

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

* [PATCH v3] mfd: rk808: add reboot support to rk808.c
@ 2021-12-20 14:46 Peter Geis
  2021-12-20 14:53 ` Dmitry Osipenko
  2021-12-20 16:33 ` Aw: " Frank Wunderlich
  0 siblings, 2 replies; 7+ messages in thread
From: Peter Geis @ 2021-12-20 14:46 UTC (permalink / raw)
  To: Lee Jones
  Cc: Peter Geis, Robin Murphy, Heiko Stuebner, linux-rockchip,
	Nicolas Frattaroli, Dmitry Osipenko, Frank Wunderlich,
	linux-kernel

This adds reboot support to the rk808 pmic driver and enables it for
the rk809 and rk817 devices.
This only enables if the rockchip,system-power-controller flag is set.

Signed-off-by: Peter Geis <pgwipeout@gmail.com>
Signed-off-by: Frank Wunderlich <frank-w@public-files.de>
---
This patch was created to address issues with psci-reset on rk356x
chips. Until the rk356x series ATF open source code is released so we
can fix the issue at the source, this is the only way to ensure reliable
resetting on devices using these chips.

After testing the rk808 (thanks Robin!), it was found DEV_OFF_RST does
not reset the PMIC to a power on state. Since the rk805 and rk818 match
this register layout, I'm removing support for all three in the v2.
It may be possible to add support to them using an RTC wakeup, but that
has not been explored and is outside the scope of this patch.

Changelog:
V3: Thanks Dmitry!
- Adjust priority to be in line with other pmic drivers
- Move ret handling to case switch
- Make default registration debug
- Add unregister function on removal

V2:
- Squash the patch from Frank Wunderlich for rk809 support.
- Remove support for the rk805, rk808, and rk818 devices.
- Only register the reset handler for supported devices.
- Remove unnecessary dev_err and dev_warn statements.
- Register the reset handler directly

 drivers/mfd/rk808.c       | 45 +++++++++++++++++++++++++++++++++++++++
 include/linux/mfd/rk808.h |  1 +
 2 files changed, 46 insertions(+)

diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
index b181fe401330..f3a79e23ac6e 100644
--- a/drivers/mfd/rk808.c
+++ b/drivers/mfd/rk808.c
@@ -19,6 +19,7 @@
 #include <linux/module.h>
 #include <linux/of_device.h>
 #include <linux/regmap.h>
+#include <linux/reboot.h>
 
 struct rk808_reg_data {
 	int addr;
@@ -543,6 +544,7 @@ static void rk808_pm_power_off(void)
 		reg = RK808_DEVCTRL_REG,
 		bit = DEV_OFF_RST;
 		break;
+	case RK809_ID:
 	case RK817_ID:
 		reg = RK817_SYS_CFG(3);
 		bit = DEV_OFF;
@@ -559,6 +561,34 @@ static void rk808_pm_power_off(void)
 		dev_err(&rk808_i2c_client->dev, "Failed to shutdown device!\n");
 }
 
+static int rk808_restart_notify(struct notifier_block *this, unsigned long mode, void *cmd)
+{
+	int ret;
+	unsigned int reg, bit;
+	struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
+
+	switch (rk808->variant) {
+	case RK809_ID:
+	case RK817_ID:
+		reg = RK817_SYS_CFG(3);
+		bit = DEV_RST;
+		break;
+
+	default:
+		return NOTIFY_DONE;
+	}
+	ret = regmap_update_bits(rk808->regmap, reg, bit, bit);
+	if (ret)
+		dev_err(&rk808_i2c_client->dev, "Failed to restart device!\n");
+
+	return NOTIFY_DONE;
+}
+
+static struct notifier_block rk808_restart_handler = {
+	.notifier_call = rk808_restart_notify,
+	.priority = 192,
+};
+
 static void rk8xx_shutdown(struct i2c_client *client)
 {
 	struct rk808 *rk808 = i2c_get_clientdata(client);
@@ -727,6 +757,18 @@ static int rk808_probe(struct i2c_client *client,
 	if (of_property_read_bool(np, "rockchip,system-power-controller")) {
 		rk808_i2c_client = client;
 		pm_power_off = rk808_pm_power_off;
+
+		switch (rk808->variant) {
+		case RK809_ID:
+		case RK817_ID:
+			ret = register_restart_handler(&rk808_restart_handler);
+			if (ret)
+				dev_warn(&client->dev, "failed to register restart handler, %d\n", ret);
+			break;
+		default:
+			dev_dbg(&client->dev, "pmic controlled board reset not supported\n");
+			break;
+		}
 	}
 
 	return 0;
@@ -749,6 +791,9 @@ static int rk808_remove(struct i2c_client *client)
 	if (pm_power_off == rk808_pm_power_off)
 		pm_power_off = NULL;
 
+	if (of_property_read_bool(np, "rockchip,system-power-controller"))
+		unregister_restart_handler(&rk808_restart_handler);
+
 	return 0;
 }
 
diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h
index a96e6d43ca06..58602032e642 100644
--- a/include/linux/mfd/rk808.h
+++ b/include/linux/mfd/rk808.h
@@ -373,6 +373,7 @@ enum rk805_reg {
 #define SWITCH2_EN	BIT(6)
 #define SWITCH1_EN	BIT(5)
 #define DEV_OFF_RST	BIT(3)
+#define DEV_RST		BIT(2)
 #define DEV_OFF		BIT(0)
 #define RTC_STOP	BIT(0)
 
-- 
2.25.1


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

end of thread, other threads:[~2021-12-22 11:10 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-20 17:06 [PATCH v3] mfd: rk808: add reboot support to rk808.c Peter Geis
2021-12-21 15:56 ` Dmitry Osipenko
  -- strict thread matches above, loose matches on Subject: below --
2021-12-20 14:46 Peter Geis
2021-12-20 14:53 ` Dmitry Osipenko
2021-12-20 16:33 ` Aw: " Frank Wunderlich
2021-12-21  8:48   ` Lee Jones
2021-12-21  9:10     ` Frank Wunderlich
2021-12-22 11:09       ` Lee Jones

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).