Re: [PATCH v1 37/49] media: usb: cx231xx: prepare for enabling irq in complete()

2013-08-22 Thread Hans Verkuil
On Sat 17 August 2013 18:25:02 Ming Lei wrote:
> Complete() will be run with interrupt enabled, so change to
> spin_lock_irqsave().
> 
> Cc: Mauro Carvalho Chehab 
> Cc: Hans Verkuil 
> Cc: linux-me...@vger.kernel.org
> Signed-off-by: Ming Lei 

Acked-by: Hans Verkuil 

Regards,

Hans

> ---
>  drivers/media/usb/cx231xx/cx231xx-audio.c |   10 ++
>  drivers/media/usb/cx231xx/cx231xx-core.c  |   10 ++
>  drivers/media/usb/cx231xx/cx231xx-vbi.c   |5 +++--
>  3 files changed, 15 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/media/usb/cx231xx/cx231xx-audio.c 
> b/drivers/media/usb/cx231xx/cx231xx-audio.c
> index 81a1d97..f6fa0af 100644
> --- a/drivers/media/usb/cx231xx/cx231xx-audio.c
> +++ b/drivers/media/usb/cx231xx/cx231xx-audio.c
> @@ -136,6 +136,7 @@ static void cx231xx_audio_isocirq(struct urb *urb)
>   stride = runtime->frame_bits >> 3;
>  
>   for (i = 0; i < urb->number_of_packets; i++) {
> + unsigned long flags;
>   int length = urb->iso_frame_desc[i].actual_length /
>stride;
>   cp = (unsigned char *)urb->transfer_buffer +
> @@ -158,7 +159,7 @@ static void cx231xx_audio_isocirq(struct urb *urb)
>  length * stride);
>   }
>  
> - snd_pcm_stream_lock(substream);
> + snd_pcm_stream_lock_irqsave(substream, flags);
>  
>   dev->adev.hwptr_done_capture += length;
>   if (dev->adev.hwptr_done_capture >=
> @@ -173,7 +174,7 @@ static void cx231xx_audio_isocirq(struct urb *urb)
>   runtime->period_size;
>   period_elapsed = 1;
>   }
> - snd_pcm_stream_unlock(substream);
> + snd_pcm_stream_unlock_irqrestore(substream, flags);
>   }
>   if (period_elapsed)
>   snd_pcm_period_elapsed(substream);
> @@ -224,6 +225,7 @@ static void cx231xx_audio_bulkirq(struct urb *urb)
>   stride = runtime->frame_bits >> 3;
>  
>   if (1) {
> + unsigned long flags;
>   int length = urb->actual_length /
>stride;
>   cp = (unsigned char *)urb->transfer_buffer;
> @@ -242,7 +244,7 @@ static void cx231xx_audio_bulkirq(struct urb *urb)
>  length * stride);
>   }
>  
> - snd_pcm_stream_lock(substream);
> + snd_pcm_stream_lock_irqsave(substream, flags);
>  
>   dev->adev.hwptr_done_capture += length;
>   if (dev->adev.hwptr_done_capture >=
> @@ -257,7 +259,7 @@ static void cx231xx_audio_bulkirq(struct urb *urb)
>   runtime->period_size;
>   period_elapsed = 1;
>   }
> - snd_pcm_stream_unlock(substream);
> + snd_pcm_stream_unlock_irqrestore(substream,flags);
>   }
>   if (period_elapsed)
>   snd_pcm_period_elapsed(substream);
> diff --git a/drivers/media/usb/cx231xx/cx231xx-core.c 
> b/drivers/media/usb/cx231xx/cx231xx-core.c
> index 4ba3ce0..593b397 100644
> --- a/drivers/media/usb/cx231xx/cx231xx-core.c
> +++ b/drivers/media/usb/cx231xx/cx231xx-core.c
> @@ -798,6 +798,7 @@ static void cx231xx_isoc_irq_callback(struct urb *urb)
>   container_of(dma_q, struct cx231xx_video_mode, vidq);
>   struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
>   int i;
> + unsigned long flags;
>  
>   switch (urb->status) {
>   case 0: /* success */
> @@ -813,9 +814,9 @@ static void cx231xx_isoc_irq_callback(struct urb *urb)
>   }
>  
>   /* Copy data from URB */
> - spin_lock(&dev->video_mode.slock);
> + spin_lock_irqsave(&dev->video_mode.slock, flags);
>   dev->video_mode.isoc_ctl.isoc_copy(dev, urb);
> - spin_unlock(&dev->video_mode.slock);
> + spin_unlock_irqrestore(&dev->video_mode.slock, flags);
>  
>   /* Reset urb buffers */
>   for (i = 0; i < urb->number_of_packets; i++) {
> @@ -842,6 +843,7 @@ static void cx231xx_bulk_irq_callback(struct urb *urb)
>   struct cx231xx_video_mode *vmode =
>   container_of(dma_q, struct cx231xx_video_mode, vidq);
>   struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
> + unsigned long flags;
>  
>   switch (urb->status) {
>   case 0: /* success */
> @@ -857,9 +859,9 @@ static void cx231xx_bulk_irq_callback(struct urb *urb)
>   }
>  
>   /* Copy data from URB */
> - spin_lock(&dev->video_mode.slock);
> + spin_lock_irqsave(&dev->video_mode.slock, flags);
>   dev->video_m

[PATCH v1 37/49] media: usb: cx231xx: prepare for enabling irq in complete()

2013-08-17 Thread Ming Lei
Complete() will be run with interrupt enabled, so change to
spin_lock_irqsave().

Cc: Mauro Carvalho Chehab 
Cc: Hans Verkuil 
Cc: linux-me...@vger.kernel.org
Signed-off-by: Ming Lei 
---
 drivers/media/usb/cx231xx/cx231xx-audio.c |   10 ++
 drivers/media/usb/cx231xx/cx231xx-core.c  |   10 ++
 drivers/media/usb/cx231xx/cx231xx-vbi.c   |5 +++--
 3 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/drivers/media/usb/cx231xx/cx231xx-audio.c 
b/drivers/media/usb/cx231xx/cx231xx-audio.c
index 81a1d97..f6fa0af 100644
--- a/drivers/media/usb/cx231xx/cx231xx-audio.c
+++ b/drivers/media/usb/cx231xx/cx231xx-audio.c
@@ -136,6 +136,7 @@ static void cx231xx_audio_isocirq(struct urb *urb)
stride = runtime->frame_bits >> 3;
 
for (i = 0; i < urb->number_of_packets; i++) {
+   unsigned long flags;
int length = urb->iso_frame_desc[i].actual_length /
 stride;
cp = (unsigned char *)urb->transfer_buffer +
@@ -158,7 +159,7 @@ static void cx231xx_audio_isocirq(struct urb *urb)
   length * stride);
}
 
-   snd_pcm_stream_lock(substream);
+   snd_pcm_stream_lock_irqsave(substream, flags);
 
dev->adev.hwptr_done_capture += length;
if (dev->adev.hwptr_done_capture >=
@@ -173,7 +174,7 @@ static void cx231xx_audio_isocirq(struct urb *urb)
runtime->period_size;
period_elapsed = 1;
}
-   snd_pcm_stream_unlock(substream);
+   snd_pcm_stream_unlock_irqrestore(substream, flags);
}
if (period_elapsed)
snd_pcm_period_elapsed(substream);
@@ -224,6 +225,7 @@ static void cx231xx_audio_bulkirq(struct urb *urb)
stride = runtime->frame_bits >> 3;
 
if (1) {
+   unsigned long flags;
int length = urb->actual_length /
 stride;
cp = (unsigned char *)urb->transfer_buffer;
@@ -242,7 +244,7 @@ static void cx231xx_audio_bulkirq(struct urb *urb)
   length * stride);
}
 
-   snd_pcm_stream_lock(substream);
+   snd_pcm_stream_lock_irqsave(substream, flags);
 
dev->adev.hwptr_done_capture += length;
if (dev->adev.hwptr_done_capture >=
@@ -257,7 +259,7 @@ static void cx231xx_audio_bulkirq(struct urb *urb)
runtime->period_size;
period_elapsed = 1;
}
-   snd_pcm_stream_unlock(substream);
+   snd_pcm_stream_unlock_irqrestore(substream,flags);
}
if (period_elapsed)
snd_pcm_period_elapsed(substream);
diff --git a/drivers/media/usb/cx231xx/cx231xx-core.c 
b/drivers/media/usb/cx231xx/cx231xx-core.c
index 4ba3ce0..593b397 100644
--- a/drivers/media/usb/cx231xx/cx231xx-core.c
+++ b/drivers/media/usb/cx231xx/cx231xx-core.c
@@ -798,6 +798,7 @@ static void cx231xx_isoc_irq_callback(struct urb *urb)
container_of(dma_q, struct cx231xx_video_mode, vidq);
struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
int i;
+   unsigned long flags;
 
switch (urb->status) {
case 0: /* success */
@@ -813,9 +814,9 @@ static void cx231xx_isoc_irq_callback(struct urb *urb)
}
 
/* Copy data from URB */
-   spin_lock(&dev->video_mode.slock);
+   spin_lock_irqsave(&dev->video_mode.slock, flags);
dev->video_mode.isoc_ctl.isoc_copy(dev, urb);
-   spin_unlock(&dev->video_mode.slock);
+   spin_unlock_irqrestore(&dev->video_mode.slock, flags);
 
/* Reset urb buffers */
for (i = 0; i < urb->number_of_packets; i++) {
@@ -842,6 +843,7 @@ static void cx231xx_bulk_irq_callback(struct urb *urb)
struct cx231xx_video_mode *vmode =
container_of(dma_q, struct cx231xx_video_mode, vidq);
struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
+   unsigned long flags;
 
switch (urb->status) {
case 0: /* success */
@@ -857,9 +859,9 @@ static void cx231xx_bulk_irq_callback(struct urb *urb)
}
 
/* Copy data from URB */
-   spin_lock(&dev->video_mode.slock);
+   spin_lock_irqsave(&dev->video_mode.slock, flags);
dev->video_mode.bulk_ctl.bulk_copy(dev, urb);
-   spin_unlock(&dev->video_mode.slock);
+   spin_unlock_irqrestore(&dev->video_mode.slock, flags);
 
/* Reset urb buffers */
u