select DRM_KMS_HELPER
        select DRM_KMS_CMA_HELPER
        select DRM_GEM_CMA_HELPER
+       select DRM_BRIDGE
+       select DRM_PANEL_BRIDGE
        select VIDEOMODE_HELPERS
        select BACKLIGHT_CLASS_DEVICE
        select BACKLIGHT_LCD_SUPPORT
 
 int tilcdc_attach_external_device(struct drm_device *ddev)
 {
        struct tilcdc_drm_private *priv = ddev->dev_private;
-       struct device_node *remote_node;
        struct drm_bridge *bridge;
+       struct drm_panel *panel;
        int ret;
 
-       remote_node = of_graph_get_remote_node(ddev->dev->of_node, 0, 0);
-       if (!remote_node)
+       ret = drm_of_find_panel_or_bridge(ddev->dev->of_node, 0, 0,
+                                         &panel, &bridge);
+       if (ret == -ENODEV)
                return 0;
-
-       bridge = of_drm_find_bridge(remote_node);
-       of_node_put(remote_node);
-       if (!bridge)
-               return -EPROBE_DEFER;
+       else if (ret)
+               return ret;
 
        priv->external_encoder = devm_kzalloc(ddev->dev,
                                              sizeof(*priv->external_encoder),
                return ret;
        }
 
+       if (panel) {
+               bridge = devm_drm_panel_bridge_add(ddev->dev, panel,
+                                                  DRM_MODE_CONNECTOR_DPI);
+               if (IS_ERR(bridge)) {
+                       ret = PTR_ERR(bridge);
+                       goto err_encoder_cleanup;
+               }
+       }
+
        ret = tilcdc_attach_bridge(ddev, bridge);
        if (ret)
-               drm_encoder_cleanup(priv->external_encoder);
+               goto err_encoder_cleanup;
+
+       return 0;
 
+err_encoder_cleanup:
+       drm_encoder_cleanup(priv->external_encoder);
        return ret;
 }