drm/panel: panel-simple: validate panel description
authorSam Ravnborg <sam@ravnborg.org>
Sun, 26 Jul 2020 20:33:10 +0000 (22:33 +0200)
committerSam Ravnborg <sam@ravnborg.org>
Mon, 27 Jul 2020 15:17:32 +0000 (17:17 +0200)
Warn if we detect a panel with incomplete/wrong description.
This is inspired by a similar patch by Laurent that introduced checks
for LVDS panels - this extends the checks to the remaining type of
connectors.

This is known to warn for some of the existing panels but added
despite this as we need help from people using the panels to
add the missing info.
The checks are not complete but will catch the most common mistakes.

The checks at the same time serve as documentation for the minimum
required description for a panel.

The checks uses dev_warn() as we know this will hit. WARN() was
too noisy at the moment for anything else than LVDS.

v3:
  - %d => %u for bpc (Laurent)
v2:
  - Use dev_warn (Laurent)
  - Check for empty bus_flags

Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20200726203324.3722593-2-sam@ravnborg.org
drivers/gpu/drm/panel/panel-simple.c

index 5432351..2c972cc 100644 (file)
@@ -500,6 +500,7 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
        struct panel_simple *panel;
        struct display_timing dt;
        struct device_node *ddc;
+       u32 bus_flags;
        int err;
 
        panel = devm_kzalloc(dev, sizeof(*panel), GFP_KERNEL);
@@ -549,8 +550,12 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
                        panel_simple_parse_panel_timing_node(dev, panel, &dt);
        }
 
-       if (desc->connector_type == DRM_MODE_CONNECTOR_LVDS) {
-               /* Catch common mistakes for LVDS panels. */
+       /* Catch common mistakes for panels. */
+       switch (desc->connector_type) {
+       case 0:
+               dev_warn(dev, "Specify missing connector_type\n");
+               break;
+       case DRM_MODE_CONNECTOR_LVDS:
                WARN_ON(desc->bus_flags &
                        ~(DRM_BUS_FLAG_DE_LOW |
                          DRM_BUS_FLAG_DE_HIGH |
@@ -564,6 +569,38 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
                WARN_ON((desc->bus_format == MEDIA_BUS_FMT_RGB888_1X7X4_SPWG ||
                         desc->bus_format == MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA) &&
                        desc->bpc != 8);
+               break;
+       case DRM_MODE_CONNECTOR_eDP:
+               if (desc->bus_format == 0)
+                       dev_warn(dev, "Specify missing bus_format\n");
+               if (desc->bpc != 6 && desc->bpc != 8)
+                       dev_warn(dev, "Expected bpc in {6,8} but got: %u\n", desc->bpc);
+               break;
+       case DRM_MODE_CONNECTOR_DSI:
+               if (desc->bpc != 6 && desc->bpc != 8)
+                       dev_warn(dev, "Expected bpc in {6,8} but got: %u\n", desc->bpc);
+               break;
+       case DRM_MODE_CONNECTOR_DPI:
+               bus_flags = DRM_BUS_FLAG_DE_LOW |
+                           DRM_BUS_FLAG_DE_HIGH |
+                           DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE |
+                           DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE |
+                           DRM_BUS_FLAG_DATA_MSB_TO_LSB |
+                           DRM_BUS_FLAG_DATA_LSB_TO_MSB |
+                           DRM_BUS_FLAG_SYNC_SAMPLE_POSEDGE |
+                           DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE;
+               if (desc->bus_flags & ~bus_flags)
+                       dev_warn(dev, "Unexpected bus_flags(%d)\n", desc->bus_flags & ~bus_flags);
+               if (!(desc->bus_flags & bus_flags))
+                       dev_warn(dev, "Specify missing bus_flags\n");
+               if (desc->bus_format == 0)
+                       dev_warn(dev, "Specify missing bus_format\n");
+               if (desc->bpc != 6 && desc->bpc != 8)
+                       dev_warn(dev, "Expected bpc in {6,8} but got: %u\n", desc->bpc);
+               break;
+       default:
+               dev_warn(dev, "Specify a valid connector_type: %d\n", desc->connector_type);
+               break;
        }
 
        drm_panel_init(&panel->base, dev, &panel_simple_funcs,