mfd: rk8xx: add pm_shutdown callback in rk8xx_power_data

The rk818 and rk808 have different way to shutdown.
Add callback(pm_shutdown) to fulfill the individual action for
each PMIC.

Change-Id: I05dc7015ffd0f82c0ab761a380865338fe1adefe
Signed-off-by: Shengfei xu <xsf@rock-chips.com>
This commit is contained in:
Shengfei xu
2016-07-19 17:34:43 +08:00
committed by Gerrit Code Review
parent 57bc786045
commit 50fa4a3a9a
2 changed files with 33 additions and 3 deletions

View File

@@ -38,6 +38,7 @@ struct rk8xx_power_data {
const struct mfd_cell *rk8xx_cell;
int cell_num;
struct regmap_irq_chip *rk8xx_irq_chip;
int (*pm_shutdown)(struct regmap *regmap);
};
static bool rk808_is_volatile_reg(struct device *dev, unsigned int reg)
@@ -68,6 +69,26 @@ static bool rk808_is_volatile_reg(struct device *dev, unsigned int reg)
return false;
}
static int rk808_shutdown(struct regmap *regmap)
{
int ret;
ret = regmap_update_bits(regmap,
RK808_DEVCTRL_REG,
DEV_OFF_RST, DEV_OFF_RST);
return ret;
}
static int rk818_shutdown(struct regmap *regmap)
{
int ret;
ret = regmap_update_bits(regmap,
RK818_DEVCTRL_REG,
DEV_OFF, DEV_OFF);
return ret;
}
static const struct regmap_config rk808_regmap_config = {
.reg_bits = 8,
.val_bits = 8,
@@ -271,6 +292,7 @@ static struct rk8xx_power_data rk808_power_data = {
.rk8xx_cell = rk808s,
.cell_num = ARRAY_SIZE(rk808s),
.rk8xx_irq_chip = &rk808_irq_chip,
.pm_shutdown = rk808_shutdown,
};
static struct rk8xx_power_data rk818_power_data = {
@@ -281,9 +303,12 @@ static struct rk8xx_power_data rk818_power_data = {
.rk8xx_cell = rk818s,
.cell_num = ARRAY_SIZE(rk818s),
.rk8xx_irq_chip = &rk818_irq_chip,
.pm_shutdown = rk818_shutdown,
};
static int (*pm_shutdown)(struct regmap *regmap);
static struct i2c_client *rk808_i2c_client;
static void rk808_device_shutdown(void)
{
int ret;
@@ -295,9 +320,7 @@ static void rk808_device_shutdown(void)
return;
}
ret = regmap_update_bits(rk808->regmap,
RK808_DEVCTRL_REG,
DEV_OFF_RST, DEV_OFF_RST);
ret = pm_shutdown(rk808->regmap);
if (ret)
dev_err(&rk808_i2c_client->dev, "power off error!\n");
}
@@ -348,6 +371,12 @@ static int rk808_probe(struct i2c_client *client,
return PTR_ERR(rk808->regmap);
}
pm_shutdown = pdata->pm_shutdown;
if (!pm_shutdown) {
dev_err(&client->dev, "shutdown initialization failed\n");
return -EINVAL;
}
for (i = 0; i < pdata->reg_num; i++) {
ret = regmap_update_bits(rk808->regmap,
pdata->rk8xx_pre_init_reg[i].addr,

View File

@@ -239,6 +239,7 @@ enum rk818_reg {
#define SWITCH2_EN BIT(6)
#define SWITCH1_EN BIT(5)
#define DEV_OFF_RST BIT(3)
#define DEV_OFF BIT(0)
#define VB_LO_ACT BIT(4)
#define VB_LO_SEL_3500MV (7 << 0)