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

Commit 50f3beb5 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab
Browse files

V4L/DVB (9742): em28xx-alsa: implement another locking schema



Instead of using a spinlock, it is better to call the proper pcm stream
locking schema.

Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 7a8f4ccf
Loading
Loading
Loading
Loading
+24 −13
Original line number Original line Diff line number Diff line
@@ -75,7 +75,9 @@ static void em28xx_audio_isocirq(struct urb *urb)
	struct em28xx            *dev = urb->context;
	struct em28xx            *dev = urb->context;
	int                      i;
	int                      i;
	unsigned int             oldptr;
	unsigned int             oldptr;
#ifdef NO_PCM_LOCK
	unsigned long            flags;
	unsigned long            flags;
#endif
	int                      period_elapsed = 0;
	int                      period_elapsed = 0;
	int                      status;
	int                      status;
	unsigned char            *cp;
	unsigned char            *cp;
@@ -96,9 +98,26 @@ static void em28xx_audio_isocirq(struct urb *urb)
			if (!length)
			if (!length)
				continue;
				continue;


#ifdef NO_PCM_LOCK
			spin_lock_irqsave(&dev->adev->slock, flags);
			spin_lock_irqsave(&dev->adev->slock, flags);

#endif
			oldptr = dev->adev->hwptr_done_capture;
			oldptr = dev->adev->hwptr_done_capture;
			if (oldptr + length >= runtime->buffer_size) {
				unsigned int cnt =
				    runtime->buffer_size - oldptr;
				memcpy(runtime->dma_area + oldptr * stride, cp,
				       cnt * stride);
				memcpy(runtime->dma_area, cp + cnt * stride,
				       length * stride - cnt * stride);
			} else {
				memcpy(runtime->dma_area + oldptr * stride, cp,
				       length * stride);
			}

#ifndef NO_PCM_LOCK
			snd_pcm_stream_lock(substream);
#endif

			dev->adev->hwptr_done_capture += length;
			dev->adev->hwptr_done_capture += length;
			if (dev->adev->hwptr_done_capture >=
			if (dev->adev->hwptr_done_capture >=
			    runtime->buffer_size)
			    runtime->buffer_size)
@@ -113,19 +132,11 @@ static void em28xx_audio_isocirq(struct urb *urb)
				period_elapsed = 1;
				period_elapsed = 1;
			}
			}


#ifdef NO_PCM_LOCK
			spin_unlock_irqrestore(&dev->adev->slock, flags);
			spin_unlock_irqrestore(&dev->adev->slock, flags);

#else
			if (oldptr + length >= runtime->buffer_size) {
			snd_pcm_stream_unlock(substream);
				unsigned int cnt =
#endif
				    runtime->buffer_size - oldptr;
				memcpy(runtime->dma_area + oldptr * stride, cp,
				       cnt * stride);
				memcpy(runtime->dma_area, cp + cnt * stride,
				       length * stride - cnt * stride);
			} else {
				memcpy(runtime->dma_area + oldptr * stride, cp,
				       length * stride);
			}
		}
		}
		if (period_elapsed)
		if (period_elapsed)
			snd_pcm_period_elapsed(substream);
			snd_pcm_period_elapsed(substream);