diff options
author | Chandler Zhang <chazhang@nvidia.com> | 2012-03-12 17:05:16 +0800 |
---|---|---|
committer | Rohan Somvanshi <rsomvanshi@nvidia.com> | 2012-03-15 08:58:00 -0700 |
commit | 07102a20b48daf109282f23d2f72d8a710fe827b (patch) | |
tree | 541f856b7ea5b5713a7d1bff770f184d1f0f391d /drivers/power | |
parent | a0713b76e334a8751adfbfc879dcebcfe6386c29 (diff) |
power: smb349: add callback to update charger
Add update_charger_status() function callback to fix unknown
charging status at start up issue.
Bug 951750
Change-Id: Ib264479b0a251a07d136c245afa85c3444754ee0
Signed-off-by: Chandler Zhang <chazhang@nvidia.com>
Reviewed-on: http://git-master/r/89436
Reviewed-by: Rohan Somvanshi <rsomvanshi@nvidia.com>
Tested-by: Rohan Somvanshi <rsomvanshi@nvidia.com>
Diffstat (limited to 'drivers/power')
-rw-r--r-- | drivers/power/smb349-charger.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/drivers/power/smb349-charger.c b/drivers/power/smb349-charger.c index d6a3ef2afc53..300f91929a1c 100644 --- a/drivers/power/smb349-charger.c +++ b/drivers/power/smb349-charger.c @@ -336,6 +336,54 @@ irq_error: return IRQ_HANDLED; } +int update_charger_status(void) +{ + struct i2c_client *client = charger->client; + int ret, val; + + val = smb349_read(client, SMB349_STS_REG_D); + if (val < 0) { + dev_err(&client->dev, "%s(): Failed in reading register" + "0x%02x\n", __func__, SMB349_STS_REG_D); + goto val_error; + } else if (val != 0) { + if (val & DEDICATED_CHARGER) + charger->chrg_type = AC; + else if (val & CHRG_DOWNSTRM_PORT) + charger->chrg_type = USB; + + /* configure charger */ + ret = smb349_configure_charger(client, 1); + if (ret < 0) { + dev_err(&client->dev, "%s() error in configuring" + "charger..\n", __func__); + goto ret_error; + } + + charger->state = progress; + } else { + charger->state = stopped; + + /* Disable charger */ + ret = smb349_configure_charger(client, 0); + if (ret < 0) { + dev_err(&client->dev, "%s() error in configuring" + "charger..\n", __func__); + goto ret_error; + } + } + + if (charger->charger_cb) + charger->charger_cb(charger->state, charger->chrg_type, + charger->charger_cb_data); + return 0; +val_error: + return val; +ret_error: + return ret; +} +EXPORT_SYMBOL_GPL(update_charger_status); + int register_callback(charging_callback_t cb, void *args) { struct smb349_charger *charger_data = charger; |