Commit 37e11062 authored by Javier Martinez Canillas's avatar Javier Martinez Canillas Committed by Inki Dae

drm/exynos: dp: Fix panel and bridge lookup logic

Commit a9fa8528 ("drm/exynos: dp: add of_graph dt binding support
for panel") made the Exynos DP DT binding more consistent since the OF
graph could be used to lookup either a panel or a bridge device node.

Before that commit, a panel would be looked up using a phandle and a
bridge using the OF graph which made the DT binding not consistent.

But the patch broke the later case since not finding a panel dev node
would cause the driver's to do a probe deferral instead of attempting
to lookup a bridge device node associated with the remote endpoint.

So instead of returning a -EPROBE_DEFER if a panel is not found, check
if there's a bridge and only do a probe deferral if both aren't found.
Signed-off-by: default avatarJavier Martinez Canillas <javier@osg.samsung.com>
Tested-by: default avatarMichal Suchanek <hramrach@gmail.com>
Signed-off-by: default avatarInki Dae <inki.dae@samsung.com>
parent 010848a7
...@@ -1392,7 +1392,7 @@ static const struct component_ops exynos_dp_ops = { ...@@ -1392,7 +1392,7 @@ static const struct component_ops exynos_dp_ops = {
static int exynos_dp_probe(struct platform_device *pdev) static int exynos_dp_probe(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct device_node *panel_node = NULL, *bridge_node, *endpoint = NULL; struct device_node *np = NULL, *endpoint = NULL;
struct exynos_dp_device *dp; struct exynos_dp_device *dp;
int ret; int ret;
...@@ -1404,41 +1404,36 @@ static int exynos_dp_probe(struct platform_device *pdev) ...@@ -1404,41 +1404,36 @@ static int exynos_dp_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, dp); platform_set_drvdata(pdev, dp);
/* This is for the backward compatibility. */ /* This is for the backward compatibility. */
panel_node = of_parse_phandle(dev->of_node, "panel", 0); np = of_parse_phandle(dev->of_node, "panel", 0);
if (panel_node) { if (np) {
dp->panel = of_drm_find_panel(panel_node); dp->panel = of_drm_find_panel(np);
of_node_put(panel_node); of_node_put(np);
if (!dp->panel) if (!dp->panel)
return -EPROBE_DEFER; return -EPROBE_DEFER;
} else { goto out;
}
endpoint = of_graph_get_next_endpoint(dev->of_node, NULL); endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
if (endpoint) { if (endpoint) {
panel_node = of_graph_get_remote_port_parent(endpoint); np = of_graph_get_remote_port_parent(endpoint);
if (panel_node) { if (np) {
dp->panel = of_drm_find_panel(panel_node); /* The remote port can be either a panel or a bridge */
of_node_put(panel_node); dp->panel = of_drm_find_panel(np);
if (!dp->panel) if (!dp->panel) {
dp->ptn_bridge = of_drm_find_bridge(np);
if (!dp->ptn_bridge) {
of_node_put(np);
return -EPROBE_DEFER; return -EPROBE_DEFER;
} else {
DRM_ERROR("no port node for panel device.\n");
return -EINVAL;
} }
} }
of_node_put(np);
} else {
DRM_ERROR("no remote endpoint device node found.\n");
return -EINVAL;
} }
} else {
if (endpoint) DRM_ERROR("no port endpoint subnode found.\n");
goto out; return -EINVAL;
endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
if (endpoint) {
bridge_node = of_graph_get_remote_port_parent(endpoint);
if (bridge_node) {
dp->ptn_bridge = of_drm_find_bridge(bridge_node);
of_node_put(bridge_node);
if (!dp->ptn_bridge)
return -EPROBE_DEFER;
} else
return -EPROBE_DEFER;
} }
out: out:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment