Exemple #1
0
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;
}