aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs/tlv320aic3x.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/codecs/tlv320aic3x.c')
-rw-r--r--sound/soc/codecs/tlv320aic3x.c126
1 files changed, 83 insertions, 43 deletions
diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c
index 546d16b7d38f..470fbfb4b386 100644
--- a/sound/soc/codecs/tlv320aic3x.c
+++ b/sound/soc/codecs/tlv320aic3x.c
@@ -350,16 +350,6 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = {
350 DACL1_2_LLOPM_VOL, DACR1_2_RLOPM_VOL, 350 DACL1_2_LLOPM_VOL, DACR1_2_RLOPM_VOL,
351 0, 118, 1, output_stage_tlv), 351 0, 118, 1, output_stage_tlv),
352 352
353 SOC_DOUBLE_R_TLV("Mono Line2 Bypass Volume",
354 LINE2L_2_MONOLOPM_VOL, LINE2R_2_MONOLOPM_VOL,
355 0, 118, 1, output_stage_tlv),
356 SOC_DOUBLE_R_TLV("Mono PGA Bypass Volume",
357 PGAL_2_MONOLOPM_VOL, PGAR_2_MONOLOPM_VOL,
358 0, 118, 1, output_stage_tlv),
359 SOC_DOUBLE_R_TLV("Mono DAC Playback Volume",
360 DACL1_2_MONOLOPM_VOL, DACR1_2_MONOLOPM_VOL,
361 0, 118, 1, output_stage_tlv),
362
363 SOC_DOUBLE_R_TLV("HP Line2 Bypass Volume", 353 SOC_DOUBLE_R_TLV("HP Line2 Bypass Volume",
364 LINE2L_2_HPLOUT_VOL, LINE2R_2_HPROUT_VOL, 354 LINE2L_2_HPLOUT_VOL, LINE2R_2_HPROUT_VOL,
365 0, 118, 1, output_stage_tlv), 355 0, 118, 1, output_stage_tlv),
@@ -383,7 +373,6 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = {
383 /* Output pin mute controls */ 373 /* Output pin mute controls */
384 SOC_DOUBLE_R("Line Playback Switch", LLOPM_CTRL, RLOPM_CTRL, 3, 374 SOC_DOUBLE_R("Line Playback Switch", LLOPM_CTRL, RLOPM_CTRL, 3,
385 0x01, 0), 375 0x01, 0),
386 SOC_SINGLE("Mono Playback Switch", MONOLOPM_CTRL, 3, 0x01, 0),
387 SOC_DOUBLE_R("HP Playback Switch", HPLOUT_CTRL, HPROUT_CTRL, 3, 376 SOC_DOUBLE_R("HP Playback Switch", HPLOUT_CTRL, HPROUT_CTRL, 3,
388 0x01, 0), 377 0x01, 0),
389 SOC_DOUBLE_R("HPCOM Playback Switch", HPLCOM_CTRL, HPRCOM_CTRL, 3, 378 SOC_DOUBLE_R("HPCOM Playback Switch", HPLCOM_CTRL, HPRCOM_CTRL, 3,
@@ -412,6 +401,20 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = {
412 SOC_ENUM("ADC HPF Cut-off", aic3x_enum[ADC_HPF_ENUM]), 401 SOC_ENUM("ADC HPF Cut-off", aic3x_enum[ADC_HPF_ENUM]),
413}; 402};
414 403
404static const struct snd_kcontrol_new aic3x_mono_controls[] = {
405 SOC_DOUBLE_R_TLV("Mono Line2 Bypass Volume",
406 LINE2L_2_MONOLOPM_VOL, LINE2R_2_MONOLOPM_VOL,
407 0, 118, 1, output_stage_tlv),
408 SOC_DOUBLE_R_TLV("Mono PGA Bypass Volume",
409 PGAL_2_MONOLOPM_VOL, PGAR_2_MONOLOPM_VOL,
410 0, 118, 1, output_stage_tlv),
411 SOC_DOUBLE_R_TLV("Mono DAC Playback Volume",
412 DACL1_2_MONOLOPM_VOL, DACR1_2_MONOLOPM_VOL,
413 0, 118, 1, output_stage_tlv),
414
415 SOC_SINGLE("Mono Playback Switch", MONOLOPM_CTRL, 3, 0x01, 0),
416};
417
415/* 418/*
416 * Class-D amplifier gain. From 0 to 18 dB in 6 dB steps 419 * Class-D amplifier gain. From 0 to 18 dB in 6 dB steps
417 */ 420 */
@@ -565,9 +568,6 @@ static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = {
565 SND_SOC_DAPM_PGA("Right HP Out", HPROUT_CTRL, 0, 0, NULL, 0), 568 SND_SOC_DAPM_PGA("Right HP Out", HPROUT_CTRL, 0, 0, NULL, 0),
566 SND_SOC_DAPM_PGA("Right HP Com", HPRCOM_CTRL, 0, 0, NULL, 0), 569 SND_SOC_DAPM_PGA("Right HP Com", HPRCOM_CTRL, 0, 0, NULL, 0),
567 570
568 /* Mono Output */
569 SND_SOC_DAPM_PGA("Mono Out", MONOLOPM_CTRL, 0, 0, NULL, 0),
570
571 /* Inputs to Left ADC */ 571 /* Inputs to Left ADC */
572 SND_SOC_DAPM_ADC("Left ADC", "Left Capture", LINE1L_2_LADC_CTRL, 2, 0), 572 SND_SOC_DAPM_ADC("Left ADC", "Left Capture", LINE1L_2_LADC_CTRL, 2, 0),
573 SND_SOC_DAPM_MIXER("Left PGA Mixer", SND_SOC_NOPM, 0, 0, 573 SND_SOC_DAPM_MIXER("Left PGA Mixer", SND_SOC_NOPM, 0, 0,
@@ -626,9 +626,6 @@ static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = {
626 SND_SOC_DAPM_MIXER("Right Line Mixer", SND_SOC_NOPM, 0, 0, 626 SND_SOC_DAPM_MIXER("Right Line Mixer", SND_SOC_NOPM, 0, 0,
627 &aic3x_right_line_mixer_controls[0], 627 &aic3x_right_line_mixer_controls[0],
628 ARRAY_SIZE(aic3x_right_line_mixer_controls)), 628 ARRAY_SIZE(aic3x_right_line_mixer_controls)),
629 SND_SOC_DAPM_MIXER("Mono Mixer", SND_SOC_NOPM, 0, 0,
630 &aic3x_mono_mixer_controls[0],
631 ARRAY_SIZE(aic3x_mono_mixer_controls)),
632 SND_SOC_DAPM_MIXER("Left HP Mixer", SND_SOC_NOPM, 0, 0, 629 SND_SOC_DAPM_MIXER("Left HP Mixer", SND_SOC_NOPM, 0, 0,
633 &aic3x_left_hp_mixer_controls[0], 630 &aic3x_left_hp_mixer_controls[0],
634 ARRAY_SIZE(aic3x_left_hp_mixer_controls)), 631 ARRAY_SIZE(aic3x_left_hp_mixer_controls)),
@@ -644,7 +641,6 @@ static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = {
644 641
645 SND_SOC_DAPM_OUTPUT("LLOUT"), 642 SND_SOC_DAPM_OUTPUT("LLOUT"),
646 SND_SOC_DAPM_OUTPUT("RLOUT"), 643 SND_SOC_DAPM_OUTPUT("RLOUT"),
647 SND_SOC_DAPM_OUTPUT("MONO_LOUT"),
648 SND_SOC_DAPM_OUTPUT("HPLOUT"), 644 SND_SOC_DAPM_OUTPUT("HPLOUT"),
649 SND_SOC_DAPM_OUTPUT("HPROUT"), 645 SND_SOC_DAPM_OUTPUT("HPROUT"),
650 SND_SOC_DAPM_OUTPUT("HPLCOM"), 646 SND_SOC_DAPM_OUTPUT("HPLCOM"),
@@ -666,6 +662,17 @@ static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = {
666 SND_SOC_DAPM_OUTPUT("Detection"), 662 SND_SOC_DAPM_OUTPUT("Detection"),
667}; 663};
668 664
665static const struct snd_soc_dapm_widget aic3x_dapm_mono_widgets[] = {
666 /* Mono Output */
667 SND_SOC_DAPM_PGA("Mono Out", MONOLOPM_CTRL, 0, 0, NULL, 0),
668
669 SND_SOC_DAPM_MIXER("Mono Mixer", SND_SOC_NOPM, 0, 0,
670 &aic3x_mono_mixer_controls[0],
671 ARRAY_SIZE(aic3x_mono_mixer_controls)),
672
673 SND_SOC_DAPM_OUTPUT("MONO_LOUT"),
674};
675
669static const struct snd_soc_dapm_widget aic3007_dapm_widgets[] = { 676static const struct snd_soc_dapm_widget aic3007_dapm_widgets[] = {
670 /* Class-D outputs */ 677 /* Class-D outputs */
671 SND_SOC_DAPM_PGA("Left Class-D Out", CLASSD_CTRL, 3, 0, NULL, 0), 678 SND_SOC_DAPM_PGA("Left Class-D Out", CLASSD_CTRL, 3, 0, NULL, 0),
@@ -754,17 +761,6 @@ static const struct snd_soc_dapm_route intercon[] = {
754 {"Right Line Out", NULL, "Right DAC Mux"}, 761 {"Right Line Out", NULL, "Right DAC Mux"},
755 {"RLOUT", NULL, "Right Line Out"}, 762 {"RLOUT", NULL, "Right Line Out"},
756 763
757 /* Mono Output */
758 {"Mono Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
759 {"Mono Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
760 {"Mono Mixer", "DACL1 Switch", "Left DAC Mux"},
761 {"Mono Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
762 {"Mono Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
763 {"Mono Mixer", "DACR1 Switch", "Right DAC Mux"},
764
765 {"Mono Out", NULL, "Mono Mixer"},
766 {"MONO_LOUT", NULL, "Mono Out"},
767
768 /* Left HP Output */ 764 /* Left HP Output */
769 {"Left HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, 765 {"Left HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
770 {"Left HP Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, 766 {"Left HP Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
@@ -820,6 +816,18 @@ static const struct snd_soc_dapm_route intercon[] = {
820 {"HPRCOM", NULL, "Right HP Com"}, 816 {"HPRCOM", NULL, "Right HP Com"},
821}; 817};
822 818
819static const struct snd_soc_dapm_route intercon_mono[] = {
820 /* Mono Output */
821 {"Mono Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
822 {"Mono Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
823 {"Mono Mixer", "DACL1 Switch", "Left DAC Mux"},
824 {"Mono Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
825 {"Mono Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
826 {"Mono Mixer", "DACR1 Switch", "Right DAC Mux"},
827 {"Mono Out", NULL, "Mono Mixer"},
828 {"MONO_LOUT", NULL, "Mono Out"},
829};
830
823static const struct snd_soc_dapm_route intercon_3007[] = { 831static const struct snd_soc_dapm_route intercon_3007[] = {
824 /* Class-D outputs */ 832 /* Class-D outputs */
825 {"Left Class-D Out", NULL, "Left Line Out"}, 833 {"Left Class-D Out", NULL, "Left Line Out"},
@@ -833,11 +841,20 @@ static int aic3x_add_widgets(struct snd_soc_codec *codec)
833 struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec); 841 struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec);
834 struct snd_soc_dapm_context *dapm = &codec->dapm; 842 struct snd_soc_dapm_context *dapm = &codec->dapm;
835 843
836 if (aic3x->model == AIC3X_MODEL_3007) { 844 switch (aic3x->model) {
845 case AIC3X_MODEL_3X:
846 case AIC3X_MODEL_33:
847 snd_soc_dapm_new_controls(dapm, aic3x_dapm_mono_widgets,
848 ARRAY_SIZE(aic3x_dapm_mono_widgets));
849 snd_soc_dapm_add_routes(dapm, intercon_mono,
850 ARRAY_SIZE(intercon_mono));
851 break;
852 case AIC3X_MODEL_3007:
837 snd_soc_dapm_new_controls(dapm, aic3007_dapm_widgets, 853 snd_soc_dapm_new_controls(dapm, aic3007_dapm_widgets,
838 ARRAY_SIZE(aic3007_dapm_widgets)); 854 ARRAY_SIZE(aic3007_dapm_widgets));
839 snd_soc_dapm_add_routes(dapm, intercon_3007, 855 snd_soc_dapm_add_routes(dapm, intercon_3007,
840 ARRAY_SIZE(intercon_3007)); 856 ARRAY_SIZE(intercon_3007));
857 break;
841 } 858 }
842 859
843 return 0; 860 return 0;
@@ -1218,6 +1235,24 @@ static int aic3x_resume(struct snd_soc_codec *codec)
1218 return 0; 1235 return 0;
1219} 1236}
1220 1237
1238static void aic3x_mono_init(struct snd_soc_codec *codec)
1239{
1240 /* DAC to Mono Line Out default volume and route to Output mixer */
1241 snd_soc_write(codec, DACL1_2_MONOLOPM_VOL, DEFAULT_VOL | ROUTE_ON);
1242 snd_soc_write(codec, DACR1_2_MONOLOPM_VOL, DEFAULT_VOL | ROUTE_ON);
1243
1244 /* unmute all outputs */
1245 snd_soc_update_bits(codec, MONOLOPM_CTRL, UNMUTE, UNMUTE);
1246
1247 /* PGA to Mono Line Out default volume, disconnect from Output Mixer */
1248 snd_soc_write(codec, PGAL_2_MONOLOPM_VOL, DEFAULT_VOL);
1249 snd_soc_write(codec, PGAR_2_MONOLOPM_VOL, DEFAULT_VOL);
1250
1251 /* Line2 to Mono Out default volume, disconnect from Output Mixer */
1252 snd_soc_write(codec, LINE2L_2_MONOLOPM_VOL, DEFAULT_VOL);
1253 snd_soc_write(codec, LINE2R_2_MONOLOPM_VOL, DEFAULT_VOL);
1254}
1255
1221/* 1256/*
1222 * initialise the AIC3X driver 1257 * initialise the AIC3X driver
1223 * register the mixer and dsp interfaces with the kernel 1258 * register the mixer and dsp interfaces with the kernel
@@ -1241,14 +1276,10 @@ static int aic3x_init(struct snd_soc_codec *codec)
1241 /* DAC to Line Out default volume and route to Output mixer */ 1276 /* DAC to Line Out default volume and route to Output mixer */
1242 snd_soc_write(codec, DACL1_2_LLOPM_VOL, DEFAULT_VOL | ROUTE_ON); 1277 snd_soc_write(codec, DACL1_2_LLOPM_VOL, DEFAULT_VOL | ROUTE_ON);
1243 snd_soc_write(codec, DACR1_2_RLOPM_VOL, DEFAULT_VOL | ROUTE_ON); 1278 snd_soc_write(codec, DACR1_2_RLOPM_VOL, DEFAULT_VOL | ROUTE_ON);
1244 /* DAC to Mono Line Out default volume and route to Output mixer */
1245 snd_soc_write(codec, DACL1_2_MONOLOPM_VOL, DEFAULT_VOL | ROUTE_ON);
1246 snd_soc_write(codec, DACR1_2_MONOLOPM_VOL, DEFAULT_VOL | ROUTE_ON);
1247 1279
1248 /* unmute all outputs */ 1280 /* unmute all outputs */
1249 snd_soc_update_bits(codec, LLOPM_CTRL, UNMUTE, UNMUTE); 1281 snd_soc_update_bits(codec, LLOPM_CTRL, UNMUTE, UNMUTE);
1250 snd_soc_update_bits(codec, RLOPM_CTRL, UNMUTE, UNMUTE); 1282 snd_soc_update_bits(codec, RLOPM_CTRL, UNMUTE, UNMUTE);
1251 snd_soc_update_bits(codec, MONOLOPM_CTRL, UNMUTE, UNMUTE);
1252 snd_soc_update_bits(codec, HPLOUT_CTRL, UNMUTE, UNMUTE); 1283 snd_soc_update_bits(codec, HPLOUT_CTRL, UNMUTE, UNMUTE);
1253 snd_soc_update_bits(codec, HPROUT_CTRL, UNMUTE, UNMUTE); 1284 snd_soc_update_bits(codec, HPROUT_CTRL, UNMUTE, UNMUTE);
1254 snd_soc_update_bits(codec, HPLCOM_CTRL, UNMUTE, UNMUTE); 1285 snd_soc_update_bits(codec, HPLCOM_CTRL, UNMUTE, UNMUTE);
@@ -1269,9 +1300,6 @@ static int aic3x_init(struct snd_soc_codec *codec)
1269 /* PGA to Line Out default volume, disconnect from Output Mixer */ 1300 /* PGA to Line Out default volume, disconnect from Output Mixer */
1270 snd_soc_write(codec, PGAL_2_LLOPM_VOL, DEFAULT_VOL); 1301 snd_soc_write(codec, PGAL_2_LLOPM_VOL, DEFAULT_VOL);
1271 snd_soc_write(codec, PGAR_2_RLOPM_VOL, DEFAULT_VOL); 1302 snd_soc_write(codec, PGAR_2_RLOPM_VOL, DEFAULT_VOL);
1272 /* PGA to Mono Line Out default volume, disconnect from Output Mixer */
1273 snd_soc_write(codec, PGAL_2_MONOLOPM_VOL, DEFAULT_VOL);
1274 snd_soc_write(codec, PGAR_2_MONOLOPM_VOL, DEFAULT_VOL);
1275 1303
1276 /* Line2 to HP Bypass default volume, disconnect from Output Mixer */ 1304 /* Line2 to HP Bypass default volume, disconnect from Output Mixer */
1277 snd_soc_write(codec, LINE2L_2_HPLOUT_VOL, DEFAULT_VOL); 1305 snd_soc_write(codec, LINE2L_2_HPLOUT_VOL, DEFAULT_VOL);
@@ -1281,12 +1309,15 @@ static int aic3x_init(struct snd_soc_codec *codec)
1281 /* Line2 Line Out default volume, disconnect from Output Mixer */ 1309 /* Line2 Line Out default volume, disconnect from Output Mixer */
1282 snd_soc_write(codec, LINE2L_2_LLOPM_VOL, DEFAULT_VOL); 1310 snd_soc_write(codec, LINE2L_2_LLOPM_VOL, DEFAULT_VOL);
1283 snd_soc_write(codec, LINE2R_2_RLOPM_VOL, DEFAULT_VOL); 1311 snd_soc_write(codec, LINE2R_2_RLOPM_VOL, DEFAULT_VOL);
1284 /* Line2 to Mono Out default volume, disconnect from Output Mixer */
1285 snd_soc_write(codec, LINE2L_2_MONOLOPM_VOL, DEFAULT_VOL);
1286 snd_soc_write(codec, LINE2R_2_MONOLOPM_VOL, DEFAULT_VOL);
1287 1312
1288 if (aic3x->model == AIC3X_MODEL_3007) { 1313 switch (aic3x->model) {
1314 case AIC3X_MODEL_3X:
1315 case AIC3X_MODEL_33:
1316 aic3x_mono_init(codec);
1317 break;
1318 case AIC3X_MODEL_3007:
1289 snd_soc_write(codec, CLASSD_CTRL, 0); 1319 snd_soc_write(codec, CLASSD_CTRL, 0);
1320 break;
1290 } 1321 }
1291 1322
1292 return 0; 1323 return 0;
@@ -1343,8 +1374,17 @@ static int aic3x_probe(struct snd_soc_codec *codec)
1343 (aic3x->setup->gpio_func[1] & 0xf) << 4); 1374 (aic3x->setup->gpio_func[1] & 0xf) << 4);
1344 } 1375 }
1345 1376
1346 if (aic3x->model == AIC3X_MODEL_3007) 1377 switch (aic3x->model) {
1347 snd_soc_add_codec_controls(codec, &aic3x_classd_amp_gain_ctrl, 1); 1378 case AIC3X_MODEL_3X:
1379 case AIC3X_MODEL_33:
1380 snd_soc_add_codec_controls(codec, aic3x_mono_controls,
1381 ARRAY_SIZE(aic3x_mono_controls));
1382 break;
1383 case AIC3X_MODEL_3007:
1384 snd_soc_add_codec_controls(codec,
1385 &aic3x_classd_amp_gain_ctrl, 1);
1386 break;
1387 }
1348 1388
1349 /* set mic bias voltage */ 1389 /* set mic bias voltage */
1350 switch (aic3x->micbias_vg) { 1390 switch (aic3x->micbias_vg) {