]> git.openpandora.org Git - pandora-kernel.git/commitdiff
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 d9798e2aedda5b16941b31ca73106e4bb0d8f852..7d0955d9bf9402c6c8db5855fae66ad6a0f1b17c 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 27768d874a5ef6304b39775b06a17e189592f6f6..172b8002a2c824e3a373079cdf86a3098fecb206 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 6dc328e22ec904e6fda396b2cd7afeb3b1e7aa26..7cb6595c1894146fb802f0b89d25001f5a3d393b 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