From: Samuel Holland <sam...@sholland.org>

Because SUN4I_I2S_FIFO_CTRL_REG is volatile, writes done while the
regmap is cache-only are ignored. To work around this, move the
configuration to a callback that runs while the ASoC core has a
runtime PM reference to the device.

Signed-off-by: Samuel Holland <sam...@sholland.org>
Signed-off-by: Clément Péron <peron.c...@gmail.com>
---
 sound/soc/sunxi/sun4i-i2s.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c
index 3f9110d70941..9cd6cd1cd284 100644
--- a/sound/soc/sunxi/sun4i-i2s.c
+++ b/sound/soc/sunxi/sun4i-i2s.c
@@ -586,6 +586,13 @@ static int sun4i_i2s_hw_params(struct snd_pcm_substream 
*substream,
                return ret;
        }
 
+       /* Set significant bits in our FIFOs */
+       regmap_update_bits(i2s->regmap, SUN4I_I2S_FIFO_CTRL_REG,
+                          SUN4I_I2S_FIFO_CTRL_TX_MODE_MASK |
+                          SUN4I_I2S_FIFO_CTRL_RX_MODE_MASK,
+                          SUN4I_I2S_FIFO_CTRL_TX_MODE(1) |
+                          SUN4I_I2S_FIFO_CTRL_RX_MODE(1));
+
        switch (params_physical_width(params)) {
        case 16:
                width = DMA_SLAVE_BUSWIDTH_2_BYTES;
@@ -914,13 +921,6 @@ static int sun4i_i2s_set_fmt(struct snd_soc_dai *dai, 
unsigned int fmt)
                return ret;
        }
 
-       /* Set significant bits in our FIFOs */
-       regmap_update_bits(i2s->regmap, SUN4I_I2S_FIFO_CTRL_REG,
-                          SUN4I_I2S_FIFO_CTRL_TX_MODE_MASK |
-                          SUN4I_I2S_FIFO_CTRL_RX_MODE_MASK,
-                          SUN4I_I2S_FIFO_CTRL_TX_MODE(1) |
-                          SUN4I_I2S_FIFO_CTRL_RX_MODE(1));
-
        i2s->format = fmt;
 
        return 0;
-- 
2.25.1

Reply via email to