From 10335413c7eec57932fe4a5a0b6c23ec2404c929 Mon Sep 17 00:00:00 2001 From: Archit Taneja Date: Mon, 10 Sep 2012 14:34:16 +0530 Subject: [PATCH] --- yaml --- r: 333583 b: refs/heads/master c: 3224827630f1823c1181e562af9d36951f6cbd11 h: refs/heads/master i: 333581: 6fc555a9add5bff98e9d5dc5a278ea99e8b9b673 333579: 6efad81bf795ee014d91b7da583a26f048a62e5e 333575: 1d3b8915d41e46dfc2ce876be2b787f927fd1bc0 333567: c3ac1f229d6e41722b2c514b9dab4279684ab537 v: v3 --- [refs] | 2 +- trunk/drivers/video/omap2/dss/display.c | 35 +++++++++++++++++++------ trunk/drivers/video/omap2/dss/dss.h | 1 + trunk/drivers/video/omap2/dss/output.c | 33 +++++++++++++++++++++++ 4 files changed, 62 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index 7897747d54f2..cc2f04431611 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 23e2aa644f39fbc8121f49dd50ce85590cc4e4b7 +refs/heads/master: 3224827630f1823c1181e562af9d36951f6cbd11 diff --git a/trunk/drivers/video/omap2/dss/display.c b/trunk/drivers/video/omap2/dss/display.c index db83ae81a713..ccf8550fafde 100644 --- a/trunk/drivers/video/omap2/dss/display.c +++ b/trunk/drivers/video/omap2/dss/display.c @@ -327,22 +327,35 @@ EXPORT_SYMBOL(omapdss_default_get_timings); */ static int dss_init_connections(struct omap_dss_device *dssdev, bool force) { + struct omap_dss_output *out; struct omap_overlay_manager *mgr; int i, r; - WARN_ON(dssdev->manager); + out = omapdss_get_output_from_dssdev(dssdev); + + WARN_ON(dssdev->output); + WARN_ON(out->device); + + r = omapdss_output_set_device(out, dssdev); + if (r) { + DSSERR("failed to connect output to new device\n"); + return r; + } mgr = omap_dss_get_overlay_manager(dssdev->channel); - if (mgr->device && !force) + if (mgr->output && !force) return 0; - if (mgr->device) - mgr->unset_device(mgr); + if (mgr->output) + mgr->unset_output(mgr); - r = mgr->set_device(mgr, dssdev); + r = mgr->set_output(mgr, out); if (r) { - DSSERR("failed to set initial manager\n"); + DSSERR("failed to connect manager to output of new device\n"); + + /* remove the output-device connection we just made */ + omapdss_output_unset_device(out); return r; } @@ -366,8 +379,14 @@ static int dss_init_connections(struct omap_dss_device *dssdev, bool force) static void dss_uninit_connections(struct omap_dss_device *dssdev) { - if (dssdev->manager) - dssdev->manager->unset_device(dssdev->manager); + if (dssdev->output) { + struct omap_overlay_manager *mgr = dssdev->output->manager; + + if (mgr) + mgr->unset_output(mgr); + + omapdss_output_unset_device(dssdev->output); + } } int dss_init_device(struct platform_device *pdev, diff --git a/trunk/drivers/video/omap2/dss/dss.h b/trunk/drivers/video/omap2/dss/dss.h index b5c0df43547f..a14528bcfeab 100644 --- a/trunk/drivers/video/omap2/dss/dss.h +++ b/trunk/drivers/video/omap2/dss/dss.h @@ -232,6 +232,7 @@ int dss_ovl_unset_manager(struct omap_overlay *ovl); /* output */ void dss_register_output(struct omap_dss_output *out); void dss_unregister_output(struct omap_dss_output *out); +struct omap_dss_output *omapdss_get_output_from_dssdev(struct omap_dss_device *dssdev); /* display */ int dss_suspend_all_devices(void); diff --git a/trunk/drivers/video/omap2/dss/output.c b/trunk/drivers/video/omap2/dss/output.c index 1a84b79d5580..813f26682b7a 100644 --- a/trunk/drivers/video/omap2/dss/output.c +++ b/trunk/drivers/video/omap2/dss/output.c @@ -113,3 +113,36 @@ struct omap_dss_output *omap_dss_get_output(enum omap_dss_output_id id) return NULL; } + +struct omap_dss_output *omapdss_get_output_from_dssdev(struct omap_dss_device *dssdev) +{ + struct omap_dss_output *out = NULL; + enum omap_dss_output_id id; + + switch (dssdev->type) { + case OMAP_DISPLAY_TYPE_DPI: + out = omap_dss_get_output(OMAP_DSS_OUTPUT_DPI); + break; + case OMAP_DISPLAY_TYPE_DBI: + out = omap_dss_get_output(OMAP_DSS_OUTPUT_DBI); + break; + case OMAP_DISPLAY_TYPE_SDI: + out = omap_dss_get_output(OMAP_DSS_OUTPUT_SDI); + break; + case OMAP_DISPLAY_TYPE_VENC: + out = omap_dss_get_output(OMAP_DSS_OUTPUT_VENC); + break; + case OMAP_DISPLAY_TYPE_HDMI: + out = omap_dss_get_output(OMAP_DSS_OUTPUT_HDMI); + break; + case OMAP_DISPLAY_TYPE_DSI: + id = dssdev->phy.dsi.module == 0 ? OMAP_DSS_OUTPUT_DSI1 : + OMAP_DSS_OUTPUT_DSI2; + out = omap_dss_get_output(id); + break; + default: + break; + } + + return out; +}