summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--linux/drivers/media/video/em28xx/em28xx-audio.c37
-rwxr-xr-xv4l/scripts/gentree.pl1
-rwxr-xr-xv4l/scripts/make_config_compat.pl20
3 files changed, 45 insertions, 13 deletions
diff --git a/linux/drivers/media/video/em28xx/em28xx-audio.c b/linux/drivers/media/video/em28xx/em28xx-audio.c
index b86b0870d..7bdbbf717 100644
--- a/linux/drivers/media/video/em28xx/em28xx-audio.c
+++ b/linux/drivers/media/video/em28xx/em28xx-audio.c
@@ -80,7 +80,9 @@ static void em28xx_audio_isocirq(struct urb *urb)
struct em28xx *dev = urb->context;
int i;
unsigned int oldptr;
+#ifdef NO_PCM_LOCK
unsigned long flags;
+#endif
int period_elapsed = 0;
int status;
unsigned char *cp;
@@ -106,9 +108,26 @@ static void em28xx_audio_isocirq(struct urb *urb)
if (!length)
continue;
+#ifdef NO_PCM_LOCK
spin_lock_irqsave(&dev->adev->slock, flags);
-
+#endif
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;
if (dev->adev->hwptr_done_capture >=
runtime->buffer_size)
@@ -123,19 +142,11 @@ static void em28xx_audio_isocirq(struct urb *urb)
period_elapsed = 1;
}
+#ifdef NO_PCM_LOCK
spin_unlock_irqrestore(&dev->adev->slock, flags);
-
- 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);
- }
+#else
+ snd_pcm_stream_unlock(substream);
+#endif
}
if (period_elapsed)
snd_pcm_period_elapsed(substream);
diff --git a/v4l/scripts/gentree.pl b/v4l/scripts/gentree.pl
index fccaedff4..d84608aa1 100755
--- a/v4l/scripts/gentree.pl
+++ b/v4l/scripts/gentree.pl
@@ -73,6 +73,7 @@ my %defs = (
'BUZ_USE_HIMEM' => 1,
'NEED_SOUND_DRIVER_H' => 0,
'TTUSB_KERNEL' => 1,
+ 'NO_PCM_LOCK' => 0,
);
#################################################################
diff --git a/v4l/scripts/make_config_compat.pl b/v4l/scripts/make_config_compat.pl
index fdbc5eaba..3aac7e3b3 100755
--- a/v4l/scripts/make_config_compat.pl
+++ b/v4l/scripts/make_config_compat.pl
@@ -159,6 +159,25 @@ sub check_proc_create()
close INNET;
}
+sub check_pcm_lock()
+{
+ my $file = "$kdir/include/sound/pcm.h";
+ my $need_compat = 1;
+
+ open INNET, "<$file" or die "File not found: $file";
+ while (<INNET>) {
+ if (m/pcm_stream_lock/) {
+ $need_compat = 0;
+ last;
+ }
+ }
+
+ if ($need_compat) {
+ $out.= "\n#define NO_PCM_LOCK 1\n";
+ }
+ close INNET;
+}
+
sub check_other_dependencies()
{
check_spin_lock();
@@ -169,6 +188,7 @@ sub check_other_dependencies()
check_is_singular();
check_clamp();
check_proc_create();
+ check_pcm_lock();
}
# Do the basic rules