drm: convert drivers to use of_graph_get_remote_node
authorRob Herring <robh@kernel.org>
Wed, 22 Mar 2017 13:26:06 +0000 (08:26 -0500)
committerSean Paul <seanpaul@chromium.org>
Thu, 6 Apr 2017 21:00:27 +0000 (17:00 -0400)
Convert drivers to use the new of_graph_get_remote_node() helper
instead of parsing the endpoint node and then getting the remote device
node. Now drivers can just specify the device node and which
port/endpoint and get back the connected remote device node. The details
of the graph binding are nicely abstracted into the core OF graph code.

This changes some error messages to debug messages (in the graph core).
Graph connections are often "no connects" depending on the particular
board, so we want to avoid spurious messages. Plus the kernel is not a
DT validator.

Signed-off-by: Rob Herring <robh@kernel.org>
Acked-by: Neil Armstrong <narmstrong@baylibre.com>
Tested-by: Liviu Dudau <liviu.dudau@arm.com>
Tested-by: Eric Anholt <eric@anholt.net>
Tested-by: Jyri Sarha <jsarha@ti.com>
Tested by: Archit Taneja <architt@codeaurora.org>
Signed-off-by: Sean Paul <seanpaul@chromium.org>
17 files changed:
drivers/gpu/drm/arm/hdlcd_drv.c
drivers/gpu/drm/arm/malidp_drv.c
drivers/gpu/drm/bridge/adv7511/adv7533.c
drivers/gpu/drm/bridge/dumb-vga-dac.c
drivers/gpu/drm/bridge/ti-tfp410.c
drivers/gpu/drm/exynos/exynos_drm_dpi.c
drivers/gpu/drm/exynos/exynos_drm_dsi.c
drivers/gpu/drm/exynos/exynos_drm_mic.c
drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
drivers/gpu/drm/mediatek/mtk_dpi.c
drivers/gpu/drm/mediatek/mtk_hdmi.c
drivers/gpu/drm/meson/meson_venc_cvbs.c
drivers/gpu/drm/msm/dsi/dsi_host.c
drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c
drivers/gpu/drm/tilcdc/tilcdc_crtc.c
drivers/gpu/drm/tilcdc/tilcdc_external.c
drivers/gpu/drm/vc4/vc4_dpi.c

index 0e74880b5e94e98c41ba0aeb1893d560c0418263..0f49c4b1277284ca76dc6128bf48a88a208250a2 100644 (file)
@@ -392,29 +392,13 @@ static int compare_dev(struct device *dev, void *data)
 
 static int hdlcd_probe(struct platform_device *pdev)
 {
-       struct device_node *port, *ep;
+       struct device_node *port;
        struct component_match *match = NULL;
 
-       if (!pdev->dev.of_node)
-               return -ENODEV;
-
        /* there is only one output port inside each device, find it */
-       ep = of_graph_get_next_endpoint(pdev->dev.of_node, NULL);
-       if (!ep)
-               return -ENODEV;
-
-       if (!of_device_is_available(ep)) {
-               of_node_put(ep);
+       port = of_graph_get_remote_node(pdev->dev.of_node, 0, 0);
+       if (!port)
                return -ENODEV;
-       }
-
-       /* add the remote encoder port as component */
-       port = of_graph_get_remote_port_parent(ep);
-       of_node_put(ep);
-       if (!port || !of_device_is_available(port)) {
-               of_node_put(port);
-               return -EAGAIN;
-       }
 
        drm_of_component_match_add(&pdev->dev, &match, compare_dev, port);
        of_node_put(port);
index ea2546f766c2fb0725d9aba28208f7a6e360ddeb..898c2b58e73dfd7c89602db4658d2999fe1c4d8f 100644 (file)
@@ -283,7 +283,6 @@ static int malidp_bind(struct device *dev)
 {
        struct resource *res;
        struct drm_device *drm;
-       struct device_node *ep;
        struct malidp_drm *malidp;
        struct malidp_hw_device *hwdev;
        struct platform_device *pdev = to_platform_device(dev);
@@ -398,12 +397,7 @@ static int malidp_bind(struct device *dev)
                goto init_fail;
 
        /* Set the CRTC's port so that the encoder component can find it */
-       ep = of_graph_get_next_endpoint(dev->of_node, NULL);
-       if (!ep) {
-               ret = -EINVAL;
-               goto port_fail;
-       }
-       malidp->crtc.port = of_get_next_parent(ep);
+       malidp->crtc.port = of_graph_get_port_by_id(dev->of_node, 0);
 
        ret = component_bind_all(dev, drm);
        if (ret) {
@@ -458,7 +452,6 @@ irq_init_fail:
 bind_fail:
        of_node_put(malidp->crtc.port);
        malidp->crtc.port = NULL;
-port_fail:
        malidp_fini(drm);
 init_fail:
        drm->dev_private = NULL;
@@ -516,29 +509,16 @@ static int malidp_compare_dev(struct device *dev, void *data)
 
 static int malidp_platform_probe(struct platform_device *pdev)
 {
-       struct device_node *port, *ep;
+       struct device_node *port;
        struct component_match *match = NULL;
 
        if (!pdev->dev.of_node)
                return -ENODEV;
 
        /* there is only one output port inside each device, find it */
-       ep = of_graph_get_next_endpoint(pdev->dev.of_node, NULL);
-       if (!ep)
-               return -ENODEV;
-
-       if (!of_device_is_available(ep)) {
-               of_node_put(ep);
+       port = of_graph_get_remote_node(pdev->dev.of_node, 0, 0);
+       if (!port)
                return -ENODEV;
-       }
-
-       /* add the remote encoder port as component */
-       port = of_graph_get_remote_port_parent(ep);
-       of_node_put(ep);
-       if (!port || !of_device_is_available(port)) {
-               of_node_put(port);
-               return -EAGAIN;
-       }
 
        drm_of_component_match_add(&pdev->dev, &match, malidp_compare_dev,
                                   port);
index 8b210373cfa272a186601cd63c749363e99ffe73..ac804f81e2f6d428e6df7368b8c10ac51b72686d 100644 (file)
@@ -232,7 +232,6 @@ void adv7533_detach_dsi(struct adv7511 *adv)
 int adv7533_parse_dt(struct device_node *np, struct adv7511 *adv)
 {
        u32 num_lanes;
-       struct device_node *endpoint;
 
        of_property_read_u32(np, "adi,dsi-lanes", &num_lanes);
 
@@ -241,17 +240,10 @@ int adv7533_parse_dt(struct device_node *np, struct adv7511 *adv)
 
        adv->num_dsi_lanes = num_lanes;
 
-       endpoint = of_graph_get_next_endpoint(np, NULL);
-       if (!endpoint)
+       adv->host_node = of_graph_get_remote_node(np, 0, 0);
+       if (!adv->host_node)
                return -ENODEV;
 
-       adv->host_node = of_graph_get_remote_port_parent(endpoint);
-       if (!adv->host_node) {
-               of_node_put(endpoint);
-               return -ENODEV;
-       }
-
-       of_node_put(endpoint);
        of_node_put(adv->host_node);
 
        adv->use_timing_gen = !of_property_read_bool(np,
index 63e113bd21d24223914e059c870f39396e668b76..831a606c4706815999a938966ae561ec10497103 100644 (file)
@@ -154,21 +154,12 @@ static const struct drm_bridge_funcs dumb_vga_bridge_funcs = {
 
 static struct i2c_adapter *dumb_vga_retrieve_ddc(struct device *dev)
 {
-       struct device_node *end_node, *phandle, *remote;
+       struct device_node *phandle, *remote;
        struct i2c_adapter *ddc;
 
-       end_node = of_graph_get_endpoint_by_regs(dev->of_node, 1, -1);
-       if (!end_node) {
-               dev_err(dev, "Missing connector endpoint\n");
-               return ERR_PTR(-ENODEV);
-       }
-
-       remote = of_graph_get_remote_port_parent(end_node);
-       of_node_put(end_node);
-       if (!remote) {
-               dev_err(dev, "Enable to parse remote node\n");
+       remote = of_graph_get_remote_node(dev->of_node, 1, -1);
+       if (!remote)
                return ERR_PTR(-EINVAL);
-       }
 
        phandle = of_parse_phandle(remote, "ddc-i2c-bus", 0);
        of_node_put(remote);
index 7d519b46aee4ff96d7844af8c9ee6d2a5b84b8a8..eee4efda829ecb91ace06df720fa670fe584a53a 100644 (file)
@@ -165,18 +165,13 @@ static irqreturn_t tfp410_hpd_irq_thread(int irq, void *arg)
 
 static int tfp410_get_connector_properties(struct tfp410 *dvi)
 {
-       struct device_node *ep = NULL, *connector_node = NULL;
-       struct device_node *ddc_phandle = NULL;
+       struct device_node *connector_node, *ddc_phandle;
        int ret = 0;
 
        /* port@1 is the connector node */
-       ep = of_graph_get_endpoint_by_regs(dvi->dev->of_node, 1, -1);
-       if (!ep)
-               goto fail;
-
-       connector_node = of_graph_get_remote_port_parent(ep);
+       connector_node = of_graph_get_remote_node(dvi->dev->of_node, 1, -1);
        if (!connector_node)
-               goto fail;
+               return -ENODEV;
 
        dvi->hpd = fwnode_get_named_gpiod(&connector_node->fwnode,
                                        "hpd-gpios", 0, GPIOD_IN, "hpd");
@@ -199,10 +194,10 @@ static int tfp410_get_connector_properties(struct tfp410 *dvi)
        else
                ret = -EPROBE_DEFER;
 
+       of_node_put(ddc_phandle);
+
 fail:
-       of_node_put(ep);
        of_node_put(connector_node);
-       of_node_put(ddc_phandle);
        return ret;
 }
 
index 3aab71a485ba1dd1c19529756c3c3d8d31f6f067..63abcd280fa027a965735cef0f9c7a768231373d 100644 (file)
@@ -163,27 +163,13 @@ enum {
        FIMD_PORT_WRB,
 };
 
-static struct device_node *exynos_dpi_of_find_panel_node(struct device *dev)
-{
-       struct device_node *np, *ep;
-
-       ep = of_graph_get_endpoint_by_regs(dev->of_node, FIMD_PORT_RGB, 0);
-       if (!ep)
-               return NULL;
-
-       np = of_graph_get_remote_port_parent(ep);
-       of_node_put(ep);
-
-       return np;
-}
-
 static int exynos_dpi_parse_dt(struct exynos_dpi *ctx)
 {
        struct device *dev = ctx->dev;
        struct device_node *dn = dev->of_node;
        struct device_node *np;
 
-       ctx->panel_node = exynos_dpi_of_find_panel_node(dev);
+       ctx->panel_node = of_graph_get_remote_node(dn, FIMD_PORT_RGB, 0);
 
        np = of_get_child_by_name(dn, "display-timings");
        if (np) {
index 6d4da2f0932de8349a4ba7ef876f98f1527382a9..fc4fda738906251de7a6047c3fc8f3699c469b79 100644 (file)
@@ -1659,17 +1659,10 @@ static int exynos_dsi_parse_dt(struct exynos_dsi *dsi)
 
        of_node_put(ep);
 
-       ep = of_graph_get_next_endpoint(node, NULL);
-       if (!ep) {
-               ret = -EINVAL;
-               goto end;
-       }
+       dsi->bridge_node = of_graph_get_remote_node(node, DSI_PORT_OUT, 0);
+       if (!dsi->bridge_node)
+               return -EINVAL;
 
-       dsi->bridge_node = of_graph_get_remote_port_parent(ep);
-       if (!dsi->bridge_node) {
-               ret = -EINVAL;
-               goto end;
-       }
 end:
        of_node_put(ep);
 
index 2ef43d403eaae42e5ab876fc4bca01a4c5153deb..e45720543a453d22c29150807815666ca0afffd9 100644 (file)
@@ -229,29 +229,6 @@ static void mic_set_reg_on(struct exynos_mic *mic, bool enable)
        writel(reg, mic->reg + MIC_OP);
 }
 
-static struct device_node *get_remote_node(struct device_node *from, int reg)
-{
-       struct device_node *endpoint = NULL, *remote_node = NULL;
-
-       endpoint = of_graph_get_endpoint_by_regs(from, reg, -1);
-       if (!endpoint) {
-               DRM_ERROR("mic: Failed to find remote port from %s",
-                               from->full_name);
-               goto exit;
-       }
-
-       remote_node = of_graph_get_remote_port_parent(endpoint);
-       if (!remote_node) {
-               DRM_ERROR("mic: Failed to find remote port parent from %s",
-                                                       from->full_name);
-               goto exit;
-       }
-
-exit:
-       of_node_put(endpoint);
-       return remote_node;
-}
-
 static int parse_dt(struct exynos_mic *mic)
 {
        int ret = 0, i, j;
@@ -263,7 +240,7 @@ static int parse_dt(struct exynos_mic *mic)
         * The first node must be for decon and the second one must be for dsi.
         */
        for (i = 0, j = 0; i < NUM_ENDPOINTS; i++) {
-               remote_node = get_remote_node(mic->dev->of_node, i);
+               remote_node = of_graph_get_remote_node(mic->dev->of_node, i, 0);
                if (!remote_node) {
                        ret = -EPIPE;
                        goto exit;
index df4f50713e54adade26cc5b95e230fd61851e46e..9c903672f582315700cfd3c8c43ec4497404cbbf 100644 (file)
@@ -230,34 +230,6 @@ static const struct component_master_ops kirin_drm_ops = {
        .unbind = kirin_drm_unbind,
 };
 
-static struct device_node *kirin_get_remote_node(struct device_node *np)
-{
-       struct device_node *endpoint, *remote;
-
-       /* get the first endpoint, in our case only one remote node
-        * is connected to display controller.
-        */
-       endpoint = of_graph_get_next_endpoint(np, NULL);
-       if (!endpoint) {
-               DRM_ERROR("no valid endpoint node\n");
-               return ERR_PTR(-ENODEV);
-       }
-
-       remote = of_graph_get_remote_port_parent(endpoint);
-       of_node_put(endpoint);
-       if (!remote) {
-               DRM_ERROR("no valid remote node\n");
-               return ERR_PTR(-ENODEV);
-       }
-
-       if (!of_device_is_available(remote)) {
-               DRM_ERROR("not available for remote node\n");
-               return ERR_PTR(-ENODEV);
-       }
-
-       return remote;
-}
-
 static int kirin_drm_platform_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
@@ -271,7 +243,7 @@ static int kirin_drm_platform_probe(struct platform_device *pdev)
                return -EINVAL;
        }
 
-       remote = kirin_get_remote_node(np);
+       remote = of_graph_get_remote_node(np, 0, 0);
        if (IS_ERR(remote))
                return PTR_ERR(remote);
 
index 3bd3bd688d1a4d8105359a5c8ab80fed52ea67bd..32ca351ecd09122cfba5305bd7d184c4d7c75a37 100644 (file)
@@ -661,7 +661,7 @@ static int mtk_dpi_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct mtk_dpi *dpi;
        struct resource *mem;
-       struct device_node *ep, *bridge_node = NULL;
+       struct device_node *bridge_node;
        int comp_id;
        int ret;
 
@@ -706,15 +706,9 @@ static int mtk_dpi_probe(struct platform_device *pdev)
                return -EINVAL;
        }
 
-       ep = of_graph_get_next_endpoint(dev->of_node, NULL);
-       if (ep) {
-               bridge_node = of_graph_get_remote_port_parent(ep);
-               of_node_put(ep);
-       }
-       if (!bridge_node) {
-               dev_err(dev, "Failed to find bridge node\n");
+       bridge_node = of_graph_get_remote_node(dev->of_node, 0, 0);
+       if (!bridge_node)
                return -ENODEV;
-       }
 
        dev_info(dev, "Found bridge node: %s\n", bridge_node->full_name);
 
index c26251260b83363352a0d460f55b2cd62989b8c8..41a1c03b03476b620a511731518b8d0f7772417d 100644 (file)
@@ -1434,7 +1434,7 @@ static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi *hdmi,
 {
        struct device *dev = &pdev->dev;
        struct device_node *np = dev->of_node;
-       struct device_node *cec_np, *port, *ep, *remote, *i2c_np;
+       struct device_node *cec_np, *remote, *i2c_np;
        struct platform_device *cec_pdev;
        struct regmap *regmap;
        struct resource *mem;
@@ -1486,29 +1486,9 @@ static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi *hdmi,
        if (IS_ERR(hdmi->regs))
                return PTR_ERR(hdmi->regs);
 
-       port = of_graph_get_port_by_id(np, 1);
-       if (!port) {
-               dev_err(dev, "Missing output port node\n");
+       remote = of_graph_get_remote_node(np, 1, 0);
+       if (!remote)
                return -EINVAL;
-       }
-
-       ep = of_get_child_by_name(port, "endpoint");
-       if (!ep) {
-               dev_err(dev, "Missing endpoint node in port %s\n",
-                       port->full_name);
-               of_node_put(port);
-               return -EINVAL;
-       }
-       of_node_put(port);
-
-       remote = of_graph_get_remote_port_parent(ep);
-       if (!remote) {
-               dev_err(dev, "Missing connector/bridge node for endpoint %s\n",
-                       ep->full_name);
-               of_node_put(ep);
-               return -EINVAL;
-       }
-       of_node_put(ep);
 
        if (!of_device_is_compatible(remote, "hdmi-connector")) {
                hdmi->next_bridge = of_drm_find_bridge(remote);
index 5d4f19ac98fcf04d7d0e82fa74ee649e53a86308..00775b397dbac3ee7f2a3ffa416b8ac55d247ce5 100644 (file)
@@ -224,25 +224,14 @@ static const struct drm_encoder_helper_funcs
 
 static bool meson_venc_cvbs_connector_is_available(struct meson_drm *priv)
 {
-       struct device_node *ep, *remote;
+       struct device_node *remote;
 
-       /* CVBS VDAC output is on the first port, first endpoint */
-       ep = of_graph_get_endpoint_by_regs(priv->dev->of_node, 0, 0);
-       if (!ep)
+       remote = of_graph_get_remote_node(priv->dev->of_node, 0, 0);
+       if (!remote)
                return false;
 
-
-       /* If the endpoint node exists, consider it enabled */
-       remote = of_graph_get_remote_port(ep);
-       if (remote) {
-               of_node_put(ep);
-               return true;
-       }
-
-       of_node_put(ep);
        of_node_put(remote);
-
-       return false;
+       return true;
 }
 
 int meson_venc_cvbs_create(struct meson_drm *priv)
index 4f79b109173db0e13c7e2218e958b96df9a682e3..f97a7803a02de117735c151cbf41ea5d3342665c 100644 (file)
@@ -1635,7 +1635,7 @@ static int dsi_host_parse_dt(struct msm_dsi_host *msm_host)
        }
 
        /* Get panel node from the output port's endpoint data */
-       device_node = of_graph_get_remote_port_parent(endpoint);
+       device_node = of_graph_get_remote_node(np, 1, 0);
        if (!device_node) {
                dev_dbg(dev, "%s: no valid device\n", __func__);
                goto err;
index a4e1206a66a8dfa676661822801fbdd08cbfe431..5b6516bb9d06b80e616615eacae2f6e05fe15d37 100644 (file)
@@ -225,32 +225,6 @@ int mdp4_enable(struct mdp4_kms *mdp4_kms)
        return 0;
 }
 
-static struct device_node *mdp4_detect_lcdc_panel(struct drm_device *dev)
-{
-       struct device_node *endpoint, *panel_node;
-       struct device_node *np = dev->dev->of_node;
-
-       /*
-        * LVDS/LCDC is the first port described in the list of ports in the
-        * MDP4 DT node.
-        */
-       endpoint = of_graph_get_endpoint_by_regs(np, 0, -1);
-       if (!endpoint) {
-               DBG("no LVDS remote endpoint\n");
-               return NULL;
-       }
-
-       panel_node = of_graph_get_remote_port_parent(endpoint);
-       if (!panel_node) {
-               DBG("no valid panel node in LVDS endpoint\n");
-               of_node_put(endpoint);
-               return NULL;
-       }
-
-       of_node_put(endpoint);
-
-       return panel_node;
-}
 
 static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms,
                                  int intf_type)
@@ -269,7 +243,7 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms,
                 * bail out early if there is no panel node (no need to
                 * initialize LCDC encoder and LVDS connector)
                 */
-               panel_node = mdp4_detect_lcdc_panel(dev);
+               panel_node = of_graph_get_remote_node(dev->dev->of_node, 0, 0);
                if (!panel_node)
                        return 0;
 
index afd2a7b2aff72db22191fef86f0f51afbb090ce8..d524ed0d5146ca8ee0caf9e1a290163af0470f46 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/workqueue.h>
 #include <linux/completion.h>
 #include <linux/dma-mapping.h>
+#include <linux/of_graph.h>
 
 #include "tilcdc_drv.h"
 #include "tilcdc_regs.h"
@@ -1035,16 +1036,7 @@ int tilcdc_crtc_create(struct drm_device *dev)
        drm_crtc_helper_add(crtc, &tilcdc_crtc_helper_funcs);
 
        if (priv->is_componentized) {
-               struct device_node *ports =
-                       of_get_child_by_name(dev->dev->of_node, "ports");
-
-               if (ports) {
-                       crtc->port = of_get_child_by_name(ports, "port");
-                       of_node_put(ports);
-               } else {
-                       crtc->port =
-                               of_get_child_by_name(dev->dev->of_node, "port");
-               }
+               crtc->port = of_graph_get_port_by_id(dev->dev->of_node, 0);
                if (!crtc->port) { /* This should never happen */
                        dev_err(dev->dev, "Port node not found in %s\n",
                                dev->dev->of_node->full_name);
index b0dd5e8634ae896f6a9f72a273917ef2c4535709..711c7b3289d35f06f909d80ad2a3ba79107571fe 100644 (file)
@@ -185,39 +185,6 @@ int tilcdc_attach_bridge(struct drm_device *ddev, struct drm_bridge *bridge)
        return ret;
 }
 
-static int tilcdc_node_has_port(struct device_node *dev_node)
-{
-       struct device_node *node;
-
-       node = of_get_child_by_name(dev_node, "ports");
-       if (!node)
-               node = of_get_child_by_name(dev_node, "port");
-       if (!node)
-               return 0;
-       of_node_put(node);
-
-       return 1;
-}
-
-static
-struct device_node *tilcdc_get_remote_node(struct device_node *node)
-{
-       struct device_node *ep;
-       struct device_node *parent;
-
-       if (!tilcdc_node_has_port(node))
-               return NULL;
-
-       ep = of_graph_get_next_endpoint(node, NULL);
-       if (!ep)
-               return NULL;
-
-       parent = of_graph_get_remote_port_parent(ep);
-       of_node_put(ep);
-
-       return parent;
-}
-
 int tilcdc_attach_external_device(struct drm_device *ddev)
 {
        struct tilcdc_drm_private *priv = ddev->dev_private;
@@ -225,7 +192,7 @@ int tilcdc_attach_external_device(struct drm_device *ddev)
        struct drm_bridge *bridge;
        int ret;
 
-       remote_node = tilcdc_get_remote_node(ddev->dev->of_node);
+       remote_node = of_graph_get_remote_node(ddev->dev->of_node, 0, 0);
        if (!remote_node)
                return 0;
 
@@ -264,35 +231,16 @@ int tilcdc_get_external_components(struct device *dev,
                                   struct component_match **match)
 {
        struct device_node *node;
-       struct device_node *ep = NULL;
-       int count = 0;
-       int ret = 0;
-
-       if (!tilcdc_node_has_port(dev->of_node))
-               return 0;
 
-       while ((ep = of_graph_get_next_endpoint(dev->of_node, ep))) {
-               node = of_graph_get_remote_port_parent(ep);
-               if (!node || !of_device_is_available(node)) {
-                       of_node_put(node);
-                       continue;
-               }
-
-               dev_dbg(dev, "Subdevice node '%s' found\n", node->name);
-
-               if (of_device_is_compatible(node, "nxp,tda998x")) {
-                       if (match)
-                               drm_of_component_match_add(dev, match,
-                                                          dev_match_of, node);
-                       ret = 1;
-               }
+       node = of_graph_get_remote_node(dev->of_node, 0, 0);
 
+       if (!of_device_is_compatible(node, "nxp,tda998x")) {
                of_node_put(node);
-               if (count++ > 1) {
-                       dev_err(dev, "Only one port is supported\n");
-                       return -EINVAL;
-               }
+               return 0;
        }
 
-       return ret;
+       if (match)
+               drm_of_component_match_add(dev, match, dev_match_of, node);
+       of_node_put(node);
+       return 1;
 }
index 71435796c7100a65884013d479f4e446025c217e..c6d703903fd9f99be7c3c590debe3f815ceaf87a 100644 (file)
@@ -356,23 +356,14 @@ static const struct of_device_id vc4_dpi_dt_match[] = {
  */
 static struct drm_panel *vc4_dpi_get_panel(struct device *dev)
 {
-       struct device_node *endpoint, *panel_node;
+       struct device_node *panel_node;
        struct device_node *np = dev->of_node;
        struct drm_panel *panel;
 
-       endpoint = of_graph_get_next_endpoint(np, NULL);
-       if (!endpoint) {
-               dev_err(dev, "no endpoint to fetch DPI panel\n");
-               return NULL;
-       }
-
        /* don't proceed if we have an endpoint but no panel_node tied to it */
-       panel_node = of_graph_get_remote_port_parent(endpoint);
-       of_node_put(endpoint);
-       if (!panel_node) {
-               dev_err(dev, "no valid panel node\n");
+       panel_node = of_graph_get_remote_node(np, 0, 0);
+       if (!panel_node)
                return NULL;
-       }
 
        panel = of_drm_find_panel(panel_node);
        of_node_put(panel_node);