From 2c2fc151245df37dba17f4ae1760bfa97e4fd3c5 Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Mon, 12 Apr 2010 10:06:14 +0300 Subject: [PATCH] OMAP: DSS2: Taal: Change DSI bus locking to avoid deadlock in ESD work Move dsi_bus_lock/unlock() out of taal_power_on/off() to avoid deadlock in taal_esd_work(). Signed-off-by: Jani Nikula Signed-off-by: Tomi Valkeinen --- drivers/video/omap2/displays/panel-taal.c | 29 +++++++++++++++-------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c index 4e594bb50f4b..137bad23a64e 100644 --- a/drivers/video/omap2/displays/panel-taal.c +++ b/drivers/video/omap2/displays/panel-taal.c @@ -672,8 +672,6 @@ static int taal_power_on(struct omap_dss_device *dssdev) /* it seems we have to wait a bit until taal is ready */ msleep(5); - dsi_bus_lock(); - r = omapdss_dsi_display_enable(dssdev); if (r) { dev_err(&dssdev->dev, "failed to enable DSI\n"); @@ -744,8 +742,6 @@ static int taal_power_on(struct omap_dss_device *dssdev) omapdss_dsi_vc_enable_hs(TCH, true); - dsi_bus_unlock(); - return 0; err: dev_err(&dssdev->dev, "error while enabling panel, issuing HW reset\n"); @@ -754,8 +750,6 @@ static int taal_power_on(struct omap_dss_device *dssdev) omapdss_dsi_display_disable(dssdev); err0: - dsi_bus_unlock(); - return r; } @@ -764,8 +758,6 @@ static void taal_power_off(struct omap_dss_device *dssdev) struct taal_data *td = dev_get_drvdata(&dssdev->dev); int r; - dsi_bus_lock(); - cancel_delayed_work(&td->esd_work); r = taal_dcs_write_0(DCS_DISPLAY_OFF); @@ -784,8 +776,6 @@ static void taal_power_off(struct omap_dss_device *dssdev) omapdss_dsi_display_disable(dssdev); td->enabled = 0; - - dsi_bus_unlock(); } static int taal_enable(struct omap_dss_device *dssdev) @@ -802,7 +792,12 @@ static int taal_enable(struct omap_dss_device *dssdev) goto err; } + dsi_bus_lock(); + r = taal_power_on(dssdev); + + dsi_bus_unlock(); + if (r) goto err; @@ -825,9 +820,13 @@ static void taal_disable(struct omap_dss_device *dssdev) mutex_lock(&td->lock); + dsi_bus_lock(); + if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) taal_power_off(dssdev); + dsi_bus_unlock(); + dssdev->state = OMAP_DSS_DISPLAY_DISABLED; mutex_unlock(&td->lock); @@ -847,7 +846,12 @@ static int taal_suspend(struct omap_dss_device *dssdev) goto err; } + dsi_bus_lock(); + taal_power_off(dssdev); + + dsi_bus_unlock(); + dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED; mutex_unlock(&td->lock); @@ -872,7 +876,12 @@ static int taal_resume(struct omap_dss_device *dssdev) goto err; } + dsi_bus_lock(); + r = taal_power_on(dssdev); + + dsi_bus_unlock(); + dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; mutex_unlock(&td->lock); -- GitLab