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;
}