.data_type      = DATA_TYPE_C420,
                .depth          = 4,
        },
+       [VPDMA_DATA_FMT_CB420] = {
+               .type           = VPDMA_DATA_FMT_TYPE_YUV,
+               .data_type      = DATA_TYPE_CB420,
+               .depth          = 4,
+       },
        [VPDMA_DATA_FMT_YCR422] = {
                .type           = VPDMA_DATA_FMT_TYPE_YUV,
                .data_type      = DATA_TYPE_YCR422,
        channel = next_chan = raw_vpdma_chan;
 
        if (fmt->type == VPDMA_DATA_FMT_TYPE_YUV &&
-                       fmt->data_type == DATA_TYPE_C420) {
+           (fmt->data_type == DATA_TYPE_C420 ||
+            fmt->data_type == DATA_TYPE_CB420)) {
                rect.height >>= 1;
                rect.top >>= 1;
                depth = 8;
        channel = next_chan = chan_info[chan].num;
 
        if (fmt->type == VPDMA_DATA_FMT_TYPE_YUV &&
-                       fmt->data_type == DATA_TYPE_C420) {
+           (fmt->data_type == DATA_TYPE_C420 ||
+            fmt->data_type == DATA_TYPE_CB420)) {
                rect.height >>= 1;
                rect.top >>= 1;
                depth = 8;
 
                                    &vpdma_yuv_fmts[VPDMA_DATA_FMT_C420],
                                  },
        },
+       {
+               .fourcc         = V4L2_PIX_FMT_NV21,
+               .types          = VPE_FMT_TYPE_CAPTURE | VPE_FMT_TYPE_OUTPUT,
+               .coplanar       = 1,
+               .vpdma_fmt      = { &vpdma_yuv_fmts[VPDMA_DATA_FMT_Y420],
+                                   &vpdma_yuv_fmts[VPDMA_DATA_FMT_CB420],
+                                 },
+       },
        {
                .fourcc         = V4L2_PIX_FMT_YUYV,
                .types          = VPE_FMT_TYPE_CAPTURE | VPE_FMT_TYPE_OUTPUT,
         * Cfg Mode 1: YUV422 source, disable upsampler, DEI is de-interlacing.
         */
 
-       if (fmt->fourcc == V4L2_PIX_FMT_NV12)
+       if (fmt->fourcc == V4L2_PIX_FMT_NV12 ||
+           fmt->fourcc == V4L2_PIX_FMT_NV21)
                cfg_mode = 0;
 
        write_field(us1_reg0, cfg_mode, VPE_US_MODE_MASK, VPE_US_MODE_SHIFT);
        struct vpe_fmt *fmt = ctx->q_data[Q_DATA_SRC].fmt;
        int line_mode = 1;
 
-       if (fmt->fourcc == V4L2_PIX_FMT_NV12)
+       if (fmt->fourcc == V4L2_PIX_FMT_NV12 ||
+           fmt->fourcc == V4L2_PIX_FMT_NV21)
                line_mode = 0;          /* double lines to line buffer */
 
        /* regs for now */
         */
        val |= VPE_DS_SRC_DEI_SCALER | VPE_CSC_SRC_DEI_SCALER;
 
-       if (fmt->fourcc != V4L2_PIX_FMT_NV12)
+       if (fmt->fourcc != V4L2_PIX_FMT_NV12 &&
+           fmt->fourcc != V4L2_PIX_FMT_NV21)
                val |= VPE_DS_BYPASS;
 
        mmr_adb->out_fmt_reg[0] = val;
 
                        if (field) {
                                int height = q_data->height / 2;
-                               int bpp = fmt->fourcc == V4L2_PIX_FMT_NV12 ?
-                                               1 : (vpdma_fmt->depth >> 3);
+                               int bpp;
+
+                               if (fmt->fourcc == V4L2_PIX_FMT_NV12 ||
+                                   fmt->fourcc == V4L2_PIX_FMT_NV21)
+                                       bpp = 1;
+                               else
+                                       bpp = vpdma_fmt->depth >> 3;
 
                                if (plane)
                                        height /= 2;
        frame_width = q_data->c_rect.width;
        frame_height = q_data->c_rect.height;
 
-       if (p_data->vb_part && fmt->fourcc == V4L2_PIX_FMT_NV12)
+       if (p_data->vb_part && (fmt->fourcc == V4L2_PIX_FMT_NV12 ||
+                               fmt->fourcc == V4L2_PIX_FMT_NV21))
                frame_height /= 2;
 
        vpdma_add_in_dtd(&ctx->desc_list, q_data->width, stride,