[PATCH] ASoC: qcom: lpass-platform: Reset irq clear reg post handling interrupts
Update interrupt clear register with reset value after addressing all interrupts. This is to fix playback or capture hanging issue in simultaneous playback and capture usecase.
Signed-off-by: Srinivasa Rao Mandadapu srivasam@codeaurora.org --- sound/soc/qcom/lpass-platform.c | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/sound/soc/qcom/lpass-platform.c b/sound/soc/qcom/lpass-platform.c index f9df76d37858..1a0a4b0b1a03 100644 --- a/sound/soc/qcom/lpass-platform.c +++ b/sound/soc/qcom/lpass-platform.c @@ -749,6 +749,12 @@ static irqreturn_t lpass_platform_lpaif_irq(int irq, void *data) } }
+ rv = regmap_write(drvdata->lpaif_map, LPAIF_IRQCLEAR_REG(v, LPAIF_IRQ_PORT_HOST), 0x0); + if (rv) { + pr_err("error writing to irqstat reg: %d\n", rv); + return IRQ_NONE; + } + return IRQ_HANDLED; }
Quoting Srinivasa Rao Mandadapu (2021-09-03 03:01:53)
Update interrupt clear register with reset value after addressing all interrupts. This is to fix playback or capture hanging issue in simultaneous playback and capture usecase.
Signed-off-by: Srinivasa Rao Mandadapu srivasam@codeaurora.org
Any Fixes tag?
sound/soc/qcom/lpass-platform.c | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/sound/soc/qcom/lpass-platform.c b/sound/soc/qcom/lpass-platform.c index f9df76d37858..1a0a4b0b1a03 100644 --- a/sound/soc/qcom/lpass-platform.c +++ b/sound/soc/qcom/lpass-platform.c @@ -749,6 +749,12 @@ static irqreturn_t lpass_platform_lpaif_irq(int irq, void *data) } }
rv = regmap_write(drvdata->lpaif_map, LPAIF_IRQCLEAR_REG(v, LPAIF_IRQ_PORT_HOST), 0x0);
if (rv) {
pr_err("error writing to irqstat reg: %d\n", rv);
return IRQ_NONE;
I was thinking we should return IRQ_HANDLED still, but then I guess failing to clear the irq be treated as a spurious irq so that if we fail enough times we'll shut off the irq at the irqchip. Things are going bad if the write fails.
}
return IRQ_HANDLED;
}
Thanks for Your time Stephen!!
On 9/4/2021 12:10 AM, Stephen Boyd wrote:
Quoting Srinivasa Rao Mandadapu (2021-09-03 03:01:53)
Update interrupt clear register with reset value after addressing all interrupts. This is to fix playback or capture hanging issue in simultaneous playback and capture usecase.
Signed-off-by: Srinivasa Rao Mandadapu srivasam@codeaurora.org
Any Fixes tag?
Actually it's incremental change. I will add base commit of this function.
sound/soc/qcom/lpass-platform.c | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/sound/soc/qcom/lpass-platform.c b/sound/soc/qcom/lpass-platform.c index f9df76d37858..1a0a4b0b1a03 100644 --- a/sound/soc/qcom/lpass-platform.c +++ b/sound/soc/qcom/lpass-platform.c @@ -749,6 +749,12 @@ static irqreturn_t lpass_platform_lpaif_irq(int irq, void *data) } }
rv = regmap_write(drvdata->lpaif_map, LPAIF_IRQCLEAR_REG(v, LPAIF_IRQ_PORT_HOST), 0x0);
if (rv) {
pr_err("error writing to irqstat reg: %d\n", rv);
return IRQ_NONE;
I was thinking we should return IRQ_HANDLED still, but then I guess failing to clear the irq be treated as a spurious irq so that if we fail enough times we'll shut off the irq at the irqchip. Things are going bad if the write fails.
Here bit confusing. Could You please suggest How to go ahead on this?
}
}return IRQ_HANDLED;
Quoting Srinivasa Rao Mandadapu (2021-09-06 06:35:46)
Thanks for Your time Stephen!!
On 9/4/2021 12:10 AM, Stephen Boyd wrote:
Quoting Srinivasa Rao Mandadapu (2021-09-03 03:01:53)
Update interrupt clear register with reset value after addressing all interrupts. This is to fix playback or capture hanging issue in simultaneous playback and capture usecase.
Signed-off-by: Srinivasa Rao Mandadapu srivasam@codeaurora.org
Any Fixes tag?
Actually it's incremental change. I will add base commit of this function.
Ok.
sound/soc/qcom/lpass-platform.c | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/sound/soc/qcom/lpass-platform.c b/sound/soc/qcom/lpass-platform.c index f9df76d37858..1a0a4b0b1a03 100644 --- a/sound/soc/qcom/lpass-platform.c +++ b/sound/soc/qcom/lpass-platform.c @@ -749,6 +749,12 @@ static irqreturn_t lpass_platform_lpaif_irq(int irq, void *data) } }
rv = regmap_write(drvdata->lpaif_map, LPAIF_IRQCLEAR_REG(v, LPAIF_IRQ_PORT_HOST), 0x0);
if (rv) {
pr_err("error writing to irqstat reg: %d\n", rv);
return IRQ_NONE;
I was thinking we should return IRQ_HANDLED still, but then I guess failing to clear the irq be treated as a spurious irq so that if we fail enough times we'll shut off the irq at the irqchip. Things are going bad if the write fails.
Here bit confusing. Could You please suggest How to go ahead on this?
Sorry. I think it is fine as is.
participants (2)
-
Srinivasa Rao Mandadapu
-
Stephen Boyd