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