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);
        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);
 
        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);
        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
                 */
                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);