mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
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:
committed by
Linus Walleij
parent
413ebc4803
commit
19ff997ffc
@@ -10,6 +10,7 @@
|
|||||||
#include <drm/drm_crtc.h>
|
#include <drm/drm_crtc.h>
|
||||||
#include <drm/drm_device.h>
|
#include <drm/drm_device.h>
|
||||||
#include <drm/drm_encoder.h>
|
#include <drm/drm_encoder.h>
|
||||||
|
#include <drm/drm_mipi_dsi.h>
|
||||||
#include <drm/drm_of.h>
|
#include <drm/drm_of.h>
|
||||||
#include <drm/drm_panel.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;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(drm_of_get_data_lanes_count_ep);
|
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_panel;
|
||||||
struct drm_bridge;
|
struct drm_bridge;
|
||||||
struct device_node;
|
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
|
* 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
|
#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
|
* drm_of_panel_bridge_remove - remove panel bridge
|
||||||
* @np: device tree node containing panel bridge output ports
|
* @np: device tree node containing panel bridge output ports
|
||||||
|
Reference in New Issue
Block a user