[2/5] : OMAP_VOUT: CLEANUP: Remove redundant code from omap_vout_isr

Message ID 1316167233-1437-3-git-send-email-archit@ti.com (mailing list archive)
State Changes Requested, archived
Headers

Commit Message

Archit Taneja Sept. 16, 2011, 10 a.m. UTC
  Currently, there is a lot of redundant code is between DPI and VENC panels, this
can be made common by moving out field/interlace specific code to a separate
function called omapvid_handle_interlace_display(). There is no functional
change made.

Signed-off-by: Archit Taneja <archit@ti.com>
---
 drivers/media/video/omap/omap_vout.c |  172 ++++++++++++++++------------------
 1 files changed, 82 insertions(+), 90 deletions(-)
  

Comments

Hiremath, Vaibhav Sept. 21, 2011, 10:05 a.m. UTC | #1
> -----Original Message-----
> From: Taneja, Archit
> Sent: Friday, September 16, 2011 3:31 PM
> To: Hiremath, Vaibhav
> Cc: Valkeinen, Tomi; linux-omap@vger.kernel.org; Semwal, Sumit; linux-
> media@vger.kernel.org; Taneja, Archit
> Subject: [PATCH 2/5] [media]: OMAP_VOUT: CLEANUP: Remove redundant code
> from omap_vout_isr
> 
> Currently, there is a lot of redundant code is between DPI and VENC panels,
> this
> can be made common by moving out field/interlace specific code to a
> separate
> function called omapvid_handle_interlace_display(). There is no functional
> change made.
> 
> Signed-off-by: Archit Taneja <archit@ti.com>
> ---
>  drivers/media/video/omap/omap_vout.c |  172 ++++++++++++++++-------------
> -----
>  1 files changed, 82 insertions(+), 90 deletions(-)
> 
> diff --git a/drivers/media/video/omap/omap_vout.c
> b/drivers/media/video/omap/omap_vout.c
> index e14c82b..c5f2ea0 100644
> --- a/drivers/media/video/omap/omap_vout.c
> +++ b/drivers/media/video/omap/omap_vout.c
> @@ -524,10 +524,50 @@ static int omapvid_apply_changes(struct
> omap_vout_device *vout)
>  	return 0;
>  }
> 
> +static int omapvid_handle_interlace_display(struct omap_vout_device *vout,
> +		unsigned int irqstatus, struct timeval timevalue)
> +{
> +	u32 fid;
> +
> +	if (vout->first_int) {
> +		vout->first_int = 0;
> +		goto err;
> +	}
> +
> +	if (irqstatus & DISPC_IRQ_EVSYNC_ODD)
> +		fid = 1;
> +	else if (irqstatus & DISPC_IRQ_EVSYNC_EVEN)
> +		fid = 0;
> +	else
> +		goto err;
> +
> +	vout->field_id ^= 1;
> +	if (fid != vout->field_id) {
> +		/* reset field ID */
> +		vout->field_id = 0;
[Hiremath, Vaibhav] You should check whether fid == 0 before resetting it.

> +	} else if (0 == fid) {
[Hiremath, Vaibhav] This is not matching with the original code, probably I have to be more careful here. I need to spend more time here...


> +		if (vout->cur_frm == vout->next_frm)
> +			goto err;
> +
> +		vout->cur_frm->ts = timevalue;
> +		vout->cur_frm->state = VIDEOBUF_DONE;
> +		wake_up_interruptible(&vout->cur_frm->done);
> +		vout->cur_frm = vout->next_frm;
> +	} else {
> +		if (list_empty(&vout->dma_queue) ||
> +				(vout->cur_frm != vout->next_frm))
> +			goto err;
> +	}
> +
> +	return vout->field_id;
> +err:
> +	return 0;
> +}
> +
>  static void omap_vout_isr(void *arg, unsigned int irqstatus)
>  {
> -	int ret;
> -	u32 addr, fid;
> +	int ret, fid;
> +	u32 addr;
>  	struct omap_overlay *ovl;
>  	struct timeval timevalue;
>  	struct omapvideo_info *ovid;
> @@ -548,107 +588,59 @@ static void omap_vout_isr(void *arg, unsigned int
> irqstatus)
>  	spin_lock(&vout->vbq_lock);
>  	do_gettimeofday(&timevalue);
> 
> -	if (cur_display->type != OMAP_DISPLAY_TYPE_VENC) {
> -		switch (cur_display->type) {
> -		case OMAP_DISPLAY_TYPE_DPI:
> -			if (!(irqstatus & (DISPC_IRQ_VSYNC | DISPC_IRQ_VSYNC2)))
> -				goto vout_isr_err;
> -			break;
> -		case OMAP_DISPLAY_TYPE_HDMI:
> -			if (!(irqstatus & DISPC_IRQ_EVSYNC_EVEN))
> -				goto vout_isr_err;
> -			break;
> -		default:
> +	switch (cur_display->type) {
> +	case OMAP_DISPLAY_TYPE_DPI:
> +		if (!(irqstatus & (DISPC_IRQ_VSYNC | DISPC_IRQ_VSYNC2)))
>  			goto vout_isr_err;
> -		}
> -		if (!vout->first_int && (vout->cur_frm != vout->next_frm)) {
> -			vout->cur_frm->ts = timevalue;
> -			vout->cur_frm->state = VIDEOBUF_DONE;
> -			wake_up_interruptible(&vout->cur_frm->done);
> -			vout->cur_frm = vout->next_frm;
> -		}
> -		vout->first_int = 0;
> -		if (list_empty(&vout->dma_queue))
> +		break;
> +	case OMAP_DISPLAY_TYPE_VENC:
> +		fid = omapvid_handle_interlace_display(vout, irqstatus,
> +				timevalue);
> +		if (!fid)
>  			goto vout_isr_err;
[Hiremath, Vaibhav] 
Have you tested TV out functionality? 

> +		break;
> +	case OMAP_DISPLAY_TYPE_HDMI:
> +		if (!(irqstatus & DISPC_IRQ_EVSYNC_EVEN))
> +			goto vout_isr_err;
> +		break;
> +	default:
> +		goto vout_isr_err;
> +	}
> 
> -		vout->next_frm = list_entry(vout->dma_queue.next,
> -				struct videobuf_buffer, queue);
> -		list_del(&vout->next_frm->queue);
> -
> -		vout->next_frm->state = VIDEOBUF_ACTIVE;
> -
> -		addr = (unsigned long) vout->queued_buf_addr[vout->next_frm-
> >i]
> -			+ vout->cropped_offset;
> +	if (!vout->first_int && (vout->cur_frm != vout->next_frm)) {
> +		vout->cur_frm->ts = timevalue;
> +		vout->cur_frm->state = VIDEOBUF_DONE;
> +		wake_up_interruptible(&vout->cur_frm->done);
> +		vout->cur_frm = vout->next_frm;
> +	}
> 
> -		/* First save the configuration in ovelray structure */
> -		ret = omapvid_init(vout, addr);
> -		if (ret)
> -			printk(KERN_ERR VOUT_NAME
> -				"failed to set overlay info\n");
> -		/* Enable the pipeline and set the Go bit */
> -		ret = omapvid_apply_changes(vout);
> -		if (ret)
> -			printk(KERN_ERR VOUT_NAME "failed to change mode\n");
> -	} else {
> +	vout->first_int = 0;
> +	if (list_empty(&vout->dma_queue))
> +		goto vout_isr_err;
> 
> -		if (vout->first_int) {
> -			vout->first_int = 0;
> -			goto vout_isr_err;
> -		}
> -		if (irqstatus & DISPC_IRQ_EVSYNC_ODD)
> -			fid = 1;
> -		else if (irqstatus & DISPC_IRQ_EVSYNC_EVEN)
> -			fid = 0;
> -		else
> -			goto vout_isr_err;
> +	vout->next_frm = list_entry(vout->dma_queue.next,
> +			struct videobuf_buffer, queue);
> +	list_del(&vout->next_frm->queue);
> 
> -		vout->field_id ^= 1;
> -		if (fid != vout->field_id) {
> -			if (0 == fid)
> -				vout->field_id = fid;
> +	vout->next_frm->state = VIDEOBUF_ACTIVE;
> 
> -			goto vout_isr_err;
> -		}
> -		if (0 == fid) {
> -			if (vout->cur_frm == vout->next_frm)
> -				goto vout_isr_err;
> -
> -			vout->cur_frm->ts = timevalue;
> -			vout->cur_frm->state = VIDEOBUF_DONE;
> -			wake_up_interruptible(&vout->cur_frm->done);
> -			vout->cur_frm = vout->next_frm;
> -		} else if (1 == fid) {
> -			if (list_empty(&vout->dma_queue) ||
> -					(vout->cur_frm != vout->next_frm))
> -				goto vout_isr_err;
> -
> -			vout->next_frm = list_entry(vout->dma_queue.next,
> -					struct videobuf_buffer, queue);
> -			list_del(&vout->next_frm->queue);
> -
> -			vout->next_frm->state = VIDEOBUF_ACTIVE;
> -			addr = (unsigned long)
> -				vout->queued_buf_addr[vout->next_frm->i] +
> -				vout->cropped_offset;
> -			/* First save the configuration in ovelray structure */
> -			ret = omapvid_init(vout, addr);
> -			if (ret)
> -				printk(KERN_ERR VOUT_NAME
> -						"failed to set overlay info\n");
> -			/* Enable the pipeline and set the Go bit */
> -			ret = omapvid_apply_changes(vout);
> -			if (ret)
> -				printk(KERN_ERR VOUT_NAME
> -						"failed to change mode\n");
> -		}
> +	addr = (unsigned long) vout->queued_buf_addr[vout->next_frm->i]
> +		+ vout->cropped_offset;
> 
> -	}
> +	/* First save the configuration in ovelray structure */
> +	ret = omapvid_init(vout, addr);
> +	if (ret)
> +		printk(KERN_ERR VOUT_NAME
> +			"failed to set overlay info\n");
> +	/* Enable the pipeline and set the Go bit */
> +	ret = omapvid_apply_changes(vout);
> +	if (ret)
> +		printk(KERN_ERR VOUT_NAME "failed to change mode\n");
> 
>  vout_isr_err:
>  	spin_unlock(&vout->vbq_lock);
>  }
[Hiremath, Vaibhav] Overall this clean-up was required, thanks for working on this patch.

Thanks,
Vaibhav
> 
> -
>  /* Video buffer call backs */
> 
>  /*
> --
> 1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
  
Archit Taneja Sept. 21, 2011, 10:45 a.m. UTC | #2
Hi,

On Wednesday 21 September 2011 03:35 PM, Hiremath, Vaibhav wrote:
>
>> -----Original Message-----
>> From: Taneja, Archit
>> Sent: Friday, September 16, 2011 3:31 PM
>> To: Hiremath, Vaibhav
>> Cc: Valkeinen, Tomi; linux-omap@vger.kernel.org; Semwal, Sumit; linux-
>> media@vger.kernel.org; Taneja, Archit
>> Subject: [PATCH 2/5] [media]: OMAP_VOUT: CLEANUP: Remove redundant code
>> from omap_vout_isr
>>
>> Currently, there is a lot of redundant code is between DPI and VENC panels,
>> this
>> can be made common by moving out field/interlace specific code to a
>> separate
>> function called omapvid_handle_interlace_display(). There is no functional
>> change made.
>>
>> Signed-off-by: Archit Taneja<archit@ti.com>
>> ---
>>   drivers/media/video/omap/omap_vout.c |  172 ++++++++++++++++-------------
>> -----
>>   1 files changed, 82 insertions(+), 90 deletions(-)
>>
>> diff --git a/drivers/media/video/omap/omap_vout.c
>> b/drivers/media/video/omap/omap_vout.c
>> index e14c82b..c5f2ea0 100644
>> --- a/drivers/media/video/omap/omap_vout.c
>> +++ b/drivers/media/video/omap/omap_vout.c
>> @@ -524,10 +524,50 @@ static int omapvid_apply_changes(struct
>> omap_vout_device *vout)
>>   	return 0;
>>   }
>>
>> +static int omapvid_handle_interlace_display(struct omap_vout_device *vout,
>> +		unsigned int irqstatus, struct timeval timevalue)
>> +{
>> +	u32 fid;
>> +
>> +	if (vout->first_int) {
>> +		vout->first_int = 0;
>> +		goto err;
>> +	}
>> +
>> +	if (irqstatus&  DISPC_IRQ_EVSYNC_ODD)
>> +		fid = 1;
>> +	else if (irqstatus&  DISPC_IRQ_EVSYNC_EVEN)
>> +		fid = 0;
>> +	else
>> +		goto err;
>> +
>> +	vout->field_id ^= 1;
>> +	if (fid != vout->field_id) {
>> +		/* reset field ID */
>> +		vout->field_id = 0;
> [Hiremath, Vaibhav] You should check whether fid == 0 before resetting it.
>
>> +	} else if (0 == fid) {
> [Hiremath, Vaibhav] This is not matching with the original code, probably I have to be more careful here. I need to spend more time here...

If you do a dry run of it you'll see that it does the same thing 
functionally. If fid was 1, vout->field_id would have been 0 anyway.
So the check for fid == 0 looked a bit redundant to me. However, if you 
think that doing this makes the code less clear, we can surely keep this 
check.

>
>
>> +		if (vout->cur_frm == vout->next_frm)
>> +			goto err;
>> +
>> +		vout->cur_frm->ts = timevalue;
>> +		vout->cur_frm->state = VIDEOBUF_DONE;
>> +		wake_up_interruptible(&vout->cur_frm->done);
>> +		vout->cur_frm = vout->next_frm;
>> +	} else {
>> +		if (list_empty(&vout->dma_queue) ||
>> +				(vout->cur_frm != vout->next_frm))
>> +			goto err;
>> +	}
>> +
>> +	return vout->field_id;
>> +err:
>> +	return 0;
>> +}
>> +
>>   static void omap_vout_isr(void *arg, unsigned int irqstatus)
>>   {
>> -	int ret;
>> -	u32 addr, fid;
>> +	int ret, fid;
>> +	u32 addr;
>>   	struct omap_overlay *ovl;
>>   	struct timeval timevalue;
>>   	struct omapvideo_info *ovid;
>> @@ -548,107 +588,59 @@ static void omap_vout_isr(void *arg, unsigned int
>> irqstatus)
>>   	spin_lock(&vout->vbq_lock);
>>   	do_gettimeofday(&timevalue);
>>
>> -	if (cur_display->type != OMAP_DISPLAY_TYPE_VENC) {
>> -		switch (cur_display->type) {
>> -		case OMAP_DISPLAY_TYPE_DPI:
>> -			if (!(irqstatus&  (DISPC_IRQ_VSYNC | DISPC_IRQ_VSYNC2)))
>> -				goto vout_isr_err;
>> -			break;
>> -		case OMAP_DISPLAY_TYPE_HDMI:
>> -			if (!(irqstatus&  DISPC_IRQ_EVSYNC_EVEN))
>> -				goto vout_isr_err;
>> -			break;
>> -		default:
>> +	switch (cur_display->type) {
>> +	case OMAP_DISPLAY_TYPE_DPI:
>> +		if (!(irqstatus&  (DISPC_IRQ_VSYNC | DISPC_IRQ_VSYNC2)))
>>   			goto vout_isr_err;
>> -		}
>> -		if (!vout->first_int&&  (vout->cur_frm != vout->next_frm)) {
>> -			vout->cur_frm->ts = timevalue;
>> -			vout->cur_frm->state = VIDEOBUF_DONE;
>> -			wake_up_interruptible(&vout->cur_frm->done);
>> -			vout->cur_frm = vout->next_frm;
>> -		}
>> -		vout->first_int = 0;
>> -		if (list_empty(&vout->dma_queue))
>> +		break;
>> +	case OMAP_DISPLAY_TYPE_VENC:
>> +		fid = omapvid_handle_interlace_display(vout, irqstatus,
>> +				timevalue);
>> +		if (!fid)
>>   			goto vout_isr_err;
> [Hiremath, Vaibhav]
> Have you tested TV out functionality?

I haven't checked it yet to be totally honest. Its hard to find a VENC 
TV! I wanted to anyway get some kind of Ack from you before starting to 
test this. Since you also feel that this clean up is needed, I'll start 
testing this out :)

>
>> +		break;
>> +	case OMAP_DISPLAY_TYPE_HDMI:
>> +		if (!(irqstatus&  DISPC_IRQ_EVSYNC_EVEN))
>> +			goto vout_isr_err;
>> +		break;
>> +	default:
>> +		goto vout_isr_err;
>> +	}
>>
>> -		vout->next_frm = list_entry(vout->dma_queue.next,
>> -				struct videobuf_buffer, queue);
>> -		list_del(&vout->next_frm->queue);
>> -
>> -		vout->next_frm->state = VIDEOBUF_ACTIVE;
>> -
>> -		addr = (unsigned long) vout->queued_buf_addr[vout->next_frm-
>>> i]
>> -			+ vout->cropped_offset;
>> +	if (!vout->first_int&&  (vout->cur_frm != vout->next_frm)) {
>> +		vout->cur_frm->ts = timevalue;
>> +		vout->cur_frm->state = VIDEOBUF_DONE;
>> +		wake_up_interruptible(&vout->cur_frm->done);
>> +		vout->cur_frm = vout->next_frm;
>> +	}
>>
>> -		/* First save the configuration in ovelray structure */
>> -		ret = omapvid_init(vout, addr);
>> -		if (ret)
>> -			printk(KERN_ERR VOUT_NAME
>> -				"failed to set overlay info\n");
>> -		/* Enable the pipeline and set the Go bit */
>> -		ret = omapvid_apply_changes(vout);
>> -		if (ret)
>> -			printk(KERN_ERR VOUT_NAME "failed to change mode\n");
>> -	} else {
>> +	vout->first_int = 0;
>> +	if (list_empty(&vout->dma_queue))
>> +		goto vout_isr_err;
>>
>> -		if (vout->first_int) {
>> -			vout->first_int = 0;
>> -			goto vout_isr_err;
>> -		}
>> -		if (irqstatus&  DISPC_IRQ_EVSYNC_ODD)
>> -			fid = 1;
>> -		else if (irqstatus&  DISPC_IRQ_EVSYNC_EVEN)
>> -			fid = 0;
>> -		else
>> -			goto vout_isr_err;
>> +	vout->next_frm = list_entry(vout->dma_queue.next,
>> +			struct videobuf_buffer, queue);
>> +	list_del(&vout->next_frm->queue);
>>
>> -		vout->field_id ^= 1;
>> -		if (fid != vout->field_id) {
>> -			if (0 == fid)
>> -				vout->field_id = fid;
>> +	vout->next_frm->state = VIDEOBUF_ACTIVE;
>>
>> -			goto vout_isr_err;
>> -		}
>> -		if (0 == fid) {
>> -			if (vout->cur_frm == vout->next_frm)
>> -				goto vout_isr_err;
>> -
>> -			vout->cur_frm->ts = timevalue;
>> -			vout->cur_frm->state = VIDEOBUF_DONE;
>> -			wake_up_interruptible(&vout->cur_frm->done);
>> -			vout->cur_frm = vout->next_frm;
>> -		} else if (1 == fid) {
>> -			if (list_empty(&vout->dma_queue) ||
>> -					(vout->cur_frm != vout->next_frm))
>> -				goto vout_isr_err;
>> -
>> -			vout->next_frm = list_entry(vout->dma_queue.next,
>> -					struct videobuf_buffer, queue);
>> -			list_del(&vout->next_frm->queue);
>> -
>> -			vout->next_frm->state = VIDEOBUF_ACTIVE;
>> -			addr = (unsigned long)
>> -				vout->queued_buf_addr[vout->next_frm->i] +
>> -				vout->cropped_offset;
>> -			/* First save the configuration in ovelray structure */
>> -			ret = omapvid_init(vout, addr);
>> -			if (ret)
>> -				printk(KERN_ERR VOUT_NAME
>> -						"failed to set overlay info\n");
>> -			/* Enable the pipeline and set the Go bit */
>> -			ret = omapvid_apply_changes(vout);
>> -			if (ret)
>> -				printk(KERN_ERR VOUT_NAME
>> -						"failed to change mode\n");
>> -		}
>> +	addr = (unsigned long) vout->queued_buf_addr[vout->next_frm->i]
>> +		+ vout->cropped_offset;
>>
>> -	}
>> +	/* First save the configuration in ovelray structure */
>> +	ret = omapvid_init(vout, addr);
>> +	if (ret)
>> +		printk(KERN_ERR VOUT_NAME
>> +			"failed to set overlay info\n");
>> +	/* Enable the pipeline and set the Go bit */
>> +	ret = omapvid_apply_changes(vout);
>> +	if (ret)
>> +		printk(KERN_ERR VOUT_NAME "failed to change mode\n");
>>
>>   vout_isr_err:
>>   	spin_unlock(&vout->vbq_lock);
>>   }
> [Hiremath, Vaibhav] Overall this clean-up was required, thanks for working on this patch.

Thanks for the review!

Archit

>
> Thanks,
> Vaibhav
>>
>> -
>>   /* Video buffer call backs */
>>
>>   /*
>> --
>> 1.7.1
>
>

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
  
Archit Taneja Sept. 26, 2011, 5:34 a.m. UTC | #3
Hi,

On Wednesday 21 September 2011 04:15 PM, Taneja, Archit wrote:
> Hi,
>
> On Wednesday 21 September 2011 03:35 PM, Hiremath, Vaibhav wrote:
>>
>>> -----Original Message-----
>>> From: Taneja, Archit
>>> Sent: Friday, September 16, 2011 3:31 PM
>>> To: Hiremath, Vaibhav
>>> Cc: Valkeinen, Tomi; linux-omap@vger.kernel.org; Semwal, Sumit; linux-
>>> media@vger.kernel.org; Taneja, Archit
>>> Subject: [PATCH 2/5] [media]: OMAP_VOUT: CLEANUP: Remove redundant code
>>> from omap_vout_isr
>>>
>>> Currently, there is a lot of redundant code is between DPI and VENC panels,
>>> this
>>> can be made common by moving out field/interlace specific code to a
>>> separate
>>> function called omapvid_handle_interlace_display(). There is no functional
>>> change made.
>>>
>>> Signed-off-by: Archit Taneja<archit@ti.com>
>>> ---
>>>    drivers/media/video/omap/omap_vout.c |  172 ++++++++++++++++-------------
>>> -----


>> [Hiremath, Vaibhav]
>> Have you tested TV out functionality?
>
> I haven't checked it yet to be totally honest. Its hard to find a VENC
> TV! I wanted to anyway get some kind of Ack from you before starting to
> test this. Since you also feel that this clean up is needed, I'll start
> testing this out :)

I tested the TV out functionality. It works fine. I have left the extra 
fid == 0 check so that the code is more clear. Will post out the new 
patch soon.

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

Patch

diff --git a/drivers/media/video/omap/omap_vout.c b/drivers/media/video/omap/omap_vout.c
index e14c82b..c5f2ea0 100644
--- a/drivers/media/video/omap/omap_vout.c
+++ b/drivers/media/video/omap/omap_vout.c
@@ -524,10 +524,50 @@  static int omapvid_apply_changes(struct omap_vout_device *vout)
 	return 0;
 }
 
+static int omapvid_handle_interlace_display(struct omap_vout_device *vout,
+		unsigned int irqstatus, struct timeval timevalue)
+{
+	u32 fid;
+
+	if (vout->first_int) {
+		vout->first_int = 0;
+		goto err;
+	}
+
+	if (irqstatus & DISPC_IRQ_EVSYNC_ODD)
+		fid = 1;
+	else if (irqstatus & DISPC_IRQ_EVSYNC_EVEN)
+		fid = 0;
+	else
+		goto err;
+
+	vout->field_id ^= 1;
+	if (fid != vout->field_id) {
+		/* reset field ID */
+		vout->field_id = 0;
+	} else if (0 == fid) {
+		if (vout->cur_frm == vout->next_frm)
+			goto err;
+
+		vout->cur_frm->ts = timevalue;
+		vout->cur_frm->state = VIDEOBUF_DONE;
+		wake_up_interruptible(&vout->cur_frm->done);
+		vout->cur_frm = vout->next_frm;
+	} else {
+		if (list_empty(&vout->dma_queue) ||
+				(vout->cur_frm != vout->next_frm))
+			goto err;
+	}
+
+	return vout->field_id;
+err:
+	return 0;
+}
+
 static void omap_vout_isr(void *arg, unsigned int irqstatus)
 {
-	int ret;
-	u32 addr, fid;
+	int ret, fid;
+	u32 addr;
 	struct omap_overlay *ovl;
 	struct timeval timevalue;
 	struct omapvideo_info *ovid;
@@ -548,107 +588,59 @@  static void omap_vout_isr(void *arg, unsigned int irqstatus)
 	spin_lock(&vout->vbq_lock);
 	do_gettimeofday(&timevalue);
 
-	if (cur_display->type != OMAP_DISPLAY_TYPE_VENC) {
-		switch (cur_display->type) {
-		case OMAP_DISPLAY_TYPE_DPI:
-			if (!(irqstatus & (DISPC_IRQ_VSYNC | DISPC_IRQ_VSYNC2)))
-				goto vout_isr_err;
-			break;
-		case OMAP_DISPLAY_TYPE_HDMI:
-			if (!(irqstatus & DISPC_IRQ_EVSYNC_EVEN))
-				goto vout_isr_err;
-			break;
-		default:
+	switch (cur_display->type) {
+	case OMAP_DISPLAY_TYPE_DPI:
+		if (!(irqstatus & (DISPC_IRQ_VSYNC | DISPC_IRQ_VSYNC2)))
 			goto vout_isr_err;
-		}
-		if (!vout->first_int && (vout->cur_frm != vout->next_frm)) {
-			vout->cur_frm->ts = timevalue;
-			vout->cur_frm->state = VIDEOBUF_DONE;
-			wake_up_interruptible(&vout->cur_frm->done);
-			vout->cur_frm = vout->next_frm;
-		}
-		vout->first_int = 0;
-		if (list_empty(&vout->dma_queue))
+		break;
+	case OMAP_DISPLAY_TYPE_VENC:
+		fid = omapvid_handle_interlace_display(vout, irqstatus,
+				timevalue);
+		if (!fid)
 			goto vout_isr_err;
+		break;
+	case OMAP_DISPLAY_TYPE_HDMI:
+		if (!(irqstatus & DISPC_IRQ_EVSYNC_EVEN))
+			goto vout_isr_err;
+		break;
+	default:
+		goto vout_isr_err;
+	}
 
-		vout->next_frm = list_entry(vout->dma_queue.next,
-				struct videobuf_buffer, queue);
-		list_del(&vout->next_frm->queue);
-
-		vout->next_frm->state = VIDEOBUF_ACTIVE;
-
-		addr = (unsigned long) vout->queued_buf_addr[vout->next_frm->i]
-			+ vout->cropped_offset;
+	if (!vout->first_int && (vout->cur_frm != vout->next_frm)) {
+		vout->cur_frm->ts = timevalue;
+		vout->cur_frm->state = VIDEOBUF_DONE;
+		wake_up_interruptible(&vout->cur_frm->done);
+		vout->cur_frm = vout->next_frm;
+	}
 
-		/* First save the configuration in ovelray structure */
-		ret = omapvid_init(vout, addr);
-		if (ret)
-			printk(KERN_ERR VOUT_NAME
-				"failed to set overlay info\n");
-		/* Enable the pipeline and set the Go bit */
-		ret = omapvid_apply_changes(vout);
-		if (ret)
-			printk(KERN_ERR VOUT_NAME "failed to change mode\n");
-	} else {
+	vout->first_int = 0;
+	if (list_empty(&vout->dma_queue))
+		goto vout_isr_err;
 
-		if (vout->first_int) {
-			vout->first_int = 0;
-			goto vout_isr_err;
-		}
-		if (irqstatus & DISPC_IRQ_EVSYNC_ODD)
-			fid = 1;
-		else if (irqstatus & DISPC_IRQ_EVSYNC_EVEN)
-			fid = 0;
-		else
-			goto vout_isr_err;
+	vout->next_frm = list_entry(vout->dma_queue.next,
+			struct videobuf_buffer, queue);
+	list_del(&vout->next_frm->queue);
 
-		vout->field_id ^= 1;
-		if (fid != vout->field_id) {
-			if (0 == fid)
-				vout->field_id = fid;
+	vout->next_frm->state = VIDEOBUF_ACTIVE;
 
-			goto vout_isr_err;
-		}
-		if (0 == fid) {
-			if (vout->cur_frm == vout->next_frm)
-				goto vout_isr_err;
-
-			vout->cur_frm->ts = timevalue;
-			vout->cur_frm->state = VIDEOBUF_DONE;
-			wake_up_interruptible(&vout->cur_frm->done);
-			vout->cur_frm = vout->next_frm;
-		} else if (1 == fid) {
-			if (list_empty(&vout->dma_queue) ||
-					(vout->cur_frm != vout->next_frm))
-				goto vout_isr_err;
-
-			vout->next_frm = list_entry(vout->dma_queue.next,
-					struct videobuf_buffer, queue);
-			list_del(&vout->next_frm->queue);
-
-			vout->next_frm->state = VIDEOBUF_ACTIVE;
-			addr = (unsigned long)
-				vout->queued_buf_addr[vout->next_frm->i] +
-				vout->cropped_offset;
-			/* First save the configuration in ovelray structure */
-			ret = omapvid_init(vout, addr);
-			if (ret)
-				printk(KERN_ERR VOUT_NAME
-						"failed to set overlay info\n");
-			/* Enable the pipeline and set the Go bit */
-			ret = omapvid_apply_changes(vout);
-			if (ret)
-				printk(KERN_ERR VOUT_NAME
-						"failed to change mode\n");
-		}
+	addr = (unsigned long) vout->queued_buf_addr[vout->next_frm->i]
+		+ vout->cropped_offset;
 
-	}
+	/* First save the configuration in ovelray structure */
+	ret = omapvid_init(vout, addr);
+	if (ret)
+		printk(KERN_ERR VOUT_NAME
+			"failed to set overlay info\n");
+	/* Enable the pipeline and set the Go bit */
+	ret = omapvid_apply_changes(vout);
+	if (ret)
+		printk(KERN_ERR VOUT_NAME "failed to change mode\n");
 
 vout_isr_err:
 	spin_unlock(&vout->vbq_lock);
 }
 
-
 /* Video buffer call backs */
 
 /*