]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
drm: convert drivers to use drm_of_find_panel_or_bridge
[karo-tx-linux.git] / drivers / gpu / drm / fsl-dcu / fsl_dcu_drm_rgb.c
index c3651456c963f4a87b47694e9085f4663d0b2965..dcbf3c06e1d80f5b731ec018563802f13a2dc02a 100644 (file)
@@ -15,6 +15,7 @@
 #include <drm/drmP.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_of.h>
 #include <drm/drm_panel.h>
 
 #include "fsl_dcu_drm_drv.h"
@@ -141,32 +142,11 @@ err_cleanup:
        return ret;
 }
 
-static int fsl_dcu_attach_endpoint(struct fsl_dcu_drm_device *fsl_dev,
-                                  const struct of_endpoint *ep)
-{
-       struct drm_bridge *bridge;
-       struct device_node *np;
-
-       np = of_graph_get_remote_port_parent(ep->local_node);
-
-       fsl_dev->connector.panel = of_drm_find_panel(np);
-       if (fsl_dev->connector.panel) {
-               of_node_put(np);
-               return fsl_dcu_attach_panel(fsl_dev, fsl_dev->connector.panel);
-       }
-
-       bridge = of_drm_find_bridge(np);
-       of_node_put(np);
-       if (!bridge)
-               return -ENODEV;
-
-       return drm_bridge_attach(&fsl_dev->encoder, bridge, NULL);
-}
-
 int fsl_dcu_create_outputs(struct fsl_dcu_drm_device *fsl_dev)
 {
-       struct of_endpoint ep;
-       struct device_node *ep_node, *panel_node;
+       struct device_node *panel_node;
+       struct drm_panel *panel;
+       struct drm_bridge *bridge;
        int ret;
 
        /* This is for backward compatibility */
@@ -179,14 +159,14 @@ int fsl_dcu_create_outputs(struct fsl_dcu_drm_device *fsl_dev)
                return fsl_dcu_attach_panel(fsl_dev, fsl_dev->connector.panel);
        }
 
-       ep_node = of_graph_get_next_endpoint(fsl_dev->np, NULL);
-       if (!ep_node)
-               return -ENODEV;
-
-       ret = of_graph_parse_endpoint(ep_node, &ep);
-       of_node_put(ep_node);
+       ret = drm_of_find_panel_or_bridge(fsl_dev->np, 0, 0, &panel, &bridge);
        if (ret)
-               return -ENODEV;
+               return ret;
+
+       if (panel) {
+               fsl_dev->connector.panel = panel;
+               return fsl_dcu_attach_panel(fsl_dev, panel);
+       }
 
-       return fsl_dcu_attach_endpoint(fsl_dev, &ep);
+       return drm_bridge_attach(&fsl_dev->encoder, bridge, NULL);
 }