diff options
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; |