]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - sound/arm/aaci.c
[ARM] 4138/1: AACI: multiple channel support for IRQ handling
[linux-2.6-omap-h63xx.git] / sound / arm / aaci.c
index 6b18225672c7ae6227a8ebb206c9aaf6460cee00..b85df793cdceb41f421a8d9597b4d339e2584ac0 100644 (file)
@@ -164,10 +164,11 @@ static inline void aaci_chan_wait_ready(struct aaci_runtime *aacirun)
 /*
  * Interrupt support.
  */
-static void aaci_fifo_irq(struct aaci *aaci, u32 mask)
+static void aaci_fifo_irq(struct aaci *aaci, int channel, u32 mask)
 {
        if (mask & ISR_URINTR) {
-               writel(ICLR_TXUEC1, aaci->base + AACI_INTCLR);
+               dev_dbg(&aaci->dev->dev, "TX underrun on chan %d\n", channel);
+               writel(ICLR_TXUEC1 << channel, aaci->base + AACI_INTCLR);
        }
 
        if (mask & ISR_TXINTR) {
@@ -221,7 +222,7 @@ static void aaci_fifo_irq(struct aaci *aaci, u32 mask)
        }
 }
 
-static irqreturn_t aaci_irq(int irq, void *devid, struct pt_regs *regs)
+static irqreturn_t aaci_irq(int irq, void *devid)
 {
        struct aaci *aaci = devid;
        u32 mask;
@@ -233,7 +234,7 @@ static irqreturn_t aaci_irq(int irq, void *devid, struct pt_regs *regs)
                u32 m = mask;
                for (i = 0; i < 4; i++, m >>= 7) {
                        if (m & 0x7f) {
-                               aaci_fifo_irq(aaci, m);
+                               aaci_fifo_irq(aaci, i, m);
                        }
                }
        }
@@ -360,7 +361,7 @@ static int aaci_pcm_open(struct aaci *aaci, struct snd_pcm_substream *substream,
        if (ret)
                goto out;
 
-       ret = request_irq(aaci->dev->irq[0], aaci_irq, SA_SHIRQ|SA_INTERRUPT,
+       ret = request_irq(aaci->dev->irq[0], aaci_irq, IRQF_SHARED|IRQF_DISABLED,
                          DRIVER_NAME, aaci);
        if (ret)
                goto out;