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 <[email protected]>
Fixes: de04bb0089a9 ("drm/panel/panel-simple: Use the new allocation in place 
of devm_kzalloc()")
---
Hi,

I am not sure whether this regression has already been reported or
addressed. If it has, please feel free to drop this patch.
---
 drivers/gpu/drm/panel/panel-simple.c | 86 ++++++++++++++++++------------------
 1 file changed, 43 insertions(+), 43 deletions(-)

diff --git a/drivers/gpu/drm/panel/panel-simple.c 
b/drivers/gpu/drm/panel/panel-simple.c
index 
da6b71b70a463400fcc45006788f87e97b0c148c..dc41789f6a53c78b928ff39291ab7219a2d835dd
 100644
--- a/drivers/gpu/drm/panel/panel-simple.c
+++ b/drivers/gpu/drm/panel/panel-simple.c
@@ -623,49 +623,6 @@ static struct panel_simple *panel_simple_probe(struct 
device *dev)
        if (IS_ERR(desc))
                return ERR_CAST(desc);
 
-       panel = devm_drm_panel_alloc(dev, struct panel_simple, base,
-                                    &panel_simple_funcs, desc->connector_type);
-       if (IS_ERR(panel))
-               return ERR_CAST(panel);
-
-       panel->desc = desc;
-
-       panel->supply = devm_regulator_get(dev, "power");
-       if (IS_ERR(panel->supply))
-               return ERR_CAST(panel->supply);
-
-       panel->enable_gpio = devm_gpiod_get_optional(dev, "enable",
-                                                    GPIOD_OUT_LOW);
-       if (IS_ERR(panel->enable_gpio))
-               return dev_err_cast_probe(dev, panel->enable_gpio,
-                                         "failed to request GPIO\n");
-
-       err = of_drm_get_panel_orientation(dev->of_node, &panel->orientation);
-       if (err) {
-               dev_err(dev, "%pOF: failed to get orientation %d\n", 
dev->of_node, err);
-               return ERR_PTR(err);
-       }
-
-       ddc = of_parse_phandle(dev->of_node, "ddc-i2c-bus", 0);
-       if (ddc) {
-               panel->ddc = of_find_i2c_adapter_by_node(ddc);
-               of_node_put(ddc);
-
-               if (!panel->ddc)
-                       return ERR_PTR(-EPROBE_DEFER);
-       }
-
-       if (!of_device_is_compatible(dev->of_node, "panel-dpi") &&
-           !of_get_display_timing(dev->of_node, "panel-timing", &dt))
-               panel_simple_parse_panel_timing_node(dev, panel, &dt);
-
-       if (desc->connector_type == DRM_MODE_CONNECTOR_LVDS) {
-               /* Optional data-mapping property for overriding bus format */
-               err = panel_simple_override_nondefault_lvds_datamapping(dev, 
panel);
-               if (err)
-                       goto free_ddc;
-       }
-
        connector_type = desc->connector_type;
        /* Catch common mistakes for panels. */
        switch (connector_type) {
@@ -720,6 +677,49 @@ static struct panel_simple *panel_simple_probe(struct 
device *dev)
                break;
        }
 
+       panel = devm_drm_panel_alloc(dev, struct panel_simple, base,
+                                    &panel_simple_funcs, connector_type);
+       if (IS_ERR(panel))
+               return ERR_CAST(panel);
+
+       panel->desc = desc;
+
+       panel->supply = devm_regulator_get(dev, "power");
+       if (IS_ERR(panel->supply))
+               return ERR_CAST(panel->supply);
+
+       panel->enable_gpio = devm_gpiod_get_optional(dev, "enable",
+                                                    GPIOD_OUT_LOW);
+       if (IS_ERR(panel->enable_gpio))
+               return dev_err_cast_probe(dev, panel->enable_gpio,
+                                         "failed to request GPIO\n");
+
+       err = of_drm_get_panel_orientation(dev->of_node, &panel->orientation);
+       if (err) {
+               dev_err(dev, "%pOF: failed to get orientation %d\n", 
dev->of_node, err);
+               return ERR_PTR(err);
+       }
+
+       ddc = of_parse_phandle(dev->of_node, "ddc-i2c-bus", 0);
+       if (ddc) {
+               panel->ddc = of_find_i2c_adapter_by_node(ddc);
+               of_node_put(ddc);
+
+               if (!panel->ddc)
+                       return ERR_PTR(-EPROBE_DEFER);
+       }
+
+       if (!of_device_is_compatible(dev->of_node, "panel-dpi") &&
+           !of_get_display_timing(dev->of_node, "panel-timing", &dt))
+               panel_simple_parse_panel_timing_node(dev, panel, &dt);
+
+       if (desc->connector_type == DRM_MODE_CONNECTOR_LVDS) {
+               /* Optional data-mapping property for overriding bus format */
+               err = panel_simple_override_nondefault_lvds_datamapping(dev, 
panel);
+               if (err)
+                       goto free_ddc;
+       }
+
        dev_set_drvdata(dev, panel);
 
        /*

---
base-commit: 88cbd8ac379cf5ce68b7efcfd4d1484a6871ee0b
change-id: 20251121-lcd_panel_connector_type_fix-f00fe3766a42

Best regards,
-- 
Ludovic Desroches <[email protected]>

Reply via email to