This is the new API for allocating DRM bridges.

This driver has a peculiar structure. zynqmp_dpsub.c is the actual driver,
which delegates to a submodule (zynqmp_dp.c) the allocation of a
sub-structure embedding the drm_bridge and its initialization, however it
does not delegate the drm_bridge_add(). Hence, following carefully the code
flow, it is correct to change the allocation function and .funcs assignment
in the submodule, while the drm_bridge_add() is not in that submodule.

Signed-off-by: Luca Ceresoli <luca.ceres...@bootlin.com>

---

Cc: Laurent Pinchart <laurent.pinch...@ideasonboard.com>
Cc: Michal Simek <michal.si...@amd.com>
Cc: Tomi Valkeinen <tomi.valkei...@ideasonboard.com>

Changes in v2:
- rebased on current drm-misc-next
- remove the kfree() calls too, as we are converting from kzalloc+kfree,
  not from devm_kzalloc
---
 drivers/gpu/drm/xlnx/zynqmp_dp.c    | 31 +++++++++++--------------------
 drivers/gpu/drm/xlnx/zynqmp_dpsub.c |  1 -
 2 files changed, 11 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/xlnx/zynqmp_dp.c b/drivers/gpu/drm/xlnx/zynqmp_dp.c
index 
238cbb49963efa6e8cc737d8a6e76250f6531276..02e1feaa611596a24217136ee8ce7f5d2f1900a2
 100644
--- a/drivers/gpu/drm/xlnx/zynqmp_dp.c
+++ b/drivers/gpu/drm/xlnx/zynqmp_dp.c
@@ -2439,9 +2439,9 @@ int zynqmp_dp_probe(struct zynqmp_dpsub *dpsub)
        struct zynqmp_dp *dp;
        int ret;
 
-       dp = kzalloc(sizeof(*dp), GFP_KERNEL);
-       if (!dp)
-               return -ENOMEM;
+       dp = devm_drm_bridge_alloc(&pdev->dev, struct zynqmp_dp, bridge, 
&zynqmp_dp_bridge_funcs);
+       if (IS_ERR(dp))
+               return PTR_ERR(dp);
 
        dp->dev = &pdev->dev;
        dp->dpsub = dpsub;
@@ -2454,31 +2454,25 @@ int zynqmp_dp_probe(struct zynqmp_dpsub *dpsub)
 
        /* Acquire all resources (IOMEM, IRQ and PHYs). */
        dp->iomem = devm_platform_ioremap_resource_byname(pdev, "dp");
-       if (IS_ERR(dp->iomem)) {
-               ret = PTR_ERR(dp->iomem);
-               goto err_free;
-       }
+       if (IS_ERR(dp->iomem))
+               return PTR_ERR(dp->iomem);
 
        dp->irq = platform_get_irq(pdev, 0);
-       if (dp->irq < 0) {
-               ret = dp->irq;
-               goto err_free;
-       }
+       if (dp->irq < 0)
+               return dp->irq;
 
        dp->reset = devm_reset_control_get(dp->dev, NULL);
-       if (IS_ERR(dp->reset)) {
-               ret = dev_err_probe(dp->dev, PTR_ERR(dp->reset),
+       if (IS_ERR(dp->reset))
+               return dev_err_probe(dp->dev, PTR_ERR(dp->reset),
                                    "failed to get reset\n");
-               goto err_free;
-       }
 
        ret = zynqmp_dp_reset(dp, true);
        if (ret < 0)
-               goto err_free;
+               return ret;
 
        ret = zynqmp_dp_reset(dp, false);
        if (ret < 0)
-               goto err_free;
+               return ret;
 
        ret = zynqmp_dp_phy_probe(dp);
        if (ret)
@@ -2486,7 +2480,6 @@ int zynqmp_dp_probe(struct zynqmp_dpsub *dpsub)
 
        /* Initialize the bridge. */
        bridge = &dp->bridge;
-       bridge->funcs = &zynqmp_dp_bridge_funcs;
        bridge->ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID
                    | DRM_BRIDGE_OP_HPD;
        bridge->type = DRM_MODE_CONNECTOR_DisplayPort;
@@ -2539,8 +2532,6 @@ int zynqmp_dp_probe(struct zynqmp_dpsub *dpsub)
        zynqmp_dp_phy_exit(dp);
 err_reset:
        zynqmp_dp_reset(dp, true);
-err_free:
-       kfree(dp);
        return ret;
 }
 
diff --git a/drivers/gpu/drm/xlnx/zynqmp_dpsub.c 
b/drivers/gpu/drm/xlnx/zynqmp_dpsub.c
index 
3a9544b97bc5311f9adeb57c08c837a04b6922fa..2764c4b17c5e49611db8adf41dd09e3134c2d524
 100644
--- a/drivers/gpu/drm/xlnx/zynqmp_dpsub.c
+++ b/drivers/gpu/drm/xlnx/zynqmp_dpsub.c
@@ -180,7 +180,6 @@ static int zynqmp_dpsub_parse_dt(struct zynqmp_dpsub *dpsub)
 void zynqmp_dpsub_release(struct zynqmp_dpsub *dpsub)
 {
        kfree(dpsub->disp);
-       kfree(dpsub->dp);
        kfree(dpsub);
 }
 

-- 
2.49.0

Reply via email to