From 923da3f428c032b8f9d4cc60edef35aad5a5b5ce Mon Sep 17 00:00:00 2001 From: Chandler Zhang Date: Mon, 14 May 2012 17:56:48 +0800 Subject: 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 Reviewed-on: http://git-master/r/103526 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Bharat Nihalani --- drivers/power/smb349-charger.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) (limited to 'drivers/power') 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 */ -- cgit v1.2.3