ASoC: sun4i-i2s: Fix setting of FIFO modes
authorSamuel Holland <samuel@sholland.org>
Fri, 30 Oct 2020 14:46:41 +0000 (15:46 +0100)
committerMark Brown <broonie@kernel.org>
Fri, 30 Oct 2020 17:58:56 +0000 (17:58 +0000)
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 <samuel@sholland.org>
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
Acked-by: Maxime Ripard <mripard@kernel.org>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
Link: https://lore.kernel.org/r/20201030144648.397824-9-peron.clem@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sunxi/sun4i-i2s.c

index 003610c0badffbca471fb683e0d214c57695872b..4f5cd850752d1f1ef7e33b01d0d0ec1d2f2a3502 100644 (file)
@@ -596,6 +596,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;
@@ -924,13 +931,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;