[PATCH 02/16] drm/exynos: extract helper functions for probe
Michael Tretter
m.tretter at pengutronix.de
Thu Sep 3 16:57:03 UTC 2020
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.tretter at 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
More information about the dri-devel
mailing list