summaryrefslogtreecommitdiff
path: root/drivers/power
diff options
context:
space:
mode:
authorChandler Zhang <chazhang@nvidia.com>2012-03-12 17:05:16 +0800
committerRohan Somvanshi <rsomvanshi@nvidia.com>2012-03-15 08:58:00 -0700
commit07102a20b48daf109282f23d2f72d8a710fe827b (patch)
tree541f856b7ea5b5713a7d1bff770f184d1f0f391d /drivers/power
parenta0713b76e334a8751adfbfc879dcebcfe6386c29 (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.c48
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;