cache_config = 1 << CODA9_CACHE_PAGEMERGE_OFFSET;
        }
        coda_write(ctx->dev, cache_size, CODA9_CMD_SET_FRAME_CACHE_SIZE);
-       if (fourcc == V4L2_PIX_FMT_NV12) {
+       if (fourcc == V4L2_PIX_FMT_NV12 || fourcc == V4L2_PIX_FMT_YUYV) {
                cache_config |= 32 << CODA9_CACHE_LUMA_BUFFER_SIZE_OFFSET |
                                16 << CODA9_CACHE_CR_BUFFER_SIZE_OFFSET |
                                0 << CODA9_CACHE_CB_BUFFER_SIZE_OFFSET;
 
        ctx->frame_mem_ctrl &= ~(CODA_FRAME_CHROMA_INTERLEAVE | (0x3 << 9) |
                                 CODA9_FRAME_TILED2LINEAR);
-       if (dst_fourcc == V4L2_PIX_FMT_NV12)
+       if (dst_fourcc == V4L2_PIX_FMT_NV12 || dst_fourcc == V4L2_PIX_FMT_YUYV)
                ctx->frame_mem_ctrl |= CODA_FRAME_CHROMA_INTERLEAVE;
        if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP)
                ctx->frame_mem_ctrl |= (0x3 << 9) |
                trace_coda_dec_rot_done(ctx, dst_buf, meta);
 
                switch (q_data_dst->fourcc) {
+               case V4L2_PIX_FMT_YUYV:
+                       payload = width * height * 2;
+                       break;
                case V4L2_PIX_FMT_YUV420:
                case V4L2_PIX_FMT_YVU420:
                case V4L2_PIX_FMT_NV12:
 
        u32 base_cb, base_cr;
 
        switch (q_data->fourcc) {
+       case V4L2_PIX_FMT_YUYV:
+               /* Fallthrough: IN -H264-> CODA -NV12 MB-> VDOA -YUYV-> OUT */
        case V4L2_PIX_FMT_NV12:
        case V4L2_PIX_FMT_YUV420:
        default:
                V4L2_PIX_FMT_NV12,
                V4L2_PIX_FMT_YUV420,
                V4L2_PIX_FMT_YVU420,
+               /*
+                * If V4L2_PIX_FMT_YUYV should be default,
+                * set_default_params() must be adjusted.
+                */
+               V4L2_PIX_FMT_YUYV,
        },
 };
 
        case V4L2_PIX_FMT_YUV420:
        case V4L2_PIX_FMT_YVU420:
        case V4L2_PIX_FMT_YUV422P:
+       case V4L2_PIX_FMT_YUYV:
                return V4L2_PIX_FMT_YUV420;
        default:
                return fourcc;
                return -EINVAL;
 
        for (i = 0; i < CODA_MAX_FORMATS; i++) {
+               /* Skip YUYV if the vdoa is not available */
+               if (!ctx->vdoa && f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE &&
+                   formats[i] == V4L2_PIX_FMT_YUYV)
+                       continue;
+
                if (formats[i] == f->fmt.pix.pixelformat) {
                        f->fmt.pix.pixelformat = formats[i];
                        return 0;
                f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
                                        f->fmt.pix.height * 3 / 2;
                break;
+       case V4L2_PIX_FMT_YUYV:
+               f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 16) * 2;
+               f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
+                                       f->fmt.pix.height;
+               break;
        case V4L2_PIX_FMT_YUV422P:
                f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 16);
                f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
                ret = coda_try_fmt_vdoa(ctx, f, &use_vdoa);
                if (ret < 0)
                        return ret;
+
+               if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_YUYV) {
+                       if (!use_vdoa)
+                               return -EINVAL;
+
+                       f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 16) * 2;
+                       f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
+                               f->fmt.pix.height;
+               }
        }
 
        return 0;
        }
 
        switch (f->fmt.pix.pixelformat) {
+       case V4L2_PIX_FMT_YUYV:
+               ctx->tiled_map_type = GDI_TILED_FRAME_MB_RASTER_MAP;
+               break;
        case V4L2_PIX_FMT_NV12:
                ctx->tiled_map_type = GDI_TILED_FRAME_MB_RASTER_MAP;
                if (!disable_tiling)