usb: musb: core: improve musb_interrupt() a bit
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>
This commit is contained in:
parent
e3c93e1a3f
commit
31a0ede0de
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user