|
@@ -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);
|