|
@@ -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);
|