};
 
 enum mtk_dpi_out_color_format {
-       MTK_DPI_COLOR_FORMAT_RGB
+       MTK_DPI_COLOR_FORMAT_RGB,
+       MTK_DPI_COLOR_FORMAT_YCBCR_422
 };
 
 struct mtk_dpi {
 static void mtk_dpi_config_color_format(struct mtk_dpi *dpi,
                                        enum mtk_dpi_out_color_format format)
 {
-       /* only support RGB888 */
-       mtk_dpi_config_yuv422_enable(dpi, false);
-       mtk_dpi_config_csc_enable(dpi, false);
-       if (dpi->conf->swap_input_support)
-               mtk_dpi_config_swap_input(dpi, false);
        mtk_dpi_config_channel_swap(dpi, MTK_DPI_OUT_CHANNEL_SWAP_RGB);
+
+       if (format == MTK_DPI_COLOR_FORMAT_YCBCR_422) {
+               mtk_dpi_config_yuv422_enable(dpi, true);
+               mtk_dpi_config_csc_enable(dpi, true);
+
+               /*
+                * If height is smaller than 720, we need to use RGB_TO_BT601
+                * to transfer to yuv422. Otherwise, we use RGB_TO_JPEG.
+                */
+               mtk_dpi_mask(dpi, DPI_MATRIX_SET, dpi->mode.hdisplay <= 720 ?
+                            MATRIX_SEL_RGB_TO_BT601 : MATRIX_SEL_RGB_TO_JPEG,
+                            INT_MATRIX_SEL_MASK);
+       } else {
+               mtk_dpi_config_yuv422_enable(dpi, false);
+               mtk_dpi_config_csc_enable(dpi, false);
+               if (dpi->conf->swap_input_support)
+                       mtk_dpi_config_swap_input(dpi, false);
+       }
 }
 
 static void mtk_dpi_dual_edge(struct mtk_dpi *dpi)
        dpi->bit_num = MTK_DPI_OUT_BIT_NUM_8BITS;
        dpi->channel_swap = MTK_DPI_OUT_CHANNEL_SWAP_RGB;
        dpi->yc_map = MTK_DPI_OUT_YC_MAP_RGB;
-       dpi->color_format = MTK_DPI_COLOR_FORMAT_RGB;
+       if (out_bus_format == MEDIA_BUS_FMT_YUYV8_1X16)
+               dpi->color_format = MTK_DPI_COLOR_FORMAT_YCBCR_422;
+       else
+               dpi->color_format = MTK_DPI_COLOR_FORMAT_RGB;
 
        return 0;
 }