ASoC: Add TDM mode support for max98091
Ravindra Lokhande [Wed, 17 Apr 2013 13:16:00 +0000 (18:16 +0530)]
For dual mic capture we need to use TDM mode. This is needed for
NC.

Bug 1234999

Change-Id: I03c91ac3b187f44587a27715edbc2a0a4b9fd7c8
Signed-off-by: Ravindra Lokhande <rlokhande@nvidia.com>
Reviewed-on: http://git-master/r/220208
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Sumit Bhattacharya <sumitb@nvidia.com>
Reviewed-by: Scott Peterson <speterson@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Stefano Sarghini <ssarghini@nvidia.com>

sound/soc/codecs/max98090.c
sound/soc/tegra/tegra_max98090.c

index 7e0e2fc..430d649 100644 (file)
@@ -2347,7 +2347,7 @@ static int max98090_dai_set_fmt(struct snd_soc_dai *codec_dai,
        struct snd_soc_codec *codec = codec_dai->codec;
        struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec);
        struct max98090_cdata *cdata;
-       u8 regval;
+       u8 regval = 0;
 
        max98090->dai_fmt = fmt;
        cdata = &max98090->dai[0];
@@ -2424,16 +2424,19 @@ static int max98090_dai_set_fmt(struct snd_soc_dai *codec_dai,
                        return -EINVAL;
                }
 
+               snd_soc_write(codec, M98090_REG_22_DAI_INTERFACE_FORMAT,
+                       regval);
+       }
 /*
  * This accommodates an inverted logic in the MAX98090 chip for
  * Bit Clock Invert (BCI). The inverted logic is only seen for the case
  * of TDM mode. The remaining cases have normal logic.
  */
-               if (max98090->tdm_slots > 1)
-                       regval ^= M98090_DAI_BCI_MASK;
-
+       if (max98090->tdm_slots > 1) {
+               regval = snd_soc_read(codec, M98090_REG_21_CLOCK_MAS_MODE);
+               regval ^= M98090_DAI_BCI_MASK;
                snd_soc_write(codec, M98090_REG_22_DAI_INTERFACE_FORMAT,
-                       regval);
+               regval);
        }
 
        return 0;
index e215b22..24848f1 100644 (file)
@@ -315,12 +315,6 @@ static int tegra_max98090_hw_params(struct snd_pcm_substream *substream,
 
        rate = clk_get_rate(machine->util_data.clk_cdev1);
 
-       err = snd_soc_dai_set_fmt(codec_dai, i2s_daifmt);
-       if (err < 0) {
-               dev_err(card->dev, "codec_dai fmt not set\n");
-               return err;
-       }
-
        err = snd_soc_dai_set_fmt(cpu_dai, i2s_daifmt);
        if (err < 0) {
                dev_err(card->dev, "cpu_dai fmt not set\n");
@@ -334,6 +328,20 @@ static int tegra_max98090_hw_params(struct snd_pcm_substream *substream,
                return err;
        }
 
+       if (pdata->i2s_param[HIFI_CODEC].i2s_mode == TEGRA_DAIFMT_I2S) {
+               err = snd_soc_dai_set_fmt(codec_dai, i2s_daifmt);
+               if (err < 0) {
+                       dev_err(card->dev, "codec_dai fmt not set\n");
+                       return err;
+               }
+       } else {
+               err = snd_soc_dai_set_tdm_slot(codec_dai, 3, 3, 2, sample_size);
+               if (err < 0) {
+                       dev_err(card->dev, "cpu_dai tdm mode setting not done\n");
+                       return err;
+               }
+       }
+
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
                tegra_max98090_set_dam_cif(i2s->dam_ifc, srate,
                        params_channels(params), sample_size, 0, 0, 0, 0);