Skip to content

Commit

Permalink
usb: phy: twl4030-usb: ignore duplicate events
Browse files Browse the repository at this point in the history
In some rare cases we may get multiple interrupts that will generate
duplicate omap_musb_mailbox() calls. This is a problem because each
VBUS/ID event generates runtime_pm call in OMAP glue code, causing
unbalanced gets or puts and breaking PM.

The same goes for initial state, glue already defaults to "no cable"
state, so only bother it if we have VBUS or ID.

Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
Reviewed-by: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
  • Loading branch information
Grazvydas Ignotas authored and Felipe Balbi committed Mar 21, 2013
1 parent 44a50d0 commit ca4f70c
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions drivers/usb/phy/phy-twl4030-usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -483,9 +483,10 @@ static irqreturn_t twl4030_usb_irq(int irq, void *_twl)
{
struct twl4030_usb *twl = _twl;
enum omap_musb_vbus_id_status status;
enum omap_musb_vbus_id_status status_prev = twl->linkstat;

status = twl4030_usb_linkstat(twl);
if (status > 0) {
if (status > 0 && status != status_prev) {
/* FIXME add a set_power() method so that B-devices can
* configure the charger appropriately. It's not always
* correct to consume VBUS power, and how much current to
Expand Down Expand Up @@ -523,7 +524,7 @@ static int twl4030_usb_phy_init(struct usb_phy *phy)
twl->asleep = 1;

status = twl4030_usb_linkstat(twl);
if (status > 0)
if (status == OMAP_MUSB_ID_GROUND || status == OMAP_MUSB_VBUS_VALID)
omap_musb_mailbox(twl->linkstat);

sysfs_notify(&twl->dev->kobj, NULL, "vbus");
Expand Down

0 comments on commit ca4f70c

Please sign in to comment.