As the driver shall be usable with drivers that use the component
framework and drivers that don't, split the common probing code into a
separate function that can be called from different locations.

Signed-off-by: Michael Tretter <m.tret...@pengutronix.de>
---
 drivers/gpu/drm/exynos/exynos_drm_dsi.c | 54 ++++++++++++++-----------
 1 file changed, 30 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c 
b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
index b38e9b592b8a..32f999dfd8c1 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
@@ -1734,7 +1734,7 @@ static const struct component_ops 
exynos_dsi_component_ops = {
        .unbind = exynos_dsi_unbind,
 };
 
-static int exynos_dsi_probe(struct platform_device *pdev)
+static struct exynos_dsi *__exynos_dsi_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct resource *res;
@@ -1743,7 +1743,7 @@ static int exynos_dsi_probe(struct platform_device *pdev)
 
        dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
        if (!dsi)
-               return -ENOMEM;
+               return ERR_PTR(-ENOMEM);
 
        /* To be checked as invalid one */
        dsi->te_gpio = -ENOENT;
@@ -1766,14 +1766,14 @@ static int exynos_dsi_probe(struct platform_device 
*pdev)
        if (ret) {
                if (ret != -EPROBE_DEFER)
                        dev_info(dev, "failed to get regulators: %d\n", ret);
-               return ret;
+               return ERR_PTR(ret);
        }
 
        dsi->clks = devm_kcalloc(dev,
                        dsi->driver_data->num_clks, sizeof(*dsi->clks),
                        GFP_KERNEL);
        if (!dsi->clks)
-               return -ENOMEM;
+               return ERR_PTR(-ENOMEM);
 
        for (i = 0; i < dsi->driver_data->num_clks; i++) {
                dsi->clks[i] = devm_clk_get(dev, clk_names[i]);
@@ -1787,7 +1787,7 @@ static int exynos_dsi_probe(struct platform_device *pdev)
 
                        dev_info(dev, "failed to get the clock: %s\n",
                                        clk_names[i]);
-                       return PTR_ERR(dsi->clks[i]);
+                       return ERR_PTR(PTR_ERR(dsi->clks[i]));
                }
        }
 
@@ -1795,18 +1795,18 @@ static int exynos_dsi_probe(struct platform_device 
*pdev)
        dsi->reg_base = devm_ioremap_resource(dev, res);
        if (IS_ERR(dsi->reg_base)) {
                dev_err(dev, "failed to remap io region\n");
-               return PTR_ERR(dsi->reg_base);
+               return dsi->reg_base;
        }
 
        dsi->phy = devm_phy_get(dev, "dsim");
        if (IS_ERR(dsi->phy)) {
                dev_info(dev, "failed to get dsim phy\n");
-               return PTR_ERR(dsi->phy);
+               return ERR_PTR(PTR_ERR(dsi->phy));
        }
 
        dsi->irq = platform_get_irq(pdev, 0);
        if (dsi->irq < 0)
-               return dsi->irq;
+               return ERR_PTR(dsi->irq);
 
        irq_set_status_flags(dsi->irq, IRQ_NOAUTOEN);
        ret = devm_request_threaded_irq(dev, dsi->irq, NULL,
@@ -1814,37 +1814,43 @@ static int exynos_dsi_probe(struct platform_device 
*pdev)
                                        dev_name(dev), dsi);
        if (ret) {
                dev_err(dev, "failed to request dsi irq\n");
-               return ret;
+               return ERR_PTR(ret);
        }
 
        ret = exynos_dsi_parse_dt(dsi);
        if (ret)
-               return ret;
-
-       platform_set_drvdata(pdev, &dsi->encoder);
+               return ERR_PTR(ret);
 
        pm_runtime_enable(dev);
 
-       ret = component_add(dev, &exynos_dsi_component_ops);
-       if (ret)
-               goto err_disable_runtime;
-
-       return 0;
+       return dsi;
+}
 
-err_disable_runtime:
-       pm_runtime_disable(dev);
+static void __exynos_dsi_remove(struct exynos_dsi *dsi)
+{
        of_node_put(dsi->in_bridge_node);
 
-       return ret;
+       pm_runtime_disable(dsi->dev);
 }
 
-static int exynos_dsi_remove(struct platform_device *pdev)
+static int exynos_dsi_probe(struct platform_device *pdev)
 {
-       struct exynos_dsi *dsi = platform_get_drvdata(pdev);
+       struct exynos_dsi *dsi;
 
-       of_node_put(dsi->in_bridge_node);
+       dsi = __exynos_dsi_probe(pdev);
+       if (IS_ERR(dsi))
+               return PTR_ERR(dsi);
+       platform_set_drvdata(pdev, &dsi->encoder);
+
+       return component_add(&pdev->dev, &exynos_dsi_component_ops);
+}
+
+static int exynos_dsi_remove(struct platform_device *pdev)
+{
+       struct drm_encoder *encoder = platform_get_drvdata(pdev);
+       struct exynos_dsi *dsi = encoder_to_dsi(encoder);
 
-       pm_runtime_disable(&pdev->dev);
+       __exynos_dsi_remove(dsi);
 
        component_del(&pdev->dev, &exynos_dsi_component_ops);
 
-- 
2.20.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to