static irqreturn_t sdma_int_handler(int irq, void *dev_id) { struct sdma_engine *sdma = dev_id; u32 stat; stat = __raw_readl(sdma->regs + SDMA_H_INTR); __raw_writel(stat, sdma->regs + SDMA_H_INTR); while (stat) { int channel = fls(stat) - 1; struct sdma_channel *sdmac = &sdma->channel[channel]; mxc_sdma_handle_channel(sdmac); stat &= ~(1 << channel); } return IRQ_HANDLED; }
static irqreturn_t sdma_int_handler(int irq, void *dev_id) { struct sdma_engine *sdma = dev_id; struct sdma_channel *sdmac; unsigned long flag; int channel; u32 stat, stat_bak; spin_lock_irqsave(&sdma->irq_reg_lock, flag); stat = readl_relaxed(sdma->regs + SDMA_H_INTR); /* not interested in channel 0 interrupts */ stat &= ~1; writel_relaxed(stat, sdma->regs + SDMA_H_INTR); spin_unlock_irqrestore(&sdma->irq_reg_lock, flag); stat_bak = stat; while (stat_bak) { channel = fls(stat_bak) - 1; sdmac = &sdma->channel[channel]; sdmac->irq_handling = 1; stat_bak &= ~(1 << channel); } while (stat) { channel = fls(stat) - 1; sdmac = &sdma->channel[channel]; if (sdmac->irq_handling) mxc_sdma_handle_channel(sdmac); stat &= ~(1 << channel); sdmac->irq_handling = 0; } return IRQ_HANDLED; }