Add support for channel selection.
[tas2770sw-android/tas2770sw-android.git] / tas2770-codec.c
index 6efab7a14d7f67c411510bc1afe67c99fc57be96..e47a024ef50660fad8b762f51813d625aaf6fcec 100644 (file)
@@ -106,7 +106,9 @@ static int tas2770_codec_suspend(struct snd_soc_codec *codec)
        mutex_lock(&pTAS2770->codec_lock);
 
        dev_dbg(pTAS2770->dev, "%s\n", __func__);
-
+       snd_soc_update_bits(codec, TAS2770_PowerControl,
+                       TAS2770_PowerControl_OperationalMode10_Mask,
+                       TAS2770_PowerControl_OperationalMode10_Shutdown);
        mutex_unlock(&pTAS2770->codec_lock);
        return ret;
 }
@@ -119,20 +121,25 @@ static int tas2770_codec_resume(struct snd_soc_codec *codec)
        mutex_lock(&pTAS2770->codec_lock);
 
        dev_dbg(pTAS2770->dev, "%s\n", __func__);
+       snd_soc_update_bits(codec, TAS2770_PowerControl,
+               TAS2770_PowerControl_OperationalMode10_Mask,
+               TAS2770_PowerControl_OperationalMode10_Active);
 
        mutex_unlock(&pTAS2770->codec_lock);
        return ret;
 }
 
-static const struct snd_kcontrol_new tas2770_asi_controls[] = {
-       SOC_DAPM_SINGLE("Left", TAS2770_TDMConfigurationReg2,
-               4, 1, 0),
-       SOC_DAPM_SINGLE("Right", TAS2770_TDMConfigurationReg2,
-               4, 2, 0),
-       SOC_DAPM_SINGLE("LeftRightDiv2", TAS2770_TDMConfigurationReg2,
-               4, 3, 0),
+static const char * const tas2770_ASI1_src[] = {
+       "I2C offset", "Left", "Right", "LeftRightDiv2",
 };
 
+static SOC_ENUM_SINGLE_DECL(
+       tas2770_ASI1_src_enum, TAS2770_TDMConfigurationReg2,
+       4, tas2770_ASI1_src);
+
+static const struct snd_kcontrol_new tas2770_asi1_mux =
+       SOC_DAPM_ENUM("ASI1 Source", tas2770_ASI1_src_enum);
+
 
 static int tas2770_dac_event(struct snd_soc_dapm_widget *w,
                        struct snd_kcontrol *kcontrol, int event)
@@ -163,10 +170,8 @@ static const struct snd_kcontrol_new vsense_switch =
 
 static const struct snd_soc_dapm_widget tas2770_dapm_widgets[] = {
        SND_SOC_DAPM_AIF_IN("ASI1", "ASI1 Playback", 0, SND_SOC_NOPM, 0, 0),
-       SND_SOC_DAPM_MIXER("ASI1 Sel",
-               TAS2770_TDMConfigurationReg2, 4, 0,
-               &tas2770_asi_controls[0],
-               ARRAY_SIZE(tas2770_asi_controls)),
+       SND_SOC_DAPM_MUX("ASI1 Sel", SND_SOC_NOPM, 0, 0,
+                               &tas2770_asi1_mux),
        SND_SOC_DAPM_SWITCH("ISENSE", TAS2770_PowerControl, 3, 1,
                        &isense_switch),
        SND_SOC_DAPM_SWITCH("VSENSE", TAS2770_PowerControl, 2, 1,
@@ -179,6 +184,7 @@ static const struct snd_soc_dapm_widget tas2770_dapm_widgets[] = {
 };
 
 static const struct snd_soc_dapm_route tas2770_audio_map[] = {
+       {"ASI1 Sel", "I2C offset", "ASI1"},
        {"ASI1 Sel", "Left", "ASI1"},
        {"ASI1 Sel", "Right", "ASI1"},
        {"ASI1 Sel", "LeftRightDiv2", "ASI1"},
@@ -320,6 +326,7 @@ static int tas2770_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
        struct snd_soc_codec *codec = dai->codec;
        struct tas2770_priv *pTAS2770 = snd_soc_codec_get_drvdata(codec);
        int ret = 0;
+       int value = 0;
 
        dev_dbg(pTAS2770->dev, "%s, format=0x%x\n", __func__, fmt);
 
@@ -370,6 +377,17 @@ static int tas2770_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
        snd_soc_update_bits(codec, TAS2770_TDMConfigurationReg1,
                TAS2770_TDMConfigurationReg1_RXOFFSET51_Mask,
        (tdm_rx_start_slot << TAS2770_TDMConfigurationReg1_RXOFFSET51_Shift));
+
+       snd_soc_update_bits(codec, TAS2770_TDMConfigurationReg3,
+               TAS2770_TDMConfigurationReg3_RXSLOTLeft30_Mask,
+               (pTAS2770->mnLeftSlot << TAS2770_TDMConfigurationReg3_RXSLOTLeft30_Shift));
+       snd_soc_update_bits(codec, TAS2770_TDMConfigurationReg3,
+               TAS2770_TDMConfigurationReg3_RXSLOTRight74_Mask,
+       (pTAS2770->mnRightSlot << TAS2770_TDMConfigurationReg3_RXSLOTRight74_Shift));
+
+       value = snd_soc_read(codec, TAS2770_TDMConfigurationReg3);
+       dev_dbg(pTAS2770->dev, "slot value: 0x%x", value);
+
        return ret;
 }