diff options
Diffstat (limited to 'sound/soc/codecs/tlv320aic3x.c')
-rw-r--r-- | sound/soc/codecs/tlv320aic3x.c | 347 |
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, | |||
197 | static int mic_bias_event(struct snd_soc_dapm_widget *w, | 198 | static 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 */ | ||
408 | static 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 | |||
427 | static const struct snd_kcontrol_new aic3x_mono_controls[] = { | 446 | static 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 */ |
466 | static const struct snd_kcontrol_new aic3x_left_line_mixer_controls[] = { | 485 | static 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 */ |
476 | static const struct snd_kcontrol_new aic3x_right_line_mixer_controls[] = { | 496 | static 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 */ |
496 | static const struct snd_kcontrol_new aic3x_left_hp_mixer_controls[] = { | 517 | static 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 */ |
506 | static const struct snd_kcontrol_new aic3x_right_hp_mixer_controls[] = { | 528 | static 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 */ |
516 | static const struct snd_kcontrol_new aic3x_left_hpcom_mixer_controls[] = { | 539 | static 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 */ |
526 | static const struct snd_kcontrol_new aic3x_right_hpcom_mixer_controls[] = { | 550 | static 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 */ | ||
579 | static 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 */ | ||
587 | static 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 */ |
554 | static const struct snd_kcontrol_new aic3x_left_line1l_mux_controls = | 595 | static const struct snd_kcontrol_new aic3x_left_line1l_mux_controls = |
555 | SOC_DAPM_ENUM("Route", aic3x_line1l_2_l_enum); | 596 | SOC_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 */ | ||
675 | static 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 | 738 | static 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 | ||
688 | static const struct snd_soc_dapm_widget aic3x_dapm_mono_widgets[] = { | 773 | static 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 */ | ||
894 | static 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 */ | ||
949 | static 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 | |||
842 | static const struct snd_soc_dapm_route intercon_mono[] = { | 959 | static 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 | }; |
1527 | MODULE_DEVICE_TABLE(i2c, aic3x_i2c_id); | 1669 | MODULE_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 | }; |
1678 | MODULE_DEVICE_TABLE(of, tlv320aic3x_of_match); | 1821 | MODULE_DEVICE_TABLE(of, tlv320aic3x_of_match); |