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;
 
        /* 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)
 
        /* 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;
        zynqmp_dp_phy_exit(dp);
 err_reset:
        zynqmp_dp_reset(dp, true);
-err_free:
-       kfree(dp);
        return ret;
 }