mfd: rk8xx: add pm_shutdown callback in rk8xx_power_data
[firefly-linux-kernel-4.4.55.git] / drivers / mfd / rk808.c
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,