RE: [PATCH 059/172] usb: musb: OMAP4430: Fix usb device detection if connected during boot

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Greg/Felipe,

>-----Original Message-----
>From: Greg Kroah-Hartman [mailto:gregkh@xxxxxxx]
>Sent: Thursday, March 17, 2011 2:40 AM
>To: linux-usb@xxxxxxxxxxxxxxx
>Cc: Hema HK; Tony Lindgren; Paul Walmsley; Felipe Balbi
>Subject: [PATCH 059/172] usb: musb: OMAP4430: Fix usb device
>detection if connected during boot
>
>From: Hema HK <hemahk@xxxxxx>
>
>OMAP4430 is embedded with UTMI PHY. This PHY does not support the
>OTG features like ID pin detection and VBUS detection. This function
>is exported to an external companion chip TWL6030. Software
>must retrieve
>the OTG HNP and SRP status from the TWL6030 and configure the
>bits inside
>the control module that drive the related USBOTGHS UTMI
>interface signals.
>It must also read back the UTMI signals needed to configure the TWL6030
>OTG module.
>
>Can find more details in the TRM[1].
>[1]:http://focus.ti.com/pdfs/wtbu/OMAP4430_ES2.0_Public_TRM_vJ.pdf
>
>In OMAP4430 musb driver VBUS and ID notifications are received from the
>transceiver driver. If the cable/device is connected during boot,
>notifications from transceiver driver will be missed till musb driver
>is loaded.
>Patch to configure the transceiver in the platform_enable/disable
>functions and enable the vbus in the gadget driver based on the
>last_event of the otg_transceiver.
>
>Signed-off-by: Hema HK <hemahk@xxxxxx>
>Cc: Tony Lindgren <tony@xxxxxxxxxxx>
>Cc: Paul Walmsley <paul@xxxxxxxxx>
>Signed-off-by: Felipe Balbi <balbi@xxxxxx>
>---
> drivers/usb/musb/musb_gadget.c |    4 +++
> drivers/usb/musb/omap2430.c    |   53
>++++++++++++++++++++++++++++++++++++----
> 2 files changed, 52 insertions(+), 5 deletions(-)
>
>diff --git a/drivers/usb/musb/musb_gadget.c
>b/drivers/usb/musb/musb_gadget.c
>index 0f59bf9..95fbacc 100644
>--- a/drivers/usb/musb/musb_gadget.c
>+++ b/drivers/usb/musb/musb_gadget.c
>@@ -1877,6 +1877,10 @@ int usb_gadget_probe_driver(struct
>usb_gadget_driver *driver,
> 		if (retval < 0) {
> 			DBG(1, "add_hcd failed, %d\n", retval);
> 			goto err2;
>+
>+			if ((musb->xceiv->last_event == USB_EVENT_ID)
>+						&&
>musb->xceiv->set_vbus)
>+				otg_set_vbus(musb->xceiv, 1);
> 		}

There is a merge issue with this patch. The above change has to be outside
the error check loop.
It should be like

 		if (retval < 0) {
 			DBG(1, "add_hcd failed, %d\n", retval);
 			goto err2;
 		}
+
+		if ((musb->xceiv->last_event == USB_EVENT_ID) &&
musb->xceiv->set_vbus)
+			otg_set_vbus(musb->xceiv, 1);

Do you want me to send the patch or you will resolve it?

Regards,
Hema
>
> 		hcd->self.uses_pio_for_control = 1;
>diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c
>index bb6e6cd..64cf243 100644
>--- a/drivers/usb/musb/omap2430.c
>+++ b/drivers/usb/musb/omap2430.c
>@@ -328,16 +328,56 @@ static int omap2430_musb_init(struct musb *musb)
> 	if (status)
> 		DBG(1, "notification register failed\n");
>
>-	/* check whether cable is already connected */
>-	if (musb->xceiv->state ==OTG_STATE_B_IDLE)
>-		musb_otg_notifications(&musb->nb, 1,
>-					musb->xceiv->gadget);
>-
> 	setup_timer(&musb_idle_timer, musb_do_idle, (unsigned
>long) musb);
>
> 	return 0;
> }
>
>+static void omap2430_musb_enable(struct musb *musb)
>+{
>+	u8		devctl;
>+	unsigned long timeout = jiffies + msecs_to_jiffies(1000);
>+	struct device *dev = musb->controller;
>+	struct musb_hdrc_platform_data *pdata = dev->platform_data;
>+	struct omap_musb_board_data *data = pdata->board_data;
>+
>+	switch (musb->xceiv->last_event) {
>+
>+	case USB_EVENT_ID:
>+		otg_init(musb->xceiv);
>+		if (data->interface_type == MUSB_INTERFACE_UTMI) {
>+			devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
>+			/* start the session */
>+			devctl |= MUSB_DEVCTL_SESSION;
>+			musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
>+			while (musb_readb(musb->mregs, MUSB_DEVCTL) &
>+						MUSB_DEVCTL_BDEVICE) {
>+				cpu_relax();
>+
>+				if (time_after(jiffies, timeout)) {
>+					dev_err(musb->controller,
>+					"configured as A device
>timeout");
>+					break;
>+				}
>+			}
>+		}
>+		break;
>+
>+	case USB_EVENT_VBUS:
>+		otg_init(musb->xceiv);
>+		break;
>+
>+	default:
>+		break;
>+	}
>+}
>+
>+static void omap2430_musb_disable(struct musb *musb)
>+{
>+	if (musb->xceiv->last_event)
>+		otg_shutdown(musb->xceiv);
>+}
>+
> static int omap2430_musb_exit(struct musb *musb)
> {
>
>@@ -355,6 +395,9 @@ static const struct musb_platform_ops
>omap2430_ops = {
> 	.try_idle	= omap2430_musb_try_idle,
>
> 	.set_vbus	= omap2430_musb_set_vbus,
>+
>+	.enable		= omap2430_musb_enable,
>+	.disable	= omap2430_musb_disable,
> };
>
> static u64 omap2430_dmamask = DMA_BIT_MASK(32);
>--
>1.7.4.1
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux