diff options
-rw-r--r-- | drivers/power/bq20z75.c | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/drivers/power/bq20z75.c b/drivers/power/bq20z75.c index 8018e8cc7a74..5615c92bef66 100644 --- a/drivers/power/bq20z75.c +++ b/drivers/power/bq20z75.c | |||
@@ -171,7 +171,7 @@ static int bq20z75_read_word_data(struct i2c_client *client, u8 address) | |||
171 | } | 171 | } |
172 | 172 | ||
173 | if (ret < 0) { | 173 | if (ret < 0) { |
174 | dev_warn(&client->dev, | 174 | dev_dbg(&client->dev, |
175 | "%s: i2c read at address 0x%x failed\n", | 175 | "%s: i2c read at address 0x%x failed\n", |
176 | __func__, address); | 176 | __func__, address); |
177 | return ret; | 177 | return ret; |
@@ -199,7 +199,7 @@ static int bq20z75_write_word_data(struct i2c_client *client, u8 address, | |||
199 | } | 199 | } |
200 | 200 | ||
201 | if (ret < 0) { | 201 | if (ret < 0) { |
202 | dev_warn(&client->dev, | 202 | dev_dbg(&client->dev, |
203 | "%s: i2c write to address 0x%x failed\n", | 203 | "%s: i2c write to address 0x%x failed\n", |
204 | __func__, address); | 204 | __func__, address); |
205 | return ret; | 205 | return ret; |
@@ -223,6 +223,7 @@ static int bq20z75_get_battery_presence_and_health( | |||
223 | val->intval = 1; | 223 | val->intval = 1; |
224 | else | 224 | else |
225 | val->intval = 0; | 225 | val->intval = 0; |
226 | bq20z75_device->is_present = val->intval; | ||
226 | return ret; | 227 | return ret; |
227 | } | 228 | } |
228 | 229 | ||
@@ -232,18 +233,17 @@ static int bq20z75_get_battery_presence_and_health( | |||
232 | ret = bq20z75_write_word_data(client, | 233 | ret = bq20z75_write_word_data(client, |
233 | bq20z75_data[REG_MANUFACTURER_DATA].addr, | 234 | bq20z75_data[REG_MANUFACTURER_DATA].addr, |
234 | MANUFACTURER_ACCESS_STATUS); | 235 | MANUFACTURER_ACCESS_STATUS); |
235 | if (ret < 0) | ||
236 | return ret; | ||
237 | |||
238 | |||
239 | ret = bq20z75_read_word_data(client, | ||
240 | bq20z75_data[REG_MANUFACTURER_DATA].addr); | ||
241 | if (ret < 0) { | 236 | if (ret < 0) { |
242 | if (psp == POWER_SUPPLY_PROP_PRESENT) | 237 | if (psp == POWER_SUPPLY_PROP_PRESENT) |
243 | val->intval = 0; /* battery removed */ | 238 | val->intval = 0; /* battery removed */ |
244 | return ret; | 239 | return ret; |
245 | } | 240 | } |
246 | 241 | ||
242 | ret = bq20z75_read_word_data(client, | ||
243 | bq20z75_data[REG_MANUFACTURER_DATA].addr); | ||
244 | if (ret < 0) | ||
245 | return ret; | ||
246 | |||
247 | if (ret < bq20z75_data[REG_MANUFACTURER_DATA].min_value || | 247 | if (ret < bq20z75_data[REG_MANUFACTURER_DATA].min_value || |
248 | ret > bq20z75_data[REG_MANUFACTURER_DATA].max_value) { | 248 | ret > bq20z75_data[REG_MANUFACTURER_DATA].max_value) { |
249 | val->intval = 0; | 249 | val->intval = 0; |
@@ -455,6 +455,8 @@ static int bq20z75_get_property(struct power_supply *psy, | |||
455 | case POWER_SUPPLY_PROP_PRESENT: | 455 | case POWER_SUPPLY_PROP_PRESENT: |
456 | case POWER_SUPPLY_PROP_HEALTH: | 456 | case POWER_SUPPLY_PROP_HEALTH: |
457 | ret = bq20z75_get_battery_presence_and_health(client, psp, val); | 457 | ret = bq20z75_get_battery_presence_and_health(client, psp, val); |
458 | if (psp == POWER_SUPPLY_PROP_PRESENT) | ||
459 | return 0; | ||
458 | break; | 460 | break; |
459 | 461 | ||
460 | case POWER_SUPPLY_PROP_TECHNOLOGY: | 462 | case POWER_SUPPLY_PROP_TECHNOLOGY: |
@@ -516,9 +518,16 @@ done: | |||
516 | } | 518 | } |
517 | 519 | ||
518 | dev_dbg(&client->dev, | 520 | dev_dbg(&client->dev, |
519 | "%s: property = %d, value = %d\n", __func__, psp, val->intval); | 521 | "%s: property = %d, value = %x\n", __func__, psp, val->intval); |
522 | |||
523 | if (ret && bq20z75_device->is_present) | ||
524 | return ret; | ||
525 | |||
526 | /* battery not present, so return NODATA for properties */ | ||
527 | if (ret) | ||
528 | return -ENODATA; | ||
520 | 529 | ||
521 | return ret; | 530 | return 0; |
522 | } | 531 | } |
523 | 532 | ||
524 | static irqreturn_t bq20z75_irq(int irq, void *devid) | 533 | static irqreturn_t bq20z75_irq(int irq, void *devid) |
@@ -643,13 +652,14 @@ static int __devexit bq20z75_remove(struct i2c_client *client) | |||
643 | static int bq20z75_suspend(struct i2c_client *client, | 652 | static int bq20z75_suspend(struct i2c_client *client, |
644 | pm_message_t state) | 653 | pm_message_t state) |
645 | { | 654 | { |
655 | struct bq20z75_info *bq20z75_device = i2c_get_clientdata(client); | ||
646 | s32 ret; | 656 | s32 ret; |
647 | 657 | ||
648 | /* write to manufacturer access with sleep command */ | 658 | /* write to manufacturer access with sleep command */ |
649 | ret = bq20z75_write_word_data(client, | 659 | ret = bq20z75_write_word_data(client, |
650 | bq20z75_data[REG_MANUFACTURER_DATA].addr, | 660 | bq20z75_data[REG_MANUFACTURER_DATA].addr, |
651 | MANUFACTURER_ACCESS_SLEEP); | 661 | MANUFACTURER_ACCESS_SLEEP); |
652 | if (ret < 0) | 662 | if (bq20z75_device->is_present && ret < 0) |
653 | return ret; | 663 | return ret; |
654 | 664 | ||
655 | return 0; | 665 | return 0; |