89 lines
2.9 KiB
Diff
89 lines
2.9 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Marcus Cooper <codekipper@gmail.com>
|
|
Date: Fri, 30 Oct 2020 15:46:38 +0100
|
|
Subject: [PATCH] ASoC: sun4i-i2s: Set sign extend sample
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
On the newer SoCs such as the H3 and A64 this is set by default
|
|
to transfer a 0 after each sample in each slot. However the A10
|
|
and A20 SoCs that this driver was developed on had a default
|
|
setting where it padded the audio gain with zeros.
|
|
|
|
This isn't a problem while we have only support for 16bit audio
|
|
but with larger sample resolution rates in the pipeline then SEXT
|
|
bits should be cleared so that they also pad at the LSB. Without
|
|
this the audio gets distorted.
|
|
|
|
Set sign extend sample for all the sunxi generations even if they
|
|
are not affected. This will keep consistency and avoid relying on
|
|
default.
|
|
|
|
Signed-off-by: Marcus Cooper <codekipper@gmail.com>
|
|
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-6-peron.clem@gmail.com
|
|
Signed-off-by: Mark Brown <broonie@kernel.org>
|
|
---
|
|
sound/soc/sunxi/sun4i-i2s.c | 17 +++++++++++++++++
|
|
1 file changed, 17 insertions(+)
|
|
|
|
diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c
|
|
index 6ee9c2995b4f..46e4da18c27f 100644
|
|
--- a/sound/soc/sunxi/sun4i-i2s.c
|
|
+++ b/sound/soc/sunxi/sun4i-i2s.c
|
|
@@ -48,6 +48,9 @@
|
|
#define SUN4I_I2S_FMT0_FMT_I2S (0 << 0)
|
|
|
|
#define SUN4I_I2S_FMT1_REG 0x08
|
|
+#define SUN4I_I2S_FMT1_REG_SEXT_MASK BIT(8)
|
|
+#define SUN4I_I2S_FMT1_REG_SEXT(sext) ((sext) << 8)
|
|
+
|
|
#define SUN4I_I2S_FIFO_TX_REG 0x0c
|
|
#define SUN4I_I2S_FIFO_RX_REG 0x10
|
|
|
|
@@ -105,6 +108,9 @@
|
|
#define SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED (1 << 7)
|
|
#define SUN8I_I2S_FMT0_BCLK_POLARITY_NORMAL (0 << 7)
|
|
|
|
+#define SUN8I_I2S_FMT1_REG_SEXT_MASK GENMASK(5, 4)
|
|
+#define SUN8I_I2S_FMT1_REG_SEXT(sext) ((sext) << 4)
|
|
+
|
|
#define SUN8I_I2S_INT_STA_REG 0x0c
|
|
#define SUN8I_I2S_FIFO_TX_REG 0x20
|
|
|
|
@@ -686,6 +692,7 @@ static int sun4i_i2s_set_soc_fmt(const struct sun4i_i2s *i2s,
|
|
}
|
|
regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG,
|
|
SUN4I_I2S_CTRL_MODE_MASK, val);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
@@ -788,6 +795,11 @@ static int sun8i_i2s_set_soc_fmt(const struct sun4i_i2s *i2s,
|
|
SUN8I_I2S_CTRL_BCLK_OUT | SUN8I_I2S_CTRL_LRCK_OUT,
|
|
val);
|
|
|
|
+ /* Set sign extension to pad out LSB with 0 */
|
|
+ regmap_update_bits(i2s->regmap, SUN4I_I2S_FMT1_REG,
|
|
+ SUN8I_I2S_FMT1_REG_SEXT_MASK,
|
|
+ SUN8I_I2S_FMT1_REG_SEXT(0));
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
@@ -890,6 +902,11 @@ static int sun50i_h6_i2s_set_soc_fmt(const struct sun4i_i2s *i2s,
|
|
SUN8I_I2S_CTRL_BCLK_OUT | SUN8I_I2S_CTRL_LRCK_OUT,
|
|
val);
|
|
|
|
+ /* Set sign extension to pad out LSB with 0 */
|
|
+ regmap_update_bits(i2s->regmap, SUN4I_I2S_FMT1_REG,
|
|
+ SUN8I_I2S_FMT1_REG_SEXT_MASK,
|
|
+ SUN8I_I2S_FMT1_REG_SEXT(0));
|
|
+
|
|
return 0;
|
|
}
|
|
|