Skip to content

Commit

Permalink
ASoC: qcom: Fix for DMA interrupt clear reg overwriting
Browse files Browse the repository at this point in the history
The DMA interrupt clear register overwritten during
simultaneous playback and capture in lpass platform
interrupt handler. It's causing playback or capture stuck
in similtaneous plaback on speaker and capture on dmic test.
Update appropriate reg fields of corresponding channel instead
of entire register write.

Fixes: commit c5c8635 ("ASoC: qcom: Add LPASS platform driver")

Signed-off-by: Srinivasa Rao Mandadapu <srivasam@codeaurora.org>
Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Link: https://lore.kernel.org/r/20210609072310.26099-1-srivasam@codeaurora.org
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Srinivasa Rao Mandadapu authored and Mark Brown committed Jun 14, 2021
1 parent 116b1e1 commit da0363f
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions sound/soc/qcom/lpass-platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -526,7 +526,7 @@ static int lpass_platform_pcmops_trigger(struct snd_soc_component *component,
return -EINVAL;
}

ret = regmap_write(map, reg_irqclr, val_irqclr);
ret = regmap_update_bits(map, reg_irqclr, val_irqclr, val_irqclr);
if (ret) {
dev_err(soc_runtime->dev, "error writing to irqclear reg: %d\n", ret);
return ret;
Expand Down Expand Up @@ -650,10 +650,11 @@ static irqreturn_t lpass_dma_interrupt_handler(
struct lpass_variant *v = drvdata->variant;
irqreturn_t ret = IRQ_NONE;
int rv;
unsigned int reg = 0, val = 0;
unsigned int reg, val, mask;
struct regmap *map;
unsigned int dai_id = cpu_dai->driver->id;

mask = LPAIF_IRQ_ALL(chan);
switch (dai_id) {
case LPASS_DP_RX:
map = drvdata->hdmiif_map;
Expand All @@ -676,8 +677,7 @@ static irqreturn_t lpass_dma_interrupt_handler(
return -EINVAL;
}
if (interrupts & LPAIF_IRQ_PER(chan)) {

rv = regmap_write(map, reg, LPAIF_IRQ_PER(chan) | val);
rv = regmap_update_bits(map, reg, mask, (LPAIF_IRQ_PER(chan) | val));
if (rv) {
dev_err(soc_runtime->dev,
"error writing to irqclear reg: %d\n", rv);
Expand All @@ -688,7 +688,7 @@ static irqreturn_t lpass_dma_interrupt_handler(
}

if (interrupts & LPAIF_IRQ_XRUN(chan)) {
rv = regmap_write(map, reg, LPAIF_IRQ_XRUN(chan) | val);
rv = regmap_update_bits(map, reg, mask, (LPAIF_IRQ_XRUN(chan) | val));
if (rv) {
dev_err(soc_runtime->dev,
"error writing to irqclear reg: %d\n", rv);
Expand All @@ -700,7 +700,7 @@ static irqreturn_t lpass_dma_interrupt_handler(
}

if (interrupts & LPAIF_IRQ_ERR(chan)) {
rv = regmap_write(map, reg, LPAIF_IRQ_ERR(chan) | val);
rv = regmap_update_bits(map, reg, mask, (LPAIF_IRQ_ERR(chan) | val));
if (rv) {
dev_err(soc_runtime->dev,
"error writing to irqclear reg: %d\n", rv);
Expand Down

0 comments on commit da0363f

Please sign in to comment.