drm/vc4: Add monochrome mode to the VEC.
authorDave Stevenson <dave.stevenson@raspberrypi.com>
Wed, 19 Jun 2024 15:39:12 +0000 (16:39 +0100)
committerMaxime Ripard <mripard@kernel.org>
Thu, 20 Jun 2024 08:02:33 +0000 (10:02 +0200)
The VEC supports not producing colour bursts for monochrome output.
It also has an option for disabling the chroma input to remove
chroma from the signal.

Now that there is a DRM_MODE_TV_MODE_MONOCHROME defined, plumb
this in.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
Signed-off-by: Maxime Ripard <mripard@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240619153913.2804051-3-dave.stevenson@raspberrypi.com
drivers/gpu/drm/vc4/vc4_vec.c

index 268f18b10ee0145b5165433dacf8c2c88da6a26c..5fdde6f28d86291e84315e39a77c7c15c085b083 100644 (file)
@@ -234,6 +234,7 @@ enum vc4_vec_tv_mode_id {
        VC4_VEC_TV_MODE_PAL_60,
        VC4_VEC_TV_MODE_PAL_N,
        VC4_VEC_TV_MODE_SECAM,
+       VC4_VEC_TV_MODE_MONOCHROME,
 };
 
 struct vc4_vec_tv_mode {
@@ -324,6 +325,22 @@ static const struct vc4_vec_tv_mode vc4_vec_tv_modes[] = {
                .config1 = VEC_CONFIG1_C_CVBS_CVBS,
                .custom_freq = 0x29c71c72,
        },
+       {
+               /* 50Hz mono */
+               .mode = DRM_MODE_TV_MODE_MONOCHROME,
+               .expected_htotal = 864,
+               .config0 = VEC_CONFIG0_PAL_BDGHI_STD | VEC_CONFIG0_BURDIS |
+                          VEC_CONFIG0_CHRDIS,
+               .config1 = VEC_CONFIG1_C_CVBS_CVBS,
+       },
+       {
+               /* 60Hz mono */
+               .mode = DRM_MODE_TV_MODE_MONOCHROME,
+               .expected_htotal = 858,
+               .config0 = VEC_CONFIG0_PAL_M_STD | VEC_CONFIG0_BURDIS |
+                          VEC_CONFIG0_CHRDIS,
+               .config1 = VEC_CONFIG1_C_CVBS_CVBS,
+       },
 };
 
 static inline const struct vc4_vec_tv_mode *
@@ -351,6 +368,7 @@ static const struct drm_prop_enum_list legacy_tv_mode_names[] = {
        { VC4_VEC_TV_MODE_PAL_M, "PAL-M", },
        { VC4_VEC_TV_MODE_PAL_N, "PAL-N", },
        { VC4_VEC_TV_MODE_SECAM, "SECAM", },
+       { VC4_VEC_TV_MODE_MONOCHROME, "Mono", },
 };
 
 static enum drm_connector_status
@@ -406,6 +424,10 @@ vc4_vec_connector_set_property(struct drm_connector *connector,
                state->tv.mode = DRM_MODE_TV_MODE_SECAM;
                break;
 
+       case VC4_VEC_TV_MODE_MONOCHROME:
+               state->tv.mode = DRM_MODE_TV_MODE_MONOCHROME;
+               break;
+
        default:
                return -EINVAL;
        }
@@ -453,6 +475,10 @@ vc4_vec_connector_get_property(struct drm_connector *connector,
                *val = VC4_VEC_TV_MODE_SECAM;
                break;
 
+       case DRM_MODE_TV_MODE_MONOCHROME:
+               *val = VC4_VEC_TV_MODE_MONOCHROME;
+               break;
+
        default:
                return -EINVAL;
        }
@@ -754,7 +780,8 @@ static int vc4_vec_bind(struct device *dev, struct device *master, void *data)
                                            BIT(DRM_MODE_TV_MODE_PAL) |
                                            BIT(DRM_MODE_TV_MODE_PAL_M) |
                                            BIT(DRM_MODE_TV_MODE_PAL_N) |
-                                           BIT(DRM_MODE_TV_MODE_SECAM));
+                                           BIT(DRM_MODE_TV_MODE_SECAM) |
+                                           BIT(DRM_MODE_TV_MODE_MONOCHROME));
        if (ret)
                return ret;