From a7a5f36fe21b6f033f39a015211bc6c418998900 Mon Sep 17 00:00:00 2001 From: Naseer Ahmed <naseer@codeaurora.org> Date: Mon, 24 Nov 2014 21:05:16 -0500 Subject: [PATCH] Rotator getting stuck leading to fence timeout Even though cancel_delayed_work should cancel the worker thread in some race condition it can fail and get scheduled. To avoid this situation use cancel_delayed_work_sync. Also rotator_lock mutex need not be unlocked while waiting for isr as isr does not aquire this mutex for doing its operations. It is after this unlock of mutex sometimes in race condition rotator clock is getting disabled via the msm_rotator_rot_clk_work_f Conflicts: drivers/char/msm_rotator.c Change-Id: I5405f2c4d9505c1b288d1f1ac3d9892955306f87 Signed-off-by: Justin Philip <jphili@codeaurora.org> Signed-off-by: Naseer Ahmed <naseer@codeaurora.org> --- drivers/char/msm_rotator.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/char/msm_rotator.c b/drivers/char/msm_rotator.c index 03ad5b72745b..fda5c8dfa6b8 100644 --- a/drivers/char/msm_rotator.c +++ b/drivers/char/msm_rotator.c @@ -319,7 +319,7 @@ int msm_rotator_imem_allocate(int requestor) rc = 1; #endif if (rc == 1) { - cancel_delayed_work(&msm_rotator_dev->imem_clk_work); + cancel_delayed_work_sync(&msm_rotator_dev->imem_clk_work); if (msm_rotator_dev->imem_clk_state != CLK_EN && msm_rotator_dev->imem_clk) { clk_prepare_enable(msm_rotator_dev->imem_clk); @@ -1556,7 +1556,7 @@ static int msm_rotator_do_rotate_sub( msm_rotator_wait_for_fence(commit_info->acq_fen); commit_info->acq_fen = NULL; - cancel_delayed_work(&msm_rotator_dev->rot_clk_work); + cancel_delayed_work_sync(&msm_rotator_dev->rot_clk_work); if (msm_rotator_dev->rot_clk_state != CLK_EN) { enable_rot_clks(); msm_rotator_dev->rot_clk_state = CLK_EN; @@ -1654,10 +1654,8 @@ static int msm_rotator_do_rotate_sub( msm_rotator_dev->processing = 1; iowrite32(0x1, MSM_ROTATOR_START); - mutex_unlock(&msm_rotator_dev->rotator_lock); wait_event(msm_rotator_dev->wq, (msm_rotator_dev->processing == 0)); - mutex_lock(&msm_rotator_dev->rotator_lock); status = (unsigned char)ioread32(MSM_ROTATOR_INTR_STATUS); if ((status & 0x03) != 0x01) { pr_err("%s(): AXI Bus Error, issuing SW_RESET\n", __func__); -- GitLab