ALSA: AACI: no need to call snd_pcm_period_elapsed() for each period
authorRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 13 Jan 2011 08:47:35 +0000 (08:47 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 26 Jan 2011 20:24:12 +0000 (20:24 +0000)
There is no need to call snd_pcm_period_elapsed() each time a period
elapses - we can call it after we're done once loading/unloading the
FIFO with data.  ALSA works out how many periods have elapsed by
reading the current pointers.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
sound/arm/aaci.c

index a8f95382a95a3b45fdeb6c43e696ac9f037c986a..393ce08b0e11d764c3b8433b2638792ac9cb8783 100644 (file)
@@ -206,6 +206,7 @@ static void aaci_fifo_irq(struct aaci *aaci, int channel, u32 mask)
 
        if (mask & ISR_RXINTR) {
                struct aaci_runtime *aacirun = &aaci->capture;
+               bool period_elapsed = false;
                void *ptr;
 
                if (!aacirun->substream || !aacirun->start) {
@@ -223,10 +224,7 @@ static void aaci_fifo_irq(struct aaci *aaci, int channel, u32 mask)
 
                        if (aacirun->bytes <= 0) {
                                aacirun->bytes += aacirun->period;
-                               aacirun->ptr = ptr;
-                               spin_unlock(&aacirun->lock);
-                               snd_pcm_period_elapsed(aacirun->substream);
-                               spin_lock(&aacirun->lock);
+                               period_elapsed = true;
                        }
                        if (!(aacirun->cr & CR_EN))
                                break;
@@ -256,6 +254,9 @@ static void aaci_fifo_irq(struct aaci *aaci, int channel, u32 mask)
                aacirun->ptr = ptr;
 
                spin_unlock(&aacirun->lock);
+
+               if (period_elapsed)
+                       snd_pcm_period_elapsed(aacirun->substream);
        }
 
        if (mask & ISR_URINTR) {
@@ -265,6 +266,7 @@ static void aaci_fifo_irq(struct aaci *aaci, int channel, u32 mask)
 
        if (mask & ISR_TXINTR) {
                struct aaci_runtime *aacirun = &aaci->playback;
+               bool period_elapsed = false;
                void *ptr;
 
                if (!aacirun->substream || !aacirun->start) {
@@ -282,10 +284,7 @@ static void aaci_fifo_irq(struct aaci *aaci, int channel, u32 mask)
 
                        if (aacirun->bytes <= 0) {
                                aacirun->bytes += aacirun->period;
-                               aacirun->ptr = ptr;
-                               spin_unlock(&aacirun->lock);
-                               snd_pcm_period_elapsed(aacirun->substream);
-                               spin_lock(&aacirun->lock);
+                               period_elapsed = true;
                        }
                        if (!(aacirun->cr & CR_EN))
                                break;
@@ -315,6 +314,9 @@ static void aaci_fifo_irq(struct aaci *aaci, int channel, u32 mask)
                aacirun->ptr = ptr;
 
                spin_unlock(&aacirun->lock);
+
+               if (period_elapsed)
+                       snd_pcm_period_elapsed(aacirun->substream);
        }
 }