From: Jonas Aaberg <jonas.ab...@stericsson.com>

Gracefully handle gpadc conversion errors.

Signed-off-by: Jonas Aaberg <jonas.ab...@stericsson.com>
Signed-off-by: Mathieu Poirier <mathieu.poir...@linaro.org>
Reviewed-by: Johan BJORNSTEDT <johan.bjornst...@stericsson.com>
---
 drivers/power/ab8500_charger.c |   22 ++++++++++++++++++----
 1 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/drivers/power/ab8500_charger.c b/drivers/power/ab8500_charger.c
index f7bba07..06a7c8b 100644
--- a/drivers/power/ab8500_charger.c
+++ b/drivers/power/ab8500_charger.c
@@ -157,6 +157,7 @@ struct ab8500_charger_info {
        int charger_voltage;
        int cv_active;
        bool wd_expired;
+       int charger_current;
 };
 
 struct ab8500_charger_event_flags {
@@ -2341,6 +2342,7 @@ static int ab8500_charger_ac_get_property(struct 
power_supply *psy,
        union power_supply_propval *val)
 {
        struct ab8500_charger *di;
+       int ret;
 
        di = to_ab8500_charger_ac_device_info(psy_to_ux500_charger(psy));
 
@@ -2362,7 +2364,10 @@ static int ab8500_charger_ac_get_property(struct 
power_supply *psy,
                val->intval = di->ac.charger_connected;
                break;
        case POWER_SUPPLY_PROP_VOLTAGE_NOW:
-               di->ac.charger_voltage = ab8500_charger_get_ac_voltage(di);
+               ret = ab8500_charger_get_ac_voltage(di);
+               if (ret >= 0)
+                       di->ac.charger_voltage = ret;
+               /* On error, use previous value */
                val->intval = di->ac.charger_voltage * 1000;
                break;
        case POWER_SUPPLY_PROP_VOLTAGE_AVG:
@@ -2374,7 +2379,10 @@ static int ab8500_charger_ac_get_property(struct 
power_supply *psy,
                val->intval = di->ac.cv_active;
                break;
        case POWER_SUPPLY_PROP_CURRENT_NOW:
-               val->intval = ab8500_charger_get_ac_current(di) * 1000;
+               ret = ab8500_charger_get_ac_current(di);
+               if (ret >= 0)
+                       di->ac.charger_current = ret;
+               val->intval = di->ac.charger_current * 1000;
                break;
        default:
                return -EINVAL;
@@ -2401,6 +2409,7 @@ static int ab8500_charger_usb_get_property(struct 
power_supply *psy,
        union power_supply_propval *val)
 {
        struct ab8500_charger *di;
+       int ret;
 
        di = to_ab8500_charger_usb_device_info(psy_to_ux500_charger(psy));
 
@@ -2424,7 +2433,9 @@ static int ab8500_charger_usb_get_property(struct 
power_supply *psy,
                val->intval = di->usb.charger_connected;
                break;
        case POWER_SUPPLY_PROP_VOLTAGE_NOW:
-               di->usb.charger_voltage = ab8500_charger_get_vbus_voltage(di);
+               ret = ab8500_charger_get_vbus_voltage(di);
+               if (ret >= 0)
+                       di->usb.charger_voltage = ret;
                val->intval = di->usb.charger_voltage * 1000;
                break;
        case POWER_SUPPLY_PROP_VOLTAGE_AVG:
@@ -2436,7 +2447,10 @@ static int ab8500_charger_usb_get_property(struct 
power_supply *psy,
                val->intval = di->usb.cv_active;
                break;
        case POWER_SUPPLY_PROP_CURRENT_NOW:
-               val->intval = ab8500_charger_get_usb_current(di) * 1000;
+               ret = ab8500_charger_get_usb_current(di);
+               if (ret >= 0)
+                       di->usb.charger_current = ret;
+               val->intval = di->usb.charger_current * 1000;
                break;
        case POWER_SUPPLY_PROP_CURRENT_AVG:
                /*
-- 
1.7.5.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to