diff options
author | Brian Austin <brian.austin@cirrus.com> | 2013-11-14 12:46:11 -0500 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2013-11-28 05:20:51 -0500 |
commit | 44b2ed54036ecec36ad27adf356f0274a72e5f05 (patch) | |
tree | c3b3523615ca5ce28bdd5465de5637ca5b9e1a77 | |
parent | a3d36bc2aba531328f7311ef57dec7687283ec57 (diff) |
ASoC: cs42l52: Make MICA/B mixer dependent on mic config
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>
-rw-r--r-- | include/sound/cs42l52.h | 8 | ||||
-rw-r--r-- | sound/soc/codecs/cs42l52.c | 37 |
2 files changed, 34 insertions, 11 deletions
diff --git a/include/sound/cs42l52.h b/include/sound/cs42l52.h index daa91f327e4f..bbabf84bdb44 100644 --- a/include/sound/cs42l52.h +++ b/include/sound/cs42l52.h | |||
@@ -16,11 +16,11 @@ struct cs42l52_platform_data { | |||
16 | /* MICBIAS Level. Check datasheet Pg48 */ | 16 | /* MICBIAS Level. Check datasheet Pg48 */ |
17 | unsigned int micbias_lvl; | 17 | unsigned int micbias_lvl; |
18 | 18 | ||
19 | /* MICA mode selection 0=Single 1=Differential */ | 19 | /* MICA mode selection Differential or Single-ended */ |
20 | unsigned int mica_cfg; | 20 | bool mica_diff_cfg; |
21 | 21 | ||
22 | /* MICB mode selection 0=Single 1=Differential */ | 22 | /* MICB mode selection Differential or Single-ended */ |
23 | unsigned int micb_cfg; | 23 | bool micb_diff_cfg; |
24 | 24 | ||
25 | /* Charge Pump Freq. Check datasheet Pg73 */ | 25 | /* Charge Pump Freq. Check datasheet Pg73 */ |
26 | unsigned int chgfreq; | 26 | unsigned int chgfreq; |
diff --git a/sound/soc/codecs/cs42l52.c b/sound/soc/codecs/cs42l52.c index 18010639d0c5..78d2dd669e89 100644 --- a/sound/soc/codecs/cs42l52.c +++ b/sound/soc/codecs/cs42l52.c | |||
@@ -419,9 +419,6 @@ static const struct snd_kcontrol_new cs42l52_snd_controls[] = { | |||
419 | 419 | ||
420 | SOC_DOUBLE("Bypass Mute", CS42L52_MISC_CTL, 4, 5, 1, 0), | 420 | SOC_DOUBLE("Bypass Mute", CS42L52_MISC_CTL, 4, 5, 1, 0), |
421 | 421 | ||
422 | SOC_ENUM("MICA Select", mica_enum), | ||
423 | SOC_ENUM("MICB Select", micb_enum), | ||
424 | |||
425 | SOC_DOUBLE_R_TLV("MIC Gain Volume", CS42L52_MICA_CTL, | 422 | SOC_DOUBLE_R_TLV("MIC Gain Volume", CS42L52_MICA_CTL, |
426 | CS42L52_MICB_CTL, 0, 0x10, 0, mic_tlv), | 423 | CS42L52_MICB_CTL, 0, 0x10, 0, mic_tlv), |
427 | 424 | ||
@@ -528,6 +525,30 @@ static const struct snd_kcontrol_new cs42l52_snd_controls[] = { | |||
528 | 525 | ||
529 | }; | 526 | }; |
530 | 527 | ||
528 | static const struct snd_kcontrol_new cs42l52_mica_controls[] = { | ||
529 | SOC_ENUM("MICA Select", mica_enum), | ||
530 | }; | ||
531 | |||
532 | static const struct snd_kcontrol_new cs42l52_micb_controls[] = { | ||
533 | SOC_ENUM("MICB Select", micb_enum), | ||
534 | }; | ||
535 | |||
536 | static int cs42l52_add_mic_controls(struct snd_soc_codec *codec) | ||
537 | { | ||
538 | struct cs42l52_private *cs42l52 = snd_soc_codec_get_drvdata(codec); | ||
539 | struct cs42l52_platform_data *pdata = &cs42l52->pdata; | ||
540 | |||
541 | if (!pdata->mica_diff_cfg) | ||
542 | snd_soc_add_codec_controls(codec, cs42l52_mica_controls, | ||
543 | ARRAY_SIZE(cs42l52_mica_controls)); | ||
544 | |||
545 | if (!pdata->micb_diff_cfg) | ||
546 | snd_soc_add_codec_controls(codec, cs42l52_micb_controls, | ||
547 | ARRAY_SIZE(cs42l52_micb_controls)); | ||
548 | |||
549 | return 0; | ||
550 | } | ||
551 | |||
531 | static const struct snd_soc_dapm_widget cs42l52_dapm_widgets[] = { | 552 | static const struct snd_soc_dapm_widget cs42l52_dapm_widgets[] = { |
532 | 553 | ||
533 | SND_SOC_DAPM_INPUT("AIN1L"), | 554 | SND_SOC_DAPM_INPUT("AIN1L"), |
@@ -1104,6 +1125,8 @@ static int cs42l52_probe(struct snd_soc_codec *codec) | |||
1104 | } | 1125 | } |
1105 | regcache_cache_only(cs42l52->regmap, true); | 1126 | regcache_cache_only(cs42l52->regmap, true); |
1106 | 1127 | ||
1128 | cs42l52_add_mic_controls(codec); | ||
1129 | |||
1107 | cs42l52_init_beep(codec); | 1130 | cs42l52_init_beep(codec); |
1108 | 1131 | ||
1109 | cs42l52_set_bias_level(codec, SND_SOC_BIAS_STANDBY); | 1132 | cs42l52_set_bias_level(codec, SND_SOC_BIAS_STANDBY); |
@@ -1221,16 +1244,16 @@ static int cs42l52_i2c_probe(struct i2c_client *i2c_client, | |||
1221 | reg & 0xFF); | 1244 | reg & 0xFF); |
1222 | 1245 | ||
1223 | /* Set Platform Data */ | 1246 | /* Set Platform Data */ |
1224 | if (cs42l52->pdata.mica_cfg) | 1247 | if (cs42l52->pdata.mica_diff_cfg) |
1225 | regmap_update_bits(cs42l52->regmap, CS42L52_MICA_CTL, | 1248 | regmap_update_bits(cs42l52->regmap, CS42L52_MICA_CTL, |
1226 | CS42L52_MIC_CTL_TYPE_MASK, | 1249 | CS42L52_MIC_CTL_TYPE_MASK, |
1227 | cs42l52->pdata.mica_cfg << | 1250 | cs42l52->pdata.mica_diff_cfg << |
1228 | CS42L52_MIC_CTL_TYPE_SHIFT); | 1251 | CS42L52_MIC_CTL_TYPE_SHIFT); |
1229 | 1252 | ||
1230 | if (cs42l52->pdata.micb_cfg) | 1253 | if (cs42l52->pdata.micb_diff_cfg) |
1231 | regmap_update_bits(cs42l52->regmap, CS42L52_MICB_CTL, | 1254 | regmap_update_bits(cs42l52->regmap, CS42L52_MICB_CTL, |
1232 | CS42L52_MIC_CTL_TYPE_MASK, | 1255 | CS42L52_MIC_CTL_TYPE_MASK, |
1233 | cs42l52->pdata.micb_cfg << | 1256 | cs42l52->pdata.micb_diff_cfg << |
1234 | CS42L52_MIC_CTL_TYPE_SHIFT); | 1257 | CS42L52_MIC_CTL_TYPE_SHIFT); |
1235 | 1258 | ||
1236 | if (cs42l52->pdata.chgfreq) | 1259 | if (cs42l52->pdata.chgfreq) |