Commit a87103a6 authored by Matthias Kaehlcke's avatar Matthias Kaehlcke Committed by Greg Kroah-Hartman

USB: twl4030-usb: Report correct vbus value for accessory charger adapters1

The twl4030-usb driver exports the status of VBUS as sysfs attribute.
In case an accessory charger adapter (ACA) is connected to the OTG
transceiver the attribute is always 'off', even when the charger
provides VBUS. Added a variable to keep track of the status of VBUS
and report it correctly
Signed-off-by: default avatarMatthias Kaehlcke <matthias.kaehlcke@tomtom.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 0b0cd6c8
...@@ -160,6 +160,7 @@ struct twl4030_usb { ...@@ -160,6 +160,7 @@ struct twl4030_usb {
int irq; int irq;
u8 linkstat; u8 linkstat;
bool vbus_supplied;
u8 asleep; u8 asleep;
bool irq_enabled; bool irq_enabled;
}; };
...@@ -250,6 +251,8 @@ static enum usb_xceiv_events twl4030_usb_linkstat(struct twl4030_usb *twl) ...@@ -250,6 +251,8 @@ static enum usb_xceiv_events twl4030_usb_linkstat(struct twl4030_usb *twl)
int status; int status;
int linkstat = USB_EVENT_NONE; int linkstat = USB_EVENT_NONE;
twl->vbus_supplied = false;
/* /*
* For ID/VBUS sensing, see manual section 15.4.8 ... * For ID/VBUS sensing, see manual section 15.4.8 ...
* except when using only battery backup power, two * except when using only battery backup power, two
...@@ -265,6 +268,9 @@ static enum usb_xceiv_events twl4030_usb_linkstat(struct twl4030_usb *twl) ...@@ -265,6 +268,9 @@ static enum usb_xceiv_events twl4030_usb_linkstat(struct twl4030_usb *twl)
if (status < 0) if (status < 0)
dev_err(twl->dev, "USB link status err %d\n", status); dev_err(twl->dev, "USB link status err %d\n", status);
else if (status & (BIT(7) | BIT(2))) { else if (status & (BIT(7) | BIT(2))) {
if (status & (BIT(7)))
twl->vbus_supplied = true;
if (status & BIT(2)) if (status & BIT(2))
linkstat = USB_EVENT_ID; linkstat = USB_EVENT_ID;
else else
...@@ -484,7 +490,7 @@ static ssize_t twl4030_usb_vbus_show(struct device *dev, ...@@ -484,7 +490,7 @@ static ssize_t twl4030_usb_vbus_show(struct device *dev,
spin_lock_irqsave(&twl->lock, flags); spin_lock_irqsave(&twl->lock, flags);
ret = sprintf(buf, "%s\n", ret = sprintf(buf, "%s\n",
(twl->linkstat == USB_EVENT_VBUS) ? "on" : "off"); twl->vbus_supplied ? "on" : "off");
spin_unlock_irqrestore(&twl->lock, flags); spin_unlock_irqrestore(&twl->lock, flags);
return ret; return ret;
...@@ -608,6 +614,7 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev) ...@@ -608,6 +614,7 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev)
twl->otg.set_peripheral = twl4030_set_peripheral; twl->otg.set_peripheral = twl4030_set_peripheral;
twl->otg.set_suspend = twl4030_set_suspend; twl->otg.set_suspend = twl4030_set_suspend;
twl->usb_mode = pdata->usb_mode; twl->usb_mode = pdata->usb_mode;
twl->vbus_supplied = false;
twl->asleep = 1; twl->asleep = 1;
/* init spinlock for workqueue */ /* init spinlock for workqueue */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment