power: pmic: rk8xx: implement suspend/resume callback

Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
Change-Id: I46b13886fcb3e7733155cd6f5fce15473c439da3
This commit is contained in:
Joseph Chen 2021-01-14 20:38:29 +08:00 committed by Jianhong Chen
parent 2a7051be6c
commit 40db74046c
2 changed files with 46 additions and 1 deletions

View File

@ -233,6 +233,48 @@ static int rk8xx_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
return 0; 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) static int rk8xx_shutdown(struct udevice *dev)
{ {
struct rk8xx_priv *priv = dev_get_priv(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, .reg_count = rk8xx_reg_count,
.read = rk8xx_read, .read = rk8xx_read,
.write = rk8xx_write, .write = rk8xx_write,
.suspend = rk8xx_suspend,
.resume = rk8xx_resume,
.shutdown = rk8xx_shutdown, .shutdown = rk8xx_shutdown,
}; };

View File

@ -277,11 +277,12 @@ struct rk8xx_reg_table {
}; };
struct rk8xx_priv { struct rk8xx_priv {
struct virq_chip *irq_chip;
int variant; int variant;
int irq; int irq;
struct virq_chip *irq_chip;
int lp_off_time; int lp_off_time;
int lp_action; int lp_action;
uint8_t sleep_pin;
}; };
int rk8xx_spl_configure_buck(struct udevice *pmic, int buck, int uvolt); int rk8xx_spl_configure_buck(struct udevice *pmic, int buck, int uvolt);