From 40db74046cf93dc2119ab6a4ba64bb05d55a6122 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 14 Jan 2021 20:38:29 +0800 Subject: [PATCH] power: pmic: rk8xx: implement suspend/resume callback Signed-off-by: Joseph Chen Change-Id: I46b13886fcb3e7733155cd6f5fce15473c439da3 --- drivers/power/pmic/rk8xx.c | 44 ++++++++++++++++++++++++++++++++++++++ include/power/rk8xx_pmic.h | 3 ++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/drivers/power/pmic/rk8xx.c b/drivers/power/pmic/rk8xx.c index ca952ea1a0..a92b5faf42 100644 --- a/drivers/power/pmic/rk8xx.c +++ b/drivers/power/pmic/rk8xx.c @@ -233,6 +233,48 @@ static int rk8xx_read(struct udevice *dev, uint reg, uint8_t *buff, int len) return 0; } +static int rk8xx_suspend(struct udevice *dev) +{ + struct rk8xx_priv *priv = dev_get_priv(dev); + int ret = 0; + u8 val; + + switch (priv->variant) { + case RK809_ID: + case RK817_ID: + /* pmic_sleep active high */ + ret = rk8xx_read(dev, RK817_PMIC_SYS_CFG3, &val, 1); + if (ret) + return ret; + priv->sleep_pin = val; + val &= ~0x38; + val |= 0x28; + ret = rk8xx_write(dev, RK817_PMIC_SYS_CFG3, &val, 1); + break; + default: + return 0; + } + + return ret; +} + +static int rk8xx_resume(struct udevice *dev) +{ + struct rk8xx_priv *priv = dev_get_priv(dev); + int ret = 0; + + switch (priv->variant) { + case RK809_ID: + case RK817_ID: + ret = rk8xx_write(dev, RK817_PMIC_SYS_CFG3, &priv->sleep_pin, 1); + break; + default: + return 0; + } + + return ret; +} + static int rk8xx_shutdown(struct udevice *dev) { struct rk8xx_priv *priv = dev_get_priv(dev); @@ -568,6 +610,8 @@ static struct dm_pmic_ops rk8xx_ops = { .reg_count = rk8xx_reg_count, .read = rk8xx_read, .write = rk8xx_write, + .suspend = rk8xx_suspend, + .resume = rk8xx_resume, .shutdown = rk8xx_shutdown, }; diff --git a/include/power/rk8xx_pmic.h b/include/power/rk8xx_pmic.h index 5f3bb30a37..87bb555817 100644 --- a/include/power/rk8xx_pmic.h +++ b/include/power/rk8xx_pmic.h @@ -277,11 +277,12 @@ struct rk8xx_reg_table { }; struct rk8xx_priv { + struct virq_chip *irq_chip; int variant; int irq; - struct virq_chip *irq_chip; int lp_off_time; int lp_action; + uint8_t sleep_pin; }; int rk8xx_spl_configure_buck(struct udevice *pmic, int buck, int uvolt);