mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 20:07:46 +09:00
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:
committed by
Gerrit Code Review
parent
57bc786045
commit
50fa4a3a9a
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user