From db91b2eba72dc11f6e6d8f83a016c11e75d532a6 Mon Sep 17 00:00:00 2001 From: Rama Krishna Phani A Date: Mon, 12 Sep 2016 18:34:18 +0530 Subject: [PATCH] msm: sps: Avoid pipe disconnect while IRQ is in progress and viceversa Client driver may disconnect pipe while some data is still pending on the pipe and might not need IRQ for that data. Current implementation might result in crash in case disconnect and IRQ happens on same pipe in parallel. Implement lock to avoid pipe disconnect while IRQ is in progress for that pipe and viceversa. Change-Id: Icf43c0a18cfc1644270b684a792632a6c81f1797 Signed-off-by: Rama Krishna Phani A --- drivers/platform/msm/sps/sps_bam.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/platform/msm/sps/sps_bam.c b/drivers/platform/msm/sps/sps_bam.c index f34242f29e2b..38a6474dd06f 100644 --- a/drivers/platform/msm/sps/sps_bam.c +++ b/drivers/platform/msm/sps/sps_bam.c @@ -1083,6 +1083,7 @@ int sps_bam_pipe_disconnect(struct sps_bam *dev, u32 pipe_index) { struct sps_pipe *pipe; int result; + unsigned long flags; if (pipe_index >= dev->props.num_pipes) { SPS_ERR(dev, "sps:Invalid BAM %pa pipe: %d\n", BAM_ID(dev), @@ -1094,8 +1095,10 @@ int sps_bam_pipe_disconnect(struct sps_bam *dev, u32 pipe_index) pipe = dev->pipes[pipe_index]; if (BAM_PIPE_IS_ASSIGNED(pipe)) { if ((dev->pipe_active_mask & (1UL << pipe_index))) { + spin_lock_irqsave(&dev->isr_lock, flags); list_del(&pipe->list); dev->pipe_active_mask &= ~(1UL << pipe_index); + spin_unlock_irqrestore(&dev->isr_lock, flags); } dev->pipe_remote_mask &= ~(1UL << pipe_index); if (pipe->connect.options & SPS_O_NO_DISABLE)