mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-24 19:45:06 +08:00
drm/omap: Simplify OF lookup of DSS devices
Now that the direction of OF graph walk has been reversed, there's no need to lookup devices by port as we have no sink device connected through multiple sink ports. Simplify OF lookup of the DSS devices to look them up by node only. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com> Tested-by: Sebastian Reichel <sebastian.reichel@collabora.com> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
This commit is contained in:
parent
e5906f765c
commit
ce69aac84f
@ -112,13 +112,12 @@ void omapdss_device_put(struct omap_dss_device *dssdev)
|
||||
}
|
||||
EXPORT_SYMBOL(omapdss_device_put);
|
||||
|
||||
struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
|
||||
unsigned int port)
|
||||
struct omap_dss_device *omapdss_find_device_by_node(struct device_node *node)
|
||||
{
|
||||
struct omap_dss_device *dssdev;
|
||||
|
||||
list_for_each_entry(dssdev, &omapdss_devices_list, list) {
|
||||
if (dssdev->dev->of_node == src && dssdev->of_ports & BIT(port))
|
||||
if (dssdev->dev->of_node == node)
|
||||
return omapdss_device_get(dssdev);
|
||||
}
|
||||
|
||||
|
@ -12,71 +12,25 @@
|
||||
* more details.
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_graph.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
#include "omapdss.h"
|
||||
|
||||
static struct device_node *
|
||||
dss_of_port_get_parent_device(struct device_node *port)
|
||||
{
|
||||
struct device_node *np;
|
||||
int i;
|
||||
|
||||
if (!port)
|
||||
return NULL;
|
||||
|
||||
np = of_get_parent(port);
|
||||
|
||||
for (i = 0; i < 2 && np; ++i) {
|
||||
struct property *prop;
|
||||
|
||||
prop = of_find_property(np, "compatible", NULL);
|
||||
|
||||
if (prop)
|
||||
return np;
|
||||
|
||||
np = of_get_next_parent(np);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct omap_dss_device *
|
||||
omapdss_of_find_connected_device(struct device_node *node, unsigned int port)
|
||||
{
|
||||
struct device_node *src_node;
|
||||
struct device_node *src_port;
|
||||
struct device_node *ep;
|
||||
struct omap_dss_device *src;
|
||||
u32 port_number = 0;
|
||||
struct device_node *remote_node;
|
||||
struct omap_dss_device *dssdev;
|
||||
|
||||
/* Get the endpoint... */
|
||||
ep = of_graph_get_endpoint_by_regs(node, port, 0);
|
||||
if (!ep)
|
||||
remote_node = of_graph_get_remote_node(node, port, 0);
|
||||
if (!remote_node)
|
||||
return NULL;
|
||||
|
||||
/* ... and its remote port... */
|
||||
src_port = of_graph_get_remote_port(ep);
|
||||
of_node_put(ep);
|
||||
if (!src_port)
|
||||
return NULL;
|
||||
dssdev = omapdss_find_device_by_node(remote_node);
|
||||
of_node_put(remote_node);
|
||||
|
||||
/* ... and the remote port's number and parent... */
|
||||
of_property_read_u32(src_port, "reg", &port_number);
|
||||
src_node = dss_of_port_get_parent_device(src_port);
|
||||
of_node_put(src_port);
|
||||
if (!src_node)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
/* ... and finally the connected device. */
|
||||
src = omapdss_find_device_by_port(src_node, port_number);
|
||||
of_node_put(src_node);
|
||||
|
||||
return src ? src : ERR_PTR(-EPROBE_DEFER);
|
||||
return dssdev ? dssdev : ERR_PTR(-EPROBE_DEFER);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(omapdss_of_find_connected_device);
|
||||
|
@ -474,8 +474,7 @@ void omapdss_device_register(struct omap_dss_device *dssdev);
|
||||
void omapdss_device_unregister(struct omap_dss_device *dssdev);
|
||||
struct omap_dss_device *omapdss_device_get(struct omap_dss_device *dssdev);
|
||||
void omapdss_device_put(struct omap_dss_device *dssdev);
|
||||
struct omap_dss_device *omapdss_find_device_by_port(struct device_node *src,
|
||||
unsigned int port);
|
||||
struct omap_dss_device *omapdss_find_device_by_node(struct device_node *node);
|
||||
int omapdss_device_connect(struct dss_device *dss,
|
||||
struct omap_dss_device *src,
|
||||
struct omap_dss_device *dst);
|
||||
|
Loading…
Reference in New Issue
Block a user