Move counter handling to trigger start section
to manage multiple start/stop events.

Signed-off-by: Olivier Moysan <olivier.moy...@st.com>
---
 sound/soc/stm/stm32_i2s.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/sound/soc/stm/stm32_i2s.c b/sound/soc/stm/stm32_i2s.c
index 7d4c67433916..7f56d7b51ba3 100644
--- a/sound/soc/stm/stm32_i2s.c
+++ b/sound/soc/stm/stm32_i2s.c
@@ -554,10 +554,6 @@ static int stm32_i2s_startup(struct snd_pcm_substream 
*substream,
                return ret;
        }
 
-       spin_lock(&i2s->lock_fd);
-       i2s->refcount++;
-       spin_unlock(&i2s->lock_fd);
-
        return regmap_write_bits(i2s->regmap, STM32_I2S_IFCR_REG,
                                 I2S_IFCR_MASK, I2S_IFCR_MASK);
 }
@@ -613,18 +609,19 @@ static int stm32_i2s_trigger(struct snd_pcm_substream 
*substream, int cmd,
                regmap_write_bits(i2s->regmap, STM32_I2S_IFCR_REG,
                                  I2S_IFCR_MASK, I2S_IFCR_MASK);
 
+               spin_lock(&i2s->lock_fd);
+               i2s->refcount++;
                if (playback_flg) {
                        ier = I2S_IER_UDRIE;
                } else {
                        ier = I2S_IER_OVRIE;
 
-                       spin_lock(&i2s->lock_fd);
                        if (i2s->refcount == 1)
                                /* dummy write to trigger capture */
                                regmap_write(i2s->regmap,
                                             STM32_I2S_TXDR_REG, 0);
-                       spin_unlock(&i2s->lock_fd);
                }
+               spin_unlock(&i2s->lock_fd);
 
                if (STM32_I2S_IS_SLAVE(i2s))
                        ier |= I2S_IER_TIFREIE;
@@ -649,7 +646,6 @@ static int stm32_i2s_trigger(struct snd_pcm_substream 
*substream, int cmd,
                        spin_unlock(&i2s->lock_fd);
                        break;
                }
-               spin_unlock(&i2s->lock_fd);
 
                dev_dbg(cpu_dai->dev, "stop I2S\n");
 
@@ -657,8 +653,10 @@ static int stm32_i2s_trigger(struct snd_pcm_substream 
*substream, int cmd,
                                         I2S_CR1_SPE, 0);
                if (ret < 0) {
                        dev_err(cpu_dai->dev, "Error %d disabling I2S\n", ret);
+                       spin_unlock(&i2s->lock_fd);
                        return ret;
                }
+               spin_unlock(&i2s->lock_fd);
 
                cfg1_mask = I2S_CFG1_RXDMAEN | I2S_CFG1_TXDMAEN;
                regmap_update_bits(i2s->regmap, STM32_I2S_CFG1_REG,
-- 
2.7.4

Reply via email to