ASoC: meson: axg-tdm: restrict formats depending on slot width
authorJerome Brunet <jbrunet@baylibre.com>
Mon, 27 Aug 2018 14:21:07 +0000 (16:21 +0200)
committerMark Brown <broonie@kernel.org>
Tue, 28 Aug 2018 18:53:35 +0000 (19:53 +0100)
Restrict the formats possible on the TDM interface depending on the width
of the TDM slot and let dpcm merging do the rest.

Fixes: d60e4f1e4be5 ("ASoC: meson: add tdm interface driver")
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/meson/axg-tdm-interface.c

index 7b8baf46d9689f43bf592052a65d7506c97cd42b..585ce030b79b65aa53cd4f4b39c0d2edb17d2287 100644 (file)
@@ -42,6 +42,7 @@ int axg_tdm_set_tdm_slots(struct snd_soc_dai *dai, u32 *tx_mask,
        struct axg_tdm_stream *rx = (struct axg_tdm_stream *)
                dai->capture_dma_data;
        unsigned int tx_slots, rx_slots;
+       unsigned int fmt = 0;
 
        tx_slots = axg_tdm_slots_total(tx_mask);
        rx_slots = axg_tdm_slots_total(rx_mask);
@@ -52,38 +53,45 @@ int axg_tdm_set_tdm_slots(struct snd_soc_dai *dai, u32 *tx_mask,
                return -EINVAL;
        }
 
-       /*
-        * Amend the dai driver channel number and let dpcm channel merge do
-        * its job
-        */
-       if (tx) {
-               tx->mask = tx_mask;
-               dai->driver->playback.channels_max = tx_slots;
-       }
-
-       if (rx) {
-               rx->mask = rx_mask;
-               dai->driver->capture.channels_max = rx_slots;
-       }
-
        iface->slots = slots;
 
        switch (slot_width) {
        case 0:
-               /* defaults width to 32 if not provided */
-               iface->slot_width = 32;
-               break;
-       case 8:
-       case 16:
-       case 24:
+               slot_width = 32;
+               /* Fall-through */
        case 32:
-               iface->slot_width = slot_width;
+               fmt |= SNDRV_PCM_FMTBIT_S32_LE;
+               /* Fall-through */
+       case 24:
+               fmt |= SNDRV_PCM_FMTBIT_S24_LE;
+               fmt |= SNDRV_PCM_FMTBIT_S20_LE;
+               /* Fall-through */
+       case 16:
+               fmt |= SNDRV_PCM_FMTBIT_S16_LE;
+               /* Fall-through */
+       case 8:
+               fmt |= SNDRV_PCM_FMTBIT_S8;
                break;
        default:
                dev_err(dai->dev, "unsupported slot width: %d\n", slot_width);
                return -EINVAL;
        }
 
+       iface->slot_width = slot_width;
+
+       /* Amend the dai driver and let dpcm merge do its job */
+       if (tx) {
+               tx->mask = tx_mask;
+               dai->driver->playback.channels_max = tx_slots;
+               dai->driver->playback.formats = fmt;
+       }
+
+       if (rx) {
+               rx->mask = rx_mask;
+               dai->driver->capture.channels_max = rx_slots;
+               dai->driver->capture.formats = fmt;
+       }
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(axg_tdm_set_tdm_slots);