|
@@ -188,18 +188,16 @@ int tilcdc_attach_bridge(struct drm_device *ddev, struct drm_bridge *bridge)
|
|
|
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),
|
|
@@ -215,10 +213,23 @@ int tilcdc_attach_external_device(struct drm_device *ddev)
|
|
|
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;
|
|
|
}
|
|
|
|