diff options
author | Chandler Zhang <chazhang@nvidia.com> | 2012-03-31 17:14:31 +0800 |
---|---|---|
committer | Simone Willett <swillett@nvidia.com> | 2012-04-10 11:27:34 -0700 |
commit | c523727f583e5d5c5825abaf4cf6d4550bc5506b (patch) | |
tree | 7190d4520bec97848fb917c7ef32c9fc580ee672 /drivers/power | |
parent | 1ce68caceddfff3403acd986aabb5f504b5cc610 (diff) |
power: max17048: correct i2c error handling
Correct max17048_read_word() function related i2c error handling
Signed-off-by: Chandler Zhang <chazhang@nvidia.com>
Reviewed-on: http://git-master/r/93702
(cherry picked from commit ba8bdc020c6e2ed57255786b3d61b870b0b5a516)
Change-Id: Ice9845bb39288442bd6637eedeaf6de6ad1acbda
Reviewed-on: http://git-master/r/95346
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Chandler Zhang <chazhang@nvidia.com>
Tested-by: Chandler Zhang <chazhang@nvidia.com>
Reviewed-by: Syed Rafiuddin <srafiuddin@nvidia.com>
Tested-by: Syed Rafiuddin <srafiuddin@nvidia.com>
Reviewed-by: Sachin Nikam <snikam@nvidia.com>
Diffstat (limited to 'drivers/power')
-rw-r--r-- | drivers/power/max17048_battery.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/drivers/power/max17048_battery.c b/drivers/power/max17048_battery.c index 880ebba4cad0..e43390984522 100644 --- a/drivers/power/max17048_battery.c +++ b/drivers/power/max17048_battery.c @@ -93,17 +93,20 @@ static int max17048_write_word(struct i2c_client *client, int reg, u16 value) return ret; } -static uint16_t max17048_read_word(struct i2c_client *client, int reg) +static int max17048_read_word(struct i2c_client *client, int reg) { - uint16_t ret; + int ret; ret = i2c_smbus_read_word_data(client, reg); - if (ret < 0) + if (ret < 0) { dev_err(&client->dev, "%s(): Failed in reading register" "0x%02x err %d\n", __func__, reg, ret); - - return swab16(ret); + return ret; + } else { + ret = (int)swab16((uint16_t)(ret & 0x0000ffff)); + return ret; + } } static int max17048_get_property(struct power_supply *psy, @@ -168,25 +171,26 @@ static int max17048_usb_get_property(struct power_supply *psy, static void max17048_get_vcell(struct i2c_client *client) { struct max17048_chip *chip = i2c_get_clientdata(client); - uint16_t vcell; + int vcell; vcell = max17048_read_word(client, MAX17048_VCELL); if (vcell < 0) dev_err(&client->dev, "%s: err %d\n", __func__, vcell); - - chip->vcell = vcell; + else + chip->vcell = (uint16_t)vcell; } static void max17048_get_soc(struct i2c_client *client) { struct max17048_chip *chip = i2c_get_clientdata(client); - uint16_t soc; + int soc; soc = max17048_read_word(client, MAX17048_SOC); if (soc < 0) dev_err(&client->dev, "%s: err %d\n", __func__, soc); + else + chip->soc = (uint16_t)soc >> 9; - chip->soc = soc >> 9; if (chip->soc > MAX17048_BATTERY_FULL) { chip->soc = MAX17048_BATTERY_FULL; chip->status = POWER_SUPPLY_STATUS_FULL; @@ -305,7 +309,12 @@ static int max17048_load_model_data(struct max17048_chip *chip) int i, ret = 0; /* read OCV */ - ocv = max17048_read_word(client, MAX17048_OCV); + ret = max17048_read_word(client, MAX17048_OCV); + if (ret < 0) { + dev_err(&client->dev, "%s: err %d\n", __func__, ret); + return ret; + } + ocv = (uint16_t)ret; if (ocv == 0xffff) { dev_err(&client->dev, "%s: Failed in unlocking" "max17048 err: %d\n", __func__, ocv); @@ -346,7 +355,12 @@ static int max17048_load_model_data(struct max17048_chip *chip) mdelay(200); /* Read SOC Register and compare to expected result */ - soc_tst = max17048_read_word(client, MAX17048_SOC); + ret = max17048_read_word(client, MAX17048_SOC); + if (ret < 0) { + dev_err(&client->dev, "%s: err %d\n", __func__, ret); + return ret; + } + soc_tst = (uint16_t)ret; if (!((soc_tst >> 8) >= mdata->soccheck_A && (soc_tst >> 8) <= mdata->soccheck_B)) { dev_err(&client->dev, "%s: soc comparison failed %d\n", |