diff options
| -rw-r--r-- | drivers/media/platform/davinci/vpif_display.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/drivers/media/platform/davinci/vpif_display.c b/drivers/media/platform/davinci/vpif_display.c index 0ac841e35aa4..aed41edd0501 100644 --- a/drivers/media/platform/davinci/vpif_display.c +++ b/drivers/media/platform/davinci/vpif_display.c | |||
| @@ -320,8 +320,31 @@ static int vpif_stop_streaming(struct vb2_queue *vq) | |||
| 320 | 320 | ||
| 321 | common = &ch->common[VPIF_VIDEO_INDEX]; | 321 | common = &ch->common[VPIF_VIDEO_INDEX]; |
| 322 | 322 | ||
| 323 | /* Disable channel */ | ||
| 324 | if (VPIF_CHANNEL2_VIDEO == ch->channel_id) { | ||
| 325 | enable_channel2(0); | ||
| 326 | channel2_intr_enable(0); | ||
| 327 | } | ||
| 328 | if ((VPIF_CHANNEL3_VIDEO == ch->channel_id) || | ||
| 329 | (2 == common->started)) { | ||
| 330 | enable_channel3(0); | ||
| 331 | channel3_intr_enable(0); | ||
| 332 | } | ||
| 333 | common->started = 0; | ||
| 334 | |||
| 323 | /* release all active buffers */ | 335 | /* release all active buffers */ |
| 324 | spin_lock_irqsave(&common->irqlock, flags); | 336 | spin_lock_irqsave(&common->irqlock, flags); |
| 337 | if (common->cur_frm == common->next_frm) { | ||
| 338 | vb2_buffer_done(&common->cur_frm->vb, VB2_BUF_STATE_ERROR); | ||
| 339 | } else { | ||
| 340 | if (common->cur_frm != NULL) | ||
| 341 | vb2_buffer_done(&common->cur_frm->vb, | ||
| 342 | VB2_BUF_STATE_ERROR); | ||
| 343 | if (common->next_frm != NULL) | ||
| 344 | vb2_buffer_done(&common->next_frm->vb, | ||
| 345 | VB2_BUF_STATE_ERROR); | ||
| 346 | } | ||
| 347 | |||
| 325 | while (!list_empty(&common->dma_queue)) { | 348 | while (!list_empty(&common->dma_queue)) { |
| 326 | common->next_frm = list_entry(common->dma_queue.next, | 349 | common->next_frm = list_entry(common->dma_queue.next, |
| 327 | struct vpif_disp_buffer, list); | 350 | struct vpif_disp_buffer, list); |
| @@ -773,18 +796,6 @@ static int vpif_release(struct file *filep) | |||
| 773 | if (fh->io_allowed[VPIF_VIDEO_INDEX]) { | 796 | if (fh->io_allowed[VPIF_VIDEO_INDEX]) { |
| 774 | /* Reset io_usrs member of channel object */ | 797 | /* Reset io_usrs member of channel object */ |
| 775 | common->io_usrs = 0; | 798 | common->io_usrs = 0; |
| 776 | /* Disable channel */ | ||
| 777 | if (VPIF_CHANNEL2_VIDEO == ch->channel_id) { | ||
| 778 | enable_channel2(0); | ||
| 779 | channel2_intr_enable(0); | ||
| 780 | } | ||
| 781 | if ((VPIF_CHANNEL3_VIDEO == ch->channel_id) || | ||
| 782 | (2 == common->started)) { | ||
| 783 | enable_channel3(0); | ||
| 784 | channel3_intr_enable(0); | ||
| 785 | } | ||
| 786 | common->started = 0; | ||
| 787 | |||
| 788 | /* Free buffers allocated */ | 799 | /* Free buffers allocated */ |
| 789 | vb2_queue_release(&common->buffer_queue); | 800 | vb2_queue_release(&common->buffer_queue); |
| 790 | vb2_dma_contig_cleanup_ctx(common->alloc_ctx); | 801 | vb2_dma_contig_cleanup_ctx(common->alloc_ctx); |
