diff options
Diffstat (limited to 'drivers/video/fbdev/omap2/dss/dss-of.c')
-rw-r--r-- | drivers/video/fbdev/omap2/dss/dss-of.c | 58 |
1 files changed, 40 insertions, 18 deletions
diff --git a/drivers/video/fbdev/omap2/dss/dss-of.c b/drivers/video/fbdev/omap2/dss/dss-of.c index a4b20aaf6142..928ee639c0c1 100644 --- a/drivers/video/fbdev/omap2/dss/dss-of.c +++ b/drivers/video/fbdev/omap2/dss/dss-of.c @@ -20,6 +20,8 @@ #include <video/omapdss.h> +#include "dss.h" + struct device_node * omapdss_of_get_next_port(const struct device_node *parent, struct device_node *prev) @@ -84,20 +86,17 @@ omapdss_of_get_next_endpoint(const struct device_node *parent, } EXPORT_SYMBOL_GPL(omapdss_of_get_next_endpoint); -static struct device_node * -omapdss_of_get_remote_device_node(const struct device_node *node) +struct device_node *dss_of_port_get_parent_device(struct device_node *port) { struct device_node *np; int i; - np = of_parse_phandle(node, "remote-endpoint", 0); - - if (!np) + if (!port) return NULL; - np = of_get_next_parent(np); + np = of_get_next_parent(port); - for (i = 0; i < 3 && np; ++i) { + for (i = 0; i < 2 && np; ++i) { struct property *prop; prop = of_find_property(np, "compatible", NULL); @@ -111,6 +110,31 @@ omapdss_of_get_remote_device_node(const struct device_node *node) return NULL; } +u32 dss_of_port_get_port_number(struct device_node *port) +{ + int r; + u32 reg; + + r = of_property_read_u32(port, "reg", ®); + if (r) + reg = 0; + + return reg; +} + +static struct device_node *omapdss_of_get_remote_port(const struct device_node *node) +{ + struct device_node *np; + + np = of_parse_phandle(node, "remote-endpoint", 0); + if (!np) + return NULL; + + np = of_get_next_parent(np); + + return np; +} + struct device_node * omapdss_of_get_first_endpoint(const struct device_node *parent) { @@ -133,27 +157,25 @@ struct omap_dss_device * omapdss_of_find_source_for_first_ep(struct device_node *node) { struct device_node *ep; - struct device_node *src_node; + struct device_node *src_port; struct omap_dss_device *src; ep = omapdss_of_get_first_endpoint(node); if (!ep) return ERR_PTR(-EINVAL); - src_node = omapdss_of_get_remote_device_node(ep); - - of_node_put(ep); - - if (!src_node) + src_port = omapdss_of_get_remote_port(ep); + if (!src_port) { + of_node_put(ep); return ERR_PTR(-EINVAL); + } - src = omap_dss_find_output_by_node(src_node); + of_node_put(ep); - of_node_put(src_node); + src = omap_dss_find_output_by_port_node(src_port); - if (!src) - return ERR_PTR(-EPROBE_DEFER); + of_node_put(src_port); - return src; + return src ? src : ERR_PTR(-EPROBE_DEFER); } EXPORT_SYMBOL_GPL(omapdss_of_find_source_for_first_ep); |