OMAPDSS: DT: Get source endpoint by matching reg-id
[firefly-linux-kernel-4.4.55.git] / drivers / video / fbdev / omap2 / dss / dss-of.c
index a4b20aaf61428c08f8747582ce0d90fa4c6cb377..928ee639c0c19ba3a2346737c41b44f38e82c0b5 100644 (file)
@@ -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", &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);