drm/exynos: fix broken component binding in case of multiple pipelines
authorAndrzej Hajda <a.hajda@samsung.com>
Thu, 11 Jun 2015 14:23:37 +0000 (23:23 +0900)
committerInki Dae <daeinki@gmail.com>
Fri, 19 Jun 2015 15:32:55 +0000 (00:32 +0900)
In case there are multiple pipelines and deferred probe occurs, only components
of the first pipeline were bound. As a result only one pipeline was available.
The main cause of this issue was dynamic generation of component match table -
every component driver during probe registered itself on helper list, if there
was at least one pipeline present on this list component match table were
created without deferred components.
This patch removes this helper list, instead it creates match table from
existing devices requiring exynos_drm KMS drivers. This way match table do not
depend on probe/deferral order and contains all KMS components.
As a side effect patch makes the code cleaner and significantly smaller.

Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
drivers/gpu/drm/exynos/exynos7_drm_decon.c
drivers/gpu/drm/exynos/exynos_dp_core.c
drivers/gpu/drm/exynos/exynos_drm_dpi.c
drivers/gpu/drm/exynos/exynos_drm_drv.c
drivers/gpu/drm/exynos/exynos_drm_drv.h
drivers/gpu/drm/exynos/exynos_drm_dsi.c
drivers/gpu/drm/exynos/exynos_drm_fimd.c
drivers/gpu/drm/exynos/exynos_drm_vidi.c
drivers/gpu/drm/exynos/exynos_hdmi.c
drivers/gpu/drm/exynos/exynos_mixer.c

index d9798e2..7d0955d 100644 (file)
@@ -789,11 +789,6 @@ static int decon_probe(struct platform_device *pdev)
        if (!ctx)
                return -ENOMEM;
 
-       ret = exynos_drm_component_add(dev, EXYNOS_DEVICE_TYPE_CRTC,
-                                       EXYNOS_DISPLAY_TYPE_LCD);
-       if (ret)
-               return ret;
-
        ctx->dev = dev;
        ctx->suspended = true;
 
@@ -803,10 +798,8 @@ static int decon_probe(struct platform_device *pdev)
        of_node_put(i80_if_timings);
 
        ctx->regs = of_iomap(dev->of_node, 0);
-       if (!ctx->regs) {
-               ret = -ENOMEM;
-               goto err_del_component;
-       }
+       if (!ctx->regs)
+               return -ENOMEM;
 
        ctx->pclk = devm_clk_get(dev, "pclk_decon0");
        if (IS_ERR(ctx->pclk)) {
@@ -876,8 +869,6 @@ err_disable_pm_runtime:
 err_iounmap:
        iounmap(ctx->regs);
 
-err_del_component:
-       exynos_drm_component_del(dev, EXYNOS_DEVICE_TYPE_CRTC);
        return ret;
 }
 
@@ -890,7 +881,6 @@ static int decon_remove(struct platform_device *pdev)
        iounmap(ctx->regs);
 
        component_del(&pdev->dev, &decon_component_ops);
-       exynos_drm_component_del(&pdev->dev, EXYNOS_DEVICE_TYPE_CRTC);
 
        return 0;
 }
index 27768d8..172b800 100644 (file)
@@ -1332,7 +1332,6 @@ static int exynos_dp_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct device_node *panel_node, *bridge_node, *endpoint;
        struct exynos_dp_device *dp;
-       int ret;
 
        dp = devm_kzalloc(&pdev->dev, sizeof(struct exynos_dp_device),
                                GFP_KERNEL);
@@ -1343,11 +1342,6 @@ static int exynos_dp_probe(struct platform_device *pdev)
        dp->display.ops = &exynos_dp_display_ops;
        platform_set_drvdata(pdev, dp);
 
-       ret = exynos_drm_component_add(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR,
-                                       dp->display.type);
-       if (ret)
-               return ret;
-
        panel_node = of_parse_phandle(dev->of_node, "panel", 0);
        if (panel_node) {
                dp->panel = of_drm_find_panel(panel_node);
@@ -1368,18 +1362,12 @@ static int exynos_dp_probe(struct platform_device *pdev)
                        return -EPROBE_DEFER;
        }
 
-       ret = component_add(&pdev->dev, &exynos_dp_ops);
-       if (ret)
-               exynos_drm_component_del(&pdev->dev,
-                                               EXYNOS_DEVICE_TYPE_CONNECTOR);
-
-       return ret;
+       return component_add(&pdev->dev, &exynos_dp_ops);
 }
 
 static int exynos_dp_remove(struct platform_device *pdev)
 {
        component_del(&pdev->dev, &exynos_dp_ops);
-       exynos_drm_component_del(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR);
 
        return 0;
 }
index 6dc328e..7cb6595 100644 (file)
@@ -313,33 +313,19 @@ struct exynos_drm_display *exynos_dpi_probe(struct device *dev)
        ctx->dev = dev;
        ctx->dpms_mode = DRM_MODE_DPMS_OFF;
 
-       ret = exynos_drm_component_add(dev,
-                                       EXYNOS_DEVICE_TYPE_CONNECTOR,
-                                       ctx->display.type);
-       if (ret)
-               return ERR_PTR(ret);
-
        ret = exynos_dpi_parse_dt(ctx);
        if (ret < 0) {
                devm_kfree(dev, ctx);
-               goto err_del_component;
+               return NULL;
        }
 
        if (ctx->panel_node) {
                ctx->panel = of_drm_find_panel(ctx->panel_node);
-               if (!ctx->panel) {
-                       exynos_drm_component_del(dev,
-                                               EXYNOS_DEVICE_TYPE_CONNECTOR);
+               if (!ctx->panel)
                        return ERR_PTR(-EPROBE_DEFER);
-               }
        }
 
        return &ctx->display;
-
-err_del_component:
-       exynos_drm_component_del(dev, EXYNOS_DEVICE_TYPE_CONNECTOR);
-
-       return NULL;
 }
 
 int exynos_dpi_remove(struct exynos_drm_display *display)
@@ -351,7 +337,5 @@ int exynos_dpi_remove(struct exynos_drm_display *display)
        if (ctx->panel)
                drm_panel_detach(ctx->panel);
 
-       exynos_drm_component_del(ctx->dev, EXYNOS_DEVICE_TYPE_CONNECTOR);
-
        return 0;
 }
Simple merge
Simple merge