Commit e144ca64 authored by Archit Taneja's avatar Archit Taneja Committed by Mauro Carvalho Chehab

[media] OMAP_VOUT: Fix VSYNC IRQ handling in omap_vout_isr

Currently, in omap_vout_isr(), if the panel type is DPI, and if we
get either VSYNC or VSYNC2 interrupts, we proceed ahead to set the
current buffers state to VIDEOBUF_DONE and prepare to display the
next frame in the queue.

On OMAP4, because we have 2 LCD managers, the panel type itself is not
sufficient to tell if we have received the correct irq, i.e, we shouldn't
proceed ahead if we get a VSYNC interrupt for LCD2 manager, or a VSYNC2
interrupt for LCD manager.

Fix this by correlating LCD manager to VSYNC interrupt and LCD2 manager
to VSYNC2 interrupt.
Signed-off-by: default avatarArchit Taneja <archit@ti.com>
Reviewed-by: default avatarSumit Semwal <sumit.semwal@ti.com>
Acked-by: default avatarVaibhav Hiremath <hvaibhav@ti.com>
Signed-off-by: default avatarVaibhav Hiremath <hvaibhav@ti.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 27801688
...@@ -565,8 +565,8 @@ static int omapvid_handle_interlace_display(struct omap_vout_device *vout, ...@@ -565,8 +565,8 @@ static int omapvid_handle_interlace_display(struct omap_vout_device *vout,
static void omap_vout_isr(void *arg, unsigned int irqstatus) static void omap_vout_isr(void *arg, unsigned int irqstatus)
{ {
int ret, fid; int ret, fid, mgr_id;
u32 addr; u32 addr, irq;
struct omap_overlay *ovl; struct omap_overlay *ovl;
struct timeval timevalue; struct timeval timevalue;
struct omapvideo_info *ovid; struct omapvideo_info *ovid;
...@@ -582,6 +582,7 @@ static void omap_vout_isr(void *arg, unsigned int irqstatus) ...@@ -582,6 +582,7 @@ static void omap_vout_isr(void *arg, unsigned int irqstatus)
if (!ovl->manager || !ovl->manager->device) if (!ovl->manager || !ovl->manager->device)
return; return;
mgr_id = ovl->manager->id;
cur_display = ovl->manager->device; cur_display = ovl->manager->device;
spin_lock(&vout->vbq_lock); spin_lock(&vout->vbq_lock);
...@@ -589,7 +590,14 @@ static void omap_vout_isr(void *arg, unsigned int irqstatus) ...@@ -589,7 +590,14 @@ static void omap_vout_isr(void *arg, unsigned int irqstatus)
switch (cur_display->type) { switch (cur_display->type) {
case OMAP_DISPLAY_TYPE_DPI: case OMAP_DISPLAY_TYPE_DPI:
if (!(irqstatus & (DISPC_IRQ_VSYNC | DISPC_IRQ_VSYNC2))) if (mgr_id == OMAP_DSS_CHANNEL_LCD)
irq = DISPC_IRQ_VSYNC;
else if (mgr_id == OMAP_DSS_CHANNEL_LCD2)
irq = DISPC_IRQ_VSYNC2;
else
goto vout_isr_err;
if (!(irqstatus & irq))
goto vout_isr_err; goto vout_isr_err;
break; break;
case OMAP_DISPLAY_TYPE_VENC: case OMAP_DISPLAY_TYPE_VENC:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment