diff options
author | Ashish Chavan <ashish.chavan@kpitcummins.com> | 2012-01-02 07:05:52 -0500 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-01-02 07:27:29 -0500 |
commit | 24b6f263d97cd2f1f2d579021af97fcd1d632a98 (patch) | |
tree | dc9fe917ba03538c40b78d94f72e5403c459d458 /sound/soc/codecs | |
parent | 32696af13724aaf7651d1cf95bc1a7a8af97a5c8 (diff) |
ASoC: da7210: Add support for line input and mic
DA7210 has three line inputs (AUX1 Left, AUX1 Right and AUX2) and
a stereo MIC. This patch adds gain controls for MIC, AUX1, AUX2 as
well as INPGA.
Signed-off-by: Ashish Chavan <ashish.chavan@kpitcummins.com>
Signed-off-by: David Dajun Chen <dchen@diasemi.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/codecs')
-rw-r--r-- | sound/soc/codecs/da7210.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/sound/soc/codecs/da7210.c b/sound/soc/codecs/da7210.c index 62e6a9cc82bd..ab38e93c3543 100644 --- a/sound/soc/codecs/da7210.c +++ b/sound/soc/codecs/da7210.c | |||
@@ -181,9 +181,14 @@ | |||
181 | 181 | ||
182 | /* AUX1_L bit fields */ | 182 | /* AUX1_L bit fields */ |
183 | #define DA7210_AUX1_L_VOL (0x3F << 0) | 183 | #define DA7210_AUX1_L_VOL (0x3F << 0) |
184 | #define DA7210_AUX1_L_EN (1 << 7) | ||
184 | 185 | ||
185 | /* AUX1_R bit fields */ | 186 | /* AUX1_R bit fields */ |
186 | #define DA7210_AUX1_R_VOL (0x3F << 0) | 187 | #define DA7210_AUX1_R_VOL (0x3F << 0) |
188 | #define DA7210_AUX1_R_EN (1 << 7) | ||
189 | |||
190 | /* AUX2 bit fields */ | ||
191 | #define DA7210_AUX2_EN (1 << 3) | ||
187 | 192 | ||
188 | /* Minimum INPGA and AUX1 volume to enable noise suppression */ | 193 | /* Minimum INPGA and AUX1 volume to enable noise suppression */ |
189 | #define DA7210_INPGA_MIN_VOL_NS 0x0A /* 10.5dB */ | 194 | #define DA7210_INPGA_MIN_VOL_NS 0x0A /* 10.5dB */ |
@@ -234,9 +239,19 @@ static const unsigned int mono_vol_tlv[] = { | |||
234 | 0x3, 0x7, TLV_DB_SCALE_ITEM(-1800, 600, 0) | 239 | 0x3, 0x7, TLV_DB_SCALE_ITEM(-1800, 600, 0) |
235 | }; | 240 | }; |
236 | 241 | ||
242 | static const unsigned int aux1_vol_tlv[] = { | ||
243 | TLV_DB_RANGE_HEAD(2), | ||
244 | 0x0, 0x10, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 1), | ||
245 | /* -48dB to 21dB */ | ||
246 | 0x11, 0x3f, TLV_DB_SCALE_ITEM(-4800, 150, 0) | ||
247 | }; | ||
248 | |||
237 | static const DECLARE_TLV_DB_SCALE(eq_gain_tlv, -1050, 150, 0); | 249 | static const DECLARE_TLV_DB_SCALE(eq_gain_tlv, -1050, 150, 0); |
238 | static const DECLARE_TLV_DB_SCALE(adc_eq_master_gain_tlv, -1800, 600, 1); | 250 | static const DECLARE_TLV_DB_SCALE(adc_eq_master_gain_tlv, -1800, 600, 1); |
239 | static const DECLARE_TLV_DB_SCALE(dac_gain_tlv, -7725, 75, 0); | 251 | static const DECLARE_TLV_DB_SCALE(dac_gain_tlv, -7725, 75, 0); |
252 | static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, -600, 600, 0); | ||
253 | static const DECLARE_TLV_DB_SCALE(aux2_vol_tlv, -600, 600, 0); | ||
254 | static const DECLARE_TLV_DB_SCALE(inpga_gain_tlv, -450, 150, 0); | ||
240 | 255 | ||
241 | /* ADC and DAC high pass filter f0 value */ | 256 | /* ADC and DAC high pass filter f0 value */ |
242 | static const char * const da7210_hpf_cutoff_txt[] = { | 257 | static const char * const da7210_hpf_cutoff_txt[] = { |
@@ -344,6 +359,17 @@ static const struct snd_kcontrol_new da7210_snd_controls[] = { | |||
344 | SOC_SINGLE_TLV("Mono Playback Volume", DA7210_OUT2, 0, 0x7, 0, | 359 | SOC_SINGLE_TLV("Mono Playback Volume", DA7210_OUT2, 0, 0x7, 0, |
345 | mono_vol_tlv), | 360 | mono_vol_tlv), |
346 | 361 | ||
362 | SOC_DOUBLE_R_TLV("Mic Capture Volume", | ||
363 | DA7210_MIC_L, DA7210_MIC_R, | ||
364 | 0, 0x5, 0, mic_vol_tlv), | ||
365 | SOC_DOUBLE_R_TLV("Aux1 Capture Volume", | ||
366 | DA7210_AUX1_L, DA7210_AUX1_R, | ||
367 | 0, 0x3f, 0, aux1_vol_tlv), | ||
368 | SOC_SINGLE_TLV("Aux2 Capture Volume", DA7210_AUX2, 0, 0x3, 0, | ||
369 | aux2_vol_tlv), | ||
370 | SOC_DOUBLE_TLV("In PGA Capture Volume", DA7210_IN_GAIN, 0, 4, 0xF, 0, | ||
371 | inpga_gain_tlv), | ||
372 | |||
347 | /* DAC Equalizer controls */ | 373 | /* DAC Equalizer controls */ |
348 | SOC_SINGLE("DAC EQ Switch", DA7210_DAC_EQ5, 7, 1, 0), | 374 | SOC_SINGLE("DAC EQ Switch", DA7210_DAC_EQ5, 7, 1, 0), |
349 | SOC_SINGLE_TLV("DAC EQ1 Volume", DA7210_DAC_EQ1_2, 0, 0xf, 1, | 375 | SOC_SINGLE_TLV("DAC EQ1 Volume", DA7210_DAC_EQ1_2, 0, 0xf, 1, |
@@ -421,26 +447,42 @@ static const struct snd_kcontrol_new da7210_snd_controls[] = { | |||
421 | static const struct snd_kcontrol_new da7210_dapm_inmixl_controls[] = { | 447 | static const struct snd_kcontrol_new da7210_dapm_inmixl_controls[] = { |
422 | SOC_DAPM_SINGLE("Mic Left Switch", DA7210_INMIX_L, 0, 1, 0), | 448 | SOC_DAPM_SINGLE("Mic Left Switch", DA7210_INMIX_L, 0, 1, 0), |
423 | SOC_DAPM_SINGLE("Mic Right Switch", DA7210_INMIX_L, 1, 1, 0), | 449 | SOC_DAPM_SINGLE("Mic Right Switch", DA7210_INMIX_L, 1, 1, 0), |
450 | SOC_DAPM_SINGLE("Aux1 Left Switch", DA7210_INMIX_L, 2, 1, 0), | ||
451 | SOC_DAPM_SINGLE("Aux2 Switch", DA7210_INMIX_L, 3, 1, 0), | ||
452 | SOC_DAPM_SINGLE("Outmix Left Switch", DA7210_INMIX_L, 4, 1, 0), | ||
424 | }; | 453 | }; |
425 | 454 | ||
426 | /* In Mixer Right */ | 455 | /* In Mixer Right */ |
427 | static const struct snd_kcontrol_new da7210_dapm_inmixr_controls[] = { | 456 | static const struct snd_kcontrol_new da7210_dapm_inmixr_controls[] = { |
428 | SOC_DAPM_SINGLE("Mic Right Switch", DA7210_INMIX_R, 0, 1, 0), | 457 | SOC_DAPM_SINGLE("Mic Right Switch", DA7210_INMIX_R, 0, 1, 0), |
429 | SOC_DAPM_SINGLE("Mic Left Switch", DA7210_INMIX_R, 1, 1, 0), | 458 | SOC_DAPM_SINGLE("Mic Left Switch", DA7210_INMIX_R, 1, 1, 0), |
459 | SOC_DAPM_SINGLE("Aux1 Right Switch", DA7210_INMIX_R, 2, 1, 0), | ||
460 | SOC_DAPM_SINGLE("Aux2 Switch", DA7210_INMIX_R, 3, 1, 0), | ||
461 | SOC_DAPM_SINGLE("Outmix Right Switch", DA7210_INMIX_R, 4, 1, 0), | ||
430 | }; | 462 | }; |
431 | 463 | ||
432 | /* Out Mixer Left */ | 464 | /* Out Mixer Left */ |
433 | static const struct snd_kcontrol_new da7210_dapm_outmixl_controls[] = { | 465 | static const struct snd_kcontrol_new da7210_dapm_outmixl_controls[] = { |
466 | SOC_DAPM_SINGLE("Aux1 Left Switch", DA7210_OUTMIX_L, 0, 1, 0), | ||
467 | SOC_DAPM_SINGLE("Aux2 Switch", DA7210_OUTMIX_L, 1, 1, 0), | ||
468 | SOC_DAPM_SINGLE("INPGA Left Switch", DA7210_OUTMIX_L, 2, 1, 0), | ||
469 | SOC_DAPM_SINGLE("INPGA Right Switch", DA7210_OUTMIX_L, 3, 1, 0), | ||
434 | SOC_DAPM_SINGLE("DAC Left Switch", DA7210_OUTMIX_L, 4, 1, 0), | 470 | SOC_DAPM_SINGLE("DAC Left Switch", DA7210_OUTMIX_L, 4, 1, 0), |
435 | }; | 471 | }; |
436 | 472 | ||
437 | /* Out Mixer Right */ | 473 | /* Out Mixer Right */ |
438 | static const struct snd_kcontrol_new da7210_dapm_outmixr_controls[] = { | 474 | static const struct snd_kcontrol_new da7210_dapm_outmixr_controls[] = { |
475 | SOC_DAPM_SINGLE("Aux1 Right Switch", DA7210_OUTMIX_R, 0, 1, 0), | ||
476 | SOC_DAPM_SINGLE("Aux2 Switch", DA7210_OUTMIX_R, 1, 1, 0), | ||
477 | SOC_DAPM_SINGLE("INPGA Left Switch", DA7210_OUTMIX_R, 2, 1, 0), | ||
478 | SOC_DAPM_SINGLE("INPGA Right Switch", DA7210_OUTMIX_R, 3, 1, 0), | ||
439 | SOC_DAPM_SINGLE("DAC Right Switch", DA7210_OUTMIX_R, 4, 1, 0), | 479 | SOC_DAPM_SINGLE("DAC Right Switch", DA7210_OUTMIX_R, 4, 1, 0), |
440 | }; | 480 | }; |
441 | 481 | ||
442 | /* Mono Mixer */ | 482 | /* Mono Mixer */ |
443 | static const struct snd_kcontrol_new da7210_dapm_monomix_controls[] = { | 483 | static const struct snd_kcontrol_new da7210_dapm_monomix_controls[] = { |
484 | SOC_DAPM_SINGLE("INPGA Right Switch", DA7210_OUT2, 3, 1, 0), | ||
485 | SOC_DAPM_SINGLE("INPGA Left Switch", DA7210_OUT2, 4, 1, 0), | ||
444 | SOC_DAPM_SINGLE("Outmix Right Switch", DA7210_OUT2, 5, 1, 0), | 486 | SOC_DAPM_SINGLE("Outmix Right Switch", DA7210_OUT2, 5, 1, 0), |
445 | SOC_DAPM_SINGLE("Outmix Left Switch", DA7210_OUT2, 6, 1, 0), | 487 | SOC_DAPM_SINGLE("Outmix Left Switch", DA7210_OUT2, 6, 1, 0), |
446 | }; | 488 | }; |
@@ -451,14 +493,23 @@ static const struct snd_soc_dapm_widget da7210_dapm_widgets[] = { | |||
451 | /* Input Lines */ | 493 | /* Input Lines */ |
452 | SND_SOC_DAPM_INPUT("MICL"), | 494 | SND_SOC_DAPM_INPUT("MICL"), |
453 | SND_SOC_DAPM_INPUT("MICR"), | 495 | SND_SOC_DAPM_INPUT("MICR"), |
496 | SND_SOC_DAPM_INPUT("AUX1L"), | ||
497 | SND_SOC_DAPM_INPUT("AUX1R"), | ||
498 | SND_SOC_DAPM_INPUT("AUX2"), | ||
454 | 499 | ||
455 | /* Input PGAs */ | 500 | /* Input PGAs */ |
456 | SND_SOC_DAPM_PGA("Mic Left", DA7210_STARTUP3, 0, 1, NULL, 0), | 501 | SND_SOC_DAPM_PGA("Mic Left", DA7210_STARTUP3, 0, 1, NULL, 0), |
457 | SND_SOC_DAPM_PGA("Mic Right", DA7210_STARTUP3, 1, 1, NULL, 0), | 502 | SND_SOC_DAPM_PGA("Mic Right", DA7210_STARTUP3, 1, 1, NULL, 0), |
503 | SND_SOC_DAPM_PGA("Aux1 Left", DA7210_STARTUP3, 2, 1, NULL, 0), | ||
504 | SND_SOC_DAPM_PGA("Aux1 Right", DA7210_STARTUP3, 3, 1, NULL, 0), | ||
505 | SND_SOC_DAPM_PGA("Aux2 Mono", DA7210_STARTUP3, 4, 1, NULL, 0), | ||
458 | 506 | ||
459 | SND_SOC_DAPM_PGA("INPGA Left", DA7210_INMIX_L, 7, 0, NULL, 0), | 507 | SND_SOC_DAPM_PGA("INPGA Left", DA7210_INMIX_L, 7, 0, NULL, 0), |
460 | SND_SOC_DAPM_PGA("INPGA Right", DA7210_INMIX_R, 7, 0, NULL, 0), | 508 | SND_SOC_DAPM_PGA("INPGA Right", DA7210_INMIX_R, 7, 0, NULL, 0), |
461 | 509 | ||
510 | /* MICBIAS */ | ||
511 | SND_SOC_DAPM_SUPPLY("Mic Bias", DA7210_MIC_L, 6, 0, NULL, 0), | ||
512 | |||
462 | /* Input Mixers */ | 513 | /* Input Mixers */ |
463 | SND_SOC_DAPM_MIXER("In Mixer Left", SND_SOC_NOPM, 0, 0, | 514 | SND_SOC_DAPM_MIXER("In Mixer Left", SND_SOC_NOPM, 0, 0, |
464 | &da7210_dapm_inmixl_controls[0], | 515 | &da7210_dapm_inmixl_controls[0], |
@@ -514,12 +565,21 @@ static const struct snd_soc_dapm_route da7210_audio_map[] = { | |||
514 | /* Input path */ | 565 | /* Input path */ |
515 | {"Mic Left", NULL, "MICL"}, | 566 | {"Mic Left", NULL, "MICL"}, |
516 | {"Mic Right", NULL, "MICR"}, | 567 | {"Mic Right", NULL, "MICR"}, |
568 | {"Aux1 Left", NULL, "AUX1L"}, | ||
569 | {"Aux1 Right", NULL, "AUX1R"}, | ||
570 | {"Aux2 Mono", NULL, "AUX2"}, | ||
517 | 571 | ||
518 | {"In Mixer Left", "Mic Left Switch", "Mic Left"}, | 572 | {"In Mixer Left", "Mic Left Switch", "Mic Left"}, |
519 | {"In Mixer Left", "Mic Right Switch", "Mic Right"}, | 573 | {"In Mixer Left", "Mic Right Switch", "Mic Right"}, |
574 | {"In Mixer Left", "Aux1 Left Switch", "Aux1 Left"}, | ||
575 | {"In Mixer Left", "Aux2 Switch", "Aux2 Mono"}, | ||
576 | {"In Mixer Left", "Outmix Left Switch", "Out Mixer Left"}, | ||
520 | 577 | ||
521 | {"In Mixer Right", "Mic Right Switch", "Mic Right"}, | 578 | {"In Mixer Right", "Mic Right Switch", "Mic Right"}, |
522 | {"In Mixer Right", "Mic Left Switch", "Mic Left"}, | 579 | {"In Mixer Right", "Mic Left Switch", "Mic Left"}, |
580 | {"In Mixer Right", "Aux1 Right Switch", "Aux1 Right"}, | ||
581 | {"In Mixer Right", "Aux2 Switch", "Aux2 Mono"}, | ||
582 | {"In Mixer Right", "Outmix Right Switch", "Out Mixer Right"}, | ||
523 | 583 | ||
524 | {"INPGA Left", NULL, "In Mixer Left"}, | 584 | {"INPGA Left", NULL, "In Mixer Left"}, |
525 | {"ADC Left", NULL, "INPGA Left"}, | 585 | {"ADC Left", NULL, "INPGA Left"}, |
@@ -528,9 +588,20 @@ static const struct snd_soc_dapm_route da7210_audio_map[] = { | |||
528 | {"ADC Right", NULL, "INPGA Right"}, | 588 | {"ADC Right", NULL, "INPGA Right"}, |
529 | 589 | ||
530 | /* Output path */ | 590 | /* Output path */ |
591 | {"Out Mixer Left", "Aux1 Left Switch", "Aux1 Left"}, | ||
592 | {"Out Mixer Left", "Aux2 Switch", "Aux2 Mono"}, | ||
593 | {"Out Mixer Left", "INPGA Left Switch", "INPGA Left"}, | ||
594 | {"Out Mixer Left", "INPGA Right Switch", "INPGA Right"}, | ||
531 | {"Out Mixer Left", "DAC Left Switch", "DAC Left"}, | 595 | {"Out Mixer Left", "DAC Left Switch", "DAC Left"}, |
596 | |||
597 | {"Out Mixer Right", "Aux1 Right Switch", "Aux1 Right"}, | ||
598 | {"Out Mixer Right", "Aux2 Switch", "Aux2 Mono"}, | ||
599 | {"Out Mixer Right", "INPGA Right Switch", "INPGA Right"}, | ||
600 | {"Out Mixer Right", "INPGA Left Switch", "INPGA Left"}, | ||
532 | {"Out Mixer Right", "DAC Right Switch", "DAC Right"}, | 601 | {"Out Mixer Right", "DAC Right Switch", "DAC Right"}, |
533 | 602 | ||
603 | {"Mono Mixer", "INPGA Right Switch", "INPGA Right"}, | ||
604 | {"Mono Mixer", "INPGA Left Switch", "INPGA Left"}, | ||
534 | {"Mono Mixer", "Outmix Right Switch", "Out Mixer Right"}, | 605 | {"Mono Mixer", "Outmix Right Switch", "Out Mixer Right"}, |
535 | {"Mono Mixer", "Outmix Left Switch", "Out Mixer Left"}, | 606 | {"Mono Mixer", "Outmix Left Switch", "Out Mixer Left"}, |
536 | 607 | ||
@@ -887,6 +958,12 @@ static int da7210_probe(struct snd_soc_codec *codec) | |||
887 | snd_soc_write(codec, DA7210_OUT2, DA7210_OUT2_EN | | 958 | snd_soc_write(codec, DA7210_OUT2, DA7210_OUT2_EN | |
888 | DA7210_OUT2_OUTMIX_L | DA7210_OUT2_OUTMIX_R); | 959 | DA7210_OUT2_OUTMIX_L | DA7210_OUT2_OUTMIX_R); |
889 | 960 | ||
961 | /* Enable Aux1 */ | ||
962 | snd_soc_write(codec, DA7210_AUX1_L, DA7210_AUX1_L_EN); | ||
963 | snd_soc_write(codec, DA7210_AUX1_R, DA7210_AUX1_R_EN); | ||
964 | /* Enable Aux2 */ | ||
965 | snd_soc_write(codec, DA7210_AUX2, DA7210_AUX2_EN); | ||
966 | |||
890 | /* Diable PLL and bypass it */ | 967 | /* Diable PLL and bypass it */ |
891 | snd_soc_write(codec, DA7210_PLL, DA7210_PLL_FS_48000); | 968 | snd_soc_write(codec, DA7210_PLL, DA7210_PLL_FS_48000); |
892 | 969 | ||