From: Shengfei xu Date: Tue, 19 Jul 2016 09:34:43 +0000 (+0800) Subject: mfd: rk8xx: add pm_shutdown callback in rk8xx_power_data X-Git-Tag: firefly_0821_release~2095 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=firefly-linux-kernel-4.4.55.git;a=commitdiff_plain;h=50fa4a3a9a2bf2de77a4b79bfd2d7d7a95aeefa2 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 --- diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c index 02de4c46a702..2220855cc1fe 100644 --- a/drivers/mfd/rk808.c +++ b/drivers/mfd/rk808.c @@ -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, diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h index ffc864940ca6..15c6e62c2fb6 100644 --- a/include/linux/mfd/rk808.h +++ b/include/linux/mfd/rk808.h @@ -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)