phy-twl4030-usb: better handle musb_mailbox() failure
authorAndreas Kemnade <andreas@kemnade.info>
Mon, 22 Aug 2016 19:24:22 +0000 (21:24 +0200)
committerKishon Vijay Abraham I <kishon@ti.com>
Wed, 14 Sep 2016 05:29:11 +0000 (10:59 +0530)
setting twl->linkstat = MUSB_UNKNOWN upon error in musb_mailbox as
introduced in
commit 12b7db2bf8b8 ("usb: musb: Return error value from musb_mailbox")
causes twl4030_usb_irq() to not detect a state change form cable connected
to cable disconnected after such an error so that
pm_runtime_put_autosuspend() will not be called and the usage counter
gets unbalanced. Such errors happen e.g. if the omap2430 module is not
(yet) loaded during plug/unplug events.

This patch introduces a flag instead that indicates whether there is
information for the musb_mailbox pending and calls musb_mailbox() if
that flag is set.

Signed-off-by: Andreas Kemnade <andreas@kemnade.info>
Tested-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
drivers/phy/phy-twl4030-usb.c

index d9b10a39a2cf77c6f67b3655b3a1f56143f0083e..81067b461098a304150acfc89581be7549440153 100644 (file)
@@ -172,6 +172,7 @@ struct twl4030_usb {
        int                     irq;
        enum musb_vbus_id_status linkstat;
        bool                    vbus_supplied;
+       bool                    musb_mailbox_pending;
 
        struct delayed_work     id_workaround_work;
 };
@@ -569,9 +570,12 @@ static irqreturn_t twl4030_usb_irq(int irq, void *_twl)
                        pm_runtime_mark_last_busy(twl->dev);
                        pm_runtime_put_autosuspend(twl->dev);
                }
+               twl->musb_mailbox_pending = true;
+       }
+       if (twl->musb_mailbox_pending) {
                err = musb_mailbox(status);
-               if (err)
-                       twl->linkstat = MUSB_UNKNOWN;
+               if (!err)
+                       twl->musb_mailbox_pending = false;
        }
 
        /* don't schedule during sleep - irq works right then */
@@ -676,6 +680,7 @@ static int twl4030_usb_probe(struct platform_device *pdev)
        twl->irq                = platform_get_irq(pdev, 0);
        twl->vbus_supplied      = false;
        twl->linkstat           = MUSB_UNKNOWN;
+       twl->musb_mailbox_pending = false;
 
        twl->phy.dev            = twl->dev;
        twl->phy.label          = "twl4030";