diff options
author | Tom Cherry <tcherry@nvidia.com> | 2012-05-23 12:06:13 -0700 |
---|---|---|
committer | Tom Cherry <tcherry@nvidia.com> | 2012-05-23 12:06:13 -0700 |
commit | a168c03bd97fd9761218779623db0cec09fa8f4a (patch) | |
tree | 521d2b51904da963d771c24fd9b142cc416f8259 /drivers/power/smb349-charger.c | |
parent | 11fb7d0e35d56230919eb91bee1aa138a10b8416 (diff) | |
parent | c7e3189c1802c2a6552eec960f521a1891529892 (diff) |
Merge commit 'main-ics-2012.05.22-B3' into HEAD
Conflicts:
arch/arm/mach-tegra/pm.c
drivers/media/video/tegra/nvavp/nvavp_dev.c
drivers/power/smb349-charger.c
include/linux/smb349-charger.h
include/trace/events/power.h
Change-Id: Ia8c82e2acfe3463ae6778bdd03aac8da104f7ad3
Diffstat (limited to 'drivers/power/smb349-charger.c')
-rw-r--r-- | drivers/power/smb349-charger.c | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/drivers/power/smb349-charger.c b/drivers/power/smb349-charger.c index 9ee8b288d225..58778409b6ba 100644 --- a/drivers/power/smb349-charger.c +++ b/drivers/power/smb349-charger.c @@ -170,17 +170,28 @@ static int smb349_configure_otg(struct i2c_client *client, int enable) } if (enable) { - /* Configure PGOOD to be active low */ - ret = smb349_read(client, SMB349_SYSOK_USB3); + /* Configure PGOOD to be active low if no 5V on VBUS */ + ret = smb349_read(client, SMB349_STS_REG_C); if (ret < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, ret); goto error; } - ret = smb349_write(client, SMB349_SYSOK_USB3, (ret & (~(1)))); - if (ret < 0) { - dev_err(&client->dev, "%s: err %d\n", __func__, ret); - goto error; + if (!(ret & 0x01)) { + ret = smb349_read(client, SMB349_SYSOK_USB3); + if (ret < 0) { + dev_err(&client->dev, "%s: err %d\n", + __func__, ret); + goto error; + } + + ret = smb349_write(client, SMB349_SYSOK_USB3, + (ret & (~(1)))); + if (ret < 0) { + dev_err(&client->dev, "%s: err %d\n", + __func__, ret); + goto error; + } } /* Enable OTG */ @@ -274,9 +285,14 @@ error: int update_charger_status(void) { - struct i2c_client *client = charger->client; + struct i2c_client *client; int ret, val; + if (!charger) + return -ENODEV; + else + client = charger->client; + val = smb349_read(client, SMB349_STS_REG_D); if (val < 0) { dev_err(&client->dev, "%s(): Failed in reading register" @@ -383,6 +399,7 @@ static int smb349_enable_charging(struct regulator_dev *rdev, "charger..\n", __func__); return ret; } + charger->chrg_type = NONE; } else { ret = smb349_read(client, SMB349_STS_REG_D); if (ret < 0) { @@ -420,7 +437,7 @@ static int __devinit smb349_probe(struct i2c_client *client, { struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); struct smb349_charger_platform_data *pdata; - int ret, irq_num; + int ret; if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE)) return -EIO; @@ -444,7 +461,7 @@ static int __devinit smb349_probe(struct i2c_client *client, dev_err(&client->dev, "%s() No Battery present, exiting..\n", __func__); ret = -ENODEV; - goto error; + goto regulator_error; } charger->reg_desc.name = "vbus_charger"; @@ -480,7 +497,7 @@ static int __devinit smb349_probe(struct i2c_client *client, dev_err(&client->dev, "failed to register %s\n", charger->reg_desc.name); ret = PTR_ERR(charger->rdev); - goto error; + goto regulator_error; } /* disable OTG */ @@ -520,7 +537,10 @@ static int __devinit smb349_probe(struct i2c_client *client, return 0; error: + regulator_unregister(charger->rdev); +regulator_error: kfree(charger); + charger = NULL; return ret; } @@ -528,7 +548,7 @@ static int __devexit smb349_remove(struct i2c_client *client) { struct smb349_charger *charger = i2c_get_clientdata(client); - free_irq(gpio_to_irq(client->irq), charger); + regulator_unregister(charger->rdev); kfree(charger); return 0; |