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, &current_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);