OSDN Git Service

Merge tag 'drm-misc-next-2020-04-14' of git://anongit.freedesktop.org/drm/drm-misc...
[tomoyo/tomoyo-test1.git] / drivers / gpu / drm / exynos / exynos_dp.c
index a61482a..9ac51b6 100644 (file)
@@ -156,15 +156,8 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
        struct drm_device *drm_dev = data;
        int ret;
 
-       dp->dev = dev;
        dp->drm_dev = drm_dev;
 
-       dp->plat_data.dev_type = EXYNOS_DP;
-       dp->plat_data.power_on_start = exynos_dp_poweron;
-       dp->plat_data.power_off = exynos_dp_poweroff;
-       dp->plat_data.attach = exynos_dp_bridge_attach;
-       dp->plat_data.get_modes = exynos_dp_get_modes;
-
        if (!dp->plat_data.panel && !dp->ptn_bridge) {
                ret = exynos_dp_dt_parse_panel(dp);
                if (ret)
@@ -181,13 +174,11 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
 
        dp->plat_data.encoder = encoder;
 
-       dp->adp = analogix_dp_bind(dev, dp->drm_dev, &dp->plat_data);
-       if (IS_ERR(dp->adp)) {
+       ret = analogix_dp_bind(dp->adp, dp->drm_dev);
+       if (ret)
                dp->encoder.funcs->destroy(&dp->encoder);
-               return PTR_ERR(dp->adp);
-       }
 
-       return 0;
+       return ret;
 }
 
 static void exynos_dp_unbind(struct device *dev, struct device *master,
@@ -218,6 +209,7 @@ static int exynos_dp_probe(struct platform_device *pdev)
        if (!dp)
                return -ENOMEM;
 
+       dp->dev = dev;
        /*
         * We just use the drvdata until driver run into component
         * add function, and then we would set drvdata to null, so
@@ -243,16 +235,29 @@ static int exynos_dp_probe(struct platform_device *pdev)
 
        /* The remote port can be either a panel or a bridge */
        dp->plat_data.panel = panel;
+       dp->plat_data.dev_type = EXYNOS_DP;
+       dp->plat_data.power_on_start = exynos_dp_poweron;
+       dp->plat_data.power_off = exynos_dp_poweroff;
+       dp->plat_data.attach = exynos_dp_bridge_attach;
+       dp->plat_data.get_modes = exynos_dp_get_modes;
        dp->plat_data.skip_connector = !!bridge;
+
        dp->ptn_bridge = bridge;
 
 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);
 }
 
 static int exynos_dp_remove(struct platform_device *pdev)
 {
+       struct exynos_dp_device *dp = platform_get_drvdata(pdev);
+
        component_del(&pdev->dev, &exynos_dp_ops);
+       analogix_dp_remove(dp->adp);
 
        return 0;
 }