mirror of
https://github.com/torvalds/linux.git
synced 2026-05-29 17:43:52 +02:00
drm/panel: simple: restore connector_type fallback
The switch from devm_kzalloc() + drm_panel_init() to
devm_drm_panel_alloc() introduced a regression.
Several panel descriptors do not set connector_type. For those panels,
panel_simple_probe() used to compute a connector type (currently DPI as a
fallback) and pass that value to drm_panel_init(). After the conversion
to devm_drm_panel_alloc(), the call unconditionally used
desc->connector_type instead, ignoring the computed fallback and
potentially passing DRM_MODE_CONNECTOR_Unknown, which
drm_panel_bridge_add() does not allow.
Move the connector_type validation / fallback logic before the
devm_drm_panel_alloc() call and pass the computed connector_type to
devm_drm_panel_alloc(), so panels without an explicit connector_type
once again get the DPI default.
Signed-off-by: Ludovic Desroches <ludovic.desroches@microchip.com>
Fixes: de04bb0089 ("drm/panel/panel-simple: Use the new allocation in place of devm_kzalloc()")
Cc: stable@vger.kernel.org
Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
Link: https://lore.kernel.org/stable/20251126-lcd_panel_connector_type_fix-v2-1-c15835d1f7cb%40microchip.com
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
Link: https://patch.msgid.link/20251218-lcd_panel_connector_type_fix-v3-1-ddcea6d8d7ef@microchip.com
This commit is contained in:
parent
6ab3d4353b
commit
9380dc33cd
|
|
@ -623,8 +623,61 @@ static struct panel_simple *panel_simple_probe(struct device *dev)
|
|||
if (IS_ERR(desc))
|
||||
return ERR_CAST(desc);
|
||||
|
||||
connector_type = desc->connector_type;
|
||||
/* Catch common mistakes for panels. */
|
||||
switch (connector_type) {
|
||||
case 0:
|
||||
dev_warn(dev, "Specify missing connector_type\n");
|
||||
connector_type = DRM_MODE_CONNECTOR_DPI;
|
||||
break;
|
||||
case DRM_MODE_CONNECTOR_LVDS:
|
||||
WARN_ON(desc->bus_flags &
|
||||
~(DRM_BUS_FLAG_DE_LOW |
|
||||
DRM_BUS_FLAG_DE_HIGH |
|
||||
DRM_BUS_FLAG_DATA_MSB_TO_LSB |
|
||||
DRM_BUS_FLAG_DATA_LSB_TO_MSB));
|
||||
WARN_ON(desc->bus_format != MEDIA_BUS_FMT_RGB666_1X7X3_SPWG &&
|
||||
desc->bus_format != MEDIA_BUS_FMT_RGB888_1X7X4_SPWG &&
|
||||
desc->bus_format != MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA);
|
||||
WARN_ON(desc->bus_format == MEDIA_BUS_FMT_RGB666_1X7X3_SPWG &&
|
||||
desc->bpc != 6);
|
||||
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:
|
||||
dev_warn(dev, "eDP panels moved to panel-edp\n");
|
||||
return ERR_PTR(-EINVAL);
|
||||
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);
|
||||
connector_type = DRM_MODE_CONNECTOR_DPI;
|
||||
break;
|
||||
}
|
||||
|
||||
panel = devm_drm_panel_alloc(dev, struct panel_simple, base,
|
||||
&panel_simple_funcs, desc->connector_type);
|
||||
&panel_simple_funcs, connector_type);
|
||||
if (IS_ERR(panel))
|
||||
return ERR_CAST(panel);
|
||||
|
||||
|
|
@ -666,60 +719,6 @@ static struct panel_simple *panel_simple_probe(struct device *dev)
|
|||
goto free_ddc;
|
||||
}
|
||||
|
||||
connector_type = desc->connector_type;
|
||||
/* Catch common mistakes for panels. */
|
||||
switch (connector_type) {
|
||||
case 0:
|
||||
dev_warn(dev, "Specify missing connector_type\n");
|
||||
connector_type = DRM_MODE_CONNECTOR_DPI;
|
||||
break;
|
||||
case DRM_MODE_CONNECTOR_LVDS:
|
||||
WARN_ON(desc->bus_flags &
|
||||
~(DRM_BUS_FLAG_DE_LOW |
|
||||
DRM_BUS_FLAG_DE_HIGH |
|
||||
DRM_BUS_FLAG_DATA_MSB_TO_LSB |
|
||||
DRM_BUS_FLAG_DATA_LSB_TO_MSB));
|
||||
WARN_ON(desc->bus_format != MEDIA_BUS_FMT_RGB666_1X7X3_SPWG &&
|
||||
desc->bus_format != MEDIA_BUS_FMT_RGB888_1X7X4_SPWG &&
|
||||
desc->bus_format != MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA);
|
||||
WARN_ON(desc->bus_format == MEDIA_BUS_FMT_RGB666_1X7X3_SPWG &&
|
||||
desc->bpc != 6);
|
||||
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:
|
||||
dev_warn(dev, "eDP panels moved to panel-edp\n");
|
||||
err = -EINVAL;
|
||||
goto free_ddc;
|
||||
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);
|
||||
connector_type = DRM_MODE_CONNECTOR_DPI;
|
||||
break;
|
||||
}
|
||||
|
||||
dev_set_drvdata(dev, panel);
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user