if (!panel)
                return ERR_PTR(-EINVAL);
 
-       panel_bridge = devm_kzalloc(panel->dev, sizeof(*panel_bridge),
-                                   GFP_KERNEL);
-       if (!panel_bridge)
-               return ERR_PTR(-ENOMEM);
+       panel_bridge = devm_drm_bridge_alloc(panel->dev, struct panel_bridge, bridge,
+                                            &panel_bridge_bridge_funcs);
+       if (IS_ERR(panel_bridge))
+               return (void *)panel_bridge;
 
        panel_bridge->connector_type = connector_type;
        panel_bridge->panel = panel;
 
-       panel_bridge->bridge.funcs = &panel_bridge_bridge_funcs;
        panel_bridge->bridge.of_node = panel->dev->of_node;
        panel_bridge->bridge.ops = DRM_BRIDGE_OP_MODES;
        panel_bridge->bridge.type = connector_type;
        panel_bridge = drm_bridge_to_panel_bridge(bridge);
 
        drm_bridge_remove(bridge);
-       devm_kfree(panel_bridge->panel->dev, bridge);
+       /* TODO remove this after reworking panel_bridge lifetime */
+       devm_drm_put_bridge(panel_bridge->panel->dev, bridge);
 }
 EXPORT_SYMBOL(drm_panel_bridge_remove);