ASoC: ab8500-codec: Set tx dai slots from tx_mask
authorFabio Baltieri <fabio.baltieri@linaro.org>
Tue, 21 May 2013 10:04:08 +0000 (12:04 +0200)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 21 May 2013 16:35:17 +0000 (11:35 -0500)
Replace hard-coded tx slot numbers from ab8500_codec_set_dai_tdm_slot
using the ones requested by the machine driver in tx_mask instead.

Signed-off-by: Fabio Baltieri <fabio.baltieri@linaro.org>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/codecs/ab8500-codec.c
sound/soc/codecs/ab8500-codec.h

index 3126cac7b7c8ce5b3d1d44ba3714f8c91e03c49a..bace321a83ddcc71797a0d09c59454ce025506a2 100644 (file)
@@ -2236,7 +2236,7 @@ static int ab8500_codec_set_dai_tdm_slot(struct snd_soc_dai *dai,
                int slots, int slot_width)
 {
        struct snd_soc_codec *codec = dai->codec;
-       unsigned int val, mask, slots_active;
+       unsigned int val, mask, slot, slots_active;
 
        mask = BIT(AB8500_DIGIFCONF2_IF0WL0) |
                BIT(AB8500_DIGIFCONF2_IF0WL1);
@@ -2292,27 +2292,34 @@ static int ab8500_codec_set_dai_tdm_slot(struct snd_soc_dai *dai,
        snd_soc_update_bits(codec, AB8500_DIGIFCONF1, mask, val);
 
        /* Setup TDM DA according to active tx slots */
+
+       if (tx_mask & ~0xff)
+               return -EINVAL;
+
        mask = AB8500_DASLOTCONFX_SLTODAX_MASK;
+       tx_mask = tx_mask << AB8500_DA_DATA0_OFFSET;
        slots_active = hweight32(tx_mask);
+
        dev_dbg(dai->codec->dev, "%s: Slots, active, TX: %d\n", __func__,
                slots_active);
+
        switch (slots_active) {
        case 0:
                break;
        case 1:
-               /* Slot 9 -> DA_IN1 & DA_IN3 */
-               snd_soc_update_bits(codec, AB8500_DASLOTCONF1, mask, 11);
-               snd_soc_update_bits(codec, AB8500_DASLOTCONF3, mask, 11);
-               snd_soc_update_bits(codec, AB8500_DASLOTCONF2, mask, 11);
-               snd_soc_update_bits(codec, AB8500_DASLOTCONF4, mask, 11);
+               slot = find_first_bit((unsigned long *)&tx_mask, 32);
+               snd_soc_update_bits(codec, AB8500_DASLOTCONF1, mask, slot);
+               snd_soc_update_bits(codec, AB8500_DASLOTCONF3, mask, slot);
+               snd_soc_update_bits(codec, AB8500_DASLOTCONF2, mask, slot);
+               snd_soc_update_bits(codec, AB8500_DASLOTCONF4, mask, slot);
                break;
        case 2:
-               /* Slot 9 -> DA_IN1 & DA_IN3, Slot 11 -> DA_IN2 & DA_IN4 */
-               snd_soc_update_bits(codec, AB8500_DASLOTCONF1, mask, 9);
-               snd_soc_update_bits(codec, AB8500_DASLOTCONF3, mask, 9);
-               snd_soc_update_bits(codec, AB8500_DASLOTCONF2, mask, 11);
-               snd_soc_update_bits(codec, AB8500_DASLOTCONF4, mask, 11);
-
+               slot = find_first_bit((unsigned long *)&tx_mask, 32);
+               snd_soc_update_bits(codec, AB8500_DASLOTCONF1, mask, slot);
+               snd_soc_update_bits(codec, AB8500_DASLOTCONF3, mask, slot);
+               slot = find_next_bit((unsigned long *)&tx_mask, 32, slot + 1);
+               snd_soc_update_bits(codec, AB8500_DASLOTCONF2, mask, slot);
+               snd_soc_update_bits(codec, AB8500_DASLOTCONF4, mask, slot);
                break;
        case 8:
                dev_dbg(dai->codec->dev,
index 114f69a0c6290b43cb90ab591e02af3f14cb4f9d..4224b525cb2f95842f902cc642c0699711d151c4 100644 (file)
 #define AB8500_SUPPORTED_RATE                  (SNDRV_PCM_RATE_48000)
 #define AB8500_SUPPORTED_FMT                   (SNDRV_PCM_FMTBIT_S16_LE)
 
+/* AB8500 interface slot offset definitions */
+
+#define AB8500_AD_DATA0_OFFSET 0
+#define AB8500_DA_DATA0_OFFSET 8
+#define AB8500_AD_DATA1_OFFSET 16
+#define AB8500_DA_DATA1_OFFSET 24
+
 /* AB8500 audio bank (0x0d) register definitions */
 
 #define AB8500_POWERUP                         0x00
This page took 0.027973 seconds and 5 git commands to generate.