ASoC: Intel: add support for configuring TDM slots for SSP
authorVinod Koul <vinod.koul@intel.com>
Wed, 6 May 2015 16:36:44 +0000 (22:06 +0530)
committerMark Brown <broonie@kernel.org>
Wed, 6 May 2015 18:50:22 +0000 (19:50 +0100)
With this machines can now configure TDM settings for SSP port using
set_tdm_slot API

Signed-off-by: Praveen Diwakar <praveen.diwakar@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/atom/sst-atom-controls.c
sound/soc/intel/atom/sst-atom-controls.h
sound/soc/intel/atom/sst-mfld-platform-pcm.c

index e024d98948fab8b22dd83bad097239b83941ea89..61e24093545115d8653b9fe51249727df45315ca 100644 (file)
@@ -774,6 +774,19 @@ int sst_handle_vb_timer(struct snd_soc_dai *dai, bool enable)
        return ret;
 }
 
+int sst_fill_ssp_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
+               unsigned int rx_mask, int slots, int slot_width)
+{
+       struct sst_data *ctx = snd_soc_dai_get_drvdata(dai);
+
+       ctx->ssp_cmd.nb_slots = slots;
+       ctx->ssp_cmd.active_tx_slot_map = tx_mask;
+       ctx->ssp_cmd.active_rx_slot_map = rx_mask;
+       ctx->ssp_cmd.nb_bits_per_slots = slot_width;
+
+       return 0;
+}
+
 static int sst_get_frame_sync_polarity(struct snd_soc_dai *dai,
                unsigned int fmt)
 {
index 53551a657b51c1bd0d1c821e67ad0a109847fc2a..93de8045d4e1ad2062e0c57f487dc1e2e1456fbb 100644 (file)
@@ -869,6 +869,8 @@ struct sst_enum {
        SOC_DAPM_ENUM(SST_MUX_CTL_NAME(xpname, xinstance), \
                          SST_SSP_MUX_ENUM(xreg, xshift, xtexts))
 
+int sst_fill_ssp_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
+                               unsigned int rx_mask, int slots, int slot_width);
 int sst_fill_ssp_config(struct snd_soc_dai *dai, unsigned int fmt);
 void sst_fill_ssp_defaults(struct snd_soc_dai *dai);
 
index 580f5e92580e1af0c8e742d5ad5971319c8b27cd..641ebe61dc08ba507ffb99c81d7ec0aa2c6d7986 100644 (file)
@@ -464,6 +464,21 @@ static int sst_set_format(struct snd_soc_dai *dai, unsigned int fmt)
        return ret;
 }
 
+static int sst_platform_set_ssp_slot(struct snd_soc_dai *dai,
+                       unsigned int tx_mask, unsigned int rx_mask,
+                       int slots, int slot_width) {
+       int ret = 0;
+
+       if (!dai->active)
+               return ret;
+
+       ret = sst_fill_ssp_slot(dai, tx_mask, rx_mask, slots, slot_width);
+       if (ret < 0)
+               dev_err(dai->dev, "sst_fill_ssp_slot failed..%d\n", ret);
+
+       return ret;
+}
+
 static void sst_disable_ssp(struct snd_pcm_substream *substream,
                        struct snd_soc_dai *dai)
 {
@@ -490,6 +505,7 @@ static struct snd_soc_dai_ops sst_be_dai_ops = {
        .startup = sst_enable_ssp,
        .hw_params = sst_be_hw_params,
        .set_fmt = sst_set_format,
+       .set_tdm_slot = sst_platform_set_ssp_slot,
        .shutdown = sst_disable_ssp,
 };