[PATCH V3 07/15] [media] marvell-ccic: add SOF / EOF pair check for marvell-ccic driver

2012-12-15 Thread Albert Wang
From: Libin Yang 

This patch adds the SOFx/EOFx pair check for marvell-ccic.

When switching format, the last EOF may not arrive when stop streamning.
And the EOF will be detected in the next start streaming.

Must ensure clear the obsolete frame flags before every really start streaming.

Signed-off-by: Albert Wang 
Signed-off-by: Libin Yang 
---
 drivers/media/platform/marvell-ccic/mcam-core.c |   30 ---
 1 file changed, 26 insertions(+), 4 deletions(-)

diff --git a/drivers/media/platform/marvell-ccic/mcam-core.c 
b/drivers/media/platform/marvell-ccic/mcam-core.c
index a679917..c3c8873 100755
--- a/drivers/media/platform/marvell-ccic/mcam-core.c
+++ b/drivers/media/platform/marvell-ccic/mcam-core.c
@@ -94,6 +94,9 @@ MODULE_PARM_DESC(buffer_mode,
 #define CF_CONFIG_NEEDED 4 /* Must configure hardware */
 #define CF_SINGLE_BUFFER 5 /* Running with a single buffer */
 #define CF_SG_RESTART   6  /* SG restart needed */
+#define CF_FRAME_SOF0   7  /* Frame 0 started */
+#define CF_FRAME_SOF1   8
+#define CF_FRAME_SOF2   9
 
 #define sensor_call(cam, o, f, args...) \
v4l2_subdev_call(cam->sensor, o, f, ##args)
@@ -251,8 +254,10 @@ static void mcam_reset_buffers(struct mcam_camera *cam)
int i;
 
cam->next_buf = -1;
-   for (i = 0; i < cam->nbufs; i++)
+   for (i = 0; i < cam->nbufs; i++) {
clear_bit(i, &cam->flags);
+   clear_bit(CF_FRAME_SOF0 + i, &cam->flags);
+   }
 }
 
 static inline int mcam_needs_config(struct mcam_camera *cam)
@@ -1134,6 +1139,7 @@ static void mcam_vb_wait_finish(struct vb2_queue *vq)
 static int mcam_vb_start_streaming(struct vb2_queue *vq, unsigned int count)
 {
struct mcam_camera *cam = vb2_get_drv_priv(vq);
+   unsigned int frame;
 
if (cam->state != S_IDLE) {
INIT_LIST_HEAD(&cam->buffers);
@@ -1151,6 +1157,14 @@ static int mcam_vb_start_streaming(struct vb2_queue *vq, 
unsigned int count)
cam->state = S_BUFWAIT;
return 0;
}
+
+   /*
+* Ensure clear the obsolete frame flags
+* before every really start streaming
+*/
+   for (frame = 0; frame < cam->nbufs; frame++)
+   clear_bit(CF_FRAME_SOF0 + frame, &cam->flags);
+
return mcam_read_setup(cam);
 }
 
@@ -1875,9 +1889,11 @@ int mccic_irq(struct mcam_camera *cam, unsigned int irqs)
 * each time.
 */
for (frame = 0; frame < cam->nbufs; frame++)
-   if (irqs & (IRQ_EOF0 << frame)) {
+   if (irqs & (IRQ_EOF0 << frame) &&
+   test_bit(CF_FRAME_SOF0 + frame, &cam->flags)) {
mcam_frame_complete(cam, frame);
handled = 1;
+   clear_bit(CF_FRAME_SOF0 + frame, &cam->flags);
if (cam->buffer_mode == B_DMA_sg)
break;
}
@@ -1886,9 +1902,15 @@ int mccic_irq(struct mcam_camera *cam, unsigned int irqs)
 * code assumes that we won't get multiple frame interrupts
 * at once; may want to rethink that.
 */
-   if (irqs & (IRQ_SOF0 | IRQ_SOF1 | IRQ_SOF2)) {
+   for (frame = 0; frame < cam->nbufs; frame++) {
+   if (irqs & (IRQ_SOF0 << frame)) {
+   set_bit(CF_FRAME_SOF0 + frame, &cam->flags);
+   handled = IRQ_HANDLED;
+   }
+   }
+
+   if (handled == IRQ_HANDLED) {
set_bit(CF_DMA_ACTIVE, &cam->flags);
-   handled = 1;
if (cam->buffer_mode == B_DMA_sg)
mcam_ctlr_stop(cam);
}
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH V3 07/15] [media] marvell-ccic: add SOF / EOF pair check for marvell-ccic driver

2012-12-16 Thread Jonathan Corbet
On Sat, 15 Dec 2012 17:57:56 +0800
Albert Wang  wrote:

> From: Libin Yang 
> 
> This patch adds the SOFx/EOFx pair check for marvell-ccic.
> 
> When switching format, the last EOF may not arrive when stop streamning.
> And the EOF will be detected in the next start streaming.
> 
> Must ensure clear the obsolete frame flags before every really start 
> streaming.

"obsolete" doesn't quite read right; it suggests that the flags only
apply to older hardware.  I'd suggest "left over" or some such (in the
code comment too).  Otherwise seems fine.

Acked-by: Jonathan Corbet 

jon
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


RE: [PATCH V3 07/15] [media] marvell-ccic: add SOF / EOF pair check for marvell-ccic driver

2012-12-16 Thread Albert Wang
Hi, Jonathan


>-Original Message-
>From: Jonathan Corbet [mailto:cor...@lwn.net]
>Sent: Monday, 17 December, 2012 00:19
>To: Albert Wang
>Cc: g.liakhovet...@gmx.de; linux-media@vger.kernel.org; Libin Yang
>Subject: Re: [PATCH V3 07/15] [media] marvell-ccic: add SOF / EOF pair check 
>for
>marvell-ccic driver
>
>On Sat, 15 Dec 2012 17:57:56 +0800
>Albert Wang  wrote:
>
>> From: Libin Yang 
>>
>> This patch adds the SOFx/EOFx pair check for marvell-ccic.
>>
>> When switching format, the last EOF may not arrive when stop streamning.
>> And the EOF will be detected in the next start streaming.
>>
>> Must ensure clear the obsolete frame flags before every really start 
>> streaming.
>
>"obsolete" doesn't quite read right; it suggests that the flags only
>apply to older hardware.  I'd suggest "left over" or some such (in the
>code comment too).  Otherwise seems fine.
>
[Albert Wang] OK, we will change the "bad" word. :)

>Acked-by: Jonathan Corbet 
>
>jon


Thanks
Albert Wang
86-21-61092656
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH V3 07/15] [media] marvell-ccic: add SOF / EOF pair check for marvell-ccic driver

2013-01-01 Thread Guennadi Liakhovetski
On Sat, 15 Dec 2012, Albert Wang wrote:

> From: Libin Yang 
> 
> This patch adds the SOFx/EOFx pair check for marvell-ccic.
> 
> When switching format, the last EOF may not arrive when stop streamning.
> And the EOF will be detected in the next start streaming.
> 
> Must ensure clear the obsolete frame flags before every really start 
> streaming.

Apart from the remark, that Jon has made:

Acked-by: Guennadi Liakhovetski 

Thanks
Guennadi

> 
> Signed-off-by: Albert Wang 
> Signed-off-by: Libin Yang 
> ---
>  drivers/media/platform/marvell-ccic/mcam-core.c |   30 
> ---
>  1 file changed, 26 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/media/platform/marvell-ccic/mcam-core.c 
> b/drivers/media/platform/marvell-ccic/mcam-core.c
> index a679917..c3c8873 100755
> --- a/drivers/media/platform/marvell-ccic/mcam-core.c
> +++ b/drivers/media/platform/marvell-ccic/mcam-core.c
> @@ -94,6 +94,9 @@ MODULE_PARM_DESC(buffer_mode,
>  #define CF_CONFIG_NEEDED 4   /* Must configure hardware */
>  #define CF_SINGLE_BUFFER 5   /* Running with a single buffer */
>  #define CF_SG_RESTART 6  /* SG restart needed */
> +#define CF_FRAME_SOF0 7  /* Frame 0 started */
> +#define CF_FRAME_SOF1 8
> +#define CF_FRAME_SOF2 9
>  
>  #define sensor_call(cam, o, f, args...) \
>   v4l2_subdev_call(cam->sensor, o, f, ##args)
> @@ -251,8 +254,10 @@ static void mcam_reset_buffers(struct mcam_camera *cam)
>   int i;
>  
>   cam->next_buf = -1;
> - for (i = 0; i < cam->nbufs; i++)
> + for (i = 0; i < cam->nbufs; i++) {
>   clear_bit(i, &cam->flags);
> + clear_bit(CF_FRAME_SOF0 + i, &cam->flags);
> + }
>  }
>  
>  static inline int mcam_needs_config(struct mcam_camera *cam)
> @@ -1134,6 +1139,7 @@ static void mcam_vb_wait_finish(struct vb2_queue *vq)
>  static int mcam_vb_start_streaming(struct vb2_queue *vq, unsigned int count)
>  {
>   struct mcam_camera *cam = vb2_get_drv_priv(vq);
> + unsigned int frame;
>  
>   if (cam->state != S_IDLE) {
>   INIT_LIST_HEAD(&cam->buffers);
> @@ -1151,6 +1157,14 @@ static int mcam_vb_start_streaming(struct vb2_queue 
> *vq, unsigned int count)
>   cam->state = S_BUFWAIT;
>   return 0;
>   }
> +
> + /*
> +  * Ensure clear the obsolete frame flags
> +  * before every really start streaming
> +  */
> + for (frame = 0; frame < cam->nbufs; frame++)
> + clear_bit(CF_FRAME_SOF0 + frame, &cam->flags);
> +
>   return mcam_read_setup(cam);
>  }
>  
> @@ -1875,9 +1889,11 @@ int mccic_irq(struct mcam_camera *cam, unsigned int 
> irqs)
>* each time.
>*/
>   for (frame = 0; frame < cam->nbufs; frame++)
> - if (irqs & (IRQ_EOF0 << frame)) {
> + if (irqs & (IRQ_EOF0 << frame) &&
> + test_bit(CF_FRAME_SOF0 + frame, &cam->flags)) {
>   mcam_frame_complete(cam, frame);
>   handled = 1;
> + clear_bit(CF_FRAME_SOF0 + frame, &cam->flags);
>   if (cam->buffer_mode == B_DMA_sg)
>   break;
>   }
> @@ -1886,9 +1902,15 @@ int mccic_irq(struct mcam_camera *cam, unsigned int 
> irqs)
>* code assumes that we won't get multiple frame interrupts
>* at once; may want to rethink that.
>*/
> - if (irqs & (IRQ_SOF0 | IRQ_SOF1 | IRQ_SOF2)) {
> + for (frame = 0; frame < cam->nbufs; frame++) {
> + if (irqs & (IRQ_SOF0 << frame)) {
> + set_bit(CF_FRAME_SOF0 + frame, &cam->flags);
> + handled = IRQ_HANDLED;
> + }
> + }
> +
> + if (handled == IRQ_HANDLED) {
>   set_bit(CF_DMA_ACTIVE, &cam->flags);
> - handled = 1;
>   if (cam->buffer_mode == B_DMA_sg)
>   mcam_ctlr_stop(cam);
>   }
> -- 
> 1.7.9.5
> 

---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
http://www.open-technology.de/
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html