diff options
Diffstat (limited to 'drivers/gpu/drm/tilcdc/tilcdc_external.c')
| -rw-r--r-- | drivers/gpu/drm/tilcdc/tilcdc_external.c | 29 | 
1 files changed, 20 insertions, 9 deletions
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_external.c b/drivers/gpu/drm/tilcdc/tilcdc_external.c index 711c7b3289d3..d651bdd6597e 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_external.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_external.c @@ -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;  }  |