power: bq24257: Add input DPM voltage threshold setting support
[firefly-linux-kernel-4.4.55.git] / drivers / power / bq24257_charger.c
index b617c3a20652d3fd797845bc15eee026647eec42..ebb22f3be4872b6c6e950334500f42e769c89bba 100644 (file)
@@ -79,6 +79,7 @@ struct bq24257_init_data {
        u8 iterm;       /* termination current */
        u8 iilimit;     /* input current limit */
        u8 vovp;        /* over voltage protection voltage */
+       u8 vindpm;      /* VDMP input threshold voltage */
 };
 
 struct bq24257_state {
@@ -208,6 +209,13 @@ static const u32 bq24257_vovp_map[] = {
 
 #define BQ24257_VOVP_MAP_SIZE          ARRAY_SIZE(bq24257_vovp_map)
 
+static const u32 bq24257_vindpm_map[] = {
+       4200000, 4280000, 4360000, 4440000, 4520000, 4600000, 4680000,
+       4760000
+};
+
+#define BQ24257_VINDPM_MAP_SIZE                ARRAY_SIZE(bq24257_vindpm_map)
+
 static int bq24257_field_read(struct bq24257_device *bq,
                              enum bq24257_fields field_id)
 {
@@ -434,6 +442,17 @@ enum bq24257_vovp {
        VOVP_10500
 };
 
+enum bq24257_vindpm {
+       VINDPM_4200,
+       VINDPM_4280,
+       VINDPM_4360,
+       VINDPM_4440,
+       VINDPM_4520,
+       VINDPM_4600,
+       VINDPM_4680,
+       VINDPM_4760
+};
+
 enum bq24257_port_type {
        PORT_TYPE_DCP,          /* Dedicated Charging Port */
        PORT_TYPE_CDP,          /* Charging Downstream Port */
@@ -607,6 +626,7 @@ static int bq24257_hw_init(struct bq24257_device *bq)
                {F_VBAT, bq->init_data.vbat},
                {F_ITERM, bq->init_data.iterm},
                {F_VOVP, bq->init_data.vovp},
+               {F_VINDPM, bq->init_data.vindpm},
        };
 
        /*
@@ -687,10 +707,23 @@ static ssize_t bq24257_show_ovp_voltage(struct device *dev,
                         bq24257_vovp_map[bq->init_data.vovp]);
 }
 
+static ssize_t bq24257_show_in_dpm_voltage(struct device *dev,
+                                          struct device_attribute *attr,
+                                          char *buf)
+{
+       struct power_supply *psy = dev_get_drvdata(dev);
+       struct bq24257_device *bq = power_supply_get_drvdata(psy);
+
+       return scnprintf(buf, PAGE_SIZE, "%u\n",
+                        bq24257_vindpm_map[bq->init_data.vindpm]);
+}
+
 static DEVICE_ATTR(ovp_voltage, S_IRUGO, bq24257_show_ovp_voltage, NULL);
+static DEVICE_ATTR(in_dpm_voltage, S_IRUGO, bq24257_show_in_dpm_voltage, NULL);
 
 static struct attribute *bq24257_charger_attr[] = {
        &dev_attr_ovp_voltage.attr,
+       &dev_attr_in_dpm_voltage.attr,
        NULL,
 };
 
@@ -785,6 +818,16 @@ static int bq24257_fw_probe(struct bq24257_device *bq)
                                                      bq24257_vovp_map,
                                                      BQ24257_VOVP_MAP_SIZE);
 
+       ret = device_property_read_u32(bq->dev, "ti,in-dpm-voltage",
+                                      &property);
+       if (ret < 0)
+               bq->init_data.vindpm = VINDPM_4360;
+       else
+               bq->init_data.vindpm =
+                               bq24257_find_idx(property,
+                                                bq24257_vindpm_map,
+                                                BQ24257_VINDPM_MAP_SIZE);
+
        return 0;
 }