drm/msm: mdp4 lvds: get panel node via of graph parsing
authorArchit Taneja <architt@codeaurora.org>
Tue, 9 Jun 2015 08:47:22 +0000 (14:17 +0530)
committerRob Clark <robdclark@gmail.com>
Sat, 15 Aug 2015 22:27:23 +0000 (18:27 -0400)
We currently get the output connected to LVDS by looking for a phandle
called 'qcom,lvds-panel' under the mdp DT node.

Use the more standard of_graph approach to create an lvds output port,
and retrieve the panel node from the port's endpoint data.

v3
- Fix return value checks of of_graph_* calls.

Tested-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Archit Taneja <architt@codeaurora.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>
drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c
drivers/gpu/drm/msm/msm_drv.h

index c7b48798b998ff707aa29e33808339fffe7ad625..077f7521a971b7b6827ae77743f0fe5d19a9309b 100644 (file)
@@ -241,22 +241,37 @@ int mdp4_enable(struct mdp4_kms *mdp4_kms)
 }
 
 #ifdef CONFIG_OF
-static struct drm_panel *detect_panel(struct drm_device *dev, const char *name)
+static struct drm_panel *detect_panel(struct drm_device *dev)
 {
-       struct device_node *n;
+       struct device_node *endpoint, *panel_node;
+       struct device_node *np = dev->dev->of_node;
        struct drm_panel *panel = NULL;
 
-       n = of_parse_phandle(dev->dev->of_node, name, 0);
-       if (n) {
-               panel = of_drm_find_panel(n);
-               if (!panel)
-                       panel = ERR_PTR(-EPROBE_DEFER);
+       endpoint = of_graph_get_next_endpoint(np, NULL);
+       if (!endpoint) {
+               dev_err(dev->dev, "no valid endpoint\n");
+               return ERR_PTR(-ENODEV);
+       }
+
+       panel_node = of_graph_get_remote_port_parent(endpoint);
+       if (!panel_node) {
+               dev_err(dev->dev, "no valid panel node\n");
+               of_node_put(endpoint);
+               return ERR_PTR(-ENODEV);
+       }
+
+       of_node_put(endpoint);
+
+       panel = of_drm_find_panel(panel_node);
+       if (!panel) {
+               of_node_put(panel_node);
+               return ERR_PTR(-EPROBE_DEFER);
        }
 
        return panel;
 }
 #else
-static struct drm_panel *detect_panel(struct drm_device *dev, const char *name)
+static struct drm_panel *detect_panel(struct drm_device *dev)
 {
        // ??? maybe use a module param to specify which panel is attached?
 }
@@ -294,7 +309,7 @@ static int modeset_init(struct mdp4_kms *mdp4_kms)
         * Setup the LCDC/LVDS path: RGB2 -> DMA_P -> LCDC -> LVDS:
         */
 
-       panel = detect_panel(dev, "qcom,lvds-panel");
+       panel = detect_panel(dev);
        if (IS_ERR(panel)) {
                ret = PTR_ERR(panel);
                dev_err(dev->dev, "failed to detect LVDS panel: %d\n", ret);
index 12c97cf27e137f119da3725d4738f856f43853d5..3be7a56b14f1d85c478cc802b69ea441ba2f498e 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/list.h>
 #include <linux/iommu.h>
 #include <linux/types.h>
+#include <linux/of_graph.h>
 #include <asm/sizes.h>
 
 #ifndef CONFIG_OF