diff options
author | Chandler Zhang <chazhang@nvidia.com> | 2012-05-14 17:56:48 +0800 |
---|---|---|
committer | Simone Willett <swillett@nvidia.com> | 2012-05-21 12:08:31 -0700 |
commit | 923da3f428c032b8f9d4cc60edef35aad5a5b5ce (patch) | |
tree | 1ceec59f4f88fecd1f4c40874fddf60dcbc1a060 /drivers/power | |
parent | 1f4ccee135b9729ec09eceaddd1b573ea7366d15 (diff) |
power: smb349: support for self-powered devices
Some self-powered devices doesn't strictly follow USB spec that
has 5V Vbus to upstream cannot work with mux on the data lines.
The MAX4983 mux routes the data lines to SMB349 rather than the
Tegra chip when PGOOD polarity is low-active and DCIN is 5V.
Change PGOOD not to invert polarity for the devices that has 5V to
upstream.
Bug 981761
Change-Id: Ic67ec66ce8936d9a9d5d2df7bca2ff7f9c65b147
Signed-off-by: Chandler Zhang <chazhang@nvidia.com>
Reviewed-on: http://git-master/r/103526
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Diffstat (limited to 'drivers/power')
-rw-r--r-- | drivers/power/smb349-charger.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/drivers/power/smb349-charger.c b/drivers/power/smb349-charger.c index 6164905efb70..62d516b374b8 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 */ |