usb: musb: core: improve musb_interrupt() a bit
authorFelipe Balbi <balbi@ti.com>
Mon, 30 Dec 2013 18:42:38 +0000 (12:42 -0600)
committerFelipe Balbi <balbi@ti.com>
Mon, 9 Mar 2015 15:38:49 +0000 (10:38 -0500)
instead of using manually spelled out bit-shits
and iterate over each of the 16-bits (one for
each endpoint) on each direction, we can make use
of for_each_set_bit() which internally uses
find_first_bit().

This makes the code slightly more readable while
also making we only iterate over bits which are
actually set.

Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/musb/musb_core.c

index 461bfe8efcf2f6b9b244cffd56d2f9eee33a3083..e59ae7395ba803a35492ae9ab39f11eb85967054 100644 (file)
@@ -1587,9 +1587,12 @@ static int musb_core_init(u16 musb_type, struct musb *musb)
 irqreturn_t musb_interrupt(struct musb *musb)
 {
        irqreturn_t     retval = IRQ_NONE;
+       unsigned long   status;
+       unsigned long   epnum;
        u8              devctl;
-       int             ep_num;
-       u32             reg;
+
+       if (!musb->int_usb && !musb->int_tx && !musb->int_rx)
+               return IRQ_NONE;
 
        devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
 
@@ -1618,43 +1621,36 @@ irqreturn_t musb_interrupt(struct musb *musb)
         */
 
        if (musb->int_usb)
-               retval |= musb_stage0_irq(musb, musb->int_usb,
-                               devctl);
+               retval |= musb_stage0_irq(musb, musb->int_usb, devctl);
 
        if (musb->int_tx & 1) {
                if (is_host_active(musb))
                        retval |= musb_h_ep0_irq(musb);
                else
                        retval |= musb_g_ep0_irq(musb);
+
+               /* we have just handled endpoint 0 IRQ, clear it */
+               musb->int_tx &= ~BIT(0);
        }
 
-       reg = musb->int_tx >> 1;
-       ep_num = 1;
-       while (reg) {
-               if (reg & 1) {
-                       retval = IRQ_HANDLED;
-                       if (is_host_active(musb))
-                               musb_host_tx(musb, ep_num);
-                       else
-                               musb_g_tx(musb, ep_num);
-               }
-               reg >>= 1;
-               ep_num++;
+       status = musb->int_tx;
+
+       for_each_set_bit(epnum, &status, 16) {
+               retval = IRQ_HANDLED;
+               if (is_host_active(musb))
+                       musb_host_tx(musb, epnum);
+               else
+                       musb_g_tx(musb, epnum);
        }
 
-       reg = musb->int_rx >> 1;
-       ep_num = 1;
-       while (reg) {
-               if (reg & 1) {
-                       retval = IRQ_HANDLED;
-                       if (is_host_active(musb))
-                               musb_host_rx(musb, ep_num);
-                       else
-                               musb_g_rx(musb, ep_num);
-               }
+       status = musb->int_rx;
 
-               reg >>= 1;
-               ep_num++;
+       for_each_set_bit(epnum, &status, 16) {
+               retval = IRQ_HANDLED;
+               if (is_host_active(musb))
+                       musb_host_rx(musb, epnum);
+               else
+                       musb_g_rx(musb, epnum);
        }
 
        return retval;