]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
ASoC: cs530x: Calculate proper bclk rate using TDM
authorPaul Handrigan <paulha@opensource.cirrus.com>
Wed, 10 Jul 2024 16:04:15 +0000 (11:04 -0500)
committerMark Brown <broonie@kernel.org>
Wed, 10 Jul 2024 17:45:24 +0000 (18:45 +0100)
Calculate the proper bclk rate using the number of tdm slots
and the width of the tdm data.

Fixes: 2884c29152c0 ("ASoC: cs530x: Support for cs530x ADCs")
Signed-off-by: Paul Handrigan <paulha@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20240710160416.2617173-1-paulha@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/cs530x.c
sound/soc/codecs/cs530x.h

index 036d0f45e3babb067ca9ab3c12721beae4ed8b2e..195739657f4e100b4e5a51ee0d3e8765949a1f7f 100644 (file)
@@ -526,13 +526,15 @@ static int cs530x_hw_params(struct snd_pcm_substream *substream,
        regmap_update_bits(regmap, CS530X_CLK_CFG_1,
                           CS530X_SAMPLE_RATE_MASK, fs_val);
 
-       if (cs530x->tdm_slots) {
+
+       if (regmap_test_bits(regmap, CS530X_SIGNAL_PATH_CFG,
+                            CS530X_TDM_EN_MASK)) {
                dev_dbg(component->dev, "Configuring for %d %d bit TDM slots\n",
                        cs530x->tdm_slots, cs530x->tdm_width);
-               cs530x->bclk = snd_soc_calc_bclk(cs530x->fs,
-                                                cs530x->tdm_width,
-                                                params_channels(params),
-                                                cs530x->tdm_slots);
+               cs530x->bclk = snd_soc_tdm_params_to_bclk(params,
+                                                         cs530x->tdm_width,
+                                                         cs530x->tdm_slots,
+                                                         1);
        } else {
                cs530x->bclk = snd_soc_params_to_bclk(params);
        }
@@ -655,6 +657,9 @@ static int cs530x_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
                return -EINVAL;
        }
 
+       cs530x->tdm_width = slot_width;
+       cs530x->tdm_slots = slots;
+
        return regmap_update_bits(regmap, CS530X_SIGNAL_PATH_CFG,
                                  CS530X_ASP_TDM_SLOT_MASK,
                                  val << CS530X_ASP_TDM_SLOT_SHIFT);
index 1c85310a5d031468df4f298b0be187f0a50821dc..1915a0efe8290d6048f5fc9bae8fc4c6e58b7e97 100644 (file)
@@ -96,6 +96,7 @@
 #define CS530X_ASP_TDM_SLOT_MASK       GENMASK(5, 3)
 #define CS530X_ASP_TDM_SLOT_SHIFT      3
 #define CS530X_ASP_CH_REVERSE          BIT(9)
+#define CS530X_TDM_EN_MASK             BIT(2)
 #define CS530X_ASP_FMT_I2S             0
 #define CS530X_ASP_FMT_LJ              1
 #define CS530X_ASP_FMT_DSP_A           0x6