Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ea51d0b1 authored by Russell King's avatar Russell King
Browse files

ALSA: AACI: no need to call snd_pcm_period_elapsed() for each period



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: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent c0dea82c
Loading
Loading
Loading
Loading
+10 −8
Original line number Original line Diff line number Diff line
@@ -206,6 +206,7 @@ static void aaci_fifo_irq(struct aaci *aaci, int channel, u32 mask)


	if (mask & ISR_RXINTR) {
	if (mask & ISR_RXINTR) {
		struct aaci_runtime *aacirun = &aaci->capture;
		struct aaci_runtime *aacirun = &aaci->capture;
		bool period_elapsed = false;
		void *ptr;
		void *ptr;


		if (!aacirun->substream || !aacirun->start) {
		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) {
			if (aacirun->bytes <= 0) {
				aacirun->bytes += aacirun->period;
				aacirun->bytes += aacirun->period;
				aacirun->ptr = ptr;
				period_elapsed = true;
				spin_unlock(&aacirun->lock);
				snd_pcm_period_elapsed(aacirun->substream);
				spin_lock(&aacirun->lock);
			}
			}
			if (!(aacirun->cr & CR_EN))
			if (!(aacirun->cr & CR_EN))
				break;
				break;
@@ -256,6 +254,9 @@ static void aaci_fifo_irq(struct aaci *aaci, int channel, u32 mask)
		aacirun->ptr = ptr;
		aacirun->ptr = ptr;


		spin_unlock(&aacirun->lock);
		spin_unlock(&aacirun->lock);

		if (period_elapsed)
			snd_pcm_period_elapsed(aacirun->substream);
	}
	}


	if (mask & ISR_URINTR) {
	if (mask & ISR_URINTR) {
@@ -265,6 +266,7 @@ static void aaci_fifo_irq(struct aaci *aaci, int channel, u32 mask)


	if (mask & ISR_TXINTR) {
	if (mask & ISR_TXINTR) {
		struct aaci_runtime *aacirun = &aaci->playback;
		struct aaci_runtime *aacirun = &aaci->playback;
		bool period_elapsed = false;
		void *ptr;
		void *ptr;


		if (!aacirun->substream || !aacirun->start) {
		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) {
			if (aacirun->bytes <= 0) {
				aacirun->bytes += aacirun->period;
				aacirun->bytes += aacirun->period;
				aacirun->ptr = ptr;
				period_elapsed = true;
				spin_unlock(&aacirun->lock);
				snd_pcm_period_elapsed(aacirun->substream);
				spin_lock(&aacirun->lock);
			}
			}
			if (!(aacirun->cr & CR_EN))
			if (!(aacirun->cr & CR_EN))
				break;
				break;
@@ -315,6 +314,9 @@ static void aaci_fifo_irq(struct aaci *aaci, int channel, u32 mask)
		aacirun->ptr = ptr;
		aacirun->ptr = ptr;


		spin_unlock(&aacirun->lock);
		spin_unlock(&aacirun->lock);

		if (period_elapsed)
			snd_pcm_period_elapsed(aacirun->substream);
	}
	}
}
}