summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/omapdrm/dss/hdmi5.c
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2018-03-02 22:13:06 +0200
committerTomi Valkeinen <tomi.valkeinen@ti.com>2018-09-03 16:13:27 +0300
commit27d624527d99265c2df999af3615ff71c29d06f4 (patch)
tree7dc6bf622bfde27e4a25482aa0b80e8c902a630f /drivers/gpu/drm/omapdrm/dss/hdmi5.c
parentc87193267d247c58f4517081d9cd04c8dc6302b8 (diff)
downloadlinux-27d624527d99265c2df999af3615ff71c29d06f4.tar.bz2
drm/omap: dss: Acquire next dssdev at probe time
Look up the next dssdev at probe time based on device tree links for all DSS outputs and encoders. This will be used to reverse the order of the dssdev connect and disconnect call chains. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/gpu/drm/omapdrm/dss/hdmi5.c')
-rw-r--r--drivers/gpu/drm/omapdrm/dss/hdmi5.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index 64b45a612439..7af60ca4e7b2 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -721,7 +721,7 @@ static const struct component_ops hdmi5_component_ops = {
* Probe & Remove, Suspend & Resume
*/
-static void hdmi5_init_output(struct omap_hdmi *hdmi)
+static int hdmi5_init_output(struct omap_hdmi *hdmi)
{
struct omap_dss_device *out = &hdmi->output;
@@ -734,13 +734,24 @@ static void hdmi5_init_output(struct omap_hdmi *hdmi)
out->owner = THIS_MODULE;
out->of_ports = BIT(0);
+ out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
+ if (IS_ERR(out->next)) {
+ if (PTR_ERR(out->next) != -EPROBE_DEFER)
+ dev_err(out->dev, "failed to find video sink\n");
+ return PTR_ERR(out->next);
+ }
+
omapdss_device_register(out);
+
+ return 0;
}
static void hdmi5_uninit_output(struct omap_hdmi *hdmi)
{
struct omap_dss_device *out = &hdmi->output;
+ if (out->next)
+ omapdss_device_put(out->next);
omapdss_device_unregister(out);
}
@@ -810,7 +821,9 @@ static int hdmi5_probe(struct platform_device *pdev)
pm_runtime_enable(&pdev->dev);
- hdmi5_init_output(hdmi);
+ r = hdmi5_init_output(hdmi);
+ if (r)
+ goto err_pm_disable;
r = component_add(&pdev->dev, &hdmi5_component_ops);
if (r)
@@ -820,6 +833,7 @@ static int hdmi5_probe(struct platform_device *pdev)
err_uninit_output:
hdmi5_uninit_output(hdmi);
+err_pm_disable:
pm_runtime_disable(&pdev->dev);
err_free:
kfree(hdmi);