diff options
-rw-r--r-- | drivers/video/omap2/dss/dsi.c | 20 |
1 files changed, 6 insertions, 14 deletions
diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c index 928b5e44a3dd..53fc0f8cb1a0 100644 --- a/drivers/video/omap2/dss/dsi.c +++ b/drivers/video/omap2/dss/dsi.c @@ -27,6 +27,7 @@ #include <linux/interrupt.h> #include <linux/delay.h> #include <linux/mutex.h> +#include <linux/semaphore.h> #include <linux/seq_file.h> #include <linux/platform_device.h> #include <linux/regulator/consumer.h> @@ -227,7 +228,7 @@ static struct } vc[4]; struct mutex lock; - struct mutex bus_lock; + struct semaphore bus_lock; unsigned pll_locked; @@ -298,19 +299,19 @@ void dsi_restore_context(void) void dsi_bus_lock(void) { - mutex_lock(&dsi.bus_lock); + down(&dsi.bus_lock); } EXPORT_SYMBOL(dsi_bus_lock); void dsi_bus_unlock(void) { - mutex_unlock(&dsi.bus_lock); + up(&dsi.bus_lock); } EXPORT_SYMBOL(dsi_bus_unlock); static bool dsi_bus_is_locked(void) { - return mutex_is_locked(&dsi.bus_lock); + return dsi.bus_lock.count == 0; } static inline int wait_for_bit_change(const struct dsi_reg idx, int bitnum, @@ -3002,8 +3003,6 @@ static int dsi_update_thread(void *data) u16 x, y, w, h; while (1) { - bool sched; - wait_event_interruptible(dsi.waitqueue, dsi.update_mode == OMAP_DSS_UPDATE_AUTO || (dsi.update_mode == OMAP_DSS_UPDATE_MANUAL && @@ -3089,16 +3088,9 @@ static int dsi_update_thread(void *data) dsi_perf_show("L4"); } - sched = atomic_read(&dsi.bus_lock.count) < 0; - complete_all(&dsi.update_completion); dsi_bus_unlock(); - - /* XXX We need to give others chance to get the bus lock. Is - * there a better way for this? */ - if (dsi.update_mode == OMAP_DSS_UPDATE_AUTO && sched) - schedule_timeout_interruptible(1); } DSSDBG("update thread exiting\n"); @@ -3798,7 +3790,7 @@ int dsi_init(struct platform_device *pdev) spin_lock_init(&dsi.update_lock); mutex_init(&dsi.lock); - mutex_init(&dsi.bus_lock); + sema_init(&dsi.bus_lock, 1); #ifdef DSI_CATCH_MISSING_TE init_timer(&dsi.te_timer); |