summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArchit Taneja <archit@ti.com>2010-01-11 16:15:55 +0530
committerSantosh Shilimkar <santosh.shilimkar@ti.com>2010-01-11 04:34:48 +0530
commitb0dbf2380e2ec33ee05e0b0e7c8b14b96ca8a57d (patch)
treea4906e4db764372fe108b3a92e6080d14801c6a8
parenta812820c095ccf3ba20b07af56b5124211314b4d (diff)
V4L2: Associate correct interrupts to corresponding channels. Cleanup isr code.
Signed-off-by: Archit Taneja <archit@ti.com>
-rwxr-xr-xdrivers/media/video/omap/omap_vout.c202
1 files changed, 71 insertions, 131 deletions
diff --git a/drivers/media/video/omap/omap_vout.c b/drivers/media/video/omap/omap_vout.c
index a7e996f8fc67..47966564eaea 100755
--- a/drivers/media/video/omap/omap_vout.c
+++ b/drivers/media/video/omap/omap_vout.c
@@ -2960,13 +2960,14 @@ void omap_vout_isr(void *arg, unsigned int irqstatus)
struct omap_vout_device *vout =
(struct omap_vout_device *) arg;
u32 addr, uv_addr;
+
#if !(CONFIG_OMAP2_DSS_HDMI)
u32 fid;
#endif
struct omapvideo_info *ovid;
struct omap_overlay *ovl;
struct omap_dss_device *cur_display;
-
+ int irq = 0;
if (!vout->streaming)
return;
@@ -2975,139 +2976,51 @@ void omap_vout_isr(void *arg, unsigned int irqstatus)
/* get the display device attached to the overlay */
if (!ovl->manager || !ovl->manager->device)
return;
- cur_display = ovl->manager->device;
-
- spin_lock(&vout->vbq_lock);
- /* do_gettimeofday(&timevalue); TODO: uncomment this!! */
-
- if (cur_display->type == OMAP_DISPLAY_TYPE_DSI) {
- if (!(irqstatus & ((DISPC_IRQ_FRAMEDONE) | (DISPC_IRQ_FRAMEDONE2)))) {
- spin_unlock(&vout->vbq_lock);
- return;
- }
- 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)) {
- spin_unlock(&vout->vbq_lock);
- return;
- }
-
- vout->next_frm = list_entry(vout->dma_queue.next,
- struct videobuf_buffer, queue);
- list_del(&vout->next_frm->queue);
+ cur_display = ovl->manager->device;
- vout->next_frm->state = VIDEOBUF_ACTIVE;
+ if (cur_display->channel == OMAP_DSS_CHANNEL_LCD)
+ irq = DISPC_IRQ_FRAMEDONE;
- addr = (unsigned long) vout->queued_buf_addr[vout->next_frm->i]
- + vout->cropped_offset;
#ifdef CONFIG_ARCH_OMAP4
- uv_addr = (unsigned long) vout->queued_buf_uv_addr[
- vout->next_frm->i] + vout->cropped_uv_offset;
+ else if (cur_display->channel == OMAP_DSS_CHANNEL_LCD2)
+ irq = DISPC_IRQ_FRAMEDONE2;
#endif
- /* First save the configuration in ovelray structure */
- r = omapvid_init(vout, addr, uv_addr);
- if (r)
- printk(KERN_ERR VOUT_NAME
- "failed to set overlay info\n");
- /* Enable the pipeline and set the Go bit */
- r = omapvid_apply_changes(vout);
- if (r)
- printk(KERN_ERR VOUT_NAME "failed to change mode\n");
- } else if (cur_display->type == OMAP_DISPLAY_TYPE_DPI) {
- if (!(irqstatus & DISPC_IRQ_VSYNC)) {
- spin_unlock(&vout->vbq_lock);
- return;
- }
- 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)) {
- spin_unlock(&vout->vbq_lock);
- return;
- }
-
- 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;
+ spin_lock(&vout->vbq_lock);
+ /* do_gettimeofday(&timevalue); TODO: uncomment this!! */
- addr = (unsigned long) vout->queued_buf_addr[vout->next_frm->i]
- + vout->cropped_offset;
+ switch (cur_display->type) {
-#ifdef CONFIG_ARCH_OMAP4
- uv_addr = (unsigned long) vout->queued_buf_uv_addr[
- vout->next_frm->i] + vout->cropped_uv_offset;
-#endif
-
- /* First save the configuration in ovelray structure */
- r = omapvid_init(vout, addr, uv_addr);
- if (r)
- printk(KERN_ERR VOUT_NAME
- "failed to set overlay info\n");
- /* Enable the pipeline and set the Go bit */
- r = omapvid_apply_changes(vout);
- if (r)
- printk(KERN_ERR VOUT_NAME "failed to change mode\n");
- } else {
-#if CONFIG_OMAP2_DSS_HDMI
- if (!(irqstatus & DISPC_IRQ_EVSYNC_EVEN)) {
- spin_unlock(&vout->vbq_lock);
- return;
- }
- 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;
+ case OMAP_DISPLAY_TYPE_DSI:
+ if (!(irqstatus & irq)) {
+ spin_unlock(&vout->vbq_lock);
+ return;
}
- vout->first_int = 0;
- if (list_empty(&vout->dma_queue)) {
- spin_unlock(&vout->vbq_lock);
+ break;
+
+ case OMAP_DISPLAY_TYPE_DPI:
+ if (!(irqstatus & DISPC_IRQ_VSYNC)) {
+ spin_unlock(&vout->vbq_lock);
return;
}
+ break;
- 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 CONFIG_OMAP2_DSS_HDMI
-#ifdef CONFIG_ARCH_OMAP4
- uv_addr = (unsigned long) vout->queued_buf_uv_addr[
- vout->next_frm->i] + vout->cropped_uv_offset;
-#endif
-
- /* First save the configuration in ovelray structure */
- r = omapvid_init(vout, addr, uv_addr);
- if (r)
- printk(KERN_ERR VOUT_NAME
- "failed to set overlay info\n");
- /* Enable the pipeline and set the Go bit */
- r = omapvid_apply_changes(vout);
- if (r)
- printk(KERN_ERR VOUT_NAME "failed to change mode\n");
+ case OMAP_DISPLAY_TYPE_HDMI:
+ if (!(irqstatus & DISPC_IRQ_EVSYNC_EVEN)) {
+ spin_unlock(&vout->vbq_lock);
+ return;
+ }
+ break;
+ #else
-#else
- if (vout->first_int) {
- vout->first_int = 0;
- spin_unlock(&vout->vbq_lock);
- return;
+ case OMAP_DISPLAY_TYPE_VENC:
+ if (vout->first_int) {
+ vout->first_int = 0;
+ spin_unlock(&vout->vbq_lock);
+ return;
}
if (irqstatus & DISPC_IRQ_EVSYNC_ODD) {
fid = 1;
@@ -3135,41 +3048,68 @@ void omap_vout_isr(void *arg, unsigned int irqstatus)
vout->cur_frm->state = VIDEOBUF_DONE;
wake_up_interruptible(&vout->cur_frm->done);
vout->cur_frm = vout->next_frm;
+ goto end;
} else if (1 == fid) {
if (list_empty(&vout->dma_queue) ||
(vout->cur_frm != vout->next_frm)) {
spin_unlock(&vout->vbq_lock);
return;
}
+
+ goto venc;
+ }
+ #endif
+
+ default:
+ return;
+ }
+
+ 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)) {
+ spin_unlock(&vout->vbq_lock);
+ return;
+ }
+
+#if !(CONFIG_OMAP2_DSS_HDMI)
+venc:
+#endif
+
vout->next_frm = list_entry(vout->dma_queue.next,
- struct videobuf_buffer, queue);
+ 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;
+
+ addr = (unsigned long) vout->queued_buf_addr[vout->next_frm->i]
+ + vout->cropped_offset;
#ifdef CONFIG_ARCH_OMAP4
uv_addr = (unsigned long) vout->queued_buf_uv_addr[
vout->next_frm->i] + vout->cropped_uv_offset;
#endif
- /* TODO: check the cropped offset part*/
-
/* First save the configuration in ovelray structure */
r = omapvid_init(vout, addr, uv_addr);
if (r)
- printk(KERN_ERR VOUT_NAME
+ printk(KERN_ERR VOUT_NAME
"failed to set overlay info\n");
/* Enable the pipeline and set the Go bit */
r = omapvid_apply_changes(vout);
if (r)
printk(KERN_ERR VOUT_NAME
- "failed to change mode\n");
- }
+ "failed to change mode\n");
+
+#if !(CONFIG_OMAP2_DSS_HDMI)
+end:
#endif
- }
- spin_unlock(&vout->vbq_lock);
+
+ spin_unlock(&vout->vbq_lock);
}
static void omap_vout_cleanup_device(struct omap_vout_device *vout)