[PATCH v2 1/2] power: pmic: rk8xx: Support sysreset shutdown method

Michal Suchánek msuchanek at suse.de
Fri Jul 15 19:18:07 CEST 2022


On Fri, Jul 15, 2022 at 12:10:47PM -0500, Chris Morgan wrote:
> On Thu, Jul 07, 2022 at 10:41:34AM +0200, Michal Suchánek wrote:
> > Hello,
> > 
> > this causes regression on pinebook pro:
> > 
> > resetting ...
> > System reset not supported on this platform
> > ### ERROR ### Please RESET the board ###
> > 
> > Is there something missing in the DT for this board?
> > 
> > Or perhaps a fallback should be provided in absence of the PMIC?
> > 
> > Thanks
> > 
> > Michal
> 
> Sorry Michal, I was busy traveling and then came down with a pretty bad
> cold, so I've been a bit away from things. Are you getting this error
> when you attempt to reset or to poweroff the Pinebook Pro from U-Boot?
> 
> I tested the code on my RK817, but a cursory reading of the datasheet
> suggests every rk8xx known so far should be able to shutdown using the
> two methods added here. I'm wondering if there is perhaps a configuration
> issue we need to account for, as this routine is only shutting down the
> PMIC and not restarting it.

This is trying to restart the system from u-boot.

The walk function *seems* to try all methods of all reset providers but
maybe there is some catch there.

Thanks

Michal

> 
> Thank you.
> 
> > 
> > On Fri, May 27, 2022 at 01:18:19PM -0500, Chris Morgan wrote:
> > > From: Chris Morgan <macromorgan at hotmail.com>
> > > 
> > > Add support for sysreset shutdown for this PMIC. The values were pulled
> > > from the various datasheets, but for now it has only been tested on
> > > the rk817 (for an Odroid Go Advance).
> > > 
> > > Signed-off-by: Chris Morgan <macromorgan at hotmail.com>
> > > Reviewed-by: Jaehoon Chung <jh80.chung at samsung.com>
> > > Reviewed-by: Kever Yang <kever.yang at rock-chips.com>
> > > ---
> > >  drivers/power/pmic/rk8xx.c | 50 +++++++++++++++++++++++++++++++++++++-
> > >  1 file changed, 49 insertions(+), 1 deletion(-)
> > > 
> > > diff --git a/drivers/power/pmic/rk8xx.c b/drivers/power/pmic/rk8xx.c
> > > index 5f442fea68..1ffbecc02a 100644
> > > --- a/drivers/power/pmic/rk8xx.c
> > > +++ b/drivers/power/pmic/rk8xx.c
> > > @@ -6,10 +6,50 @@
> > >  
> > >  #include <common.h>
> > >  #include <dm.h>
> > > +#include <dm/lists.h>
> > >  #include <errno.h>
> > >  #include <log.h>
> > >  #include <power/rk8xx_pmic.h>
> > >  #include <power/pmic.h>
> > > +#include <sysreset.h>
> > > +
> > > +static int rk8xx_sysreset_request(struct udevice *dev, enum sysreset_t type)
> > > +{
> > > +	struct rk8xx_priv *priv = dev_get_priv(dev->parent);
> > > +
> > > +	if (type != SYSRESET_POWER_OFF)
> > > +		return -EPROTONOSUPPORT;
> > > +
> > > +	switch (priv->variant) {
> > > +	case RK805_ID:
> > > +	case RK808_ID:
> > > +	case RK816_ID:
> > > +	case RK818_ID:
> > > +		pmic_clrsetbits(dev->parent, REG_DEVCTRL, 0, BIT(0));
> > > +		break;
> > > +	case RK809_ID:
> > > +	case RK817_ID:
> > > +		pmic_clrsetbits(dev->parent, RK817_REG_SYS_CFG3, 0,
> > > +				BIT(0));
> > > +		break;
> > > +	default:
> > > +		printf("Unknown PMIC RK%x: Cannot shutdown\n",
> > > +		       priv->variant);
> > > +		return -EPROTONOSUPPORT;
> > > +	};
> > > +
> > > +	return -EINPROGRESS;
> > > +}
> > > +
> > > +static struct sysreset_ops rk8xx_sysreset_ops = {
> > > +	.request	= rk8xx_sysreset_request,
> > > +};
> > > +
> > > +U_BOOT_DRIVER(rk8xx_sysreset) = {
> > > +	.name		= "rk8xx_sysreset",
> > > +	.id		= UCLASS_SYSRESET,
> > > +	.ops		= &rk8xx_sysreset_ops,
> > > +};
> > >  
> > >  static struct reg_data rk817_init_reg[] = {
> > >  /* enable the under-voltage protection,
> > > @@ -61,7 +101,7 @@ static int rk8xx_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
> > >  static int rk8xx_bind(struct udevice *dev)
> > >  {
> > >  	ofnode regulators_node;
> > > -	int children;
> > > +	int children, ret;
> > >  
> > >  	regulators_node = dev_read_subnode(dev, "regulators");
> > >  	if (!ofnode_valid(regulators_node)) {
> > > @@ -72,6 +112,14 @@ static int rk8xx_bind(struct udevice *dev)
> > >  
> > >  	debug("%s: '%s' - found regulators subnode\n", __func__, dev->name);
> > >  
> > > +	if (CONFIG_IS_ENABLED(SYSRESET)) {
> > > +		ret = device_bind_driver_to_node(dev, "rk8xx_sysreset",
> > > +						 "rk8xx_sysreset",
> > > +						 dev_ofnode(dev), NULL);
> > > +		if (ret)
> > > +			return ret;
> > > +	}
> > > +
> > >  	children = pmic_bind_children(dev, regulators_node, pmic_children_info);
> > >  	if (!children)
> > >  		debug("%s: %s - no child found\n", __func__, dev->name);
> > > -- 
> > > 2.25.1
> > > 


More information about the U-Boot mailing list