drm/meson: add YUV422 output support
authorDongjin Kim <tobetter@gmail.com>
Mon, 16 May 2022 07:22:45 +0000 (07:22 +0000)
committerNeil Armstrong <narmstrong@baylibre.com>
Wed, 18 May 2022 07:13:31 +0000 (09:13 +0200)
Support YUV422 output from the Amlogic Meson SoC VPU to the HDMI
controller. Without this YUV422 format out of the HDMI encoder
leads to using the dw-hdmi YUV444 to YUV422 color conversion which
gives wrong colors and a green line on the left edge of the screen.

Signed-off-by: Dongjin Kim <tobetter@gmail.com>
Signed-off-by: Christian Hewitt <christianshewitt@gmail.com>
Tested-by: Furkan Kardame <f.kardame@manjaro.org>
Acked-by: Neil Armstrong <narmstrong@baylibre.com>
Tested-by: Dan Johansen <strit@manjaro.org>
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220516072245.10745-1-christianshewitt@gmail.com
drivers/gpu/drm/meson/meson_encoder_hdmi.c

index de87f02cd388ed011ac05d7e045b0db53e18ef4e..2593c542ad41ad0645fc04e984f6b9618ddef9fb 100644 (file)
@@ -218,7 +218,8 @@ static void meson_encoder_hdmi_atomic_enable(struct drm_bridge *bridge,
        if (encoder_hdmi->output_bus_fmt == MEDIA_BUS_FMT_UYYVYY8_0_5X24) {
                ycrcb_map = VPU_HDMI_OUTPUT_CRYCB;
                yuv420_mode = true;
-       }
+       } else if (encoder_hdmi->output_bus_fmt == MEDIA_BUS_FMT_UYVY8_1X16)
+               ycrcb_map = VPU_HDMI_OUTPUT_CRYCB;
 
        /* VENC + VENC-DVI Mode setup */
        meson_venc_hdmi_mode_set(priv, vic, ycrcb_map, yuv420_mode, mode);
@@ -230,6 +231,10 @@ static void meson_encoder_hdmi_atomic_enable(struct drm_bridge *bridge,
                /* Setup YUV420 to HDMI-TX, no 10bit diphering */
                writel_relaxed(2 | (2 << 2),
                               priv->io_base + _REG(VPU_HDMI_FMT_CTRL));
+       else if (encoder_hdmi->output_bus_fmt == MEDIA_BUS_FMT_UYVY8_1X16)
+               /* Setup YUV422 to HDMI-TX, no 10bit diphering */
+               writel_relaxed(1 | (2 << 2),
+                               priv->io_base + _REG(VPU_HDMI_FMT_CTRL));
        else
                /* Setup YUV444 to HDMI-TX, no 10bit diphering */
                writel_relaxed(0, priv->io_base + _REG(VPU_HDMI_FMT_CTRL));
@@ -257,6 +262,7 @@ static void meson_encoder_hdmi_atomic_disable(struct drm_bridge *bridge,
 
 static const u32 meson_encoder_hdmi_out_bus_fmts[] = {
        MEDIA_BUS_FMT_YUV8_1X24,
+       MEDIA_BUS_FMT_UYVY8_1X16,
        MEDIA_BUS_FMT_UYYVYY8_0_5X24,
 };