Support RPi DPI interface in mode6 for 18-bit color
authorJoerg Quinten <aBUGSworstnightmare@gmail.com>
Fri, 18 Jun 2021 11:02:29 +0000 (13:02 +0200)
committerDom Cobley <popcornmix@gmail.com>
Mon, 21 Mar 2022 16:04:17 +0000 (16:04 +0000)
A matching media bus format was added and an overlay for using it,
both with FB and VC4 was added as well.

Signed-off-by: Joerg Quinten <aBUGSworstnightmare@gmail.com>
Documentation/devicetree/bindings/display/panel/panel-simple.yaml
Documentation/userspace-api/media/v4l/subdev-formats.rst
drivers/gpu/drm/panel/panel-simple.c
drivers/gpu/drm/vc4/vc4_dpi.c
include/uapi/linux/media-bus-format.h

index 335776c..6637cb1 100644 (file)
@@ -162,6 +162,8 @@ properties:
       - ivo,m133nwf4-r0
         # Innolux AT043TN24 4.3" WQVGA TFT LCD panel
       - innolux,at043tn24
+        # Innolux AT056tN53V1 5.6" VGA (640x480) TFT LCD panel
+      - innolux,at056tn53v1
         # Innolux AT070TN92 7.0" WQVGA TFT LCD panel
       - innolux,at070tn92
         # Innolux G070Y2-L01 7" WVGA (800x480) TFT LCD panel
index e7a2fac..6e143e4 100644 (file)
@@ -912,6 +912,43 @@ The following tables list existing packed RGB formats.
       - g\ :sub:`5`
       - g\ :sub:`4`
       - g\ :sub:`3`
+    * .. _MEDIA-BUS-FMT-BGR666-1X18:
+
+      - MEDIA_BUS_FMT_RGB666_1X18
+      - 0x101f
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      - b\ :sub:`5`
+      - b\ :sub:`4`
+      - b\ :sub:`3`
+      - b\ :sub:`2`
+      - b\ :sub:`1`
+      - b\ :sub:`0`
+      - g\ :sub:`5`
+      - g\ :sub:`4`
+      - g\ :sub:`3`
+      - g\ :sub:`2`
+      - g\ :sub:`1`
+      - g\ :sub:`0`
+      - r\ :sub:`5`
+      - r\ :sub:`4`
+      - r\ :sub:`3`
+      - r\ :sub:`2`
+      - r\ :sub:`1`
+      - r\ :sub:`0`
     * .. _MEDIA-BUS-FMT-RGB666-1X18:
 
       - MEDIA_BUS_FMT_RGB666_1X18
@@ -986,6 +1023,43 @@ The following tables list existing packed RGB formats.
       - g\ :sub:`2`
       - g\ :sub:`1`
       - g\ :sub:`0`
+    * .. _MEDIA-BUS-FMT-BGR666-1X24_CPADHI:
+
+      - MEDIA_BUS_FMT_BGR666_1X24_CPADHI
+      - 0x101e
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      -
+      - 0
+      - 0
+      - b\ :sub:`5`
+      - b\ :sub:`4`
+      - b\ :sub:`3`
+      - b\ :sub:`2`
+      - b\ :sub:`1`
+      - b\ :sub:`0`
+      - 0
+      - 0
+      - g\ :sub:`5`
+      - g\ :sub:`4`
+      - g\ :sub:`3`
+      - g\ :sub:`2`
+      - g\ :sub:`1`
+      - g\ :sub:`0`
+      - 0
+      - 0
+      - r\ :sub:`5`
+      - r\ :sub:`4`
+      - r\ :sub:`3`
+      - r\ :sub:`2`
+      - r\ :sub:`1`
+      - r\ :sub:`0`
     * .. _MEDIA-BUS-FMT-RGB666-1X24_CPADHI:
 
       - MEDIA_BUS_FMT_RGB666_1X24_CPADHI
index b7b654f..e4e479e 100644 (file)
@@ -2472,6 +2472,38 @@ static const struct panel_desc innolux_at043tn24 = {
        .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
 };
 
+static const struct display_timing innolux_at056tn53v1_timing = {
+       .pixelclock = { 39700000, 39700000, 39700000},
+       .hactive = { 640, 640, 640 },
+       .hfront_porch = { 16, 16, 16 },
+       .hback_porch = { 134, 134, 134 },
+       .hsync_len = { 10, 10, 10},
+       .vactive = { 480, 480, 480 },
+       .vfront_porch = { 32, 32, 32},
+       .vback_porch = { 11, 11, 11 },
+       .vsync_len = { 2, 2, 2 },
+       .flags = DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_PHSYNC,
+};
+
+static const struct panel_desc innolux_at056tn53v1 = {
+       .timings = &innolux_at056tn53v1_timing,
+       .num_timings = 1,
+       .bpc = 6,
+       .size = {
+               .width = 112,
+               .height = 84,
+       },
+       .delay = {
+               .prepare = 50,
+               .enable = 200,
+               .disable = 110,
+               .unprepare = 200,
+       },
+       .bus_format = MEDIA_BUS_FMT_BGR666_1X24_CPADHI,
+       .bus_flags = DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE,
+       .connector_type = DRM_MODE_CONNECTOR_DPI,
+};
+
 static const struct drm_display_mode innolux_at070tn92_mode = {
        .clock = 33333,
        .hdisplay = 800,
@@ -4659,6 +4691,9 @@ static const struct of_device_id platform_of_match[] = {
                .compatible = "innolux,at043tn24",
                .data = &innolux_at043tn24,
        }, {
+               .compatible = "innolux,at056tn53v1",
+               .data = &innolux_at056tn53v1,
+       }, {
                .compatible = "innolux,at070tn92",
                .data = &innolux_at070tn92,
        }, {
index a90f254..afb446f 100644 (file)
@@ -165,10 +165,20 @@ static void vc4_dpi_encoder_enable(struct drm_encoder *encoder)
                        dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
                                               DPI_FORMAT);
                        break;
+               case MEDIA_BUS_FMT_BGR666_1X24_CPADHI:
+                       dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
+                                              DPI_FORMAT);
+                       dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR, DPI_ORDER);
+                       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_BGR666_1X18:
+                       dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1,
+                                              DPI_FORMAT);
+                       dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR, DPI_ORDER);
+                       break;
                case MEDIA_BUS_FMT_RGB565_1X16:
                        dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_3,
                                               DPI_FORMAT);
index aa56d7f..6ad34f8 100644 (file)
@@ -34,7 +34,7 @@
 
 #define MEDIA_BUS_FMT_FIXED                    0x0001
 
-/* RGB - next is       0x101e */
+/* RGB - next is       0x1020 */
 #define MEDIA_BUS_FMT_RGB444_1X12              0x1016
 #define MEDIA_BUS_FMT_RGB444_2X8_PADHI_BE      0x1001
 #define MEDIA_BUS_FMT_RGB444_2X8_PADHI_LE      0x1002
 #define MEDIA_BUS_FMT_BGR565_2X8_LE            0x1006
 #define MEDIA_BUS_FMT_RGB565_2X8_BE            0x1007
 #define MEDIA_BUS_FMT_RGB565_2X8_LE            0x1008
+#define MEDIA_BUS_FMT_BGR666_1X18              0x101f
 #define MEDIA_BUS_FMT_RGB666_1X18              0x1009
 #define MEDIA_BUS_FMT_RBG888_1X24              0x100e
+#define MEDIA_BUS_FMT_BGR666_1X24_CPADHI       0x101e
 #define MEDIA_BUS_FMT_RGB666_1X24_CPADHI       0x1015
 #define MEDIA_BUS_FMT_RGB666_1X7X3_SPWG                0x1010
 #define MEDIA_BUS_FMT_BGR888_1X24              0x1013