Skip to content

Commit

Permalink
usb: musb: core: improve musb_interrupt() a bit
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Felipe Balbi committed Mar 9, 2015
1 parent e3c93e1 commit 31a0ede
Showing 1 changed file with 24 additions and 28 deletions.
52 changes: 24 additions & 28 deletions drivers/usb/musb/musb_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 31a0ede

Please sign in to comment.