power: charger: fix fluctuation between charging and not charging

commit 8126554cf049d13f4dd2d815d86ea289efdc6f3a has fluctuation issue
between charging and not charging. It fixes this issue.

Change-Id: I1cc2f3b51b5c1077b5d317ce324e0ce05a616977
diff --git a/drivers/power/pm8921-charger.c b/drivers/power/pm8921-charger.c
index ffbadde..aac3221 100644
--- a/drivers/power/pm8921-charger.c
+++ b/drivers/power/pm8921-charger.c
@@ -1358,7 +1358,9 @@
 			return 0;
 
 		/* USB charging */
-		if (usb_target_ma < USB_WALL_THRESHOLD_MA)
+		if (usb_target_ma == 0)
+			val->intval = the_chip->usb_present;
+		else if (usb_target_ma <= USB_WALL_THRESHOLD_MA)
 			val->intval = is_usb_chg_plugged_in(the_chip);
 		else
 			return 0;
@@ -1728,6 +1730,8 @@
 					usb_max_current, mA);
 		mA = usb_max_current;
 	}
+	if (usb_target_ma == 0 && mA > USB_WALL_THRESHOLD_MA)
+		usb_target_ma = mA;
 
 	spin_lock_irqsave(&vbus_lock, flags);
 	if (the_chip) {
@@ -2129,7 +2133,7 @@
 		pm8921_chg_enable_irq(chip, CHG_GONE_IRQ);
 	} else {
 		/* USB unplugged reset target current */
-		usb_target_ma = 1;
+		usb_target_ma = 0;
 		pm8921_chg_disable_irq(chip, CHG_GONE_IRQ);
 	}
 	enable_input_voltage_regulation(chip);
@@ -2656,6 +2660,19 @@
 				__pm8921_charger_vbus_draw(usb_ma);
 				pr_info("usb_now=%d, usb_target = %d\n",
 					usb_ma, 500);
+				goto check_again_later;
+			} else if (usb_ma == 500) {
+				pr_info("Stopping Unplug Check Worker"
+					 " USB == 500mA\n");
+				disable_input_voltage_regulation(chip);
+				return;
+			}
+
+			if (usb_ma <= 100) {
+				pr_debug(
+					"Unenumerated or suspended usb_ma = %d"
+					" skip\n", usb_ma);
+				goto check_again_later;
 			}
 		}
 	} else if (active_path & DC_ACTIVE_BIT) {
@@ -2663,7 +2680,7 @@
 		/* Some board designs are not prone to reverse boost on DC
 		 * charging path */
 		if (!chip->dc_unplug_check)
-			goto done;
+			return;
 	} else {
 		/* No charger active */
 		if (!(is_usb_chg_plugged_in(chip)
@@ -2675,7 +2692,7 @@
 				get_prop_batt_current(chip)
 				);
 		}
-		goto done;
+		return;
 	}
 
 	if (active_path & USB_ACTIVE_BIT) {
@@ -2687,7 +2704,7 @@
 			usb_target_ma = usb_ma;
 			/* end AICL here */
 			__pm8921_charger_vbus_draw(usb_ma);
-			pr_info("usb_now=%d, usb_target = %d\n",
+			pr_info("VIN: usb_now=%d, usb_target = %d\n",
 				usb_ma, usb_target_ma);
 		}
 	}
@@ -2745,16 +2762,16 @@
 			__pm8921_charger_vbus_draw(usb_ma);
 			pr_info("usb_now=%d, usb_target = %d\n",
 					usb_ma, usb_target_ma);
+		} else {
+			usb_target_ma = usb_ma;
 		}
 	}
 
+check_again_later:
 	/* schedule to check again later */
 	schedule_delayed_work(&chip->unplug_check_work,
 		      round_jiffies_relative(msecs_to_jiffies
 				(UNPLUG_CHECK_WAIT_PERIOD_MS)));
-	return;
-done:
-	usb_target_ma = 1;
 }
 
 static irqreturn_t loop_change_irq_handler(int irq, void *data)
diff --git a/drivers/usb/otg/msm_otg.c b/drivers/usb/otg/msm_otg.c
index 4df4060..283f220 100644
--- a/drivers/usb/otg/msm_otg.c
+++ b/drivers/usb/otg/msm_otg.c
@@ -1119,12 +1119,8 @@
 
 	dev_info(motg->phy.dev, "Avail curr from USB = %u\n", mA);
 
-	/*
-	 *  Use Power Supply API if supported, otherwise fallback
-	 *  to legacy pm8921 API.
-	 */
-	if (msm_otg_notify_power_supply(motg, mA))
-		pm8921_charger_vbus_draw(mA);
+	pm8921_charger_vbus_draw(mA);
+	msm_otg_notify_power_supply(motg, mA);
 
 	motg->cur_power = mA;
 }