drm: omap: use common OF graph helpers
authorRob Herring <robh@kernel.org>
Wed, 22 Mar 2017 13:26:08 +0000 (08:26 -0500)
committerSean Paul <seanpaul@chromium.org>
Thu, 6 Apr 2017 21:00:27 +0000 (17:00 -0400)
The OMAP driver has its own OF graph helpers that are similar to the
common helpers. This commit replaces most of the calls with the common
helpers. There's still a couple of custom helpers left, but the driver
needs more extensive changes to get rid of them.

In dss_init_ports, we invert the loop, looping through the known ports
and matching them to DT nodes rather than looping thru DT nodes and
matching them to the ports.

Signed-off-by: Rob Herring <robh@kernel.org>
Signed-off-by: Sean Paul <seanpaul@chromium.org>
drivers/gpu/drm/omapdrm/dss/dpi.c
drivers/gpu/drm/omapdrm/dss/dsi.c
drivers/gpu/drm/omapdrm/dss/dss-of.c
drivers/gpu/drm/omapdrm/dss/dss.c
drivers/gpu/drm/omapdrm/dss/hdmi4.c
drivers/gpu/drm/omapdrm/dss/hdmi5.c
drivers/gpu/drm/omapdrm/dss/omapdss.h
drivers/gpu/drm/omapdrm/dss/sdi.c
drivers/gpu/drm/omapdrm/dss/venc.c

index 51d90a8..8a730a7 100644 (file)
@@ -877,7 +877,7 @@ int dpi_init_port(struct platform_device *pdev, struct device_node *port)
        if (!dpi)
                return -ENOMEM;
 
-       ep = omapdss_of_get_next_endpoint(port, NULL);
+       ep = of_get_next_child(port, NULL);
        if (!ep)
                return 0;
 
index f50d6fc..910754b 100644 (file)
@@ -39,6 +39,7 @@
 #include <linux/debugfs.h>
 #include <linux/pm_runtime.h>
 #include <linux/of.h>
+#include <linux/of_graph.h>
 #include <linux/of_platform.h>
 #include <linux/component.h>
 
@@ -5090,7 +5091,7 @@ static int dsi_probe_of(struct platform_device *pdev)
        struct device_node *ep;
        struct omap_dsi_pin_config pin_cfg;
 
-       ep = omapdss_of_get_first_endpoint(node);
+       ep = of_graph_get_endpoint_by_regs(node, 0, 0);
        if (!ep)
                return 0;
 
index b46606b..c6b86f3 100644 (file)
 #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"
 
-struct device_node *
-omapdss_of_get_next_port(const struct device_node *parent,
-                        struct device_node *prev)
-{
-       struct device_node *port = NULL;
-
-       if (!parent)
-               return NULL;
-
-       if (!prev) {
-               struct device_node *ports;
-               /*
-                * It's the first call, we have to find a port subnode
-                * within this node or within an optional 'ports' node.
-                */
-               ports = of_get_child_by_name(parent, "ports");
-               if (ports)
-                       parent = ports;
-
-               port = of_get_child_by_name(parent, "port");
-
-               /* release the 'ports' node */
-               of_node_put(ports);
-       } else {
-               struct device_node *ports;
-
-               ports = of_get_parent(prev);
-               if (!ports)
-                       return NULL;
-
-               do {
-                       port = of_get_next_child(ports, prev);
-                       if (!port) {
-                               of_node_put(ports);
-                               return NULL;
-                       }
-                       prev = port;
-               } while (of_node_cmp(port->name, "port") != 0);
-
-               of_node_put(ports);
-       }
-
-       return port;
-}
-EXPORT_SYMBOL_GPL(omapdss_of_get_next_port);
-
-struct device_node *
-omapdss_of_get_next_endpoint(const struct device_node *parent,
-                            struct device_node *prev)
-{
-       struct device_node *ep = NULL;
-
-       if (!parent)
-               return NULL;
-
-       do {
-               ep = of_get_next_child(parent, prev);
-               if (!ep)
-                       return NULL;
-               prev = ep;
-       } while (of_node_cmp(ep->name, "endpoint") != 0);
-
-       return ep;
-}
-EXPORT_SYMBOL_GPL(omapdss_of_get_next_endpoint);
-
 struct device_node *dss_of_port_get_parent_device(struct device_node *port)
 {
        struct device_node *np;
@@ -124,37 +59,6 @@ u32 dss_of_port_get_port_number(struct device_node *port)
 }
 EXPORT_SYMBOL_GPL(dss_of_port_get_port_number);
 
-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)
-{
-       struct device_node *port, *ep;
-
-       port = omapdss_of_get_next_port(parent, NULL);
-
-       if (!port)
-               return NULL;
-
-       ep = omapdss_of_get_next_endpoint(port, NULL);
-
-       of_node_put(port);
-
-       return ep;
-}
-EXPORT_SYMBOL_GPL(omapdss_of_get_first_endpoint);
-
 struct omap_dss_device *
 omapdss_of_find_source_for_first_ep(struct device_node *node)
 {
@@ -162,11 +66,11 @@ omapdss_of_find_source_for_first_ep(struct device_node *node)
        struct device_node *src_port;
        struct omap_dss_device *src;
 
-       ep = omapdss_of_get_first_endpoint(node);
+       ep = of_graph_get_endpoint_by_regs(node, 0, 0);
        if (!ep)
                return ERR_PTR(-EINVAL);
 
-       src_port = omapdss_of_get_remote_port(ep);
+       src_port = of_graph_get_remote_port(ep);
        if (!src_port) {
                of_node_put(ep);
                return ERR_PTR(-EINVAL);
index ceb4836..fa99ec7 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/mfd/syscon.h>
 #include <linux/regmap.h>
 #include <linux/of.h>
+#include <linux/of_graph.h>
 #include <linux/regulator/consumer.h>
 #include <linux/suspend.h>
 #include <linux/component.h>
@@ -1035,32 +1036,14 @@ static int dss_init_ports(struct platform_device *pdev)
 {
        struct device_node *parent = pdev->dev.of_node;
        struct device_node *port;
-       int r;
-
-       if (parent == NULL)
-               return 0;
+       int i;
 
-       port = omapdss_of_get_next_port(parent, NULL);
-       if (!port)
-               return 0;
-
-       if (dss.feat->num_ports == 0)
-               return 0;
-
-       do {
-               enum omap_display_type port_type;
-               u32 reg;
-
-               r = of_property_read_u32(port, "reg", &reg);
-               if (r)
-                       reg = 0;
-
-               if (reg >= dss.feat->num_ports)
+       for (i = 0; i < dss.feat->num_ports; i++) {
+               port = of_graph_get_port_by_id(parent, i);
+               if (!port)
                        continue;
 
-               port_type = dss.feat->ports[reg];
-
-               switch (port_type) {
+               switch (dss.feat->ports[i]) {
                case OMAP_DISPLAY_TYPE_DPI:
                        dpi_init_port(pdev, port);
                        break;
@@ -1070,7 +1053,7 @@ static int dss_init_ports(struct platform_device *pdev)
                default:
                        break;
                }
-       } while ((port = omapdss_of_get_next_port(parent, port)) != NULL);
+       }
 
        return 0;
 }
@@ -1079,32 +1062,14 @@ static void dss_uninit_ports(struct platform_device *pdev)
 {
        struct device_node *parent = pdev->dev.of_node;
        struct device_node *port;
+       int i;
 
-       if (parent == NULL)
-               return;
-
-       port = omapdss_of_get_next_port(parent, NULL);
-       if (!port)
-               return;
-
-       if (dss.feat->num_ports == 0)
-               return;
-
-       do {
-               enum omap_display_type port_type;
-               u32 reg;
-               int r;
-
-               r = of_property_read_u32(port, "reg", &reg);
-               if (r)
-                       reg = 0;
-
-               if (reg >= dss.feat->num_ports)
+       for (i = 0; i < dss.feat->num_ports; i++) {
+               port = of_graph_get_port_by_id(parent, i);
+               if (!port)
                        continue;
 
-               port_type = dss.feat->ports[reg];
-
-               switch (port_type) {
+               switch (dss.feat->ports[i]) {
                case OMAP_DISPLAY_TYPE_DPI:
                        dpi_uninit_port(port);
                        break;
@@ -1114,7 +1079,7 @@ static void dss_uninit_ports(struct platform_device *pdev)
                default:
                        break;
                }
-       } while ((port = omapdss_of_get_next_port(parent, port)) != NULL);
+       }
 }
 
 static int dss_video_pll_probe(struct platform_device *pdev)
index e7162c1..87c5303 100644 (file)
@@ -34,6 +34,7 @@
 #include <linux/regulator/consumer.h>
 #include <linux/component.h>
 #include <linux/of.h>
+#include <linux/of_graph.h>
 #include <sound/omap-hdmi-audio.h>
 
 #include "omapdss.h"
@@ -546,7 +547,7 @@ static int hdmi_probe_of(struct platform_device *pdev)
        struct device_node *ep;
        int r;
 
-       ep = omapdss_of_get_first_endpoint(node);
+       ep = of_graph_get_endpoint_by_regs(node, 0, 0);
        if (!ep)
                return 0;
 
index 678dfb0..d13dce7 100644 (file)
@@ -39,6 +39,7 @@
 #include <linux/regulator/consumer.h>
 #include <linux/component.h>
 #include <linux/of.h>
+#include <linux/of_graph.h>
 #include <sound/omap-hdmi-audio.h>
 
 #include "omapdss.h"
@@ -572,7 +573,7 @@ static int hdmi_probe_of(struct platform_device *pdev)
        struct device_node *ep;
        int r;
 
-       ep = omapdss_of_get_first_endpoint(node);
+       ep = of_graph_get_endpoint_by_regs(node, 0, 0);
        if (!ep)
                return 0;
 
index 63c2684..b19dae1 100644 (file)
@@ -830,17 +830,6 @@ static inline bool omapdss_device_is_enabled(struct omap_dss_device *dssdev)
        return dssdev->state == OMAP_DSS_DISPLAY_ACTIVE;
 }
 
-struct device_node *
-omapdss_of_get_next_port(const struct device_node *parent,
-                        struct device_node *prev);
-
-struct device_node *
-omapdss_of_get_next_endpoint(const struct device_node *parent,
-                            struct device_node *prev);
-
-struct device_node *
-omapdss_of_get_first_endpoint(const struct device_node *parent);
-
 struct omap_dss_device *
 omapdss_of_find_source_for_first_ep(struct device_node *node);
 
index b3bda2d..0620b9f 100644 (file)
@@ -414,7 +414,7 @@ int sdi_init_port(struct platform_device *pdev, struct device_node *port)
        u32 datapairs;
        int r;
 
-       ep = omapdss_of_get_next_endpoint(port, NULL);
+       ep = of_get_next_child(port, NULL);
        if (!ep)
                return 0;
 
index d74f7fc..19d1495 100644 (file)
@@ -35,6 +35,7 @@
 #include <linux/regulator/consumer.h>
 #include <linux/pm_runtime.h>
 #include <linux/of.h>
+#include <linux/of_graph.h>
 #include <linux/component.h>
 
 #include "omapdss.h"
@@ -818,7 +819,7 @@ static int venc_probe_of(struct platform_device *pdev)
        u32 channels;
        int r;
 
-       ep = omapdss_of_get_first_endpoint(node);
+       ep = of_graph_get_endpoint_by_regs(node, 0, 0);
        if (!ep)
                return 0;