12 Jul
2011
12 Jul
'11
11:06 a.m.
On Fri, Jul 1, 2011 at 7:18 AM, Sangbeom Kim sbkim73@samsung.com wrote:
+static void idma_control(int op) +{
- u32 val = readl(idma.regs + I2SAHB);
- spin_lock(&idma.lock);
- switch (op) {
- case LPAM_DMA_START:
- val |= (AHB_INTENLVL0 | AHB_DMAEN);
- break;
- case LPAM_DMA_STOP:
- val &= ~(AHB_INTENLVL0 | AHB_DMAEN);
- break;
- default:
- return;
Need to release the lock before return. This is not the showstopper for this revision.
- }
- writel(val, idma.regs + I2SAHB);
- spin_unlock(&idma.lock);
+}
......
+static irqreturn_t iis_irq(int irqno, void *dev_id) +{
- struct idma_ctrl *prtd = (struct idma_ctrl *)dev_id;
- u32 iiscon, iisahb, val, addr;
- iisahb = readl(idma.regs + I2SAHB);
- iiscon = readl(idma.regs + I2SCON);
- val = (iisahb & AHB_LVL0INT) ? AHB_CLRLVL0INT : 0;
- if (val) {
- iisahb |= val;
- writel(iisahb, idma.regs + I2SAHB);
- addr = readl(idma.regs + I2SLVL0ADDR) - idma.lp_tx_addr;
- addr += prtd->periodsz;
- addr %= prtd->period;
- addr += idma.lp_tx_addr;
Dear, out of 4 revisions, 3(including current) got it wrong at this important point. Ok write it like below addr = readl(idma.regs + I2SLVL0ADDR) - idma.lp_tx_addr; addr += prtd->periodsz; addr %= (prtd->end - prtd->start); // <------ Note addr += idma.lp_tx_addr;
- writel(addr, idma.regs + I2SLVL0ADDR);
- if (prtd->cb)
- prtd->cb(prtd->token, prtd->period);
- }
- return IRQ_HANDLED;
+}