power: pm8921-bms: use restart reason for usb detection
When the charger is not initialized it returns -EINVAL when asked
whether usb charger is plugged in. Use the restart reason to check
if we started with a charger insertion.
Change-Id: I2e8fcb4a15af3a66331a921d378bfd5d2dfe4533
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
diff --git a/drivers/power/pm8921-bms.c b/drivers/power/pm8921-bms.c
index e5ab5ec..98fa37c 100644
--- a/drivers/power/pm8921-bms.c
+++ b/drivers/power/pm8921-bms.c
@@ -350,13 +350,18 @@
return 0;
}
-static int usb_chg_plugged_in(void)
+static int usb_chg_plugged_in(struct pm8921_bms_chip *chip)
{
int val = pm8921_is_usb_chg_plugged_in();
- /* treat as if usb is not present in case of error */
- if (val == -EINVAL)
- val = 0;
+ /* if the charger driver was not initialized, use the restart reason */
+ if (val == -EINVAL) {
+ if (pm8xxx_restart_reason(chip->dev->parent)
+ == PM8XXX_RESTART_CHG)
+ val = 1;
+ else
+ val = 0;
+ }
return val;
}
@@ -959,7 +964,7 @@
mutex_unlock(&the_chip->bms_output_lock);
- usb_chg = usb_chg_plugged_in();
+ usb_chg = usb_chg_plugged_in(the_chip);
usb_chg |= wireless_chg_plugged_in();
convert_vbatt_raw_to_uv(the_chip, usb_chg, vbat_raw, vbat_uv);
@@ -1001,7 +1006,7 @@
pm_bms_unlock_output_data(chip);
mutex_unlock(&chip->bms_output_lock);
- usb_chg = usb_chg_plugged_in();
+ usb_chg = usb_chg_plugged_in(chip);
usb_chg |= wireless_chg_plugged_in();
if (chip->prev_last_good_ocv_raw == 0) {
@@ -2319,9 +2324,8 @@
}
voltage = xoadc_reading_to_microvolt(result.adc_code);
- usb_chg = usb_chg_plugged_in();
+ usb_chg = usb_chg_plugged_in(chip);
usb_chg |= wireless_chg_plugged_in();
-
pr_debug("result 0.625V = 0x%x, voltage = %duV adc_meas = %lld "
"usb_chg = %d\n",
result.adc_code, voltage, result.measurement,
@@ -2808,9 +2812,8 @@
*/
ocv_uv = 0;
pm_bms_read_output_data(chip, LAST_GOOD_OCV_VALUE, &ocv_raw);
- usb_chg = usb_chg_plugged_in();
+ usb_chg = usb_chg_plugged_in(chip);
usb_chg |= wireless_chg_plugged_in();
-
rc = convert_vbatt_raw_to_uv(chip, usb_chg, ocv_raw, &ocv_uv);
if (rc || ocv_uv == 0) {
rc = adc_based_ocv(chip, &ocv_uv);