Skip to content

Commit 9380dc3

Browse files
ldesrochessuperna9999
authored andcommitted
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: de04bb0 ("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
1 parent 6ab3d43 commit 9380dc3

1 file changed

Lines changed: 44 additions & 45 deletions

File tree

drivers/gpu/drm/panel/panel-simple.c

Lines changed: 44 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -623,49 +623,6 @@ static struct panel_simple *panel_simple_probe(struct device *dev)
623623
if (IS_ERR(desc))
624624
return ERR_CAST(desc);
625625

626-
panel = devm_drm_panel_alloc(dev, struct panel_simple, base,
627-
&panel_simple_funcs, desc->connector_type);
628-
if (IS_ERR(panel))
629-
return ERR_CAST(panel);
630-
631-
panel->desc = desc;
632-
633-
panel->supply = devm_regulator_get(dev, "power");
634-
if (IS_ERR(panel->supply))
635-
return ERR_CAST(panel->supply);
636-
637-
panel->enable_gpio = devm_gpiod_get_optional(dev, "enable",
638-
GPIOD_OUT_LOW);
639-
if (IS_ERR(panel->enable_gpio))
640-
return dev_err_cast_probe(dev, panel->enable_gpio,
641-
"failed to request GPIO\n");
642-
643-
err = of_drm_get_panel_orientation(dev->of_node, &panel->orientation);
644-
if (err) {
645-
dev_err(dev, "%pOF: failed to get orientation %d\n", dev->of_node, err);
646-
return ERR_PTR(err);
647-
}
648-
649-
ddc = of_parse_phandle(dev->of_node, "ddc-i2c-bus", 0);
650-
if (ddc) {
651-
panel->ddc = of_find_i2c_adapter_by_node(ddc);
652-
of_node_put(ddc);
653-
654-
if (!panel->ddc)
655-
return ERR_PTR(-EPROBE_DEFER);
656-
}
657-
658-
if (!of_device_is_compatible(dev->of_node, "panel-dpi") &&
659-
!of_get_display_timing(dev->of_node, "panel-timing", &dt))
660-
panel_simple_parse_panel_timing_node(dev, panel, &dt);
661-
662-
if (desc->connector_type == DRM_MODE_CONNECTOR_LVDS) {
663-
/* Optional data-mapping property for overriding bus format */
664-
err = panel_simple_override_nondefault_lvds_datamapping(dev, panel);
665-
if (err)
666-
goto free_ddc;
667-
}
668-
669626
connector_type = desc->connector_type;
670627
/* Catch common mistakes for panels. */
671628
switch (connector_type) {
@@ -690,8 +647,7 @@ static struct panel_simple *panel_simple_probe(struct device *dev)
690647
break;
691648
case DRM_MODE_CONNECTOR_eDP:
692649
dev_warn(dev, "eDP panels moved to panel-edp\n");
693-
err = -EINVAL;
694-
goto free_ddc;
650+
return ERR_PTR(-EINVAL);
695651
case DRM_MODE_CONNECTOR_DSI:
696652
if (desc->bpc != 6 && desc->bpc != 8)
697653
dev_warn(dev, "Expected bpc in {6,8} but got: %u\n", desc->bpc);
@@ -720,6 +676,49 @@ static struct panel_simple *panel_simple_probe(struct device *dev)
720676
break;
721677
}
722678

679+
panel = devm_drm_panel_alloc(dev, struct panel_simple, base,
680+
&panel_simple_funcs, connector_type);
681+
if (IS_ERR(panel))
682+
return ERR_CAST(panel);
683+
684+
panel->desc = desc;
685+
686+
panel->supply = devm_regulator_get(dev, "power");
687+
if (IS_ERR(panel->supply))
688+
return ERR_CAST(panel->supply);
689+
690+
panel->enable_gpio = devm_gpiod_get_optional(dev, "enable",
691+
GPIOD_OUT_LOW);
692+
if (IS_ERR(panel->enable_gpio))
693+
return dev_err_cast_probe(dev, panel->enable_gpio,
694+
"failed to request GPIO\n");
695+
696+
err = of_drm_get_panel_orientation(dev->of_node, &panel->orientation);
697+
if (err) {
698+
dev_err(dev, "%pOF: failed to get orientation %d\n", dev->of_node, err);
699+
return ERR_PTR(err);
700+
}
701+
702+
ddc = of_parse_phandle(dev->of_node, "ddc-i2c-bus", 0);
703+
if (ddc) {
704+
panel->ddc = of_find_i2c_adapter_by_node(ddc);
705+
of_node_put(ddc);
706+
707+
if (!panel->ddc)
708+
return ERR_PTR(-EPROBE_DEFER);
709+
}
710+
711+
if (!of_device_is_compatible(dev->of_node, "panel-dpi") &&
712+
!of_get_display_timing(dev->of_node, "panel-timing", &dt))
713+
panel_simple_parse_panel_timing_node(dev, panel, &dt);
714+
715+
if (desc->connector_type == DRM_MODE_CONNECTOR_LVDS) {
716+
/* Optional data-mapping property for overriding bus format */
717+
err = panel_simple_override_nondefault_lvds_datamapping(dev, panel);
718+
if (err)
719+
goto free_ddc;
720+
}
721+
723722
dev_set_drvdata(dev, panel);
724723

725724
/*

0 commit comments

Comments
 (0)