diff mbox

phy-twl4030-usb: better handle musb_mailbox() failure

Message ID 1471766607-3980-1-git-send-email-andreas@kemnade.info (mailing list archive)
State New, archived
Headers show

Commit Message

Andreas Kemnade Aug. 21, 2016, 8:03 a.m. UTC
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 musb
knows about the status and calls musb_mailbox() when it does not
know yet about the status.

Signed-off-by: Andreas Kemnade <andreas@kemnade.info>
---
 drivers/phy/phy-twl4030-usb.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

Comments

Tony Lindgren Aug. 22, 2016, 3:42 p.m. UTC | #1
* Andreas Kemnade <andreas@kemnade.info> [160821 01:04]:
> 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.

OK makes sense to me.

> This patch introduces a flag instead that indicates whether musb
> knows about the status and calls musb_mailbox() when it does not
> know yet about the status.

Works for me the same with this patch too. Probably best to not
use musb naming here though in the phy. How about use something like
musb_mailbox_pending for the flag?

Maybe also swap the logic around to only set musb_mailbox_pending
if musb_mailbox(status) returns err?

Regards,

Tony
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/phy/phy-twl4030-usb.c b/drivers/phy/phy-twl4030-usb.c
index ed98cb6..49737fb 100644
--- a/drivers/phy/phy-twl4030-usb.c
+++ b/drivers/phy/phy-twl4030-usb.c
@@ -173,6 +173,7 @@  struct twl4030_usb {
 	int			irq;
 	enum musb_vbus_id_status linkstat;
 	bool			vbus_supplied;
+	bool			musb_has_seen_linkstat;
 
 	struct delayed_work	id_workaround_work;
 };
@@ -711,9 +712,13 @@  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_has_seen_linkstat = false;
+	}
+
+	if (!twl->musb_has_seen_linkstat) {
 		err = musb_mailbox(status);
-		if (err)
-			twl->linkstat = MUSB_UNKNOWN;
+		if (!err)
+			twl->musb_has_seen_linkstat = true;
 	}
 
 	/* don't schedule during sleep - irq works right then */
@@ -818,6 +823,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_has_seen_linkstat = false;
 
 	twl->phy.dev		= twl->dev;
 	twl->phy.label		= "twl4030";