power: rk818: support rk818 battery driver
[firefly-linux-kernel-4.4.55.git] / drivers / mfd / rk808.c
index 2220855cc1fe0b0b8a0b1f71f3a70f7f07e0792f..86dd427b0fe358e66df0b4783ae3b609cbb5f808 100644 (file)
@@ -89,6 +89,38 @@ static int rk818_shutdown(struct regmap *regmap)
        return ret;
 }
 
+static bool rk818_is_volatile_reg(struct device *dev, unsigned int reg)
+{
+       /*
+        * Notes:
+        * - Technically the ROUND_30s bit makes RTC_CTRL_REG volatile, but
+        *   we don't use that feature.  It's better to cache.
+        * - It's unlikely we care that RK808_DEVCTRL_REG is volatile since
+        *   bits are cleared in case when we shutoff anyway, but better safe.
+        */
+
+       switch (reg) {
+       case RK808_SECONDS_REG ... RK808_WEEKS_REG:
+       case RK808_RTC_STATUS_REG:
+       case RK808_VB_MON_REG:
+       case RK808_THERMAL_REG:
+       case RK808_DCDC_EN_REG:
+       case RK808_DCDC_UV_STS_REG:
+       case RK808_LDO_UV_STS_REG:
+       case RK808_DCDC_PG_REG:
+       case RK808_LDO_PG_REG:
+       case RK808_DEVCTRL_REG:
+       case RK808_INT_STS_REG1:
+       case RK808_INT_STS_REG2:
+       case RK808_INT_STS_MSK_REG1:
+       case RK808_INT_STS_MSK_REG2:
+       case RK818_SUP_STS_REG ... RK818_SAVE_DATA19:
+               return true;
+       }
+
+       return false;
+}
+
 static const struct regmap_config rk808_regmap_config = {
        .reg_bits = 8,
        .val_bits = 8,
@@ -185,12 +217,13 @@ static const struct regmap_config rk818_regmap_config = {
        .val_bits = 8,
        .max_register = RK818_SAVE_DATA19,
        .cache_type = REGCACHE_RBTREE,
-       .volatile_reg = rk808_is_volatile_reg,
+       .volatile_reg = rk818_is_volatile_reg,
 };
 
 static const struct mfd_cell rk818s[] = {
        { .name = "rk808-clkout", },
        { .name = "rk818-regulator", },
+       { .name = "rk818-battery", .of_compatible = "rk818-battery", },
        {
                .name = "rk808-rtc",
                .num_resources = ARRAY_SIZE(rtc_resources),