Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[firefly-linux-kernel-4.4.55.git] / drivers / mfd / tps65910.c
index be9e07b77325a6afef8ed64253bc4a51e5cb4cc9..1c563792c777ba8f04c194a2a99c39159d8871f7 100644 (file)
@@ -68,6 +68,24 @@ static const struct regmap_config tps65910_regmap_config = {
        .cache_type = REGCACHE_RBTREE,
 };
 
+static int __devinit tps65910_ck32k_init(struct tps65910 *tps65910,
+                                       struct tps65910_board *pmic_pdata)
+{
+       int ret;
+
+       if (!pmic_pdata->en_ck32k_xtal)
+               return 0;
+
+       ret = tps65910_reg_clear_bits(tps65910, TPS65910_DEVCTRL,
+                                               DEVCTRL_CK32K_CTRL_MASK);
+       if (ret < 0) {
+               dev_err(tps65910->dev, "clear ck32k_ctrl failed: %d\n", ret);
+               return ret;
+       }
+
+       return 0;
+}
+
 static int __devinit tps65910_sleepinit(struct tps65910 *tps65910,
                struct tps65910_board *pmic_pdata)
 {
@@ -175,6 +193,9 @@ static struct tps65910_board *tps65910_parse_dt(struct i2c_client *client,
        else if (*chip_id == TPS65911)
                dev_warn(&client->dev, "VMBCH2-Threshold not specified");
 
+       prop = of_property_read_bool(np, "ti,en-ck32k-xtal");
+       board_info->en_ck32k_xtal = prop;
+
        board_info->irq = client->irq;
        board_info->irq_base = -1;
 
@@ -243,7 +264,7 @@ static __devinit int tps65910_i2c_probe(struct i2c_client *i2c,
        init_data->irq_base = pmic_plat_data->irq_base;
 
        tps65910_irq_init(tps65910, init_data->irq, init_data);
-
+       tps65910_ck32k_init(tps65910, pmic_plat_data);
        tps65910_sleepinit(tps65910, pmic_plat_data);
 
        return ret;