| From 8ba3c5215d69c09f5c39783ff3b78347769822ad Mon Sep 17 00:00:00 2001 |
| From: Olivier Moysan <olivier.moysan@st.com> |
| Date: Tue, 26 Feb 2019 14:51:04 +0100 |
| Subject: ASoC: stm32: i2s: fix IRQ clearing |
| |
| From: Olivier Moysan <olivier.moysan@st.com> |
| |
| commit 8ba3c5215d69c09f5c39783ff3b78347769822ad upstream. |
| |
| Because of regmap cache, interrupts may not be cleared |
| as expected. |
| Declare IFCR register as write only and make writings |
| to IFCR register unconditional. |
| |
| Signed-off-by: Olivier Moysan <olivier.moysan@st.com> |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/soc/stm/stm32_i2s.c | 13 ++++++------- |
| 1 file changed, 6 insertions(+), 7 deletions(-) |
| |
| --- a/sound/soc/stm/stm32_i2s.c |
| +++ b/sound/soc/stm/stm32_i2s.c |
| @@ -246,8 +246,8 @@ static irqreturn_t stm32_i2s_isr(int irq |
| return IRQ_NONE; |
| } |
| |
| - regmap_update_bits(i2s->regmap, STM32_I2S_IFCR_REG, |
| - I2S_IFCR_MASK, flags); |
| + regmap_write_bits(i2s->regmap, STM32_I2S_IFCR_REG, |
| + I2S_IFCR_MASK, flags); |
| |
| if (flags & I2S_SR_OVR) { |
| dev_dbg(&pdev->dev, "Overrun\n"); |
| @@ -276,7 +276,6 @@ static bool stm32_i2s_readable_reg(struc |
| case STM32_I2S_CFG2_REG: |
| case STM32_I2S_IER_REG: |
| case STM32_I2S_SR_REG: |
| - case STM32_I2S_IFCR_REG: |
| case STM32_I2S_TXDR_REG: |
| case STM32_I2S_RXDR_REG: |
| case STM32_I2S_CGFR_REG: |
| @@ -547,8 +546,8 @@ static int stm32_i2s_startup(struct snd_ |
| i2s->refcount++; |
| spin_unlock(&i2s->lock_fd); |
| |
| - return regmap_update_bits(i2s->regmap, STM32_I2S_IFCR_REG, |
| - I2S_IFCR_MASK, I2S_IFCR_MASK); |
| + return regmap_write_bits(i2s->regmap, STM32_I2S_IFCR_REG, |
| + I2S_IFCR_MASK, I2S_IFCR_MASK); |
| } |
| |
| static int stm32_i2s_hw_params(struct snd_pcm_substream *substream, |
| @@ -603,8 +602,8 @@ static int stm32_i2s_trigger(struct snd_ |
| return ret; |
| } |
| |
| - regmap_update_bits(i2s->regmap, STM32_I2S_IFCR_REG, |
| - I2S_IFCR_MASK, I2S_IFCR_MASK); |
| + regmap_write_bits(i2s->regmap, STM32_I2S_IFCR_REG, |
| + I2S_IFCR_MASK, I2S_IFCR_MASK); |
| |
| if (playback_flg) { |
| ier = I2S_IER_UDRIE; |