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.c347
1 files changed, 245 insertions, 102 deletions
diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c
index dd222b10ce13..51c4713ac6e3 100644
--- a/sound/soc/codecs/tlv320aic3x.c
+++ b/sound/soc/codecs/tlv320aic3x.c
@@ -87,6 +87,7 @@ struct aic3x_priv {
87#define AIC3X_MODEL_3X 0 87#define AIC3X_MODEL_3X 0
88#define AIC3X_MODEL_33 1 88#define AIC3X_MODEL_33 1
89#define AIC3X_MODEL_3007 2 89#define AIC3X_MODEL_3007 2
90#define AIC3X_MODEL_3104 3
90 u16 model; 91 u16 model;
91 92
92 /* Selects the micbias voltage */ 93 /* Selects the micbias voltage */
@@ -197,7 +198,7 @@ static int snd_soc_dapm_put_volsw_aic3x(struct snd_kcontrol *kcontrol,
197static int mic_bias_event(struct snd_soc_dapm_widget *w, 198static int mic_bias_event(struct snd_soc_dapm_widget *w,
198 struct snd_kcontrol *kcontrol, int event) 199 struct snd_kcontrol *kcontrol, int event)
199{ 200{
200 struct snd_soc_codec *codec = w->codec; 201 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
201 struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec); 202 struct aic3x_priv *aic3x = snd_soc_codec_get_drvdata(codec);
202 203
203 switch (event) { 204 switch (event) {
@@ -316,52 +317,37 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = {
316 * only for swapped L-to-R and R-to-L routes. See below stereo controls 317 * only for swapped L-to-R and R-to-L routes. See below stereo controls
317 * for direct L-to-L and R-to-R routes. 318 * for direct L-to-L and R-to-R routes.
318 */ 319 */
319 SOC_SINGLE_TLV("Left Line Mixer Line2R Bypass Volume",
320 LINE2R_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv),
321 SOC_SINGLE_TLV("Left Line Mixer PGAR Bypass Volume", 320 SOC_SINGLE_TLV("Left Line Mixer PGAR Bypass Volume",
322 PGAR_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv), 321 PGAR_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv),
323 SOC_SINGLE_TLV("Left Line Mixer DACR1 Playback Volume", 322 SOC_SINGLE_TLV("Left Line Mixer DACR1 Playback Volume",
324 DACR1_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv), 323 DACR1_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv),
325 324
326 SOC_SINGLE_TLV("Right Line Mixer Line2L Bypass Volume",
327 LINE2L_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv),
328 SOC_SINGLE_TLV("Right Line Mixer PGAL Bypass Volume", 325 SOC_SINGLE_TLV("Right Line Mixer PGAL Bypass Volume",
329 PGAL_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv), 326 PGAL_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv),
330 SOC_SINGLE_TLV("Right Line Mixer DACL1 Playback Volume", 327 SOC_SINGLE_TLV("Right Line Mixer DACL1 Playback Volume",
331 DACL1_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv), 328 DACL1_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv),
332 329
333 SOC_SINGLE_TLV("Left HP Mixer Line2R Bypass Volume",
334 LINE2R_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv),
335 SOC_SINGLE_TLV("Left HP Mixer PGAR Bypass Volume", 330 SOC_SINGLE_TLV("Left HP Mixer PGAR Bypass Volume",
336 PGAR_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv), 331 PGAR_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv),
337 SOC_SINGLE_TLV("Left HP Mixer DACR1 Playback Volume", 332 SOC_SINGLE_TLV("Left HP Mixer DACR1 Playback Volume",
338 DACR1_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv), 333 DACR1_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv),
339 334
340 SOC_SINGLE_TLV("Right HP Mixer Line2L Bypass Volume",
341 LINE2L_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv),
342 SOC_SINGLE_TLV("Right HP Mixer PGAL Bypass Volume", 335 SOC_SINGLE_TLV("Right HP Mixer PGAL Bypass Volume",
343 PGAL_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv), 336 PGAL_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv),
344 SOC_SINGLE_TLV("Right HP Mixer DACL1 Playback Volume", 337 SOC_SINGLE_TLV("Right HP Mixer DACL1 Playback Volume",
345 DACL1_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv), 338 DACL1_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv),
346 339
347 SOC_SINGLE_TLV("Left HPCOM Mixer Line2R Bypass Volume",
348 LINE2R_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv),
349 SOC_SINGLE_TLV("Left HPCOM Mixer PGAR Bypass Volume", 340 SOC_SINGLE_TLV("Left HPCOM Mixer PGAR Bypass Volume",
350 PGAR_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv), 341 PGAR_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv),
351 SOC_SINGLE_TLV("Left HPCOM Mixer DACR1 Playback Volume", 342 SOC_SINGLE_TLV("Left HPCOM Mixer DACR1 Playback Volume",
352 DACR1_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv), 343 DACR1_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv),
353 344
354 SOC_SINGLE_TLV("Right HPCOM Mixer Line2L Bypass Volume",
355 LINE2L_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv),
356 SOC_SINGLE_TLV("Right HPCOM Mixer PGAL Bypass Volume", 345 SOC_SINGLE_TLV("Right HPCOM Mixer PGAL Bypass Volume",
357 PGAL_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv), 346 PGAL_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv),
358 SOC_SINGLE_TLV("Right HPCOM Mixer DACL1 Playback Volume", 347 SOC_SINGLE_TLV("Right HPCOM Mixer DACL1 Playback Volume",
359 DACL1_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv), 348 DACL1_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv),
360 349
361 /* Stereo output controls for direct L-to-L and R-to-R routes */ 350 /* Stereo output controls for direct L-to-L and R-to-R routes */
362 SOC_DOUBLE_R_TLV("Line Line2 Bypass Volume",
363 LINE2L_2_LLOPM_VOL, LINE2R_2_RLOPM_VOL,
364 0, 118, 1, output_stage_tlv),
365 SOC_DOUBLE_R_TLV("Line PGA Bypass Volume", 351 SOC_DOUBLE_R_TLV("Line PGA Bypass Volume",
366 PGAL_2_LLOPM_VOL, PGAR_2_RLOPM_VOL, 352 PGAL_2_LLOPM_VOL, PGAR_2_RLOPM_VOL,
367 0, 118, 1, output_stage_tlv), 353 0, 118, 1, output_stage_tlv),
@@ -369,9 +355,6 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = {
369 DACL1_2_LLOPM_VOL, DACR1_2_RLOPM_VOL, 355 DACL1_2_LLOPM_VOL, DACR1_2_RLOPM_VOL,
370 0, 118, 1, output_stage_tlv), 356 0, 118, 1, output_stage_tlv),
371 357
372 SOC_DOUBLE_R_TLV("HP Line2 Bypass Volume",
373 LINE2L_2_HPLOUT_VOL, LINE2R_2_HPROUT_VOL,
374 0, 118, 1, output_stage_tlv),
375 SOC_DOUBLE_R_TLV("HP PGA Bypass Volume", 358 SOC_DOUBLE_R_TLV("HP PGA Bypass Volume",
376 PGAL_2_HPLOUT_VOL, PGAR_2_HPROUT_VOL, 359 PGAL_2_HPLOUT_VOL, PGAR_2_HPROUT_VOL,
377 0, 118, 1, output_stage_tlv), 360 0, 118, 1, output_stage_tlv),
@@ -379,9 +362,6 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = {
379 DACL1_2_HPLOUT_VOL, DACR1_2_HPROUT_VOL, 362 DACL1_2_HPLOUT_VOL, DACR1_2_HPROUT_VOL,
380 0, 118, 1, output_stage_tlv), 363 0, 118, 1, output_stage_tlv),
381 364
382 SOC_DOUBLE_R_TLV("HPCOM Line2 Bypass Volume",
383 LINE2L_2_HPLCOM_VOL, LINE2R_2_HPRCOM_VOL,
384 0, 118, 1, output_stage_tlv),
385 SOC_DOUBLE_R_TLV("HPCOM PGA Bypass Volume", 365 SOC_DOUBLE_R_TLV("HPCOM PGA Bypass Volume",
386 PGAL_2_HPLCOM_VOL, PGAR_2_HPRCOM_VOL, 366 PGAL_2_HPLCOM_VOL, PGAR_2_HPRCOM_VOL,
387 0, 118, 1, output_stage_tlv), 367 0, 118, 1, output_stage_tlv),
@@ -424,6 +404,45 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = {
424 SOC_ENUM("Output Driver Ramp-up step", aic3x_rampup_step_enum), 404 SOC_ENUM("Output Driver Ramp-up step", aic3x_rampup_step_enum),
425}; 405};
426 406
407/* For other than tlv320aic3104 */
408static const struct snd_kcontrol_new aic3x_extra_snd_controls[] = {
409 /*
410 * Output controls that map to output mixer switches. Note these are
411 * only for swapped L-to-R and R-to-L routes. See below stereo controls
412 * for direct L-to-L and R-to-R routes.
413 */
414 SOC_SINGLE_TLV("Left Line Mixer Line2R Bypass Volume",
415 LINE2R_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv),
416
417 SOC_SINGLE_TLV("Right Line Mixer Line2L Bypass Volume",
418 LINE2L_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv),
419
420 SOC_SINGLE_TLV("Left HP Mixer Line2R Bypass Volume",
421 LINE2R_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv),
422
423 SOC_SINGLE_TLV("Right HP Mixer Line2L Bypass Volume",
424 LINE2L_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv),
425
426 SOC_SINGLE_TLV("Left HPCOM Mixer Line2R Bypass Volume",
427 LINE2R_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv),
428
429 SOC_SINGLE_TLV("Right HPCOM Mixer Line2L Bypass Volume",
430 LINE2L_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv),
431
432 /* Stereo output controls for direct L-to-L and R-to-R routes */
433 SOC_DOUBLE_R_TLV("Line Line2 Bypass Volume",
434 LINE2L_2_LLOPM_VOL, LINE2R_2_RLOPM_VOL,
435 0, 118, 1, output_stage_tlv),
436
437 SOC_DOUBLE_R_TLV("HP Line2 Bypass Volume",
438 LINE2L_2_HPLOUT_VOL, LINE2R_2_HPROUT_VOL,
439 0, 118, 1, output_stage_tlv),
440
441 SOC_DOUBLE_R_TLV("HPCOM Line2 Bypass Volume",
442 LINE2L_2_HPLCOM_VOL, LINE2R_2_HPRCOM_VOL,
443 0, 118, 1, output_stage_tlv),
444};
445
427static const struct snd_kcontrol_new aic3x_mono_controls[] = { 446static const struct snd_kcontrol_new aic3x_mono_controls[] = {
428 SOC_DOUBLE_R_TLV("Mono Line2 Bypass Volume", 447 SOC_DOUBLE_R_TLV("Mono Line2 Bypass Volume",
429 LINE2L_2_MONOLOPM_VOL, LINE2R_2_MONOLOPM_VOL, 448 LINE2L_2_MONOLOPM_VOL, LINE2R_2_MONOLOPM_VOL,
@@ -464,22 +483,24 @@ SOC_DAPM_ENUM("Route", aic3x_right_hpcom_enum);
464 483
465/* Left Line Mixer */ 484/* Left Line Mixer */
466static const struct snd_kcontrol_new aic3x_left_line_mixer_controls[] = { 485static const struct snd_kcontrol_new aic3x_left_line_mixer_controls[] = {
467 SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_LLOPM_VOL, 7, 1, 0),
468 SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_LLOPM_VOL, 7, 1, 0), 486 SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_LLOPM_VOL, 7, 1, 0),
469 SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_LLOPM_VOL, 7, 1, 0), 487 SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_LLOPM_VOL, 7, 1, 0),
470 SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_LLOPM_VOL, 7, 1, 0),
471 SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_LLOPM_VOL, 7, 1, 0), 488 SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_LLOPM_VOL, 7, 1, 0),
472 SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_LLOPM_VOL, 7, 1, 0), 489 SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_LLOPM_VOL, 7, 1, 0),
490 /* Not on tlv320aic3104 */
491 SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_LLOPM_VOL, 7, 1, 0),
492 SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_LLOPM_VOL, 7, 1, 0),
473}; 493};
474 494
475/* Right Line Mixer */ 495/* Right Line Mixer */
476static const struct snd_kcontrol_new aic3x_right_line_mixer_controls[] = { 496static const struct snd_kcontrol_new aic3x_right_line_mixer_controls[] = {
477 SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_RLOPM_VOL, 7, 1, 0),
478 SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_RLOPM_VOL, 7, 1, 0), 497 SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_RLOPM_VOL, 7, 1, 0),
479 SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_RLOPM_VOL, 7, 1, 0), 498 SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_RLOPM_VOL, 7, 1, 0),
480 SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_RLOPM_VOL, 7, 1, 0),
481 SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_RLOPM_VOL, 7, 1, 0), 499 SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_RLOPM_VOL, 7, 1, 0),
482 SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_RLOPM_VOL, 7, 1, 0), 500 SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_RLOPM_VOL, 7, 1, 0),
501 /* Not on tlv320aic3104 */
502 SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_RLOPM_VOL, 7, 1, 0),
503 SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_RLOPM_VOL, 7, 1, 0),
483}; 504};
484 505
485/* Mono Mixer */ 506/* Mono Mixer */
@@ -494,42 +515,46 @@ static const struct snd_kcontrol_new aic3x_mono_mixer_controls[] = {
494 515
495/* Left HP Mixer */ 516/* Left HP Mixer */
496static const struct snd_kcontrol_new aic3x_left_hp_mixer_controls[] = { 517static const struct snd_kcontrol_new aic3x_left_hp_mixer_controls[] = {
497 SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPLOUT_VOL, 7, 1, 0),
498 SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPLOUT_VOL, 7, 1, 0), 518 SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPLOUT_VOL, 7, 1, 0),
499 SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPLOUT_VOL, 7, 1, 0), 519 SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPLOUT_VOL, 7, 1, 0),
500 SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPLOUT_VOL, 7, 1, 0),
501 SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPLOUT_VOL, 7, 1, 0), 520 SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPLOUT_VOL, 7, 1, 0),
502 SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPLOUT_VOL, 7, 1, 0), 521 SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPLOUT_VOL, 7, 1, 0),
522 /* Not on tlv320aic3104 */
523 SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPLOUT_VOL, 7, 1, 0),
524 SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPLOUT_VOL, 7, 1, 0),
503}; 525};
504 526
505/* Right HP Mixer */ 527/* Right HP Mixer */
506static const struct snd_kcontrol_new aic3x_right_hp_mixer_controls[] = { 528static const struct snd_kcontrol_new aic3x_right_hp_mixer_controls[] = {
507 SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPROUT_VOL, 7, 1, 0),
508 SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPROUT_VOL, 7, 1, 0), 529 SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPROUT_VOL, 7, 1, 0),
509 SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPROUT_VOL, 7, 1, 0), 530 SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPROUT_VOL, 7, 1, 0),
510 SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPROUT_VOL, 7, 1, 0),
511 SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPROUT_VOL, 7, 1, 0), 531 SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPROUT_VOL, 7, 1, 0),
512 SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPROUT_VOL, 7, 1, 0), 532 SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPROUT_VOL, 7, 1, 0),
533 /* Not on tlv320aic3104 */
534 SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPROUT_VOL, 7, 1, 0),
535 SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPROUT_VOL, 7, 1, 0),
513}; 536};
514 537
515/* Left HPCOM Mixer */ 538/* Left HPCOM Mixer */
516static const struct snd_kcontrol_new aic3x_left_hpcom_mixer_controls[] = { 539static const struct snd_kcontrol_new aic3x_left_hpcom_mixer_controls[] = {
517 SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPLCOM_VOL, 7, 1, 0),
518 SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPLCOM_VOL, 7, 1, 0), 540 SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPLCOM_VOL, 7, 1, 0),
519 SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPLCOM_VOL, 7, 1, 0), 541 SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPLCOM_VOL, 7, 1, 0),
520 SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPLCOM_VOL, 7, 1, 0),
521 SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPLCOM_VOL, 7, 1, 0), 542 SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPLCOM_VOL, 7, 1, 0),
522 SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPLCOM_VOL, 7, 1, 0), 543 SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPLCOM_VOL, 7, 1, 0),
544 /* Not on tlv320aic3104 */
545 SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPLCOM_VOL, 7, 1, 0),
546 SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPLCOM_VOL, 7, 1, 0),
523}; 547};
524 548
525/* Right HPCOM Mixer */ 549/* Right HPCOM Mixer */
526static const struct snd_kcontrol_new aic3x_right_hpcom_mixer_controls[] = { 550static const struct snd_kcontrol_new aic3x_right_hpcom_mixer_controls[] = {
527 SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPRCOM_VOL, 7, 1, 0),
528 SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPRCOM_VOL, 7, 1, 0), 551 SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPRCOM_VOL, 7, 1, 0),
529 SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPRCOM_VOL, 7, 1, 0), 552 SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPRCOM_VOL, 7, 1, 0),
530 SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPRCOM_VOL, 7, 1, 0),
531 SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPRCOM_VOL, 7, 1, 0), 553 SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPRCOM_VOL, 7, 1, 0),
532 SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPRCOM_VOL, 7, 1, 0), 554 SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPRCOM_VOL, 7, 1, 0),
555 /* Not on tlv320aic3104 */
556 SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPRCOM_VOL, 7, 1, 0),
557 SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPRCOM_VOL, 7, 1, 0),
533}; 558};
534 559
535/* Left PGA Mixer */ 560/* Left PGA Mixer */
@@ -550,6 +575,22 @@ static const struct snd_kcontrol_new aic3x_right_pga_mixer_controls[] = {
550 SOC_DAPM_SINGLE_AIC3X("Mic3R Switch", MIC3LR_2_RADC_CTRL, 0, 1, 1), 575 SOC_DAPM_SINGLE_AIC3X("Mic3R Switch", MIC3LR_2_RADC_CTRL, 0, 1, 1),
551}; 576};
552 577
578/* Left PGA Mixer for tlv320aic3104 */
579static const struct snd_kcontrol_new aic3104_left_pga_mixer_controls[] = {
580 SOC_DAPM_SINGLE_AIC3X("Line1L Switch", LINE1L_2_LADC_CTRL, 3, 1, 1),
581 SOC_DAPM_SINGLE_AIC3X("Line1R Switch", LINE1R_2_LADC_CTRL, 3, 1, 1),
582 SOC_DAPM_SINGLE_AIC3X("Mic2L Switch", MIC3LR_2_LADC_CTRL, 4, 1, 1),
583 SOC_DAPM_SINGLE_AIC3X("Mic2R Switch", MIC3LR_2_LADC_CTRL, 0, 1, 1),
584};
585
586/* Right PGA Mixer for tlv320aic3104 */
587static const struct snd_kcontrol_new aic3104_right_pga_mixer_controls[] = {
588 SOC_DAPM_SINGLE_AIC3X("Line1R Switch", LINE1R_2_RADC_CTRL, 3, 1, 1),
589 SOC_DAPM_SINGLE_AIC3X("Line1L Switch", LINE1L_2_RADC_CTRL, 3, 1, 1),
590 SOC_DAPM_SINGLE_AIC3X("Mic2L Switch", MIC3LR_2_RADC_CTRL, 4, 1, 1),
591 SOC_DAPM_SINGLE_AIC3X("Mic2R Switch", MIC3LR_2_RADC_CTRL, 0, 1, 1),
592};
593
553/* Left Line1 Mux */ 594/* Left Line1 Mux */
554static const struct snd_kcontrol_new aic3x_left_line1l_mux_controls = 595static const struct snd_kcontrol_new aic3x_left_line1l_mux_controls =
555SOC_DAPM_ENUM("Route", aic3x_line1l_2_l_enum); 596SOC_DAPM_ENUM("Route", aic3x_line1l_2_l_enum);
@@ -593,26 +634,56 @@ static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = {
593 634
594 /* Inputs to Left ADC */ 635 /* Inputs to Left ADC */
595 SND_SOC_DAPM_ADC("Left ADC", "Left Capture", LINE1L_2_LADC_CTRL, 2, 0), 636 SND_SOC_DAPM_ADC("Left ADC", "Left Capture", LINE1L_2_LADC_CTRL, 2, 0),
596 SND_SOC_DAPM_MIXER("Left PGA Mixer", SND_SOC_NOPM, 0, 0,
597 &aic3x_left_pga_mixer_controls[0],
598 ARRAY_SIZE(aic3x_left_pga_mixer_controls)),
599 SND_SOC_DAPM_MUX("Left Line1L Mux", SND_SOC_NOPM, 0, 0, 637 SND_SOC_DAPM_MUX("Left Line1L Mux", SND_SOC_NOPM, 0, 0,
600 &aic3x_left_line1l_mux_controls), 638 &aic3x_left_line1l_mux_controls),
601 SND_SOC_DAPM_MUX("Left Line1R Mux", SND_SOC_NOPM, 0, 0, 639 SND_SOC_DAPM_MUX("Left Line1R Mux", SND_SOC_NOPM, 0, 0,
602 &aic3x_left_line1r_mux_controls), 640 &aic3x_left_line1r_mux_controls),
603 SND_SOC_DAPM_MUX("Left Line2L Mux", SND_SOC_NOPM, 0, 0,
604 &aic3x_left_line2_mux_controls),
605 641
606 /* Inputs to Right ADC */ 642 /* Inputs to Right ADC */
607 SND_SOC_DAPM_ADC("Right ADC", "Right Capture", 643 SND_SOC_DAPM_ADC("Right ADC", "Right Capture",
608 LINE1R_2_RADC_CTRL, 2, 0), 644 LINE1R_2_RADC_CTRL, 2, 0),
609 SND_SOC_DAPM_MIXER("Right PGA Mixer", SND_SOC_NOPM, 0, 0,
610 &aic3x_right_pga_mixer_controls[0],
611 ARRAY_SIZE(aic3x_right_pga_mixer_controls)),
612 SND_SOC_DAPM_MUX("Right Line1L Mux", SND_SOC_NOPM, 0, 0, 645 SND_SOC_DAPM_MUX("Right Line1L Mux", SND_SOC_NOPM, 0, 0,
613 &aic3x_right_line1l_mux_controls), 646 &aic3x_right_line1l_mux_controls),
614 SND_SOC_DAPM_MUX("Right Line1R Mux", SND_SOC_NOPM, 0, 0, 647 SND_SOC_DAPM_MUX("Right Line1R Mux", SND_SOC_NOPM, 0, 0,
615 &aic3x_right_line1r_mux_controls), 648 &aic3x_right_line1r_mux_controls),
649
650 /* Mic Bias */
651 SND_SOC_DAPM_SUPPLY("Mic Bias", MICBIAS_CTRL, 6, 0,
652 mic_bias_event,
653 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
654
655 SND_SOC_DAPM_OUTPUT("LLOUT"),
656 SND_SOC_DAPM_OUTPUT("RLOUT"),
657 SND_SOC_DAPM_OUTPUT("HPLOUT"),
658 SND_SOC_DAPM_OUTPUT("HPROUT"),
659 SND_SOC_DAPM_OUTPUT("HPLCOM"),
660 SND_SOC_DAPM_OUTPUT("HPRCOM"),
661
662 SND_SOC_DAPM_INPUT("LINE1L"),
663 SND_SOC_DAPM_INPUT("LINE1R"),
664
665 /*
666 * Virtual output pin to detection block inside codec. This can be
667 * used to keep codec bias on if gpio or detection features are needed.
668 * Force pin on or construct a path with an input jack and mic bias
669 * widgets.
670 */
671 SND_SOC_DAPM_OUTPUT("Detection"),
672};
673
674/* For other than tlv320aic3104 */
675static const struct snd_soc_dapm_widget aic3x_extra_dapm_widgets[] = {
676 /* Inputs to Left ADC */
677 SND_SOC_DAPM_MIXER("Left PGA Mixer", SND_SOC_NOPM, 0, 0,
678 &aic3x_left_pga_mixer_controls[0],
679 ARRAY_SIZE(aic3x_left_pga_mixer_controls)),
680 SND_SOC_DAPM_MUX("Left Line2L Mux", SND_SOC_NOPM, 0, 0,
681 &aic3x_left_line2_mux_controls),
682
683 /* Inputs to Right ADC */
684 SND_SOC_DAPM_MIXER("Right PGA Mixer", SND_SOC_NOPM, 0, 0,
685 &aic3x_right_pga_mixer_controls[0],
686 ARRAY_SIZE(aic3x_right_pga_mixer_controls)),
616 SND_SOC_DAPM_MUX("Right Line2R Mux", SND_SOC_NOPM, 0, 0, 687 SND_SOC_DAPM_MUX("Right Line2R Mux", SND_SOC_NOPM, 0, 0,
617 &aic3x_right_line2_mux_controls), 688 &aic3x_right_line2_mux_controls),
618 689
@@ -637,11 +708,6 @@ static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = {
637 SND_SOC_DAPM_REG(snd_soc_dapm_micbias, "DMic Rate 32", 708 SND_SOC_DAPM_REG(snd_soc_dapm_micbias, "DMic Rate 32",
638 AIC3X_ASD_INTF_CTRLA, 0, 3, 3, 0), 709 AIC3X_ASD_INTF_CTRLA, 0, 3, 3, 0),
639 710
640 /* Mic Bias */
641 SND_SOC_DAPM_SUPPLY("Mic Bias", MICBIAS_CTRL, 6, 0,
642 mic_bias_event,
643 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
644
645 /* Output mixers */ 711 /* Output mixers */
646 SND_SOC_DAPM_MIXER("Left Line Mixer", SND_SOC_NOPM, 0, 0, 712 SND_SOC_DAPM_MIXER("Left Line Mixer", SND_SOC_NOPM, 0, 0,
647 &aic3x_left_line_mixer_controls[0], 713 &aic3x_left_line_mixer_controls[0],
@@ -662,27 +728,46 @@ static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = {
662 &aic3x_right_hpcom_mixer_controls[0], 728 &aic3x_right_hpcom_mixer_controls[0],
663 ARRAY_SIZE(aic3x_right_hpcom_mixer_controls)), 729 ARRAY_SIZE(aic3x_right_hpcom_mixer_controls)),
664 730
665 SND_SOC_DAPM_OUTPUT("LLOUT"),
666 SND_SOC_DAPM_OUTPUT("RLOUT"),
667 SND_SOC_DAPM_OUTPUT("HPLOUT"),
668 SND_SOC_DAPM_OUTPUT("HPROUT"),
669 SND_SOC_DAPM_OUTPUT("HPLCOM"),
670 SND_SOC_DAPM_OUTPUT("HPRCOM"),
671
672 SND_SOC_DAPM_INPUT("MIC3L"), 731 SND_SOC_DAPM_INPUT("MIC3L"),
673 SND_SOC_DAPM_INPUT("MIC3R"), 732 SND_SOC_DAPM_INPUT("MIC3R"),
674 SND_SOC_DAPM_INPUT("LINE1L"),
675 SND_SOC_DAPM_INPUT("LINE1R"),
676 SND_SOC_DAPM_INPUT("LINE2L"), 733 SND_SOC_DAPM_INPUT("LINE2L"),
677 SND_SOC_DAPM_INPUT("LINE2R"), 734 SND_SOC_DAPM_INPUT("LINE2R"),
735};
678 736
679 /* 737/* For tlv320aic3104 */
680 * Virtual output pin to detection block inside codec. This can be 738static const struct snd_soc_dapm_widget aic3104_extra_dapm_widgets[] = {
681 * used to keep codec bias on if gpio or detection features are needed. 739 /* Inputs to Left ADC */
682 * Force pin on or construct a path with an input jack and mic bias 740 SND_SOC_DAPM_MIXER("Left PGA Mixer", SND_SOC_NOPM, 0, 0,
683 * widgets. 741 &aic3104_left_pga_mixer_controls[0],
684 */ 742 ARRAY_SIZE(aic3104_left_pga_mixer_controls)),
685 SND_SOC_DAPM_OUTPUT("Detection"), 743
744 /* Inputs to Right ADC */
745 SND_SOC_DAPM_MIXER("Right PGA Mixer", SND_SOC_NOPM, 0, 0,
746 &aic3104_right_pga_mixer_controls[0],
747 ARRAY_SIZE(aic3104_right_pga_mixer_controls)),
748
749 /* Output mixers */
750 SND_SOC_DAPM_MIXER("Left Line Mixer", SND_SOC_NOPM, 0, 0,
751 &aic3x_left_line_mixer_controls[0],
752 ARRAY_SIZE(aic3x_left_line_mixer_controls) - 2),
753 SND_SOC_DAPM_MIXER("Right Line Mixer", SND_SOC_NOPM, 0, 0,
754 &aic3x_right_line_mixer_controls[0],
755 ARRAY_SIZE(aic3x_right_line_mixer_controls) - 2),
756 SND_SOC_DAPM_MIXER("Left HP Mixer", SND_SOC_NOPM, 0, 0,
757 &aic3x_left_hp_mixer_controls[0],
758 ARRAY_SIZE(aic3x_left_hp_mixer_controls) - 2),
759 SND_SOC_DAPM_MIXER("Right HP Mixer", SND_SOC_NOPM, 0, 0,
760 &aic3x_right_hp_mixer_controls[0],
761 ARRAY_SIZE(aic3x_right_hp_mixer_controls) - 2),
762 SND_SOC_DAPM_MIXER("Left HPCOM Mixer", SND_SOC_NOPM, 0, 0,
763 &aic3x_left_hpcom_mixer_controls[0],
764 ARRAY_SIZE(aic3x_left_hpcom_mixer_controls) - 2),
765 SND_SOC_DAPM_MIXER("Right HPCOM Mixer", SND_SOC_NOPM, 0, 0,
766 &aic3x_right_hpcom_mixer_controls[0],
767 ARRAY_SIZE(aic3x_right_hpcom_mixer_controls) - 2),
768
769 SND_SOC_DAPM_INPUT("MIC2L"),
770 SND_SOC_DAPM_INPUT("MIC2R"),
686}; 771};
687 772
688static const struct snd_soc_dapm_widget aic3x_dapm_mono_widgets[] = { 773static const struct snd_soc_dapm_widget aic3x_dapm_mono_widgets[] = {
@@ -712,17 +797,10 @@ static const struct snd_soc_dapm_route intercon[] = {
712 {"Left Line1R Mux", "single-ended", "LINE1R"}, 797 {"Left Line1R Mux", "single-ended", "LINE1R"},
713 {"Left Line1R Mux", "differential", "LINE1R"}, 798 {"Left Line1R Mux", "differential", "LINE1R"},
714 799
715 {"Left Line2L Mux", "single-ended", "LINE2L"},
716 {"Left Line2L Mux", "differential", "LINE2L"},
717
718 {"Left PGA Mixer", "Line1L Switch", "Left Line1L Mux"}, 800 {"Left PGA Mixer", "Line1L Switch", "Left Line1L Mux"},
719 {"Left PGA Mixer", "Line1R Switch", "Left Line1R Mux"}, 801 {"Left PGA Mixer", "Line1R Switch", "Left Line1R Mux"},
720 {"Left PGA Mixer", "Line2L Switch", "Left Line2L Mux"},
721 {"Left PGA Mixer", "Mic3L Switch", "MIC3L"},
722 {"Left PGA Mixer", "Mic3R Switch", "MIC3R"},
723 802
724 {"Left ADC", NULL, "Left PGA Mixer"}, 803 {"Left ADC", NULL, "Left PGA Mixer"},
725 {"Left ADC", NULL, "GPIO1 dmic modclk"},
726 804
727 /* Right Input */ 805 /* Right Input */
728 {"Right Line1R Mux", "single-ended", "LINE1R"}, 806 {"Right Line1R Mux", "single-ended", "LINE1R"},
@@ -730,25 +808,10 @@ static const struct snd_soc_dapm_route intercon[] = {
730 {"Right Line1L Mux", "single-ended", "LINE1L"}, 808 {"Right Line1L Mux", "single-ended", "LINE1L"},
731 {"Right Line1L Mux", "differential", "LINE1L"}, 809 {"Right Line1L Mux", "differential", "LINE1L"},
732 810
733 {"Right Line2R Mux", "single-ended", "LINE2R"},
734 {"Right Line2R Mux", "differential", "LINE2R"},
735
736 {"Right PGA Mixer", "Line1L Switch", "Right Line1L Mux"}, 811 {"Right PGA Mixer", "Line1L Switch", "Right Line1L Mux"},
737 {"Right PGA Mixer", "Line1R Switch", "Right Line1R Mux"}, 812 {"Right PGA Mixer", "Line1R Switch", "Right Line1R Mux"},
738 {"Right PGA Mixer", "Line2R Switch", "Right Line2R Mux"},
739 {"Right PGA Mixer", "Mic3L Switch", "MIC3L"},
740 {"Right PGA Mixer", "Mic3R Switch", "MIC3R"},
741 813
742 {"Right ADC", NULL, "Right PGA Mixer"}, 814 {"Right ADC", NULL, "Right PGA Mixer"},
743 {"Right ADC", NULL, "GPIO1 dmic modclk"},
744
745 /*
746 * Logical path between digital mic enable and GPIO1 modulator clock
747 * output function
748 */
749 {"GPIO1 dmic modclk", NULL, "DMic Rate 128"},
750 {"GPIO1 dmic modclk", NULL, "DMic Rate 64"},
751 {"GPIO1 dmic modclk", NULL, "DMic Rate 32"},
752 815
753 /* Left DAC Output */ 816 /* Left DAC Output */
754 {"Left DAC Mux", "DAC_L1", "Left DAC"}, 817 {"Left DAC Mux", "DAC_L1", "Left DAC"},
@@ -761,10 +824,8 @@ static const struct snd_soc_dapm_route intercon[] = {
761 {"Right DAC Mux", "DAC_R3", "Right DAC"}, 824 {"Right DAC Mux", "DAC_R3", "Right DAC"},
762 825
763 /* Left Line Output */ 826 /* Left Line Output */
764 {"Left Line Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
765 {"Left Line Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, 827 {"Left Line Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
766 {"Left Line Mixer", "DACL1 Switch", "Left DAC Mux"}, 828 {"Left Line Mixer", "DACL1 Switch", "Left DAC Mux"},
767 {"Left Line Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
768 {"Left Line Mixer", "PGAR Bypass Switch", "Right PGA Mixer"}, 829 {"Left Line Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
769 {"Left Line Mixer", "DACR1 Switch", "Right DAC Mux"}, 830 {"Left Line Mixer", "DACR1 Switch", "Right DAC Mux"},
770 831
@@ -773,10 +834,8 @@ static const struct snd_soc_dapm_route intercon[] = {
773 {"LLOUT", NULL, "Left Line Out"}, 834 {"LLOUT", NULL, "Left Line Out"},
774 835
775 /* Right Line Output */ 836 /* Right Line Output */
776 {"Right Line Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
777 {"Right Line Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, 837 {"Right Line Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
778 {"Right Line Mixer", "DACL1 Switch", "Left DAC Mux"}, 838 {"Right Line Mixer", "DACL1 Switch", "Left DAC Mux"},
779 {"Right Line Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
780 {"Right Line Mixer", "PGAR Bypass Switch", "Right PGA Mixer"}, 839 {"Right Line Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
781 {"Right Line Mixer", "DACR1 Switch", "Right DAC Mux"}, 840 {"Right Line Mixer", "DACR1 Switch", "Right DAC Mux"},
782 841
@@ -785,10 +844,8 @@ static const struct snd_soc_dapm_route intercon[] = {
785 {"RLOUT", NULL, "Right Line Out"}, 844 {"RLOUT", NULL, "Right Line Out"},
786 845
787 /* Left HP Output */ 846 /* Left HP Output */
788 {"Left HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
789 {"Left HP Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, 847 {"Left HP Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
790 {"Left HP Mixer", "DACL1 Switch", "Left DAC Mux"}, 848 {"Left HP Mixer", "DACL1 Switch", "Left DAC Mux"},
791 {"Left HP Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
792 {"Left HP Mixer", "PGAR Bypass Switch", "Right PGA Mixer"}, 849 {"Left HP Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
793 {"Left HP Mixer", "DACR1 Switch", "Right DAC Mux"}, 850 {"Left HP Mixer", "DACR1 Switch", "Right DAC Mux"},
794 851
@@ -797,10 +854,8 @@ static const struct snd_soc_dapm_route intercon[] = {
797 {"HPLOUT", NULL, "Left HP Out"}, 854 {"HPLOUT", NULL, "Left HP Out"},
798 855
799 /* Right HP Output */ 856 /* Right HP Output */
800 {"Right HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
801 {"Right HP Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, 857 {"Right HP Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
802 {"Right HP Mixer", "DACL1 Switch", "Left DAC Mux"}, 858 {"Right HP Mixer", "DACL1 Switch", "Left DAC Mux"},
803 {"Right HP Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
804 {"Right HP Mixer", "PGAR Bypass Switch", "Right PGA Mixer"}, 859 {"Right HP Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
805 {"Right HP Mixer", "DACR1 Switch", "Right DAC Mux"}, 860 {"Right HP Mixer", "DACR1 Switch", "Right DAC Mux"},
806 861
@@ -809,10 +864,8 @@ static const struct snd_soc_dapm_route intercon[] = {
809 {"HPROUT", NULL, "Right HP Out"}, 864 {"HPROUT", NULL, "Right HP Out"},
810 865
811 /* Left HPCOM Output */ 866 /* Left HPCOM Output */
812 {"Left HPCOM Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
813 {"Left HPCOM Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, 867 {"Left HPCOM Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
814 {"Left HPCOM Mixer", "DACL1 Switch", "Left DAC Mux"}, 868 {"Left HPCOM Mixer", "DACL1 Switch", "Left DAC Mux"},
815 {"Left HPCOM Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
816 {"Left HPCOM Mixer", "PGAR Bypass Switch", "Right PGA Mixer"}, 869 {"Left HPCOM Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
817 {"Left HPCOM Mixer", "DACR1 Switch", "Right DAC Mux"}, 870 {"Left HPCOM Mixer", "DACR1 Switch", "Right DAC Mux"},
818 871
@@ -823,10 +876,8 @@ static const struct snd_soc_dapm_route intercon[] = {
823 {"HPLCOM", NULL, "Left HP Com"}, 876 {"HPLCOM", NULL, "Left HP Com"},
824 877
825 /* Right HPCOM Output */ 878 /* Right HPCOM Output */
826 {"Right HPCOM Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
827 {"Right HPCOM Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, 879 {"Right HPCOM Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
828 {"Right HPCOM Mixer", "DACL1 Switch", "Left DAC Mux"}, 880 {"Right HPCOM Mixer", "DACL1 Switch", "Left DAC Mux"},
829 {"Right HPCOM Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
830 {"Right HPCOM Mixer", "PGAR Bypass Switch", "Right PGA Mixer"}, 881 {"Right HPCOM Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
831 {"Right HPCOM Mixer", "DACR1 Switch", "Right DAC Mux"}, 882 {"Right HPCOM Mixer", "DACR1 Switch", "Right DAC Mux"},
832 883
@@ -839,6 +890,72 @@ static const struct snd_soc_dapm_route intercon[] = {
839 {"HPRCOM", NULL, "Right HP Com"}, 890 {"HPRCOM", NULL, "Right HP Com"},
840}; 891};
841 892
893/* For other than tlv320aic3104 */
894static const struct snd_soc_dapm_route intercon_extra[] = {
895 /* Left Input */
896 {"Left Line2L Mux", "single-ended", "LINE2L"},
897 {"Left Line2L Mux", "differential", "LINE2L"},
898
899 {"Left PGA Mixer", "Line2L Switch", "Left Line2L Mux"},
900 {"Left PGA Mixer", "Mic3L Switch", "MIC3L"},
901 {"Left PGA Mixer", "Mic3R Switch", "MIC3R"},
902
903 {"Left ADC", NULL, "GPIO1 dmic modclk"},
904
905 /* Right Input */
906 {"Right Line2R Mux", "single-ended", "LINE2R"},
907 {"Right Line2R Mux", "differential", "LINE2R"},
908
909 {"Right PGA Mixer", "Line2R Switch", "Right Line2R Mux"},
910 {"Right PGA Mixer", "Mic3L Switch", "MIC3L"},
911 {"Right PGA Mixer", "Mic3R Switch", "MIC3R"},
912
913 {"Right ADC", NULL, "GPIO1 dmic modclk"},
914
915 /*
916 * Logical path between digital mic enable and GPIO1 modulator clock
917 * output function
918 */
919 {"GPIO1 dmic modclk", NULL, "DMic Rate 128"},
920 {"GPIO1 dmic modclk", NULL, "DMic Rate 64"},
921 {"GPIO1 dmic modclk", NULL, "DMic Rate 32"},
922
923 /* Left Line Output */
924 {"Left Line Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
925 {"Left Line Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
926
927 /* Right Line Output */
928 {"Right Line Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
929 {"Right Line Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
930
931 /* Left HP Output */
932 {"Left HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
933 {"Left HP Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
934
935 /* Right HP Output */
936 {"Right HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
937 {"Right HP Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
938
939 /* Left HPCOM Output */
940 {"Left HPCOM Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
941 {"Left HPCOM Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
942
943 /* Right HPCOM Output */
944 {"Right HPCOM Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
945 {"Right HPCOM Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
946};
947
948/* For tlv320aic3104 */
949static const struct snd_soc_dapm_route intercon_extra_3104[] = {
950 /* Left Input */
951 {"Left PGA Mixer", "Mic2L Switch", "MIC2L"},
952 {"Left PGA Mixer", "Mic2R Switch", "MIC2R"},
953
954 /* Right Input */
955 {"Right PGA Mixer", "Mic2L Switch", "MIC2L"},
956 {"Right PGA Mixer", "Mic2R Switch", "MIC2R"},
957};
958
842static const struct snd_soc_dapm_route intercon_mono[] = { 959static const struct snd_soc_dapm_route intercon_mono[] = {
843 /* Mono Output */ 960 /* Mono Output */
844 {"Mono Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, 961 {"Mono Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
@@ -867,17 +984,31 @@ static int aic3x_add_widgets(struct snd_soc_codec *codec)
867 switch (aic3x->model) { 984 switch (aic3x->model) {
868 case AIC3X_MODEL_3X: 985 case AIC3X_MODEL_3X:
869 case AIC3X_MODEL_33: 986 case AIC3X_MODEL_33:
987 snd_soc_dapm_new_controls(dapm, aic3x_extra_dapm_widgets,
988 ARRAY_SIZE(aic3x_extra_dapm_widgets));
989 snd_soc_dapm_add_routes(dapm, intercon_extra,
990 ARRAY_SIZE(intercon_extra));
870 snd_soc_dapm_new_controls(dapm, aic3x_dapm_mono_widgets, 991 snd_soc_dapm_new_controls(dapm, aic3x_dapm_mono_widgets,
871 ARRAY_SIZE(aic3x_dapm_mono_widgets)); 992 ARRAY_SIZE(aic3x_dapm_mono_widgets));
872 snd_soc_dapm_add_routes(dapm, intercon_mono, 993 snd_soc_dapm_add_routes(dapm, intercon_mono,
873 ARRAY_SIZE(intercon_mono)); 994 ARRAY_SIZE(intercon_mono));
874 break; 995 break;
875 case AIC3X_MODEL_3007: 996 case AIC3X_MODEL_3007:
997 snd_soc_dapm_new_controls(dapm, aic3x_extra_dapm_widgets,
998 ARRAY_SIZE(aic3x_extra_dapm_widgets));
999 snd_soc_dapm_add_routes(dapm, intercon_extra,
1000 ARRAY_SIZE(intercon_extra));
876 snd_soc_dapm_new_controls(dapm, aic3007_dapm_widgets, 1001 snd_soc_dapm_new_controls(dapm, aic3007_dapm_widgets,
877 ARRAY_SIZE(aic3007_dapm_widgets)); 1002 ARRAY_SIZE(aic3007_dapm_widgets));
878 snd_soc_dapm_add_routes(dapm, intercon_3007, 1003 snd_soc_dapm_add_routes(dapm, intercon_3007,
879 ARRAY_SIZE(intercon_3007)); 1004 ARRAY_SIZE(intercon_3007));
880 break; 1005 break;
1006 case AIC3X_MODEL_3104:
1007 snd_soc_dapm_new_controls(dapm, aic3104_extra_dapm_widgets,
1008 ARRAY_SIZE(aic3104_extra_dapm_widgets));
1009 snd_soc_dapm_add_routes(dapm, intercon_extra_3104,
1010 ARRAY_SIZE(intercon_extra_3104));
1011 break;
881 } 1012 }
882 1013
883 return 0; 1014 return 0;
@@ -1438,23 +1569,33 @@ static int aic3x_probe(struct snd_soc_codec *codec)
1438 aic3x_init(codec); 1569 aic3x_init(codec);
1439 1570
1440 if (aic3x->setup) { 1571 if (aic3x->setup) {
1441 /* setup GPIO functions */ 1572 if (aic3x->model != AIC3X_MODEL_3104) {
1442 snd_soc_write(codec, AIC3X_GPIO1_REG, 1573 /* setup GPIO functions */
1443 (aic3x->setup->gpio_func[0] & 0xf) << 4); 1574 snd_soc_write(codec, AIC3X_GPIO1_REG,
1444 snd_soc_write(codec, AIC3X_GPIO2_REG, 1575 (aic3x->setup->gpio_func[0] & 0xf) << 4);
1445 (aic3x->setup->gpio_func[1] & 0xf) << 4); 1576 snd_soc_write(codec, AIC3X_GPIO2_REG,
1577 (aic3x->setup->gpio_func[1] & 0xf) << 4);
1578 } else {
1579 dev_warn(codec->dev, "GPIO functionality is not supported on tlv320aic3104\n");
1580 }
1446 } 1581 }
1447 1582
1448 switch (aic3x->model) { 1583 switch (aic3x->model) {
1449 case AIC3X_MODEL_3X: 1584 case AIC3X_MODEL_3X:
1450 case AIC3X_MODEL_33: 1585 case AIC3X_MODEL_33:
1586 snd_soc_add_codec_controls(codec, aic3x_extra_snd_controls,
1587 ARRAY_SIZE(aic3x_extra_snd_controls));
1451 snd_soc_add_codec_controls(codec, aic3x_mono_controls, 1588 snd_soc_add_codec_controls(codec, aic3x_mono_controls,
1452 ARRAY_SIZE(aic3x_mono_controls)); 1589 ARRAY_SIZE(aic3x_mono_controls));
1453 break; 1590 break;
1454 case AIC3X_MODEL_3007: 1591 case AIC3X_MODEL_3007:
1592 snd_soc_add_codec_controls(codec, aic3x_extra_snd_controls,
1593 ARRAY_SIZE(aic3x_extra_snd_controls));
1455 snd_soc_add_codec_controls(codec, 1594 snd_soc_add_codec_controls(codec,
1456 &aic3x_classd_amp_gain_ctrl, 1); 1595 &aic3x_classd_amp_gain_ctrl, 1);
1457 break; 1596 break;
1597 case AIC3X_MODEL_3104:
1598 break;
1458 } 1599 }
1459 1600
1460 /* set mic bias voltage */ 1601 /* set mic bias voltage */
@@ -1522,6 +1663,7 @@ static const struct i2c_device_id aic3x_i2c_id[] = {
1522 { "tlv320aic33", AIC3X_MODEL_33 }, 1663 { "tlv320aic33", AIC3X_MODEL_33 },
1523 { "tlv320aic3007", AIC3X_MODEL_3007 }, 1664 { "tlv320aic3007", AIC3X_MODEL_3007 },
1524 { "tlv320aic3106", AIC3X_MODEL_3X }, 1665 { "tlv320aic3106", AIC3X_MODEL_3X },
1666 { "tlv320aic3104", AIC3X_MODEL_3104 },
1525 { } 1667 { }
1526}; 1668};
1527MODULE_DEVICE_TABLE(i2c, aic3x_i2c_id); 1669MODULE_DEVICE_TABLE(i2c, aic3x_i2c_id);
@@ -1673,6 +1815,7 @@ static const struct of_device_id tlv320aic3x_of_match[] = {
1673 { .compatible = "ti,tlv320aic33" }, 1815 { .compatible = "ti,tlv320aic33" },
1674 { .compatible = "ti,tlv320aic3007" }, 1816 { .compatible = "ti,tlv320aic3007" },
1675 { .compatible = "ti,tlv320aic3106" }, 1817 { .compatible = "ti,tlv320aic3106" },
1818 { .compatible = "ti,tlv320aic3104" },
1676 {}, 1819 {},
1677}; 1820};
1678MODULE_DEVICE_TABLE(of, tlv320aic3x_of_match); 1821MODULE_DEVICE_TABLE(of, tlv320aic3x_of_match);