drm/vc4: dpi: Add option for inverting pixel clock and output enable
authorDave Stevenson <dave.stevenson@raspberrypi.com>
Mon, 13 Jun 2022 14:47:36 +0000 (16:47 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 10 Mar 2023 08:39:20 +0000 (09:39 +0100)
[ Upstream commit 3c2707632146b22e97b0fbf6778bab8add2eaa1d ]

DRM provides flags for inverting pixel clock and output enable
signals, but these were not mapped to the relevant registers.

Add those mappings.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
Link: https://lore.kernel.org/r/20220613144800.326124-10-maxime@cerno.tech
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
Stable-dep-of: 0870d86eac8a ("drm/vc4: dpi: Fix format mapping for RGB565")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/vc4/vc4_dpi.c

index a90f2545baee0c7e6b541cc1d957c7dad6c286a4..0e25add2df071950b5d363150ae4717ad0cc5e1b 100644 (file)
@@ -148,35 +148,45 @@ static void vc4_dpi_encoder_enable(struct drm_encoder *encoder)
        }
        drm_connector_list_iter_end(&conn_iter);
 
-       if (connector && connector->display_info.num_bus_formats) {
-               u32 bus_format = connector->display_info.bus_formats[0];
-
-               switch (bus_format) {
-               case MEDIA_BUS_FMT_RGB888_1X24:
-                       dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
-                                              DPI_FORMAT);
-                       break;
-               case MEDIA_BUS_FMT_BGR888_1X24:
-                       dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
-                                              DPI_FORMAT);
-                       dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR, DPI_ORDER);
-                       break;
-               case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
-                       dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
-                                              DPI_FORMAT);
-                       break;
-               case MEDIA_BUS_FMT_RGB666_1X18:
-                       dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1,
-                                              DPI_FORMAT);
-                       break;
-               case MEDIA_BUS_FMT_RGB565_1X16:
-                       dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_3,
-                                              DPI_FORMAT);
-                       break;
-               default:
-                       DRM_ERROR("Unknown media bus format %d\n", bus_format);
-                       break;
+       if (connector) {
+               if (connector->display_info.num_bus_formats) {
+                       u32 bus_format = connector->display_info.bus_formats[0];
+
+                       switch (bus_format) {
+                       case MEDIA_BUS_FMT_RGB888_1X24:
+                               dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
+                                                      DPI_FORMAT);
+                               break;
+                       case MEDIA_BUS_FMT_BGR888_1X24:
+                               dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
+                                                      DPI_FORMAT);
+                               dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR,
+                                                      DPI_ORDER);
+                               break;
+                       case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
+                               dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
+                                                      DPI_FORMAT);
+                               break;
+                       case MEDIA_BUS_FMT_RGB666_1X18:
+                               dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1,
+                                                      DPI_FORMAT);
+                               break;
+                       case MEDIA_BUS_FMT_RGB565_1X16:
+                               dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_3,
+                                                      DPI_FORMAT);
+                               break;
+                       default:
+                               DRM_ERROR("Unknown media bus format %d\n",
+                                         bus_format);
+                               break;
+                       }
                }
+
+               if (connector->display_info.bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE)
+                       dpi_c |= DPI_PIXEL_CLK_INVERT;
+
+               if (connector->display_info.bus_flags & DRM_BUS_FLAG_DE_LOW)
+                       dpi_c |= DPI_OUTPUT_ENABLE_INVERT;
        } else {
                /* Default to 24bit if no connector found. */
                dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB, DPI_FORMAT);