struct dvo_config *config;
        bool enabled;
        struct drm_encoder *encoder;
-       struct drm_bridge *bridge;
+       struct drm_bridge bridge;
 };
 
 struct sti_dvo_connector {
        struct drm_encoder *encoder;
        struct sti_dvo_connector *connector;
        struct drm_connector *drm_connector;
-       struct drm_bridge *bridge;
        int err;
 
        /* Set the drm device handle */
 
        connector->dvo = dvo;
 
-       bridge = devm_kzalloc(dev, sizeof(*bridge), GFP_KERNEL);
-       if (!bridge)
-               return -ENOMEM;
-
-       bridge->driver_private = dvo;
-       bridge->funcs = &sti_dvo_bridge_funcs;
-       bridge->of_node = dvo->dev.of_node;
-       drm_bridge_add(bridge);
+       dvo->bridge.driver_private = dvo;
+       dvo->bridge.of_node = dvo->dev.of_node;
+       drm_bridge_add(&dvo->bridge);
 
-       err = drm_bridge_attach(encoder, bridge, NULL, 0);
+       err = drm_bridge_attach(encoder, &dvo->bridge, NULL, 0);
        if (err)
                return err;
 
-       dvo->bridge = bridge;
        connector->encoder = encoder;
        dvo->encoder = encoder;
 
        return 0;
 
 err_sysfs:
-       drm_bridge_remove(bridge);
+       drm_bridge_remove(&dvo->bridge);
        return -EINVAL;
 }
 
 {
        struct sti_dvo *dvo = dev_get_drvdata(dev);
 
-       drm_bridge_remove(dvo->bridge);
+       drm_bridge_remove(&dvo->bridge);
 }
 
 static const struct component_ops sti_dvo_ops = {
 
        DRM_INFO("%s\n", __func__);
 
-       dvo = devm_kzalloc(dev, sizeof(*dvo), GFP_KERNEL);
-       if (!dvo) {
-               DRM_ERROR("Failed to allocate memory for DVO\n");
-               return -ENOMEM;
+       dvo = devm_drm_bridge_alloc(dev, struct sti_dvo, bridge, &sti_dvo_bridge_funcs);
+       if (IS_ERR(dvo)) {
+               DRM_ERROR("Failed to allocate DVO\n");
+               return PTR_ERR(dvo);
        }
 
        dvo->dev = pdev->dev;