mirror of https://gitee.com/openkylin/linux.git
drm/rockchip: add function to check if endpoint is a subdriver
To be able to have both internal subdrivers and external bridge drivers as output endpoints of vops, add a function to be able to distinguish these. changes in v8: - improved function documentation - better error handling - put calls for node and pdev references changes in v6: - added function to check subdriver vs. bridge Signed-off-by: Heiko Stuebner <heiko@sntech.de> Reviewed-by: Sandy Huang <hjc@rock-chips.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180830211207.10480-2-heiko@sntech.de
This commit is contained in:
parent
633ba1e086
commit
3880f62e47
|
@ -24,6 +24,7 @@
|
|||
#include <linux/pm_runtime.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_graph.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/component.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/iommu.h>
|
||||
|
@ -267,6 +268,53 @@ static const struct dev_pm_ops rockchip_drm_pm_ops = {
|
|||
static struct platform_driver *rockchip_sub_drivers[MAX_ROCKCHIP_SUB_DRIVERS];
|
||||
static int num_rockchip_sub_drivers;
|
||||
|
||||
/*
|
||||
* Check if a vop endpoint is leading to a rockchip subdriver or bridge.
|
||||
* Should be called from the component bind stage of the drivers
|
||||
* to ensure that all subdrivers are probed.
|
||||
*
|
||||
* @ep: endpoint of a rockchip vop
|
||||
*
|
||||
* returns true if subdriver, false if external bridge and -ENODEV
|
||||
* if remote port does not contain a device.
|
||||
*/
|
||||
int rockchip_drm_endpoint_is_subdriver(struct device_node *ep)
|
||||
{
|
||||
struct device_node *node = of_graph_get_remote_port_parent(ep);
|
||||
struct platform_device *pdev;
|
||||
struct device_driver *drv;
|
||||
int i;
|
||||
|
||||
if (!node)
|
||||
return -ENODEV;
|
||||
|
||||
/* status disabled will prevent creation of platform-devices */
|
||||
pdev = of_find_device_by_node(node);
|
||||
of_node_put(node);
|
||||
if (!pdev)
|
||||
return -ENODEV;
|
||||
|
||||
/*
|
||||
* All rockchip subdrivers have probed at this point, so
|
||||
* any device not having a driver now is an external bridge.
|
||||
*/
|
||||
drv = pdev->dev.driver;
|
||||
if (!drv) {
|
||||
platform_device_put(pdev);
|
||||
return false;
|
||||
}
|
||||
|
||||
for (i = 0; i < num_rockchip_sub_drivers; i++) {
|
||||
if (rockchip_sub_drivers[i] == to_platform_driver(drv)) {
|
||||
platform_device_put(pdev);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
platform_device_put(pdev);
|
||||
return false;
|
||||
}
|
||||
|
||||
static int compare_dev(struct device *dev, void *data)
|
||||
{
|
||||
return dev == (struct device *)data;
|
||||
|
|
|
@ -64,6 +64,7 @@ void rockchip_drm_dma_detach_device(struct drm_device *drm_dev,
|
|||
struct device *dev);
|
||||
int rockchip_drm_wait_vact_end(struct drm_crtc *crtc, unsigned int mstimeout);
|
||||
|
||||
int rockchip_drm_endpoint_is_subdriver(struct device_node *ep);
|
||||
extern struct platform_driver cdn_dp_driver;
|
||||
extern struct platform_driver dw_hdmi_rockchip_pltfm_driver;
|
||||
extern struct platform_driver dw_mipi_dsi_driver;
|
||||
|
|
Loading…
Reference in New Issue