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

On Fri, May 27, 2022 at 01:18:19PM -0500, Chris Morgan wrote:
> From: Chris Morgan <macromor...@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 <macromor...@hotmail.com>
> Reviewed-by: Jaehoon Chung <jh80.ch...@samsung.com>
> Reviewed-by: Kever Yang <kever.y...@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
> 

Reply via email to