ASoC: cs42l52: Make MICA/B mixer dependent on mic config
authorBrian Austin <brian.austin@cirrus.com>
Thu, 14 Nov 2013 17:46:11 +0000 (11:46 -0600)
committerMark Brown <broonie@linaro.org>
Thu, 28 Nov 2013 10:20:51 +0000 (10:20 +0000)
MICA/B Single-Ended input selection depends on mica/b config so lets
make the mixer controls for them only show for selected mic's

Signed-off-by: Brian Austin <brian.austin@cirrus.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
include/sound/cs42l52.h
sound/soc/codecs/cs42l52.c

index daa91f327e4f76b74e8e66ffda3f37ba4e57175e..bbabf84bdb443114fcd33d4b3a4bbc3172385a8b 100644 (file)
@@ -16,11 +16,11 @@ struct cs42l52_platform_data {
        /* MICBIAS Level. Check datasheet Pg48 */
        unsigned int micbias_lvl;
 
-       /* MICA mode selection 0=Single 1=Differential */
-       unsigned int mica_cfg;
+       /* MICA mode selection Differential or Single-ended */
+       bool mica_diff_cfg;
 
-       /* MICB mode selection 0=Single 1=Differential */
-       unsigned int micb_cfg;
+       /* MICB mode selection Differential or Single-ended */
+       bool micb_diff_cfg;
 
        /* Charge Pump Freq. Check datasheet Pg73 */
        unsigned int chgfreq;
index 18010639d0c5f9d642dd5de0e11cc6c5a1fb1147..78d2dd669e8972542e1b39ec8e12fdbdec672c88 100644 (file)
@@ -419,9 +419,6 @@ static const struct snd_kcontrol_new cs42l52_snd_controls[] = {
 
        SOC_DOUBLE("Bypass Mute", CS42L52_MISC_CTL, 4, 5, 1, 0),
 
-       SOC_ENUM("MICA Select", mica_enum),
-       SOC_ENUM("MICB Select", micb_enum),
-
        SOC_DOUBLE_R_TLV("MIC Gain Volume", CS42L52_MICA_CTL,
                              CS42L52_MICB_CTL, 0, 0x10, 0, mic_tlv),
 
@@ -528,6 +525,30 @@ static const struct snd_kcontrol_new cs42l52_snd_controls[] = {
 
 };
 
+static const struct snd_kcontrol_new cs42l52_mica_controls[] = {
+       SOC_ENUM("MICA Select", mica_enum),
+};
+
+static const struct snd_kcontrol_new cs42l52_micb_controls[] = {
+       SOC_ENUM("MICB Select", micb_enum),
+};
+
+static int cs42l52_add_mic_controls(struct snd_soc_codec *codec)
+{
+       struct cs42l52_private *cs42l52 = snd_soc_codec_get_drvdata(codec);
+       struct cs42l52_platform_data *pdata = &cs42l52->pdata;
+
+       if (!pdata->mica_diff_cfg)
+               snd_soc_add_codec_controls(codec, cs42l52_mica_controls,
+                                    ARRAY_SIZE(cs42l52_mica_controls));
+
+       if (!pdata->micb_diff_cfg)
+               snd_soc_add_codec_controls(codec, cs42l52_micb_controls,
+                                    ARRAY_SIZE(cs42l52_micb_controls));
+
+       return 0;
+}
+
 static const struct snd_soc_dapm_widget cs42l52_dapm_widgets[] = {
 
        SND_SOC_DAPM_INPUT("AIN1L"),
@@ -1104,6 +1125,8 @@ static int cs42l52_probe(struct snd_soc_codec *codec)
        }
        regcache_cache_only(cs42l52->regmap, true);
 
+       cs42l52_add_mic_controls(codec);
+
        cs42l52_init_beep(codec);
 
        cs42l52_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
@@ -1221,16 +1244,16 @@ static int cs42l52_i2c_probe(struct i2c_client *i2c_client,
                        reg & 0xFF);
 
        /* Set Platform Data */
-       if (cs42l52->pdata.mica_cfg)
+       if (cs42l52->pdata.mica_diff_cfg)
                regmap_update_bits(cs42l52->regmap, CS42L52_MICA_CTL,
                                   CS42L52_MIC_CTL_TYPE_MASK,
-                               cs42l52->pdata.mica_cfg <<
+                               cs42l52->pdata.mica_diff_cfg <<
                                CS42L52_MIC_CTL_TYPE_SHIFT);
 
-       if (cs42l52->pdata.micb_cfg)
+       if (cs42l52->pdata.micb_diff_cfg)
                regmap_update_bits(cs42l52->regmap, CS42L52_MICB_CTL,
                                   CS42L52_MIC_CTL_TYPE_MASK,
-                               cs42l52->pdata.micb_cfg <<
+                               cs42l52->pdata.micb_diff_cfg <<
                                CS42L52_MIC_CTL_TYPE_SHIFT);
 
        if (cs42l52->pdata.chgfreq)