[PATCH v4] mfd: rk808: add reboot support to rk808.c

Lee Jones lee.jones at linaro.org
Mon Jan 31 08:02:28 PST 2022


On Tue, 21 Dec 2021, Peter Geis wrote:

> 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 at gmail.com>
> Signed-off-by: Frank Wunderlich <frank-w at public-files.de>
> Reviewed-by: Dmitry Osipenko <digetx at gmail.com>
> ---
> (Resending due to incorrect Subject line)
> 
> 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);

This line looks very long.

I'm surprised it survived checkpatch.pl!

Once this has been fixed, please resubmit with my:

For my own reference (apply this as-is to your sign-off block):

  Acked-for-MFD-by: Lee Jones <lee.jones at linaro.org>

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

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



More information about the Linux-rockchip mailing list