diff options
Diffstat (limited to 'drivers/gpu/drm/arc/arcpgu_drv.c')
| -rw-r--r-- | drivers/gpu/drm/arc/arcpgu_drv.c | 16 | 
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/gpu/drm/arc/arcpgu_drv.c b/drivers/gpu/drm/arc/arcpgu_drv.c index 6b7f791685ec..d6a6692db0ac 100644 --- a/drivers/gpu/drm/arc/arcpgu_drv.c +++ b/drivers/gpu/drm/arc/arcpgu_drv.c @@ -14,6 +14,7 @@  #include <drm/drm_fb_helper.h>  #include <drm/drm_gem_cma_helper.h>  #include <drm/drm_gem_framebuffer_helper.h> +#include <drm/drm_of.h>  #include <drm/drm_probe_helper.h>  #include <linux/dma-mapping.h>  #include <linux/module.h> @@ -45,7 +46,7 @@ static int arcpgu_load(struct drm_device *drm)  {  	struct platform_device *pdev = to_platform_device(drm->dev);  	struct arcpgu_drm_private *arcpgu; -	struct device_node *encoder_node; +	struct device_node *encoder_node = NULL, *endpoint_node = NULL;  	struct resource *res;  	int ret; @@ -80,14 +81,23 @@ static int arcpgu_load(struct drm_device *drm)  	if (arc_pgu_setup_crtc(drm) < 0)  		return -ENODEV; -	/* find the encoder node and initialize it */ -	encoder_node = of_parse_phandle(drm->dev->of_node, "encoder-slave", 0); +	/* +	 * There is only one output port inside each device. It is linked with +	 * encoder endpoint. +	 */ +	endpoint_node = of_graph_get_next_endpoint(pdev->dev.of_node, NULL); +	if (endpoint_node) { +		encoder_node = of_graph_get_remote_port_parent(endpoint_node); +		of_node_put(endpoint_node); +	} +  	if (encoder_node) {  		ret = arcpgu_drm_hdmi_init(drm, encoder_node);  		of_node_put(encoder_node);  		if (ret < 0)  			return ret;  	} else { +		dev_info(drm->dev, "no encoder found. Assumed virtual LCD on simulation platform\n");  		ret = arcpgu_drm_sim_init(drm, NULL);  		if (ret < 0)  			return ret;  |