power: supply: bq25890: On the bq25892 set the IINLIM based on external charger detection
authorHans de Goede <hdegoede@redhat.com>
Tue, 1 Feb 2022 13:06:57 +0000 (14:06 +0100)
committerSebastian Reichel <sebastian.reichel@collabora.com>
Tue, 1 Feb 2022 13:55:12 +0000 (14:55 +0100)
The bq25892 does not have builtin charger-type detection like the bq25980,
there might be some external charger detection capability, which will be
modelled as a power_supply class-device supplying the bq25892.

Use the usb_type property value from the supplier psy-device to set the
input-current-limit (when available).

Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
drivers/power/supply/bq25890_charger.c

index 637cdd3..3de72f0 100644 (file)
@@ -594,6 +594,38 @@ static int bq25890_power_supply_get_property(struct power_supply *psy,
        return 0;
 }
 
+/* On the BQ25892 try to get charger-type info from our supplier */
+static void bq25890_charger_external_power_changed(struct power_supply *psy)
+{
+       struct bq25890_device *bq = power_supply_get_drvdata(psy);
+       union power_supply_propval val;
+       int input_current_limit, ret;
+
+       if (bq->chip_version != BQ25892)
+               return;
+
+       ret = power_supply_get_property_from_supplier(bq->charger,
+                                                     POWER_SUPPLY_PROP_USB_TYPE,
+                                                     &val);
+       if (ret)
+               return;
+
+       switch (val.intval) {
+       case POWER_SUPPLY_USB_TYPE_DCP:
+               input_current_limit = bq25890_find_idx(2000000, TBL_IINLIM);
+               break;
+       case POWER_SUPPLY_USB_TYPE_CDP:
+       case POWER_SUPPLY_USB_TYPE_ACA:
+               input_current_limit = bq25890_find_idx(1500000, TBL_IINLIM);
+               break;
+       case POWER_SUPPLY_USB_TYPE_SDP:
+       default:
+               input_current_limit = bq25890_find_idx(500000, TBL_IINLIM);
+       }
+
+       bq25890_field_write(bq, F_IINLIM, input_current_limit);
+}
+
 static int bq25890_get_chip_state(struct bq25890_device *bq,
                                  struct bq25890_state *state)
 {
@@ -818,6 +850,7 @@ static const struct power_supply_desc bq25890_power_supply_desc = {
        .properties = bq25890_power_supply_props,
        .num_properties = ARRAY_SIZE(bq25890_power_supply_props),
        .get_property = bq25890_power_supply_get_property,
+       .external_power_changed = bq25890_charger_external_power_changed,
 };
 
 static int bq25890_power_supply_init(struct bq25890_device *bq)