diff options
Diffstat (limited to 'drivers/media/video/mxc/capture/ipu_csi_enc.c')
-rw-r--r-- | drivers/media/video/mxc/capture/ipu_csi_enc.c | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/drivers/media/video/mxc/capture/ipu_csi_enc.c b/drivers/media/video/mxc/capture/ipu_csi_enc.c index 0261a7ecd212..7b43616a8514 100644 --- a/drivers/media/video/mxc/capture/ipu_csi_enc.c +++ b/drivers/media/video/mxc/capture/ipu_csi_enc.c @@ -1,5 +1,5 @@ /* - * Copyright 2009-2011 Freescale Semiconductor, Inc. All Rights Reserved. + * Copyright 2009-2012 Freescale Semiconductor, Inc. All Rights Reserved. */ /* @@ -171,7 +171,7 @@ static int csi_enc_setup(cam_data *cam) err = ipu_init_channel_buffer(cam->ipu, CSI_MEM, IPU_OUTPUT_BUFFER, pixel_fmt, cam->v2f.fmt.pix.width, cam->v2f.fmt.pix.height, - cam->v2f.fmt.pix.width, IPU_ROTATE_NONE, + cam->v2f.fmt.pix.width, cam->rotation, dummy, dummy, 0, cam->offset.u_offset, cam->offset.v_offset); @@ -235,18 +235,29 @@ static int csi_enc_enabling_tasks(void *private) int err = 0; CAMERA_TRACE("IPU:In csi_enc_enabling_tasks\n"); - cam->dummy_frame.vaddress = dma_alloc_coherent(0, - PAGE_ALIGN(cam->v2f.fmt.pix.sizeimage), - &cam->dummy_frame.paddress, - GFP_DMA | GFP_KERNEL); - if (cam->dummy_frame.vaddress == 0) { - pr_err("ERROR: v4l2 capture: Allocate dummy frame " - "failed.\n"); - return -ENOBUFS; + if (cam->dummy_frame.vaddress && + cam->dummy_frame.buffer.length + < PAGE_ALIGN(cam->v2f.fmt.pix.sizeimage)) { + dma_free_coherent(0, cam->dummy_frame.buffer.length, + cam->dummy_frame.vaddress, + cam->dummy_frame.paddress); + cam->dummy_frame.vaddress = 0; + } + + if (!cam->dummy_frame.vaddress) { + cam->dummy_frame.vaddress = dma_alloc_coherent(0, + PAGE_ALIGN(cam->v2f.fmt.pix.sizeimage), + &cam->dummy_frame.paddress, + GFP_DMA | GFP_KERNEL); + if (cam->dummy_frame.vaddress == 0) { + pr_err("ERROR: v4l2 capture: Allocate dummy frame " + "failed.\n"); + return -ENOBUFS; + } + cam->dummy_frame.buffer.length = + PAGE_ALIGN(cam->v2f.fmt.pix.sizeimage); } cam->dummy_frame.buffer.type = V4L2_BUF_TYPE_PRIVATE; - cam->dummy_frame.buffer.length = - PAGE_ALIGN(cam->v2f.fmt.pix.sizeimage); cam->dummy_frame.buffer.m.offset = cam->dummy_frame.paddress; ipu_clear_irq(cam->ipu, IPU_IRQ_CSI0_OUT_EOF); @@ -288,13 +299,6 @@ static int csi_enc_disabling_tasks(void *private) ipu_uninit_channel(cam->ipu, CSI_MEM); - if (cam->dummy_frame.vaddress != 0) { - dma_free_coherent(0, cam->dummy_frame.buffer.length, - cam->dummy_frame.vaddress, - cam->dummy_frame.paddress); - cam->dummy_frame.vaddress = 0; - } - #ifdef CONFIG_MXC_MIPI_CSI2 mipi_csi2_info = mipi_csi2_get_info(); |