diff options
author | Hyongbin Kim <hyongbink@nvidia.com> | 2013-07-26 11:44:58 +0900 |
---|---|---|
committer | Gabby Lee <galee@nvidia.com> | 2013-07-29 21:02:52 -0700 |
commit | c9663967a8a691be0d9d08f01d764697bacd7980 (patch) | |
tree | 58193f9360f62bf31854a6a4883ee633f63f01b3 /drivers | |
parent | 33aeebec22ee7458f566694169fa91bad826b61b (diff) |
power: max17048_battery: disable "1% SOC change" alert when enter suspend
For prevent system wakeup when SOC changed, clear CONFIG.ALSC when enter
suspend and reset to 1 when call resume.
In low SOC, we can wakeup from HD(SOC low) alert.
Bug 1333630
Change-Id: I535b6a29311d61a76c2984b8e413db50f3eced64
Signed-off-by: Hyongbin Kim <hyongbink@nvidia.com>
Reviewed-on: http://git-master/r/253969
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
GVS: Gerrit_Virtual_Submit
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/power/max17048_battery.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/power/max17048_battery.c b/drivers/power/max17048_battery.c index 5f5d5540d7f9..7da47f77ace6 100644 --- a/drivers/power/max17048_battery.c +++ b/drivers/power/max17048_battery.c @@ -852,6 +852,25 @@ static int max17048_suspend(struct i2c_client *client, { struct max17048_chip *chip = i2c_get_clientdata(client); int ret; + struct max17048_battery_model *mdata = chip->pdata->model_data; + u16 val; + + /* clear CONFIG.ALSC */ + if (mdata->one_percent_alerts) { + val = max17048_read_word(client, MAX17048_CONFIG); + if (val < 0) { + dev_err(&client->dev, + "%s(): Failed in reading register" \ + "MAX17048_CONFIG err %d\n", + __func__, val); + } else { + val &= ~(mdata->one_percent_alerts); + ret = max17048_write_word(client, MAX17048_CONFIG, val); + if (ret < 0) + dev_err(&client->dev, + "failed clear CONFIG.ALSC\n"); + } + } if (client->irq) { enable_irq_wake(chip->client->irq); @@ -871,6 +890,7 @@ static int max17048_resume(struct i2c_client *client) struct max17048_chip *chip = i2c_get_clientdata(client); int ret; struct max17048_battery_model *mdata = chip->pdata->model_data; + u16 val; ret = max17048_write_word(client, MAX17048_HIBRT, mdata->hibernate); if (ret < 0) { @@ -883,6 +903,23 @@ static int max17048_resume(struct i2c_client *client) disable_irq_wake(client->irq); } + /* set CONFIG.ALSC */ + if (mdata->one_percent_alerts) { + val = max17048_read_word(client, MAX17048_CONFIG); + if (val < 0) { + dev_err(&client->dev, + "%s(): Failed in reading register" \ + "MAX17048_CONFIG err %d\n", + __func__, val); + } else { + val |= mdata->one_percent_alerts; + ret = max17048_write_word(client, MAX17048_CONFIG, val); + if (ret < 0) + dev_err(&client->dev, + "failed set CONFIG.ALSC\n"); + } + } + return 0; } |