OSDN Git Service

drm/meson: remove useless recursive components matching
authorNeil Armstrong <narmstrong@baylibre.com>
Wed, 20 Oct 2021 12:39:43 +0000 (14:39 +0200)
committerNeil Armstrong <narmstrong@baylibre.com>
Fri, 12 Nov 2021 09:07:12 +0000 (10:07 +0100)
The initial design was recursive to cover all port/endpoints, but only the first layer
of endpoints should be covered by the components list.
This also breaks the MIPI-DSI init/bridge attach sequence, thus only parse the
first endpoints instead of recursing.

Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
Acked-by: Sam Ravnborg <sam@ravnborg.org>
Acked-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211020123947.2585572-3-narmstrong@baylibre.com
drivers/gpu/drm/meson/meson_drv.c

index 7f41a33..97ebc07 100644 (file)
@@ -426,46 +426,6 @@ static int compare_of(struct device *dev, void *data)
        return dev->of_node == data;
 }
 
-/* Possible connectors nodes to ignore */
-static const struct of_device_id connectors_match[] = {
-       { .compatible = "composite-video-connector" },
-       { .compatible = "svideo-connector" },
-       { .compatible = "hdmi-connector" },
-       { .compatible = "dvi-connector" },
-       {}
-};
-
-static int meson_probe_remote(struct platform_device *pdev,
-                             struct component_match **match,
-                             struct device_node *parent,
-                             struct device_node *remote)
-{
-       struct device_node *ep, *remote_node;
-       int count = 1;
-
-       /* If node is a connector, return and do not add to match table */
-       if (of_match_node(connectors_match, remote))
-               return 1;
-
-       component_match_add(&pdev->dev, match, compare_of, remote);
-
-       for_each_endpoint_of_node(remote, ep) {
-               remote_node = of_graph_get_remote_port_parent(ep);
-               if (!remote_node ||
-                   remote_node == parent || /* Ignore parent endpoint */
-                   !of_device_is_available(remote_node)) {
-                       of_node_put(remote_node);
-                       continue;
-               }
-
-               count += meson_probe_remote(pdev, match, remote, remote_node);
-
-               of_node_put(remote_node);
-       }
-
-       return count;
-}
-
 static void meson_drv_shutdown(struct platform_device *pdev)
 {
        struct meson_drm *priv = dev_get_drvdata(&pdev->dev);
@@ -477,6 +437,13 @@ static void meson_drv_shutdown(struct platform_device *pdev)
        drm_atomic_helper_shutdown(priv->drm);
 }
 
+/* Possible connectors nodes to ignore */
+static const struct of_device_id connectors_match[] = {
+       { .compatible = "composite-video-connector" },
+       { .compatible = "svideo-connector" },
+       {}
+};
+
 static int meson_drv_probe(struct platform_device *pdev)
 {
        struct component_match *match = NULL;
@@ -491,8 +458,21 @@ static int meson_drv_probe(struct platform_device *pdev)
                        continue;
                }
 
-               count += meson_probe_remote(pdev, &match, np, remote);
+               /* If an analog connector is detected, count it as an output */
+               if (of_match_node(connectors_match, remote)) {
+                       ++count;
+                       of_node_put(remote);
+                       continue;
+               }
+
+               dev_dbg(&pdev->dev, "parent %pOF remote match add %pOF parent %s\n",
+                       np, remote, dev_name(&pdev->dev));
+
+               component_match_add(&pdev->dev, &match, compare_of, remote);
+
                of_node_put(remote);
+
+               ++count;
        }
 
        if (count && !match)