Skip to contentSkip to conversation

Few PM fixes for MUSB for v4.9 merge window

PATCH Applied Tony Lindgren 2 participants 4 messages Sep 15, 2016 – Sep 21, 2016 1 message not in the archive

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

cover Few PM fixes for MUSB for v4.9 merge window

Hi,

I noticed few corner cases we're not handling properly with the musb hardware session bit based PM runtime heading for v4.9.

Probably the disconnect after unconfigure PM issue has always been there, but fixing it without the session bit based PM runtime would be a mess.

Regards,

Tony

Tony Lindgren (2):
usb: musb: Fix PM runtime for disconnect after unconfigure
usb: musb: Fix session based PM for first invalid VBUS

 drivers/usb/musb/musb_core.c   | 13 ++++++++-----
 drivers/usb/musb/musb_core.h   |  1 +
 drivers/usb/musb/musb_gadget.c |  3 +++
 3 files changed, 12 insertions(+), 5 deletions(-)
Signature · 5 lines
2.9.3
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

A message that is not in the archive (sent off-list or not yet received): 20160915162914.8164-1-tony-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org

#2 lore raw

PATCH 1/2 usb: musb: Fix PM runtime for disconnect after unconfigure

If we unconfigure musb as a USB peripheral with cable connected, and then remove the cable, no interrupts will happen. And musb thinks we're still connected keeping the device active.

Now with the session bit based PM runtime working for musb, we can fix this issue by calling musb irq_work. That rechecks the devctl register and reconfigures PM runtime based on the devctl.

Fixes 467d5c980709 ("usb: musb: Implement session bit based

runtime PM for musb-core")

---
 drivers/usb/musb/musb_gadget.c | 3 +++
 1 file changed, 3 insertions(+)
drivers/usb/musb/musb_gadget.c +3 -0
@@ -1964,6 +1964,9 @@ static int musb_gadget_stop(struct usb_gadget *g)
 	 * that currently misbehaves.
 	 */
 
+	/* Force check of devctl register for PM runtime */
+	schedule_work(&musb->irq_work);
+
 	pm_runtime_mark_last_busy(musb->controller);
 	pm_runtime_put_autosuspend(musb->controller);
 
Signature · 5 lines
2.9.3
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#3 lore raw

PATCH 2/2 usb: musb: Fix session based PM for first invalid VBUS

In reply to a message not in the archive

With the session bit based PM runtime working on musb, we've implemented few quirks to attempt to detect the current state of the hardware. One of the quirks is for invalid VBUS as peripheral, but it is not working in all cases.

If we start musb on dm3730 as a peripheral with no cable connected, we will get the devctl 91 state once and will never idle as there are not further interrupts from musb. So we need to ignore the first devctl 91 state as there will be more interrupts if we're connected.

The invalid VBUS state also can happen always when connected to certain USB hubs. Looks like musb on dm3730 can claim invalid VBUS with some hubs while 3717-evm and BeagleBone don't. This causes session as peripheral to fail for dm3730 with some hubs.

This too is fixed by ignoring only the first invalid VBUS. When connected, we can just look at the session bit as that will clear automatically when the session ends.

Fixes 467d5c980709 ("usb: musb: Implement session bit based

runtime PM for musb-core")

---
 drivers/usb/musb/musb_core.c | 13 ++++++++-----
 drivers/usb/musb/musb_core.h |  1 +
 2 files changed, 9 insertions(+), 5 deletions(-)
drivers/usb/musb/musb_core.c +8 -5
@@ -1855,11 +1855,13 @@ static void musb_pm_runtime_check_session(struct musb *musb)
 		MUSB_DEVCTL_HR;
 	switch (devctl & ~s) {
 	case MUSB_QUIRK_B_INVALID_VBUS_91:
-		if (musb->session)
-			break;
-		musb_dbg(musb, "Allow PM as device with invalid vbus: %02x",
-			devctl);
-		return;
+		if (!musb->session && !musb->quirk_invalid_vbus) {
+			musb->quirk_invalid_vbus = true;
+			musb_dbg(musb,
+				 "First invalid vbus, assume no session");
+			return;
+		}
+		break;
 	case MUSB_QUIRK_A_DISCONNECT_19:
 		if (!musb->session)
 			break;
@@ -1886,6 +1888,7 @@ static void musb_pm_runtime_check_session(struct musb *musb)
 				error);
 	} else {
 		musb_dbg(musb, "Allow PM with no session: %02x", devctl);
+		musb->quirk_invalid_vbus = false;
 		pm_runtime_mark_last_busy(musb->controller);
 		pm_runtime_put_autosuspend(musb->controller);
 	}
drivers/usb/musb/musb_core.h +1 -0
@@ -379,6 +379,7 @@ struct musb {
 
 	int			port_mode;	/* MUSB_PORT_MODE_* */
 	bool			session;
+	bool			quirk_invalid_vbus;
 	bool			is_host;
 
 	int			a_wait_bcon;	/* VBUS timeout in msecs */
Signature · 5 lines
2.9.3
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Applied
#4 lore raw
In reply to a message not in the archive

Hi,

Quoted 13 lines · Tony Lindgren

Hi,

I noticed few corner cases we're not handling properly with the musb hardware session bit based PM runtime heading for v4.9.

Probably the disconnect after unconfigure PM issue has always been there, but fixing it without the session bit based PM runtime would be a mess.

Regards,

Tony

Quoted 8 lines

Tony Lindgren (2):
usb: musb: Fix PM runtime for disconnect after unconfigure
usb: musb: Fix session based PM for first invalid VBUS

 drivers/usb/musb/musb_core.c   | 13 ++++++++-----
 drivers/usb/musb/musb_core.h   |  1 +
 drivers/usb/musb/musb_gadget.c |  3 +++
 3 files changed, 12 insertions(+), 5 deletions(-)

Applied. Thanks.

Regards,
-Bin.
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html