USB: musb_gadget_ep0: stop abusing musb_gadget_set_halt()
authorSergei Shtylyov <sshtylyov@ru.mvista.com>
Wed, 18 Nov 2009 19:54:32 +0000 (22:54 +0300)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 11 Dec 2009 19:55:25 +0000 (11:55 -0800)
Stop playing with musb->lock and abusing musb_gadget_set_halt() in
the code clearing the endpoint halt feature -- instead, manipulate
the registers directly.

While at it, get rid uf unneeded line breaks and over-indentation in
the code setting the endpoint halt feature.

Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/musb/musb_gadget.h
drivers/usb/musb/musb_gadget_ep0.c

index 9096669..c8b1403 100644 (file)
@@ -105,6 +105,4 @@ extern void musb_gadget_cleanup(struct musb *);
 
 extern void musb_g_giveback(struct musb_ep *, struct usb_request *, int);
 
-extern int musb_gadget_set_halt(struct usb_ep *ep, int value);
-
 #endif         /* __MUSB_GADGET_H */
index c63aff1..8fba3f1 100644 (file)
@@ -257,19 +257,25 @@ __acquires(musb->lock)
                        case USB_RECIP_INTERFACE:
                                break;
                        case USB_RECIP_ENDPOINT:{
-                               const u8 num = ctrlrequest->wIndex & 0x0f;
-                               struct musb_ep *musb_ep;
+                               const u8                epnum =
+                                       ctrlrequest->wIndex & 0x0f;
+                               struct musb_ep          *musb_ep;
+                               struct musb_hw_ep       *ep;
+                               void __iomem            *regs;
+                               int                     is_in;
+                               u16                     csr;
 
-                               if (num == 0
-                                               || num >= MUSB_C_NUM_EPS
-                                               || ctrlrequest->wValue
-                                                       != USB_ENDPOINT_HALT)
+                               if (epnum == 0 || epnum >= MUSB_C_NUM_EPS ||
+                                   ctrlrequest->wValue != USB_ENDPOINT_HALT)
                                        break;
 
-                               if (ctrlrequest->wIndex & USB_DIR_IN)
-                                       musb_ep = &musb->endpoints[num].ep_in;
+                               ep = musb->endpoints + epnum;
+                               regs = ep->regs;
+                               is_in = ctrlrequest->wIndex & USB_DIR_IN;
+                               if (is_in)
+                                       musb_ep = &ep->ep_in;
                                else
-                                       musb_ep = &musb->endpoints[num].ep_out;
+                                       musb_ep = &ep->ep_out;
                                if (!musb_ep->desc)
                                        break;
 
@@ -278,10 +284,23 @@ __acquires(musb->lock)
                                if (musb_ep->wedged)
                                        break;
 
-                               /* REVISIT do it directly, no locking games */
-                               spin_unlock(&musb->lock);
-                               musb_gadget_set_halt(&musb_ep->end_point, 0);
-                               spin_lock(&musb->lock);
+                               musb_ep_select(mbase, epnum);
+                               if (is_in) {
+                                       csr  = musb_readw(regs, MUSB_TXCSR);
+                                       csr |= MUSB_TXCSR_CLRDATATOG |
+                                              MUSB_TXCSR_P_WZC_BITS;
+                                       csr &= ~(MUSB_TXCSR_P_SENDSTALL |
+                                                MUSB_TXCSR_P_SENTSTALL |
+                                                MUSB_TXCSR_TXPKTRDY);
+                                       musb_writew(regs, MUSB_TXCSR, csr);
+                               } else {
+                                       csr  = musb_readw(regs, MUSB_RXCSR);
+                                       csr |= MUSB_RXCSR_CLRDATATOG |
+                                              MUSB_RXCSR_P_WZC_BITS;
+                                       csr &= ~(MUSB_RXCSR_P_SENDSTALL |
+                                                MUSB_RXCSR_P_SENTSTALL);
+                                       musb_writew(regs, MUSB_RXCSR, csr);
+                               }
 
                                /* select ep0 again */
                                musb_ep_select(mbase, 0);
@@ -377,10 +396,8 @@ stall:
                                int                     is_in;
                                u16                     csr;
 
-                               if (epnum == 0
-                                               || epnum >= MUSB_C_NUM_EPS
-                                               || ctrlrequest->wValue
-                                                       != USB_ENDPOINT_HALT)
+                               if (epnum == 0 || epnum >= MUSB_C_NUM_EPS ||
+                                   ctrlrequest->wValue != USB_ENDPOINT_HALT)
                                        break;
 
                                ep = musb->endpoints + epnum;
@@ -395,24 +412,20 @@ stall:
 
                                musb_ep_select(mbase, epnum);
                                if (is_in) {
-                                       csr = musb_readw(regs,
-                                                       MUSB_TXCSR);
+                                       csr = musb_readw(regs, MUSB_TXCSR);
                                        if (csr & MUSB_TXCSR_FIFONOTEMPTY)
                                                csr |= MUSB_TXCSR_FLUSHFIFO;
                                        csr |= MUSB_TXCSR_P_SENDSTALL
                                                | MUSB_TXCSR_CLRDATATOG
                                                | MUSB_TXCSR_P_WZC_BITS;
-                                       musb_writew(regs, MUSB_TXCSR,
-                                                       csr);
+                                       musb_writew(regs, MUSB_TXCSR, csr);
                                } else {
-                                       csr = musb_readw(regs,
-                                                       MUSB_RXCSR);
+                                       csr = musb_readw(regs, MUSB_RXCSR);
                                        csr |= MUSB_RXCSR_P_SENDSTALL
                                                | MUSB_RXCSR_FLUSHFIFO
                                                | MUSB_RXCSR_CLRDATATOG
                                                | MUSB_RXCSR_P_WZC_BITS;
-                                       musb_writew(regs, MUSB_RXCSR,
-                                                       csr);
+                                       musb_writew(regs, MUSB_RXCSR, csr);
                                }
 
                                /* select ep0 again */