[PATCH v2 1/2] power: pmic: rk8xx: Support sysreset shutdown method
Michal Suchánek
msuchanek at suse.de
Thu Jul 7 10:41:34 CEST 2022
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 <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