diff options
| author | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
| commit | 1ac731c529cd4d6adbce134754b51ff7d822b145 (patch) | |
| tree | 143ab3f35ca5f3b69f583c84e6964b17139c2ec1 /drivers/gpu/drm/drm_of.c | |
| parent | 07b4c950f27bef0362dc6ad7ee713aab61d58149 (diff) | |
| parent | 54116d442e001e1b6bd482122043b1870998a1f3 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.6 merge window.
Diffstat (limited to 'drivers/gpu/drm/drm_of.c')
| -rw-r--r-- | drivers/gpu/drm/drm_of.c | 51 | 
1 files changed, 51 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c index 7bbcb999bb75..177b600895d3 100644 --- a/drivers/gpu/drm/drm_of.c +++ b/drivers/gpu/drm/drm_of.c @@ -10,6 +10,7 @@  #include <drm/drm_crtc.h>  #include <drm/drm_device.h>  #include <drm/drm_encoder.h> +#include <drm/drm_mipi_dsi.h>  #include <drm/drm_of.h>  #include <drm/drm_panel.h> @@ -493,3 +494,53 @@ int drm_of_get_data_lanes_count_ep(const struct device_node *port,  	return ret;  }  EXPORT_SYMBOL_GPL(drm_of_get_data_lanes_count_ep); + +#if IS_ENABLED(CONFIG_DRM_MIPI_DSI) + +/** + * drm_of_get_dsi_bus - find the DSI bus for a given device + * @dev: parent device of display (SPI, I2C) + * + * Gets parent DSI bus for a DSI device controlled through a bus other + * than MIPI-DCS (SPI, I2C, etc.) using the Device Tree. + * + * Returns pointer to mipi_dsi_host if successful, -EINVAL if the + * request is unsupported, -EPROBE_DEFER if the DSI host is found but + * not available, or -ENODEV otherwise. + */ +struct mipi_dsi_host *drm_of_get_dsi_bus(struct device *dev) +{ +	struct mipi_dsi_host *dsi_host; +	struct device_node *endpoint, *dsi_host_node; + +	/* +	 * Get first endpoint child from device. +	 */ +	endpoint = of_graph_get_next_endpoint(dev->of_node, NULL); +	if (!endpoint) +		return ERR_PTR(-ENODEV); + +	/* +	 * Follow the first endpoint to get the DSI host node and then +	 * release the endpoint since we no longer need it. +	 */ +	dsi_host_node = of_graph_get_remote_port_parent(endpoint); +	of_node_put(endpoint); +	if (!dsi_host_node) +		return ERR_PTR(-ENODEV); + +	/* +	 * Get the DSI host from the DSI host node. If we get an error +	 * or the return is null assume we're not ready to probe just +	 * yet. Release the DSI host node since we're done with it. +	 */ +	dsi_host = of_find_mipi_dsi_host_by_node(dsi_host_node); +	of_node_put(dsi_host_node); +	if (IS_ERR_OR_NULL(dsi_host)) +		return ERR_PTR(-EPROBE_DEFER); + +	return dsi_host; +} +EXPORT_SYMBOL_GPL(drm_of_get_dsi_bus); + +#endif /* CONFIG_DRM_MIPI_DSI */  |