power: pm8921-charger: Report DC charging to userspace
When the secondary charging path is being used without an external
charger report the charging status based upon the DCIN_VALID_IRQ.
Change-Id: I4a992e9f6344588249bd1855cbaae24b0e97a601
Signed-off-by: David Keitel <dkeitel@codeaurora.org>
diff --git a/drivers/power/pm8921-charger.c b/drivers/power/pm8921-charger.c
index fa8f866..aca724a 100644
--- a/drivers/power/pm8921-charger.c
+++ b/drivers/power/pm8921-charger.c
@@ -415,14 +415,6 @@
disable ? CHG_CHARGE_DIS_BIT : 0);
}
-static bool pm_is_chg_charge_dis_bit_set(struct pm8921_chg_chip *chip)
-{
- u8 temp = 0;
-
- pm8xxx_readb(chip->dev->parent, CHG_CNTRL, &temp);
- return !!(temp & CHG_CHARGE_DIS_BIT);
-}
-
#define PM8921_CHG_V_MIN_MV 3240
#define PM8921_CHG_V_STEP_MV 20
#define PM8921_CHG_V_STEP_10_MV_BIT BIT(7)
@@ -1024,24 +1016,34 @@
break;
case POWER_SUPPLY_PROP_PRESENT:
case POWER_SUPPLY_PROP_ONLINE:
- if (pm_is_chg_charge_dis_bit_set(the_chip) ||
- !is_usb_chg_plugged_in(the_chip))
- val->intval = 0;
- else if (psy->type == POWER_SUPPLY_TYPE_USB ||
+ val->intval = 0;
+ if (charging_disabled)
+ return 0;
+
+ /* USB charging */
+ if (psy->type == POWER_SUPPLY_TYPE_USB ||
psy->type == POWER_SUPPLY_TYPE_USB_DCP ||
psy->type == POWER_SUPPLY_TYPE_USB_CDP ||
psy->type == POWER_SUPPLY_TYPE_USB_ACA) {
- val->intval = 1;
- } else if (psy->type == POWER_SUPPLY_TYPE_MAINS) {
+ val->intval = is_usb_chg_plugged_in(the_chip);
+ return 0;
+ }
+
+ /* DC charging */
+ if (psy->type == POWER_SUPPLY_TYPE_MAINS) {
+ /* external charger is connected */
+ if (the_chip->dc_present || is_ext_charging(the_chip)) {
+ val->intval = 1;
+ return 0;
+ }
+ /* USB with max current greater than 500 mA connected */
pm_chg_iusbmax_get(the_chip, ¤t_max);
if (current_max > USB_WALL_THRESHOLD_MA)
- val->intval = 1;
- else
- val->intval = 0;
- } else {
- val->intval = 0;
- pr_err("Unkown POWER_SUPPLY_TYPE %d\n", psy->type);
+ val->intval = is_usb_chg_plugged_in(the_chip);
+ return 0;
}
+
+ pr_err("Unkown POWER_SUPPLY_TYPE %d\n", psy->type);
break;
default:
return -EINVAL;
@@ -1592,6 +1594,7 @@
the_chip->usb_psy.type = type;
power_supply_changed(&the_chip->usb_psy);
+ power_supply_changed(&the_chip->dc_psy);
return 0;
}
EXPORT_SYMBOL_GPL(pm8921_set_usb_power_supply_type);
@@ -1639,6 +1642,7 @@
power_supply_set_charge_type(chip->ext_psy,
POWER_SUPPLY_CHARGE_TYPE_NONE);
pm8921_disable_source_current(false); /* release BATFET */
+ power_supply_changed(&chip->dc_psy);
chip->ext_charging = false;
chip->ext_charge_done = false;
bms_notify_check(chip);
@@ -1686,8 +1690,10 @@
return;
}
+ power_supply_set_online(chip->ext_psy, dc_present);
power_supply_set_charge_type(chip->ext_psy,
POWER_SUPPLY_CHARGE_TYPE_FAST);
+ power_supply_changed(&chip->dc_psy);
chip->ext_charging = true;
chip->ext_charge_done = false;
bms_notify_check(chip);
@@ -1768,6 +1774,7 @@
power_supply_changed(&chip->batt_psy);
power_supply_changed(&chip->usb_psy);
+ power_supply_changed(&chip->dc_psy);
return IRQ_HANDLED;
}
@@ -1819,6 +1826,7 @@
power_supply_changed(&chip->batt_psy);
power_supply_changed(&chip->usb_psy);
+ power_supply_changed(&chip->dc_psy);
bms_notify_check(chip);
@@ -1841,6 +1849,7 @@
power_supply_changed(&chip->batt_psy);
power_supply_changed(&chip->usb_psy);
+ power_supply_changed(&chip->dc_psy);
return IRQ_HANDLED;
}
@@ -1851,6 +1860,7 @@
pr_debug("state_changed_to=%d\n", pm_chg_get_fsm_state(data));
power_supply_changed(&chip->batt_psy);
power_supply_changed(&chip->usb_psy);
+ power_supply_changed(&chip->dc_psy);
bms_notify_check(chip);