mfd: rk8xx: add pm_shutdown callback in rk8xx_power_data
authorShengfei xu <xsf@rock-chips.com>
Tue, 19 Jul 2016 09:34:43 +0000 (17:34 +0800)
committerGerrit Code Review <gerrit@rock-chips.com>
Mon, 25 Jul 2016 09:46:31 +0000 (17:46 +0800)
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>
drivers/mfd/rk808.c
include/linux/mfd/rk808.h

index 02de4c46a7022c1d471c5b0460baa8d605d5c602..2220855cc1fe0b0b8a0b1f71f3a70f7f07e0792f 100644 (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,
index ffc864940ca6e17a0f4305da12b0d97515b2eb0c..15c6e62c2fb67de2846313e2a238addf8cde7be2 100644 (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)