]> git.baikalelectronics.ru Git - kernel.git/commitdiff
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)
committerMaxime Ripard <maxime@cerno.tech>
Tue, 28 Jun 2022 12:55:16 +0000 (14:55 +0200)
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>
drivers/gpu/drm/vc4/vc4_dpi.c

index ffa55952c773c765ae88dd0e0f677c97ee4d2214..695b759db9bcd20b65b26bd8a02b3551ce17a8e7 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);