Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: tlv320aic3x: Add support for tlv320aic3104

Disables GPIO support and LINE2 input and renames Mic3 input to Mic2,
if tlv320aic3104 mode is seleced. Devicetree binding document is
updated accordingly.

Signed-off-by: Jyri Sarha <jsarha@ti.com>
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Jyri Sarha and committed by
Mark Brown
9503112d 97bf6af1

+253 -102
+9 -1
Documentation/devicetree/bindings/sound/tlv320aic3x.txt
··· 9 9 "ti,tlv320aic33" - TLV320AIC33 10 10 "ti,tlv320aic3007" - TLV320AIC3007 11 11 "ti,tlv320aic3106" - TLV320AIC3106 12 + "ti,tlv320aic3104" - TLV320AIC3104 12 13 13 14 14 15 - reg - <int> - I2C slave address ··· 19 18 20 19 - gpio-reset - gpio pin number used for codec reset 21 20 - ai3x-gpio-func - <array of 2 int> - AIC3X_GPIO1 & AIC3X_GPIO2 Functionality 21 + - Not supported on tlv320aic3104 22 22 - ai3x-micbias-vg - MicBias Voltage required. 23 23 1 - MICBIAS output is powered to 2.0V, 24 24 2 - MICBIAS output is powered to 2.5V, ··· 38 36 * HPLCOM 39 37 * HPRCOM 40 38 41 - CODEC input pins: 39 + CODEC input pins for TLV320AIC3104: 40 + * MIC2L 41 + * MIC2R 42 + * LINE1L 43 + * LINE1R 44 + 45 + CODEC input pins for other compatible codecs: 42 46 * MIC3L 43 47 * MIC3R 44 48 * LINE1L
+244 -101
sound/soc/codecs/tlv320aic3x.c
··· 87 87 #define AIC3X_MODEL_3X 0 88 88 #define AIC3X_MODEL_33 1 89 89 #define AIC3X_MODEL_3007 2 90 + #define AIC3X_MODEL_3104 3 90 91 u16 model; 91 92 92 93 /* Selects the micbias voltage */ ··· 317 316 * only for swapped L-to-R and R-to-L routes. See below stereo controls 318 317 * for direct L-to-L and R-to-R routes. 319 318 */ 320 - SOC_SINGLE_TLV("Left Line Mixer Line2R Bypass Volume", 321 - LINE2R_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv), 322 319 SOC_SINGLE_TLV("Left Line Mixer PGAR Bypass Volume", 323 320 PGAR_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv), 324 321 SOC_SINGLE_TLV("Left Line Mixer DACR1 Playback Volume", 325 322 DACR1_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv), 326 323 327 - SOC_SINGLE_TLV("Right Line Mixer Line2L Bypass Volume", 328 - LINE2L_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv), 329 324 SOC_SINGLE_TLV("Right Line Mixer PGAL Bypass Volume", 330 325 PGAL_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv), 331 326 SOC_SINGLE_TLV("Right Line Mixer DACL1 Playback Volume", 332 327 DACL1_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv), 333 328 334 - SOC_SINGLE_TLV("Left HP Mixer Line2R Bypass Volume", 335 - LINE2R_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv), 336 329 SOC_SINGLE_TLV("Left HP Mixer PGAR Bypass Volume", 337 330 PGAR_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv), 338 331 SOC_SINGLE_TLV("Left HP Mixer DACR1 Playback Volume", 339 332 DACR1_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv), 340 333 341 - SOC_SINGLE_TLV("Right HP Mixer Line2L Bypass Volume", 342 - LINE2L_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv), 343 334 SOC_SINGLE_TLV("Right HP Mixer PGAL Bypass Volume", 344 335 PGAL_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv), 345 336 SOC_SINGLE_TLV("Right HP Mixer DACL1 Playback Volume", 346 337 DACL1_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv), 347 338 348 - SOC_SINGLE_TLV("Left HPCOM Mixer Line2R Bypass Volume", 349 - LINE2R_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv), 350 339 SOC_SINGLE_TLV("Left HPCOM Mixer PGAR Bypass Volume", 351 340 PGAR_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv), 352 341 SOC_SINGLE_TLV("Left HPCOM Mixer DACR1 Playback Volume", 353 342 DACR1_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv), 354 343 355 - SOC_SINGLE_TLV("Right HPCOM Mixer Line2L Bypass Volume", 356 - LINE2L_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv), 357 344 SOC_SINGLE_TLV("Right HPCOM Mixer PGAL Bypass Volume", 358 345 PGAL_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv), 359 346 SOC_SINGLE_TLV("Right HPCOM Mixer DACL1 Playback Volume", 360 347 DACL1_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv), 361 348 362 349 /* Stereo output controls for direct L-to-L and R-to-R routes */ 363 - SOC_DOUBLE_R_TLV("Line Line2 Bypass Volume", 364 - LINE2L_2_LLOPM_VOL, LINE2R_2_RLOPM_VOL, 365 - 0, 118, 1, output_stage_tlv), 366 350 SOC_DOUBLE_R_TLV("Line PGA Bypass Volume", 367 351 PGAL_2_LLOPM_VOL, PGAR_2_RLOPM_VOL, 368 352 0, 118, 1, output_stage_tlv), ··· 355 369 DACL1_2_LLOPM_VOL, DACR1_2_RLOPM_VOL, 356 370 0, 118, 1, output_stage_tlv), 357 371 358 - SOC_DOUBLE_R_TLV("HP Line2 Bypass Volume", 359 - LINE2L_2_HPLOUT_VOL, LINE2R_2_HPROUT_VOL, 360 - 0, 118, 1, output_stage_tlv), 361 372 SOC_DOUBLE_R_TLV("HP PGA Bypass Volume", 362 373 PGAL_2_HPLOUT_VOL, PGAR_2_HPROUT_VOL, 363 374 0, 118, 1, output_stage_tlv), ··· 362 379 DACL1_2_HPLOUT_VOL, DACR1_2_HPROUT_VOL, 363 380 0, 118, 1, output_stage_tlv), 364 381 365 - SOC_DOUBLE_R_TLV("HPCOM Line2 Bypass Volume", 366 - LINE2L_2_HPLCOM_VOL, LINE2R_2_HPRCOM_VOL, 367 - 0, 118, 1, output_stage_tlv), 368 382 SOC_DOUBLE_R_TLV("HPCOM PGA Bypass Volume", 369 383 PGAL_2_HPLCOM_VOL, PGAR_2_HPRCOM_VOL, 370 384 0, 118, 1, output_stage_tlv), ··· 404 424 SOC_ENUM("Output Driver Ramp-up step", aic3x_rampup_step_enum), 405 425 }; 406 426 427 + /* For other than tlv320aic3104 */ 428 + static const struct snd_kcontrol_new aic3x_extra_snd_controls[] = { 429 + /* 430 + * Output controls that map to output mixer switches. Note these are 431 + * only for swapped L-to-R and R-to-L routes. See below stereo controls 432 + * for direct L-to-L and R-to-R routes. 433 + */ 434 + SOC_SINGLE_TLV("Left Line Mixer Line2R Bypass Volume", 435 + LINE2R_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv), 436 + 437 + SOC_SINGLE_TLV("Right Line Mixer Line2L Bypass Volume", 438 + LINE2L_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv), 439 + 440 + SOC_SINGLE_TLV("Left HP Mixer Line2R Bypass Volume", 441 + LINE2R_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv), 442 + 443 + SOC_SINGLE_TLV("Right HP Mixer Line2L Bypass Volume", 444 + LINE2L_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv), 445 + 446 + SOC_SINGLE_TLV("Left HPCOM Mixer Line2R Bypass Volume", 447 + LINE2R_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv), 448 + 449 + SOC_SINGLE_TLV("Right HPCOM Mixer Line2L Bypass Volume", 450 + LINE2L_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv), 451 + 452 + /* Stereo output controls for direct L-to-L and R-to-R routes */ 453 + SOC_DOUBLE_R_TLV("Line Line2 Bypass Volume", 454 + LINE2L_2_LLOPM_VOL, LINE2R_2_RLOPM_VOL, 455 + 0, 118, 1, output_stage_tlv), 456 + 457 + SOC_DOUBLE_R_TLV("HP Line2 Bypass Volume", 458 + LINE2L_2_HPLOUT_VOL, LINE2R_2_HPROUT_VOL, 459 + 0, 118, 1, output_stage_tlv), 460 + 461 + SOC_DOUBLE_R_TLV("HPCOM Line2 Bypass Volume", 462 + LINE2L_2_HPLCOM_VOL, LINE2R_2_HPRCOM_VOL, 463 + 0, 118, 1, output_stage_tlv), 464 + }; 465 + 407 466 static const struct snd_kcontrol_new aic3x_mono_controls[] = { 408 467 SOC_DOUBLE_R_TLV("Mono Line2 Bypass Volume", 409 468 LINE2L_2_MONOLOPM_VOL, LINE2R_2_MONOLOPM_VOL, ··· 483 464 484 465 /* Left Line Mixer */ 485 466 static const struct snd_kcontrol_new aic3x_left_line_mixer_controls[] = { 486 - SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_LLOPM_VOL, 7, 1, 0), 487 467 SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_LLOPM_VOL, 7, 1, 0), 488 468 SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_LLOPM_VOL, 7, 1, 0), 489 - SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_LLOPM_VOL, 7, 1, 0), 490 469 SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_LLOPM_VOL, 7, 1, 0), 491 470 SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_LLOPM_VOL, 7, 1, 0), 471 + /* Not on tlv320aic3104 */ 472 + SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_LLOPM_VOL, 7, 1, 0), 473 + SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_LLOPM_VOL, 7, 1, 0), 492 474 }; 493 475 494 476 /* Right Line Mixer */ 495 477 static const struct snd_kcontrol_new aic3x_right_line_mixer_controls[] = { 496 - SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_RLOPM_VOL, 7, 1, 0), 497 478 SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_RLOPM_VOL, 7, 1, 0), 498 479 SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_RLOPM_VOL, 7, 1, 0), 499 - SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_RLOPM_VOL, 7, 1, 0), 500 480 SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_RLOPM_VOL, 7, 1, 0), 501 481 SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_RLOPM_VOL, 7, 1, 0), 482 + /* Not on tlv320aic3104 */ 483 + SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_RLOPM_VOL, 7, 1, 0), 484 + SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_RLOPM_VOL, 7, 1, 0), 502 485 }; 503 486 504 487 /* Mono Mixer */ ··· 515 494 516 495 /* Left HP Mixer */ 517 496 static const struct snd_kcontrol_new aic3x_left_hp_mixer_controls[] = { 518 - SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPLOUT_VOL, 7, 1, 0), 519 497 SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPLOUT_VOL, 7, 1, 0), 520 498 SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPLOUT_VOL, 7, 1, 0), 521 - SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPLOUT_VOL, 7, 1, 0), 522 499 SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPLOUT_VOL, 7, 1, 0), 523 500 SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPLOUT_VOL, 7, 1, 0), 501 + /* Not on tlv320aic3104 */ 502 + SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPLOUT_VOL, 7, 1, 0), 503 + SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPLOUT_VOL, 7, 1, 0), 524 504 }; 525 505 526 506 /* Right HP Mixer */ 527 507 static const struct snd_kcontrol_new aic3x_right_hp_mixer_controls[] = { 528 - SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPROUT_VOL, 7, 1, 0), 529 508 SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPROUT_VOL, 7, 1, 0), 530 509 SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPROUT_VOL, 7, 1, 0), 531 - SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPROUT_VOL, 7, 1, 0), 532 510 SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPROUT_VOL, 7, 1, 0), 533 511 SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPROUT_VOL, 7, 1, 0), 512 + /* Not on tlv320aic3104 */ 513 + SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPROUT_VOL, 7, 1, 0), 514 + SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPROUT_VOL, 7, 1, 0), 534 515 }; 535 516 536 517 /* Left HPCOM Mixer */ 537 518 static const struct snd_kcontrol_new aic3x_left_hpcom_mixer_controls[] = { 538 - SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPLCOM_VOL, 7, 1, 0), 539 519 SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPLCOM_VOL, 7, 1, 0), 540 520 SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPLCOM_VOL, 7, 1, 0), 541 - SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPLCOM_VOL, 7, 1, 0), 542 521 SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPLCOM_VOL, 7, 1, 0), 543 522 SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPLCOM_VOL, 7, 1, 0), 523 + /* Not on tlv320aic3104 */ 524 + SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPLCOM_VOL, 7, 1, 0), 525 + SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPLCOM_VOL, 7, 1, 0), 544 526 }; 545 527 546 528 /* Right HPCOM Mixer */ 547 529 static const struct snd_kcontrol_new aic3x_right_hpcom_mixer_controls[] = { 548 - SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPRCOM_VOL, 7, 1, 0), 549 530 SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPRCOM_VOL, 7, 1, 0), 550 531 SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPRCOM_VOL, 7, 1, 0), 551 - SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPRCOM_VOL, 7, 1, 0), 552 532 SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPRCOM_VOL, 7, 1, 0), 553 533 SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPRCOM_VOL, 7, 1, 0), 534 + /* Not on tlv320aic3104 */ 535 + SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPRCOM_VOL, 7, 1, 0), 536 + SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPRCOM_VOL, 7, 1, 0), 554 537 }; 555 538 556 539 /* Left PGA Mixer */ ··· 573 548 SOC_DAPM_SINGLE_AIC3X("Line2R Switch", LINE2R_2_RADC_CTRL, 3, 1, 1), 574 549 SOC_DAPM_SINGLE_AIC3X("Mic3L Switch", MIC3LR_2_RADC_CTRL, 4, 1, 1), 575 550 SOC_DAPM_SINGLE_AIC3X("Mic3R Switch", MIC3LR_2_RADC_CTRL, 0, 1, 1), 551 + }; 552 + 553 + /* Left PGA Mixer for tlv320aic3104 */ 554 + static const struct snd_kcontrol_new aic3104_left_pga_mixer_controls[] = { 555 + SOC_DAPM_SINGLE_AIC3X("Line1L Switch", LINE1L_2_LADC_CTRL, 3, 1, 1), 556 + SOC_DAPM_SINGLE_AIC3X("Line1R Switch", LINE1R_2_LADC_CTRL, 3, 1, 1), 557 + SOC_DAPM_SINGLE_AIC3X("Mic2L Switch", MIC3LR_2_LADC_CTRL, 4, 1, 1), 558 + SOC_DAPM_SINGLE_AIC3X("Mic2R Switch", MIC3LR_2_LADC_CTRL, 0, 1, 1), 559 + }; 560 + 561 + /* Right PGA Mixer for tlv320aic3104 */ 562 + static const struct snd_kcontrol_new aic3104_right_pga_mixer_controls[] = { 563 + SOC_DAPM_SINGLE_AIC3X("Line1R Switch", LINE1R_2_RADC_CTRL, 3, 1, 1), 564 + SOC_DAPM_SINGLE_AIC3X("Line1L Switch", LINE1L_2_RADC_CTRL, 3, 1, 1), 565 + SOC_DAPM_SINGLE_AIC3X("Mic2L Switch", MIC3LR_2_RADC_CTRL, 4, 1, 1), 566 + SOC_DAPM_SINGLE_AIC3X("Mic2R Switch", MIC3LR_2_RADC_CTRL, 0, 1, 1), 576 567 }; 577 568 578 569 /* Left Line1 Mux */ ··· 634 593 635 594 /* Inputs to Left ADC */ 636 595 SND_SOC_DAPM_ADC("Left ADC", "Left Capture", LINE1L_2_LADC_CTRL, 2, 0), 637 - SND_SOC_DAPM_MIXER("Left PGA Mixer", SND_SOC_NOPM, 0, 0, 638 - &aic3x_left_pga_mixer_controls[0], 639 - ARRAY_SIZE(aic3x_left_pga_mixer_controls)), 640 596 SND_SOC_DAPM_MUX("Left Line1L Mux", SND_SOC_NOPM, 0, 0, 641 597 &aic3x_left_line1l_mux_controls), 642 598 SND_SOC_DAPM_MUX("Left Line1R Mux", SND_SOC_NOPM, 0, 0, 643 599 &aic3x_left_line1r_mux_controls), 644 - SND_SOC_DAPM_MUX("Left Line2L Mux", SND_SOC_NOPM, 0, 0, 645 - &aic3x_left_line2_mux_controls), 646 600 647 601 /* Inputs to Right ADC */ 648 602 SND_SOC_DAPM_ADC("Right ADC", "Right Capture", 649 603 LINE1R_2_RADC_CTRL, 2, 0), 650 - SND_SOC_DAPM_MIXER("Right PGA Mixer", SND_SOC_NOPM, 0, 0, 651 - &aic3x_right_pga_mixer_controls[0], 652 - ARRAY_SIZE(aic3x_right_pga_mixer_controls)), 653 604 SND_SOC_DAPM_MUX("Right Line1L Mux", SND_SOC_NOPM, 0, 0, 654 605 &aic3x_right_line1l_mux_controls), 655 606 SND_SOC_DAPM_MUX("Right Line1R Mux", SND_SOC_NOPM, 0, 0, 656 607 &aic3x_right_line1r_mux_controls), 608 + 609 + /* Mic Bias */ 610 + SND_SOC_DAPM_SUPPLY("Mic Bias", MICBIAS_CTRL, 6, 0, 611 + mic_bias_event, 612 + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), 613 + 614 + SND_SOC_DAPM_OUTPUT("LLOUT"), 615 + SND_SOC_DAPM_OUTPUT("RLOUT"), 616 + SND_SOC_DAPM_OUTPUT("HPLOUT"), 617 + SND_SOC_DAPM_OUTPUT("HPROUT"), 618 + SND_SOC_DAPM_OUTPUT("HPLCOM"), 619 + SND_SOC_DAPM_OUTPUT("HPRCOM"), 620 + 621 + SND_SOC_DAPM_INPUT("LINE1L"), 622 + SND_SOC_DAPM_INPUT("LINE1R"), 623 + 624 + /* 625 + * Virtual output pin to detection block inside codec. This can be 626 + * used to keep codec bias on if gpio or detection features are needed. 627 + * Force pin on or construct a path with an input jack and mic bias 628 + * widgets. 629 + */ 630 + SND_SOC_DAPM_OUTPUT("Detection"), 631 + }; 632 + 633 + /* For other than tlv320aic3104 */ 634 + static const struct snd_soc_dapm_widget aic3x_extra_dapm_widgets[] = { 635 + /* Inputs to Left ADC */ 636 + SND_SOC_DAPM_MIXER("Left PGA Mixer", SND_SOC_NOPM, 0, 0, 637 + &aic3x_left_pga_mixer_controls[0], 638 + ARRAY_SIZE(aic3x_left_pga_mixer_controls)), 639 + SND_SOC_DAPM_MUX("Left Line2L Mux", SND_SOC_NOPM, 0, 0, 640 + &aic3x_left_line2_mux_controls), 641 + 642 + /* Inputs to Right ADC */ 643 + SND_SOC_DAPM_MIXER("Right PGA Mixer", SND_SOC_NOPM, 0, 0, 644 + &aic3x_right_pga_mixer_controls[0], 645 + ARRAY_SIZE(aic3x_right_pga_mixer_controls)), 657 646 SND_SOC_DAPM_MUX("Right Line2R Mux", SND_SOC_NOPM, 0, 0, 658 647 &aic3x_right_line2_mux_controls), 659 648 ··· 708 637 SND_SOC_DAPM_REG(snd_soc_dapm_micbias, "DMic Rate 32", 709 638 AIC3X_ASD_INTF_CTRLA, 0, 3, 3, 0), 710 639 711 - /* Mic Bias */ 712 - SND_SOC_DAPM_SUPPLY("Mic Bias", MICBIAS_CTRL, 6, 0, 713 - mic_bias_event, 714 - SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), 715 - 716 640 /* Output mixers */ 717 641 SND_SOC_DAPM_MIXER("Left Line Mixer", SND_SOC_NOPM, 0, 0, 718 642 &aic3x_left_line_mixer_controls[0], ··· 728 662 &aic3x_right_hpcom_mixer_controls[0], 729 663 ARRAY_SIZE(aic3x_right_hpcom_mixer_controls)), 730 664 731 - SND_SOC_DAPM_OUTPUT("LLOUT"), 732 - SND_SOC_DAPM_OUTPUT("RLOUT"), 733 - SND_SOC_DAPM_OUTPUT("HPLOUT"), 734 - SND_SOC_DAPM_OUTPUT("HPROUT"), 735 - SND_SOC_DAPM_OUTPUT("HPLCOM"), 736 - SND_SOC_DAPM_OUTPUT("HPRCOM"), 737 - 738 665 SND_SOC_DAPM_INPUT("MIC3L"), 739 666 SND_SOC_DAPM_INPUT("MIC3R"), 740 - SND_SOC_DAPM_INPUT("LINE1L"), 741 - SND_SOC_DAPM_INPUT("LINE1R"), 742 667 SND_SOC_DAPM_INPUT("LINE2L"), 743 668 SND_SOC_DAPM_INPUT("LINE2R"), 669 + }; 744 670 745 - /* 746 - * Virtual output pin to detection block inside codec. This can be 747 - * used to keep codec bias on if gpio or detection features are needed. 748 - * Force pin on or construct a path with an input jack and mic bias 749 - * widgets. 750 - */ 751 - SND_SOC_DAPM_OUTPUT("Detection"), 671 + /* For tlv320aic3104 */ 672 + static const struct snd_soc_dapm_widget aic3104_extra_dapm_widgets[] = { 673 + /* Inputs to Left ADC */ 674 + SND_SOC_DAPM_MIXER("Left PGA Mixer", SND_SOC_NOPM, 0, 0, 675 + &aic3104_left_pga_mixer_controls[0], 676 + ARRAY_SIZE(aic3104_left_pga_mixer_controls)), 677 + 678 + /* Inputs to Right ADC */ 679 + SND_SOC_DAPM_MIXER("Right PGA Mixer", SND_SOC_NOPM, 0, 0, 680 + &aic3104_right_pga_mixer_controls[0], 681 + ARRAY_SIZE(aic3104_right_pga_mixer_controls)), 682 + 683 + /* Output mixers */ 684 + SND_SOC_DAPM_MIXER("Left Line Mixer", SND_SOC_NOPM, 0, 0, 685 + &aic3x_left_line_mixer_controls[0], 686 + ARRAY_SIZE(aic3x_left_line_mixer_controls) - 2), 687 + SND_SOC_DAPM_MIXER("Right Line Mixer", SND_SOC_NOPM, 0, 0, 688 + &aic3x_right_line_mixer_controls[0], 689 + ARRAY_SIZE(aic3x_right_line_mixer_controls) - 2), 690 + SND_SOC_DAPM_MIXER("Left HP Mixer", SND_SOC_NOPM, 0, 0, 691 + &aic3x_left_hp_mixer_controls[0], 692 + ARRAY_SIZE(aic3x_left_hp_mixer_controls) - 2), 693 + SND_SOC_DAPM_MIXER("Right HP Mixer", SND_SOC_NOPM, 0, 0, 694 + &aic3x_right_hp_mixer_controls[0], 695 + ARRAY_SIZE(aic3x_right_hp_mixer_controls) - 2), 696 + SND_SOC_DAPM_MIXER("Left HPCOM Mixer", SND_SOC_NOPM, 0, 0, 697 + &aic3x_left_hpcom_mixer_controls[0], 698 + ARRAY_SIZE(aic3x_left_hpcom_mixer_controls) - 2), 699 + SND_SOC_DAPM_MIXER("Right HPCOM Mixer", SND_SOC_NOPM, 0, 0, 700 + &aic3x_right_hpcom_mixer_controls[0], 701 + ARRAY_SIZE(aic3x_right_hpcom_mixer_controls) - 2), 702 + 703 + SND_SOC_DAPM_INPUT("MIC2L"), 704 + SND_SOC_DAPM_INPUT("MIC2R"), 752 705 }; 753 706 754 707 static const struct snd_soc_dapm_widget aic3x_dapm_mono_widgets[] = { ··· 797 712 {"Left Line1R Mux", "single-ended", "LINE1R"}, 798 713 {"Left Line1R Mux", "differential", "LINE1R"}, 799 714 800 - {"Left Line2L Mux", "single-ended", "LINE2L"}, 801 - {"Left Line2L Mux", "differential", "LINE2L"}, 802 - 803 715 {"Left PGA Mixer", "Line1L Switch", "Left Line1L Mux"}, 804 716 {"Left PGA Mixer", "Line1R Switch", "Left Line1R Mux"}, 805 - {"Left PGA Mixer", "Line2L Switch", "Left Line2L Mux"}, 806 - {"Left PGA Mixer", "Mic3L Switch", "MIC3L"}, 807 - {"Left PGA Mixer", "Mic3R Switch", "MIC3R"}, 808 717 809 718 {"Left ADC", NULL, "Left PGA Mixer"}, 810 - {"Left ADC", NULL, "GPIO1 dmic modclk"}, 811 719 812 720 /* Right Input */ 813 721 {"Right Line1R Mux", "single-ended", "LINE1R"}, ··· 808 730 {"Right Line1L Mux", "single-ended", "LINE1L"}, 809 731 {"Right Line1L Mux", "differential", "LINE1L"}, 810 732 811 - {"Right Line2R Mux", "single-ended", "LINE2R"}, 812 - {"Right Line2R Mux", "differential", "LINE2R"}, 813 - 814 733 {"Right PGA Mixer", "Line1L Switch", "Right Line1L Mux"}, 815 734 {"Right PGA Mixer", "Line1R Switch", "Right Line1R Mux"}, 816 - {"Right PGA Mixer", "Line2R Switch", "Right Line2R Mux"}, 817 - {"Right PGA Mixer", "Mic3L Switch", "MIC3L"}, 818 - {"Right PGA Mixer", "Mic3R Switch", "MIC3R"}, 819 735 820 736 {"Right ADC", NULL, "Right PGA Mixer"}, 821 - {"Right ADC", NULL, "GPIO1 dmic modclk"}, 822 - 823 - /* 824 - * Logical path between digital mic enable and GPIO1 modulator clock 825 - * output function 826 - */ 827 - {"GPIO1 dmic modclk", NULL, "DMic Rate 128"}, 828 - {"GPIO1 dmic modclk", NULL, "DMic Rate 64"}, 829 - {"GPIO1 dmic modclk", NULL, "DMic Rate 32"}, 830 737 831 738 /* Left DAC Output */ 832 739 {"Left DAC Mux", "DAC_L1", "Left DAC"}, ··· 824 761 {"Right DAC Mux", "DAC_R3", "Right DAC"}, 825 762 826 763 /* Left Line Output */ 827 - {"Left Line Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, 828 764 {"Left Line Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, 829 765 {"Left Line Mixer", "DACL1 Switch", "Left DAC Mux"}, 830 - {"Left Line Mixer", "Line2R Bypass Switch", "Right Line2R Mux"}, 831 766 {"Left Line Mixer", "PGAR Bypass Switch", "Right PGA Mixer"}, 832 767 {"Left Line Mixer", "DACR1 Switch", "Right DAC Mux"}, 833 768 ··· 834 773 {"LLOUT", NULL, "Left Line Out"}, 835 774 836 775 /* Right Line Output */ 837 - {"Right Line Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, 838 776 {"Right Line Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, 839 777 {"Right Line Mixer", "DACL1 Switch", "Left DAC Mux"}, 840 - {"Right Line Mixer", "Line2R Bypass Switch", "Right Line2R Mux"}, 841 778 {"Right Line Mixer", "PGAR Bypass Switch", "Right PGA Mixer"}, 842 779 {"Right Line Mixer", "DACR1 Switch", "Right DAC Mux"}, 843 780 ··· 844 785 {"RLOUT", NULL, "Right Line Out"}, 845 786 846 787 /* Left HP Output */ 847 - {"Left HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, 848 788 {"Left HP Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, 849 789 {"Left HP Mixer", "DACL1 Switch", "Left DAC Mux"}, 850 - {"Left HP Mixer", "Line2R Bypass Switch", "Right Line2R Mux"}, 851 790 {"Left HP Mixer", "PGAR Bypass Switch", "Right PGA Mixer"}, 852 791 {"Left HP Mixer", "DACR1 Switch", "Right DAC Mux"}, 853 792 ··· 854 797 {"HPLOUT", NULL, "Left HP Out"}, 855 798 856 799 /* Right HP Output */ 857 - {"Right HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, 858 800 {"Right HP Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, 859 801 {"Right HP Mixer", "DACL1 Switch", "Left DAC Mux"}, 860 - {"Right HP Mixer", "Line2R Bypass Switch", "Right Line2R Mux"}, 861 802 {"Right HP Mixer", "PGAR Bypass Switch", "Right PGA Mixer"}, 862 803 {"Right HP Mixer", "DACR1 Switch", "Right DAC Mux"}, 863 804 ··· 864 809 {"HPROUT", NULL, "Right HP Out"}, 865 810 866 811 /* Left HPCOM Output */ 867 - {"Left HPCOM Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, 868 812 {"Left HPCOM Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, 869 813 {"Left HPCOM Mixer", "DACL1 Switch", "Left DAC Mux"}, 870 - {"Left HPCOM Mixer", "Line2R Bypass Switch", "Right Line2R Mux"}, 871 814 {"Left HPCOM Mixer", "PGAR Bypass Switch", "Right PGA Mixer"}, 872 815 {"Left HPCOM Mixer", "DACR1 Switch", "Right DAC Mux"}, 873 816 ··· 876 823 {"HPLCOM", NULL, "Left HP Com"}, 877 824 878 825 /* Right HPCOM Output */ 879 - {"Right HPCOM Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, 880 826 {"Right HPCOM Mixer", "PGAL Bypass Switch", "Left PGA Mixer"}, 881 827 {"Right HPCOM Mixer", "DACL1 Switch", "Left DAC Mux"}, 882 - {"Right HPCOM Mixer", "Line2R Bypass Switch", "Right Line2R Mux"}, 883 828 {"Right HPCOM Mixer", "PGAR Bypass Switch", "Right PGA Mixer"}, 884 829 {"Right HPCOM Mixer", "DACR1 Switch", "Right DAC Mux"}, 885 830 ··· 888 837 {"Right HPCOM Mux", "external feedback", "Right HPCOM Mixer"}, 889 838 {"Right HP Com", NULL, "Right HPCOM Mux"}, 890 839 {"HPRCOM", NULL, "Right HP Com"}, 840 + }; 841 + 842 + /* For other than tlv320aic3104 */ 843 + static const struct snd_soc_dapm_route intercon_extra[] = { 844 + /* Left Input */ 845 + {"Left Line2L Mux", "single-ended", "LINE2L"}, 846 + {"Left Line2L Mux", "differential", "LINE2L"}, 847 + 848 + {"Left PGA Mixer", "Line2L Switch", "Left Line2L Mux"}, 849 + {"Left PGA Mixer", "Mic3L Switch", "MIC3L"}, 850 + {"Left PGA Mixer", "Mic3R Switch", "MIC3R"}, 851 + 852 + {"Left ADC", NULL, "GPIO1 dmic modclk"}, 853 + 854 + /* Right Input */ 855 + {"Right Line2R Mux", "single-ended", "LINE2R"}, 856 + {"Right Line2R Mux", "differential", "LINE2R"}, 857 + 858 + {"Right PGA Mixer", "Line2R Switch", "Right Line2R Mux"}, 859 + {"Right PGA Mixer", "Mic3L Switch", "MIC3L"}, 860 + {"Right PGA Mixer", "Mic3R Switch", "MIC3R"}, 861 + 862 + {"Right ADC", NULL, "GPIO1 dmic modclk"}, 863 + 864 + /* 865 + * Logical path between digital mic enable and GPIO1 modulator clock 866 + * output function 867 + */ 868 + {"GPIO1 dmic modclk", NULL, "DMic Rate 128"}, 869 + {"GPIO1 dmic modclk", NULL, "DMic Rate 64"}, 870 + {"GPIO1 dmic modclk", NULL, "DMic Rate 32"}, 871 + 872 + /* Left Line Output */ 873 + {"Left Line Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, 874 + {"Left Line Mixer", "Line2R Bypass Switch", "Right Line2R Mux"}, 875 + 876 + /* Right Line Output */ 877 + {"Right Line Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, 878 + {"Right Line Mixer", "Line2R Bypass Switch", "Right Line2R Mux"}, 879 + 880 + /* Left HP Output */ 881 + {"Left HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, 882 + {"Left HP Mixer", "Line2R Bypass Switch", "Right Line2R Mux"}, 883 + 884 + /* Right HP Output */ 885 + {"Right HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, 886 + {"Right HP Mixer", "Line2R Bypass Switch", "Right Line2R Mux"}, 887 + 888 + /* Left HPCOM Output */ 889 + {"Left HPCOM Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, 890 + {"Left HPCOM Mixer", "Line2R Bypass Switch", "Right Line2R Mux"}, 891 + 892 + /* Right HPCOM Output */ 893 + {"Right HPCOM Mixer", "Line2L Bypass Switch", "Left Line2L Mux"}, 894 + {"Right HPCOM Mixer", "Line2R Bypass Switch", "Right Line2R Mux"}, 895 + }; 896 + 897 + /* For other than tlv320aic3104 */ 898 + static const struct snd_soc_dapm_route intercon_extra_3104[] = { 899 + /* Left Input */ 900 + {"Left PGA Mixer", "Mic2L Switch", "MIC2L"}, 901 + {"Left PGA Mixer", "Mic2R Switch", "MIC2R"}, 902 + 903 + /* Right Input */ 904 + {"Right PGA Mixer", "Mic2L Switch", "MIC2L"}, 905 + {"Right PGA Mixer", "Mic2R Switch", "MIC2R"}, 891 906 }; 892 907 893 908 static const struct snd_soc_dapm_route intercon_mono[] = { ··· 984 867 switch (aic3x->model) { 985 868 case AIC3X_MODEL_3X: 986 869 case AIC3X_MODEL_33: 870 + snd_soc_dapm_new_controls(dapm, aic3x_extra_dapm_widgets, 871 + ARRAY_SIZE(aic3x_extra_dapm_widgets)); 872 + snd_soc_dapm_add_routes(dapm, intercon_extra, 873 + ARRAY_SIZE(intercon_extra)); 987 874 snd_soc_dapm_new_controls(dapm, aic3x_dapm_mono_widgets, 988 875 ARRAY_SIZE(aic3x_dapm_mono_widgets)); 989 876 snd_soc_dapm_add_routes(dapm, intercon_mono, 990 877 ARRAY_SIZE(intercon_mono)); 991 878 break; 992 879 case AIC3X_MODEL_3007: 880 + snd_soc_dapm_new_controls(dapm, aic3x_extra_dapm_widgets, 881 + ARRAY_SIZE(aic3x_extra_dapm_widgets)); 882 + snd_soc_dapm_add_routes(dapm, intercon_extra, 883 + ARRAY_SIZE(intercon_extra)); 993 884 snd_soc_dapm_new_controls(dapm, aic3007_dapm_widgets, 994 885 ARRAY_SIZE(aic3007_dapm_widgets)); 995 886 snd_soc_dapm_add_routes(dapm, intercon_3007, 996 887 ARRAY_SIZE(intercon_3007)); 888 + break; 889 + case AIC3X_MODEL_3104: 890 + snd_soc_dapm_new_controls(dapm, aic3104_extra_dapm_widgets, 891 + ARRAY_SIZE(aic3104_extra_dapm_widgets)); 892 + snd_soc_dapm_add_routes(dapm, intercon_extra_3104, 893 + ARRAY_SIZE(intercon_extra_3104)); 997 894 break; 998 895 } 999 896 ··· 1569 1438 aic3x_init(codec); 1570 1439 1571 1440 if (aic3x->setup) { 1572 - /* setup GPIO functions */ 1573 - snd_soc_write(codec, AIC3X_GPIO1_REG, 1574 - (aic3x->setup->gpio_func[0] & 0xf) << 4); 1575 - snd_soc_write(codec, AIC3X_GPIO2_REG, 1576 - (aic3x->setup->gpio_func[1] & 0xf) << 4); 1441 + if (aic3x->model != AIC3X_MODEL_3104) { 1442 + /* setup GPIO functions */ 1443 + snd_soc_write(codec, AIC3X_GPIO1_REG, 1444 + (aic3x->setup->gpio_func[0] & 0xf) << 4); 1445 + snd_soc_write(codec, AIC3X_GPIO2_REG, 1446 + (aic3x->setup->gpio_func[1] & 0xf) << 4); 1447 + } else { 1448 + dev_warn(codec->dev, "GPIO functionality is not supported on tlv320aic3104\n"); 1449 + } 1577 1450 } 1578 1451 1579 1452 switch (aic3x->model) { 1580 1453 case AIC3X_MODEL_3X: 1581 1454 case AIC3X_MODEL_33: 1455 + snd_soc_add_codec_controls(codec, aic3x_extra_snd_controls, 1456 + ARRAY_SIZE(aic3x_extra_snd_controls)); 1582 1457 snd_soc_add_codec_controls(codec, aic3x_mono_controls, 1583 1458 ARRAY_SIZE(aic3x_mono_controls)); 1584 1459 break; 1585 1460 case AIC3X_MODEL_3007: 1461 + snd_soc_add_codec_controls(codec, aic3x_extra_snd_controls, 1462 + ARRAY_SIZE(aic3x_extra_snd_controls)); 1586 1463 snd_soc_add_codec_controls(codec, 1587 1464 &aic3x_classd_amp_gain_ctrl, 1); 1465 + break; 1466 + case AIC3X_MODEL_3104: 1588 1467 break; 1589 1468 } 1590 1469 ··· 1663 1522 { "tlv320aic33", AIC3X_MODEL_33 }, 1664 1523 { "tlv320aic3007", AIC3X_MODEL_3007 }, 1665 1524 { "tlv320aic3106", AIC3X_MODEL_3X }, 1525 + { "tlv320aic3104", AIC3X_MODEL_3104 }, 1666 1526 { } 1667 1527 }; 1668 1528 MODULE_DEVICE_TABLE(i2c, aic3x_i2c_id); ··· 1815 1673 { .compatible = "ti,tlv320aic33" }, 1816 1674 { .compatible = "ti,tlv320aic3007" }, 1817 1675 { .compatible = "ti,tlv320aic3106" }, 1676 + { .compatible = "ti,tlv320aic3104" }, 1818 1677 {}, 1819 1678 }; 1820 1679 MODULE_DEVICE_TABLE(of, tlv320aic3x_of_match);