power: supply: bq24190_charger: Add property system-minimum-microvolt
authorLiam Breck <kernel@networkimprov.net>
Mon, 28 Aug 2017 21:23:48 +0000 (14:23 -0700)
committerSebastian Reichel <sre@kernel.org>
Tue, 29 Aug 2017 21:08:39 +0000 (23:08 +0200)
Set minimum system voltage limit obtained from device property.

Cc: Hans de Goede <hdegoede@redhat.com>
Acked-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Liam Breck <kernel@networkimprov.net>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
drivers/power/supply/bq24190_charger.c

index 6e651fe..a12d263 100644 (file)
@@ -43,6 +43,8 @@
 #define BQ24190_REG_POC_CHG_CONFIG_OTG                 0x2
 #define BQ24190_REG_POC_SYS_MIN_MASK           (BIT(3) | BIT(2) | BIT(1))
 #define BQ24190_REG_POC_SYS_MIN_SHIFT          1
+#define BQ24190_REG_POC_SYS_MIN_MIN                    3000
+#define BQ24190_REG_POC_SYS_MIN_MAX                    3700
 #define BQ24190_REG_POC_BOOST_LIM_MASK         BIT(0)
 #define BQ24190_REG_POC_BOOST_LIM_SHIFT                0
 
@@ -159,6 +161,7 @@ struct bq24190_dev_info {
        char                            model_name[I2C_NAME_SIZE];
        bool                            initialized;
        bool                            irq_event;
+       u16                             sys_min;
        struct mutex                    f_reg_lock;
        u8                              f_reg;
        u8                              ss_reg;
@@ -530,6 +533,16 @@ static int bq24190_set_config(struct bq24190_dev_info *bdi)
        if (ret < 0)
                return ret;
 
+       if (bdi->sys_min) {
+               v = bdi->sys_min / 100 - 30; // manual section 9.5.1.2, table 9
+               ret = bq24190_write_mask(bdi, BQ24190_REG_POC,
+                                        BQ24190_REG_POC_SYS_MIN_MASK,
+                                        BQ24190_REG_POC_SYS_MIN_SHIFT,
+                                        v);
+               if (ret < 0)
+                       return ret;
+       }
+
        return 0;
 }
 
@@ -1509,6 +1522,18 @@ static int bq24190_hw_init(struct bq24190_dev_info *bdi)
 
 static int bq24190_get_config(struct bq24190_dev_info *bdi)
 {
+       const char * const s = "ti,system-minimum-microvolt";
+       int v;
+
+       if (device_property_read_u32(bdi->dev, s, &v) == 0) {
+               v /= 1000;
+               if (v >= BQ24190_REG_POC_SYS_MIN_MIN
+                && v <= BQ24190_REG_POC_SYS_MIN_MAX)
+                       bdi->sys_min = v;
+               else
+                       dev_warn(bdi->dev, "invalid value for %s: %u\n", s, v);
+       }
+
        return 0;
 }