summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKrishnankutty Kolathappilly <kkolatha@codeaurora.org>2015-10-27 10:31:20 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:12:40 -0700
commita309c04c54d0164eeaa5c41780f3a4da137c2b5f (patch)
treec1d9cd5487b6d91756103ab14d32dea7500c8106
parentb789d4375ed29574852db56ec66fdc50ef7e3dbb (diff)
msm: cpp: Synchronize tasklet and timeout work queue
CPP driver times out for a particular frame. Interrupt for a particular frame is received after timeout. Tasklet is initiated but not scheduled. Timeout sequence reloads the firmware. Before frame is rescheduled from timeout, tasklet is scheduled and frame is removed from queue. Null pointer dereference occurs when timeout tries to schedule a frame that is removed from queue. Ensure any pending scheduled events on tasklet is executed before time out sequence reload firmware and reschedules the frame. CRs-Fixed: 928854 Change-Id: I6b6fb55fcdfea936456ad1dd81082f19b3825c9c Signed-off-by: Krishnankutty Kolathappilly <kkolatha@codeaurora.org>
-rw-r--r--drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c
index b529812f13b9..2b44058ac98e 100644
--- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c
+++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c
@@ -1758,9 +1758,17 @@ static void msm_cpp_do_timeout_work(struct work_struct *work)
disable_irq(cpp_timer.data.cpp_dev->irq->start);
+ /* make sure all the pending queued entries are scheduled */
+ tasklet_kill(&cpp_dev->cpp_tasklet);
queue = &cpp_timer.data.cpp_dev->processing_q;
queue_len = queue->len;
+ if (!queue_len) {
+ pr_err("%s:%d: irq serviced after timeout.Ignore timeout\n",
+ __func__, __LINE__);
+ msm_cpp_set_micro_irq_mask(cpp_dev, 1, 0x8);
+ goto end;
+ }
pr_debug("Reloading firmware %d\n", queue_len);
rc = cpp_load_fw(cpp_timer.data.cpp_dev,