lkml.org 
[lkml]   [2011]   [Sep]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCHv1 1/1] [Power Supply]: Fix error handling in max17042 fuel gauge
    Date
    In max17042_get_property(...), the values returned by
    max17042_read_reg are directly assigned to the variables,
    even if the read results in an error.

    This patch checks for the return code from max17042_read_reg and
    exits the function if there is any error.

    Signed-off-by: Ramakrishna Pallala <ramakrishna.pallala@intel.com>
    ---
    drivers/power/max17042_battery.c | 85 ++++++++++++++++++++++++++------------
    1 files changed, 58 insertions(+), 27 deletions(-)

    diff --git a/drivers/power/max17042_battery.c b/drivers/power/max17042_battery.c
    index 98bfab3..cae910d 100644
    --- a/drivers/power/max17042_battery.c
    +++ b/drivers/power/max17042_battery.c
    @@ -84,55 +84,79 @@ static int max17042_get_property(struct power_supply *psy,
    {
    struct max17042_chip *chip = container_of(psy,
    struct max17042_chip, battery);
    + int ret;

    switch (psp) {
    case POWER_SUPPLY_PROP_PRESENT:
    - val->intval = max17042_read_reg(chip->client,
    - MAX17042_STATUS);
    - if (val->intval & MAX17042_STATUS_BattAbsent)
    + ret = max17042_read_reg(chip->client, MAX17042_STATUS);
    + if (ret < 0)
    + return ret;
    +
    + if (ret & MAX17042_STATUS_BattAbsent)
    val->intval = 0;
    else
    val->intval = 1;
    break;
    case POWER_SUPPLY_PROP_CYCLE_COUNT:
    - val->intval = max17042_read_reg(chip->client,
    - MAX17042_Cycles);
    + ret = max17042_read_reg(chip->client, MAX17042_Cycles);
    + if (ret < 0)
    + return ret;
    +
    + val->intval = ret;
    break;
    case POWER_SUPPLY_PROP_VOLTAGE_MAX:
    - val->intval = max17042_read_reg(chip->client,
    - MAX17042_MinMaxVolt);
    - val->intval >>= 8;
    + ret = max17042_read_reg(chip->client, MAX17042_MinMaxVolt);
    + if (ret < 0)
    + return ret;
    +
    + val->intval = ret >> 8;
    val->intval *= 20000; /* Units of LSB = 20mV */
    break;
    case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
    - val->intval = max17042_read_reg(chip->client,
    - MAX17042_V_empty);
    - val->intval >>= 7;
    + ret = max17042_read_reg(chip->client, MAX17042_V_empty);
    + if (ret < 0)
    + return ret;
    +
    + val->intval = ret >> 7;
    val->intval *= 10000; /* Units of LSB = 10mV */
    break;
    case POWER_SUPPLY_PROP_VOLTAGE_NOW:
    - val->intval = max17042_read_reg(chip->client,
    - MAX17042_VCELL) * 83; /* 1000 / 12 = 83 */
    + ret = max17042_read_reg(chip->client, MAX17042_VCELL);
    + if (ret < 0)
    + return ret;
    +
    + val->intval = ret * 83; /* 1000 / 12 = 83 */
    break;
    case POWER_SUPPLY_PROP_VOLTAGE_AVG:
    - val->intval = max17042_read_reg(chip->client,
    - MAX17042_AvgVCELL) * 83;
    + ret = max17042_read_reg(chip->client, MAX17042_AvgVCELL);
    + if (ret < 0)
    + return ret;
    +
    + val->intval = ret * 83; /* 1000 / 12 = 83 */
    break;
    case POWER_SUPPLY_PROP_CAPACITY:
    - val->intval = max17042_read_reg(chip->client,
    - MAX17042_SOC) / 256;
    + ret = max17042_read_reg(chip->client, MAX17042_SOC);
    + if (ret < 0)
    + return ret;
    +
    + val->intval = ret >> 8;
    break;
    case POWER_SUPPLY_PROP_CHARGE_FULL:
    - val->intval = max17042_read_reg(chip->client,
    - MAX17042_RepSOC);
    - if ((val->intval / 256) >= MAX17042_BATTERY_FULL)
    + ret = max17042_read_reg(chip->client, MAX17042_RepSOC);
    + if (ret < 0)
    + return ret;
    +
    + if ((ret >> 8) >= MAX17042_BATTERY_FULL)
    val->intval = 1;
    - else if (val->intval >= 0)
    + else if (ret >= 0)
    val->intval = 0;
    break;
    case POWER_SUPPLY_PROP_TEMP:
    - val->intval = max17042_read_reg(chip->client,
    - MAX17042_TEMP);
    + ret = max17042_read_reg(chip->client, MAX17042_TEMP);
    + if (ret < 0)
    + return ret;
    +
    + val->intval = ret;
    /* The value is signed. */
    if (val->intval & 0x8000) {
    val->intval = (0x7fff & ~val->intval) + 1;
    @@ -144,8 +168,11 @@ static int max17042_get_property(struct power_supply *psy,
    break;
    case POWER_SUPPLY_PROP_CURRENT_NOW:
    if (chip->pdata->enable_current_sense) {
    - val->intval = max17042_read_reg(chip->client,
    - MAX17042_Current);
    + ret = max17042_read_reg(chip->client, MAX17042_Current);
    + if (ret < 0)
    + return ret;
    +
    + val->intval = ret;
    if (val->intval & 0x8000) {
    /* Negative */
    val->intval = ~val->intval & 0x7fff;
    @@ -160,8 +187,12 @@ static int max17042_get_property(struct power_supply *psy,
    break;
    case POWER_SUPPLY_PROP_CURRENT_AVG:
    if (chip->pdata->enable_current_sense) {
    - val->intval = max17042_read_reg(chip->client,
    - MAX17042_AvgCurrent);
    + ret = max17042_read_reg(chip->client,
    + MAX17042_AvgCurrent);
    + if (ret < 0)
    + return ret;
    +
    + val->intval = ret;
    if (val->intval & 0x8000) {
    /* Negative */
    val->intval = ~val->intval & 0x7fff;
    --
    1.7.0.4


    \
     
     \ /
      Last update: 2011-09-02 16:45    [W:0.031 / U:32.784 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site