130 lines
4.5 KiB
Diff
130 lines
4.5 KiB
Diff
From 9af236e5480129ba288a66c71f6e6e0cb025c81a Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Cl=C3=A9ment=20P=C3=A9ron?= <peron.clem@gmail.com>
|
|
Date: Sun, 27 Sep 2020 21:28:54 +0200
|
|
Subject: [PATCH 257/323] ASoC: sun4i-i2s: Change set_chan_cfg() params
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
As slots and slot_width can be overwritter in case set_tdm() is
|
|
called. Avoid to have this logic in set_chan_cfg().
|
|
|
|
Instead pass the required values as params to set_chan_cfg().
|
|
|
|
This will also avoid a bug when we will enable 20/24bits support,
|
|
i2s->slot_width is not actually used in the lrck_period computation.
|
|
|
|
Suggested-by: Samuel Holland <samuel@sholland.org>
|
|
Signed-off-by: Clément Péron <peron.clem@gmail.com>
|
|
---
|
|
sound/soc/sunxi/sun4i-i2s.c | 36 ++++++++++++++----------------------
|
|
1 file changed, 14 insertions(+), 22 deletions(-)
|
|
|
|
diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c
|
|
index 6d4fe8a0a..249b8acd9 100644
|
|
--- a/sound/soc/sunxi/sun4i-i2s.c
|
|
+++ b/sound/soc/sunxi/sun4i-i2s.c
|
|
@@ -177,8 +177,9 @@ struct sun4i_i2s_quirks {
|
|
unsigned long (*get_bclk_parent_rate)(const struct sun4i_i2s *);
|
|
s8 (*get_sr)(const struct sun4i_i2s *, int);
|
|
s8 (*get_wss)(const struct sun4i_i2s *, int);
|
|
- int (*set_chan_cfg)(const struct sun4i_i2s *,
|
|
- const struct snd_pcm_hw_params *);
|
|
+ int (*set_chan_cfg)(const struct sun4i_i2s *i2s,
|
|
+ unsigned int channels, unsigned int slots,
|
|
+ unsigned int slot_width);
|
|
int (*set_fmt)(const struct sun4i_i2s *, unsigned int);
|
|
};
|
|
|
|
@@ -414,10 +415,9 @@ static s8 sun8i_i2s_get_sr_wss(const struct sun4i_i2s *i2s, int width)
|
|
}
|
|
|
|
static int sun4i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
|
|
- const struct snd_pcm_hw_params *params)
|
|
+ unsigned int channels, unsigned int slots,
|
|
+ unsigned int slot_width)
|
|
{
|
|
- unsigned int channels = params_channels(params);
|
|
-
|
|
/* Map the channels for playback and capture */
|
|
regmap_write(i2s->regmap, SUN4I_I2S_TX_CHAN_MAP_REG, 0x76543210);
|
|
regmap_write(i2s->regmap, SUN4I_I2S_RX_CHAN_MAP_REG, 0x00003210);
|
|
@@ -434,15 +434,11 @@ static int sun4i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
|
|
}
|
|
|
|
static int sun8i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
|
|
- const struct snd_pcm_hw_params *params)
|
|
+ unsigned int channels, unsigned int slots,
|
|
+ unsigned int slot_width)
|
|
{
|
|
- unsigned int channels = params_channels(params);
|
|
- unsigned int slots = channels;
|
|
unsigned int lrck_period;
|
|
|
|
- if (i2s->slots)
|
|
- slots = i2s->slots;
|
|
-
|
|
/* Map the channels for playback and capture */
|
|
regmap_write(i2s->regmap, SUN8I_I2S_TX_CHAN_MAP_REG, 0x76543210);
|
|
regmap_write(i2s->regmap, SUN8I_I2S_RX_CHAN_MAP_REG, 0x76543210);
|
|
@@ -465,13 +461,13 @@ static int sun8i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
|
|
switch (i2s->format & SND_SOC_DAIFMT_FORMAT_MASK) {
|
|
case SND_SOC_DAIFMT_DSP_A:
|
|
case SND_SOC_DAIFMT_DSP_B:
|
|
- lrck_period = params_physical_width(params) * slots;
|
|
+ lrck_period = slot_width * slots;
|
|
break;
|
|
|
|
case SND_SOC_DAIFMT_LEFT_J:
|
|
case SND_SOC_DAIFMT_RIGHT_J:
|
|
case SND_SOC_DAIFMT_I2S:
|
|
- lrck_period = params_physical_width(params);
|
|
+ lrck_period = slot_width;
|
|
break;
|
|
|
|
default:
|
|
@@ -490,15 +486,11 @@ static int sun8i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
|
|
}
|
|
|
|
static int sun50i_h6_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
|
|
- const struct snd_pcm_hw_params *params)
|
|
+ unsigned int channels, unsigned int slots,
|
|
+ unsigned int slot_width)
|
|
{
|
|
- unsigned int channels = params_channels(params);
|
|
- unsigned int slots = channels;
|
|
unsigned int lrck_period;
|
|
|
|
- if (i2s->slots)
|
|
- slots = i2s->slots;
|
|
-
|
|
/* Map the channels for playback and capture */
|
|
regmap_write(i2s->regmap, SUN50I_H6_I2S_TX_CHAN_MAP1_REG, 0x76543210);
|
|
regmap_write(i2s->regmap, SUN50I_H6_I2S_RX_CHAN_MAP1_REG, 0x76543210);
|
|
@@ -523,11 +515,11 @@ static int sun50i_h6_i2s_set_chan_cfg(const struct sun4i_i2s *i2s,
|
|
case SND_SOC_DAIFMT_DSP_B:
|
|
case SND_SOC_DAIFMT_LEFT_J:
|
|
case SND_SOC_DAIFMT_RIGHT_J:
|
|
- lrck_period = params_physical_width(params) * slots;
|
|
+ lrck_period = slot_width * slots;
|
|
break;
|
|
|
|
case SND_SOC_DAIFMT_I2S:
|
|
- lrck_period = params_physical_width(params);
|
|
+ lrck_period = slot_width;
|
|
break;
|
|
|
|
default:
|
|
@@ -563,7 +555,7 @@ static int sun4i_i2s_hw_params(struct snd_pcm_substream *substream,
|
|
if (i2s->slot_width)
|
|
slot_width = i2s->slot_width;
|
|
|
|
- ret = i2s->variant->set_chan_cfg(i2s, params);
|
|
+ ret = i2s->variant->set_chan_cfg(i2s, channels, slots, slot_width);
|
|
if (ret < 0) {
|
|
dev_err(dai->dev, "Invalid channel configuration\n");
|
|
return ret;
|
|
--
|
|
2.34.0
|
|
|