[media] coda: add coda_write_base helper
authorPhilipp Zabel <p.zabel@pengutronix.de>
Mon, 29 Sep 2014 12:53:44 +0000 (09:53 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Tue, 28 Oct 2014 16:26:53 +0000 (14:26 -0200)
Add a helper function that writes a vb2_buffer's Y, Cb, and
Cr plane base addresses of into three consecutive registers.
This moves common code out of coda-bit.c.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Kamil Debski <k.debski@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/platform/coda/coda-bit.c
drivers/media/platform/coda/coda-common.c
drivers/media/platform/coda/coda.h

index 9b8ea8bbeb4e79f44fbd722ccca372f36ebf6e16..f01393ccf30c6541f4b3a15d9e60a0bc986e9fc8 100644 (file)
@@ -1036,9 +1036,9 @@ static int coda_prepare_encode(struct coda_ctx *ctx)
        struct coda_dev *dev = ctx->dev;
        int force_ipicture;
        int quant_param = 0;
-       u32 picture_y, picture_cb, picture_cr;
        u32 pic_stream_buffer_addr, pic_stream_buffer_size;
        u32 dst_fourcc;
+       u32 reg;
 
        src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
        dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
@@ -1129,37 +1129,17 @@ static int coda_prepare_encode(struct coda_ctx *ctx)
        coda_write(dev, quant_param, CODA_CMD_ENC_PIC_QS);
 
 
-       picture_y = vb2_dma_contig_plane_dma_addr(src_buf, 0);
-       switch (q_data_src->fourcc) {
-       case V4L2_PIX_FMT_YVU420:
-               /* Switch Cb and Cr for YVU420 format */
-               picture_cr = picture_y + q_data_src->bytesperline *
-                               q_data_src->height;
-               picture_cb = picture_cr + q_data_src->bytesperline / 2 *
-                               q_data_src->height / 2;
-               break;
-       case V4L2_PIX_FMT_YUV420:
-       default:
-               picture_cb = picture_y + q_data_src->bytesperline *
-                               q_data_src->height;
-               picture_cr = picture_cb + q_data_src->bytesperline / 2 *
-                               q_data_src->height / 2;
-               break;
-       }
-
        if (dev->devtype->product == CODA_960) {
                coda_write(dev, 4/*FIXME: 0*/, CODA9_CMD_ENC_PIC_SRC_INDEX);
                coda_write(dev, q_data_src->width, CODA9_CMD_ENC_PIC_SRC_STRIDE);
                coda_write(dev, 0, CODA9_CMD_ENC_PIC_SUB_FRAME_SYNC);
 
-               coda_write(dev, picture_y, CODA9_CMD_ENC_PIC_SRC_ADDR_Y);
-               coda_write(dev, picture_cb, CODA9_CMD_ENC_PIC_SRC_ADDR_CB);
-               coda_write(dev, picture_cr, CODA9_CMD_ENC_PIC_SRC_ADDR_CR);
+               reg = CODA9_CMD_ENC_PIC_SRC_ADDR_Y;
        } else {
-               coda_write(dev, picture_y, CODA_CMD_ENC_PIC_SRC_ADDR_Y);
-               coda_write(dev, picture_cb, CODA_CMD_ENC_PIC_SRC_ADDR_CB);
-               coda_write(dev, picture_cr, CODA_CMD_ENC_PIC_SRC_ADDR_CR);
+               reg = CODA_CMD_ENC_PIC_SRC_ADDR_Y;
        }
+       coda_write_base(ctx, q_data_src, src_buf, reg);
+
        coda_write(dev, force_ipicture << 1 & 0x2,
                   CODA_CMD_ENC_PIC_OPTION);
 
@@ -1501,20 +1481,11 @@ static int coda_prepare_decode(struct coda_ctx *ctx)
        struct vb2_buffer *dst_buf;
        struct coda_dev *dev = ctx->dev;
        struct coda_q_data *q_data_dst;
-       u32 stridey, height;
-       u32 picture_y, picture_cb, picture_cr;
+       u32 reg_addr, reg_stride;
 
        dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
        q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
 
-       if (ctx->params.rot_mode & CODA_ROT_90) {
-               stridey = q_data_dst->height;
-               height = q_data_dst->width;
-       } else {
-               stridey = q_data_dst->width;
-               height = q_data_dst->height;
-       }
-
        /* Try to copy source buffer contents into the bitstream ringbuffer */
        mutex_lock(&ctx->bitstream_mutex);
        coda_fill_bitstream(ctx);
@@ -1545,17 +1516,6 @@ static int coda_prepare_decode(struct coda_ctx *ctx)
        if (dev->devtype->product == CODA_960)
                coda_set_gdi_regs(ctx);
 
-       /* Set rotator output */
-       picture_y = vb2_dma_contig_plane_dma_addr(dst_buf, 0);
-       if (q_data_dst->fourcc == V4L2_PIX_FMT_YVU420) {
-               /* Switch Cr and Cb for YVU420 format */
-               picture_cr = picture_y + stridey * height;
-               picture_cb = picture_cr + stridey / 2 * height / 2;
-       } else {
-               picture_cb = picture_y + stridey * height;
-               picture_cr = picture_cb + stridey / 2 * height / 2;
-       }
-
        if (dev->devtype->product == CODA_960) {
                /*
                 * The CODA960 seems to have an internal list of buffers with
@@ -1565,16 +1525,16 @@ static int coda_prepare_decode(struct coda_ctx *ctx)
                 */
                coda_write(dev, CODA_MAX_FRAMEBUFFERS + dst_buf->v4l2_buf.index,
                                CODA9_CMD_DEC_PIC_ROT_INDEX);
-               coda_write(dev, picture_y, CODA9_CMD_DEC_PIC_ROT_ADDR_Y);
-               coda_write(dev, picture_cb, CODA9_CMD_DEC_PIC_ROT_ADDR_CB);
-               coda_write(dev, picture_cr, CODA9_CMD_DEC_PIC_ROT_ADDR_CR);
-               coda_write(dev, stridey, CODA9_CMD_DEC_PIC_ROT_STRIDE);
+
+               reg_addr = CODA9_CMD_DEC_PIC_ROT_ADDR_Y;
+               reg_stride = CODA9_CMD_DEC_PIC_ROT_STRIDE;
        } else {
-               coda_write(dev, picture_y, CODA_CMD_DEC_PIC_ROT_ADDR_Y);
-               coda_write(dev, picture_cb, CODA_CMD_DEC_PIC_ROT_ADDR_CB);
-               coda_write(dev, picture_cr, CODA_CMD_DEC_PIC_ROT_ADDR_CR);
-               coda_write(dev, stridey, CODA_CMD_DEC_PIC_ROT_STRIDE);
+               reg_addr = CODA_CMD_DEC_PIC_ROT_ADDR_Y;
+               reg_stride = CODA_CMD_DEC_PIC_ROT_STRIDE;
        }
+       coda_write_base(ctx, q_data_dst, dst_buf, reg_addr);
+       coda_write(dev, q_data_dst->bytesperline, reg_stride);
+
        coda_write(dev, CODA_ROT_MIR_ENABLE | ctx->params.rot_mode,
                        CODA_CMD_DEC_PIC_ROT_MODE);
 
index 538d4acef17e6fbf3b58c6212c04c49747f18e8b..fac25170c4c3ac419bfa2888c17923d7e33a0202 100644 (file)
@@ -82,6 +82,30 @@ unsigned int coda_read(struct coda_dev *dev, u32 reg)
        return data;
 }
 
+void coda_write_base(struct coda_ctx *ctx, struct coda_q_data *q_data,
+                    struct vb2_buffer *buf, unsigned int reg_y)
+{
+       u32 base_y = vb2_dma_contig_plane_dma_addr(buf, 0);
+       u32 base_cb, base_cr;
+
+       switch (q_data->fourcc) {
+       case V4L2_PIX_FMT_YVU420:
+               /* Switch Cb and Cr for YVU420 format */
+               base_cr = base_y + q_data->bytesperline * q_data->height;
+               base_cb = base_cr + q_data->bytesperline * q_data->height / 4;
+               break;
+       case V4L2_PIX_FMT_YUV420:
+       default:
+               base_cb = base_y + q_data->bytesperline * q_data->height;
+               base_cr = base_cb + q_data->bytesperline * q_data->height / 4;
+               break;
+       }
+
+       coda_write(ctx->dev, base_y, reg_y);
+       coda_write(ctx->dev, base_cb, reg_y + 4);
+       coda_write(ctx->dev, base_cr, reg_y + 8);
+}
+
 /*
  * Array of all formats supported by any version of Coda:
  */
index bbc18c0dacd979b12c8161d316cfaa81c9ff88ff..76ba83c03191bd908177d43057cc158aa7b36ecb 100644 (file)
@@ -232,6 +232,8 @@ extern int coda_debug;
 
 void coda_write(struct coda_dev *dev, u32 data, u32 reg);
 unsigned int coda_read(struct coda_dev *dev, u32 reg);
+void coda_write_base(struct coda_ctx *ctx, struct coda_q_data *q_data,
+                    struct vb2_buffer *buf, unsigned int reg_y);
 
 int coda_alloc_aux_buf(struct coda_dev *dev, struct coda_aux_buf *buf,
                       size_t size, const char *name, struct dentry *parent);