summaryrefslogtreecommitdiff
path: root/drivers/power/smb349-charger.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/power/smb349-charger.c')
-rw-r--r--drivers/power/smb349-charger.c42
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;