drm: of: Add drm_of_get_dsi_bus helper function
Add helper function to find DSI host for devices where DSI panel is not a minor of a DSI bus (such as the Samsung AMS495QA01 panel or the official Raspberry Pi touchscreen display). Co-developed-by: Maya Matuszczyk <maccraft123mc@gmail.com> Signed-off-by: Maya Matuszczyk <maccraft123mc@gmail.com> Signed-off-by: Chris Morgan <macromorgan@hotmail.com> Reviewed-by: Maxime Ripard <maxime@cerno.tech> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Link: https://patchwork.freedesktop.org/patch/msgid/20230123154603.1315112-2-macroalpha82@gmail.com
This commit is contained in:
parent
413ebc4803
commit
19ff997ffc
|
@ -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 */
|
||||
|
|
|
@ -15,6 +15,8 @@ struct drm_encoder;
|
|||
struct drm_panel;
|
||||
struct drm_bridge;
|
||||
struct device_node;
|
||||
struct mipi_dsi_device_info;
|
||||
struct mipi_dsi_host;
|
||||
|
||||
/**
|
||||
* enum drm_lvds_dual_link_pixels - Pixel order of an LVDS dual-link connection
|
||||
|
@ -129,6 +131,16 @@ drm_of_get_data_lanes_count_ep(const struct device_node *port,
|
|||
}
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_OF) && IS_ENABLED(CONFIG_DRM_MIPI_DSI)
|
||||
struct mipi_dsi_host *drm_of_get_dsi_bus(struct device *dev);
|
||||
#else
|
||||
static inline struct
|
||||
mipi_dsi_host *drm_of_get_dsi_bus(struct device *dev)
|
||||
{
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
#endif /* CONFIG_OF && CONFIG_DRM_MIPI_DSI */
|
||||
|
||||
/*
|
||||
* drm_of_panel_bridge_remove - remove panel bridge
|
||||
* @np: device tree node containing panel bridge output ports
|
||||
|
|
Loading…
Reference in New Issue