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);
 
 {
        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);
                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) {
 bind_fail:
        of_node_put(malidp->crtc.port);
        malidp->crtc.port = NULL;
-port_fail:
        malidp_fini(drm);
 init_fail:
        drm->dev_private = NULL;
 
 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);
 
 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);
 
 
        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,
 
 
 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);
 
 
 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");
        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;
 }
 
 
        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) {
 
 
        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);
 
 
        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;
         * 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;
 
        .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;
                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);
 
 
        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;
 
                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);
 
 
 {
        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;
        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);
 
 
 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)
 
        }
 
        /* 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;
 
        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)
                 * 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;
 
 
 #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"
        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);
 
        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;
        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;
 
                                   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;
 }
 
  */
 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);