ASoC: rt1308-sdw: add set_tdm_slot() support
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Wed, 25 Mar 2020 21:29:04 +0000 (16:29 -0500)
committerMark Brown <broonie@kernel.org>
Thu, 26 Mar 2020 18:48:08 +0000 (18:48 +0000)
Add ability to select which of the channels is used, or both, in case
two RT1308 amplifiers are located on the same link.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20200325212905.28145-2-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/rt1308-sdw.c
sound/soc/codecs/rt1308-sdw.h

index d930f60..8763192 100644 (file)
@@ -507,6 +507,28 @@ static void rt1308_sdw_shutdown(struct snd_pcm_substream *substream,
        kfree(stream);
 }
 
+static int rt1308_sdw_set_tdm_slot(struct snd_soc_dai *dai,
+                                  unsigned int tx_mask,
+                                  unsigned int rx_mask,
+                                  int slots, int slot_width)
+{
+       struct snd_soc_component *component = dai->component;
+       struct rt1308_sdw_priv *rt1308 =
+               snd_soc_component_get_drvdata(component);
+
+       if (tx_mask)
+               return -EINVAL;
+
+       if (slots > 2)
+               return -EINVAL;
+
+       rt1308->rx_mask = rx_mask;
+       rt1308->slots = slots;
+       /* slot_width is not used since it's irrelevant for SoundWire */
+
+       return 0;
+}
+
 static int rt1308_sdw_hw_params(struct snd_pcm_substream *substream,
        struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
 {
@@ -597,6 +619,7 @@ static const struct snd_soc_dai_ops rt1308_aif_dai_ops = {
        .hw_free        = rt1308_sdw_pcm_hw_free,
        .set_sdw_stream = rt1308_set_sdw_stream,
        .shutdown       = rt1308_sdw_shutdown,
+       .set_tdm_slot   = rt1308_sdw_set_tdm_slot,
 };
 
 #define RT1308_STEREO_RATES SNDRV_PCM_RATE_48000
index c9341e7..c5ce756 100644 (file)
@@ -160,6 +160,8 @@ struct rt1308_sdw_priv {
        struct sdw_bus_params params;
        bool hw_init;
        bool first_hw_init;
+       int rx_mask;
+       int slots;
 };
 
 struct sdw_stream_data {