lkml.org 
[lkml]   [2019]   [Feb]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/7] ASoC: stm32: i2s: fix IRQ clearing
    Date
    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>
    ---
    sound/soc/stm/stm32_i2s.c | 13 ++++++-------
    1 file changed, 6 insertions(+), 7 deletions(-)

    diff --git a/sound/soc/stm/stm32_i2s.c b/sound/soc/stm/stm32_i2s.c
    index a25919d32187..339cd4715b2e 100644
    --- a/sound/soc/stm/stm32_i2s.c
    +++ b/sound/soc/stm/stm32_i2s.c
    @@ -247,8 +247,8 @@ static irqreturn_t stm32_i2s_isr(int irq, void *devid)
    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");
    @@ -277,7 +277,6 @@ static bool stm32_i2s_readable_reg(struct device *dev, unsigned int reg)
    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:
    @@ -559,8 +558,8 @@ static int stm32_i2s_startup(struct snd_pcm_substream *substream,
    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,
    @@ -611,8 +610,8 @@ static int stm32_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
    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;
    --
    2.7.4
    \
     
     \ /
      Last update: 2019-02-26 14:52    [W:2.639 / U:0.124 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site