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 <rphani@codeaurora.org>
This commit is contained in:
parent
9b82a4c589
commit
db91b2eba7
1 changed files with 3 additions and 0 deletions
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue