]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/exynos: exynos_dp: Apply analogix_dp_finish_probe()
authorDamon Ding <damon.ding@rock-chips.com>
Mon, 13 Apr 2026 13:25:48 +0000 (21:25 +0800)
committerLuca Ceresoli <luca.ceresoli@bootlin.com>
Mon, 13 Apr 2026 15:43:45 +0000 (17:43 +0200)
Apply analogix_dp_finish_probe() in order to move the panel/bridge
parsing from Exynos side to the Analogix side.

Signed-off-by: Damon Ding <damon.ding@rock-chips.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Tested-by: Heiko Stuebner <heiko@sntech.de> # rk3588
Link: https://patch.msgid.link/20260413132551.1049307-6-damon.ding@rock-chips.com
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
drivers/gpu/drm/exynos/exynos_dp.c

index b2597fafd73ddbcf72efed4a76ce0cffd51eae0b..9f3d4d4c7352b785079a28e07c079e2080a0e222 100644 (file)
@@ -158,9 +158,6 @@ static int exynos_dp_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct device_node *np;
        struct exynos_dp_device *dp;
-       struct drm_panel *panel;
-       struct drm_bridge *bridge;
-       int ret;
 
        dp = devm_kzalloc(&pdev->dev, sizeof(struct exynos_dp_device),
                          GFP_KERNEL);
@@ -187,30 +184,30 @@ static int exynos_dp_probe(struct platform_device *pdev)
                goto out;
        }
 
-       ret = drm_of_find_panel_or_bridge(dev->of_node, 0, 0, &panel, &bridge);
-       if (ret == -ENODEV) {
+       if (of_get_display_timings(dev->of_node)) {
                dp->plat_data.next_bridge = devm_drm_of_display_mode_bridge(dp->dev,
                                                                        dp->dev->of_node,
                                                                        DRM_MODE_CONNECTOR_eDP);
-               ret = IS_ERR(dp->plat_data.next_bridge) ? PTR_ERR(dp->plat_data.next_bridge) : 0;
+               if (IS_ERR(dp->plat_data.next_bridge))
+                       return PTR_ERR(dp->plat_data.next_bridge);
        }
-       if (ret)
-               return ret;
 
        /* The remote port can be either a panel or a bridge */
-       dp->plat_data.panel = panel;
-       dp->plat_data.next_bridge = bridge;
        dp->plat_data.dev_type = EXYNOS_DP;
        dp->plat_data.power_on = exynos_dp_poweron;
        dp->plat_data.power_off = exynos_dp_poweroff;
        dp->plat_data.attach = exynos_dp_bridge_attach;
+       dp->plat_data.ops = &exynos_dp_ops;
 
 out:
        dp->adp = analogix_dp_probe(dev, &dp->plat_data);
        if (IS_ERR(dp->adp))
                return PTR_ERR(dp->adp);
 
-       return component_add(&pdev->dev, &exynos_dp_ops);
+       if (dp->plat_data.panel || dp->plat_data.next_bridge)
+               return component_add(&pdev->dev, &exynos_dp_ops);
+       else
+               return analogix_dp_finish_probe(dp->adp);
 }
 
 static void exynos_dp_remove(struct platform_device *pdev)