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

ASoC: codecs: lpass-wsa-macro: Correct support for newer v2.5 version

Starting with v2.5 of Qualcomm LPASS Codec, few registers in the WSA
macro block change. Bring proper support for this v2.5 and newer
versions, to fix second speaker playback (speaker was silent).

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Acked-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Link: https://patch.msgid.link/20240625-qcom-audio-wsa-second-speaker-v1-3-f65ffdfc368c@linaro.org
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Krzysztof Kozlowski and committed by
Mark Brown
727de4fb 5dcf442b

+306 -3
+306 -3
sound/soc/codecs/lpass-wsa-macro.c
··· 216 216 #define CDC_WSA_SOFTCLIP1_CRC (0x0640) 217 217 #define CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL (0x0644) 218 218 219 + /* LPASS codec version >=2.5 register offsets */ 220 + #define CDC_WSA_TOP_FS_UNGATE (0x00AC) 221 + #define CDC_WSA_TOP_GRP_SEL (0x00B0) 222 + #define CDC_WSA_TOP_FS_UNGATE2 (0x00DC) 223 + #define CDC_2_5_WSA_COMPANDER0_CTL8 (0x05A0) 224 + #define CDC_2_5_WSA_COMPANDER0_CTL9 (0x05A4) 225 + #define CDC_2_5_WSA_COMPANDER0_CTL10 (0x05A8) 226 + #define CDC_2_5_WSA_COMPANDER0_CTL11 (0x05AC) 227 + #define CDC_2_5_WSA_COMPANDER0_CTL12 (0x05B0) 228 + #define CDC_2_5_WSA_COMPANDER0_CTL13 (0x05B4) 229 + #define CDC_2_5_WSA_COMPANDER0_CTL14 (0x05B8) 230 + #define CDC_2_5_WSA_COMPANDER0_CTL15 (0x05BC) 231 + #define CDC_2_5_WSA_COMPANDER0_CTL16 (0x05C0) 232 + #define CDC_2_5_WSA_COMPANDER0_CTL17 (0x05C4) 233 + #define CDC_2_5_WSA_COMPANDER0_CTL18 (0x05C8) 234 + #define CDC_2_5_WSA_COMPANDER0_CTL19 (0x05CC) 235 + #define CDC_2_5_WSA_COMPANDER1_CTL0 (0x05E0) 236 + #define CDC_2_5_WSA_COMPANDER1_CTL1 (0x05E4) 237 + #define CDC_2_5_WSA_COMPANDER1_CTL2 (0x05E8) 238 + #define CDC_2_5_WSA_COMPANDER1_CTL3 (0x05EC) 239 + #define CDC_2_5_WSA_COMPANDER1_CTL4 (0x05F0) 240 + #define CDC_2_5_WSA_COMPANDER1_CTL5 (0x05F4) 241 + #define CDC_2_5_WSA_COMPANDER1_CTL6 (0x05F8) 242 + #define CDC_2_5_WSA_COMPANDER1_CTL7 (0x05FC) 243 + #define CDC_2_5_WSA_COMPANDER1_CTL8 (0x0600) 244 + #define CDC_2_5_WSA_COMPANDER1_CTL9 (0x0604) 245 + #define CDC_2_5_WSA_COMPANDER1_CTL10 (0x0608) 246 + #define CDC_2_5_WSA_COMPANDER1_CTL11 (0x060C) 247 + #define CDC_2_5_WSA_COMPANDER1_CTL12 (0x0610) 248 + #define CDC_2_5_WSA_COMPANDER1_CTL13 (0x0614) 249 + #define CDC_2_5_WSA_COMPANDER1_CTL14 (0x0618) 250 + #define CDC_2_5_WSA_COMPANDER1_CTL15 (0x061C) 251 + #define CDC_2_5_WSA_COMPANDER1_CTL16 (0x0620) 252 + #define CDC_2_5_WSA_COMPANDER1_CTL17 (0x0624) 253 + #define CDC_2_5_WSA_COMPANDER1_CTL18 (0x0628) 254 + #define CDC_2_5_WSA_COMPANDER1_CTL19 (0x062C) 255 + #define CDC_2_5_WSA_SOFTCLIP0_CRC (0x0640) 256 + #define CDC_2_5_WSA_SOFTCLIP0_SOFTCLIP_CTRL (0x0644) 257 + #define CDC_2_5_WSA_SOFTCLIP1_CRC (0x0660) 258 + #define CDC_2_5_WSA_SOFTCLIP1_SOFTCLIP_CTRL (0x0664) 259 + 219 260 #define WSA_MACRO_RX_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ 220 261 SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\ 221 262 SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) ··· 428 387 .softclip1_reg_offset = 0x40, 429 388 }; 430 389 390 + static const struct wsa_reg_layout wsa_codec_v2_5 = { 391 + .rx_intx_1_mix_inp0_sel_mask = GENMASK(3, 0), 392 + .rx_intx_1_mix_inp1_sel_mask = GENMASK(7, 4), 393 + .rx_intx_1_mix_inp2_sel_mask = GENMASK(7, 4), 394 + .rx_intx_2_sel_mask = GENMASK(3, 0), 395 + .compander1_reg_offset = 0x60, 396 + .softclip0_reg_base = 0x640, 397 + .softclip1_reg_offset = 0x20, 398 + }; 399 + 431 400 static const DECLARE_TLV_DB_SCALE(digital_gain, -8400, 100, -8400); 432 401 433 402 static const char *const rx_text_v2_1[] = { 434 403 "ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1", "DEC0", "DEC1" 435 404 }; 436 405 406 + static const char *const rx_text_v2_5[] = { 407 + "ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1", "RX4", "RX5", "RX6", "RX7", "RX8", "DEC0", "DEC1" 408 + }; 409 + 437 410 static const char *const rx_mix_text_v2_1[] = { 438 411 "ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1" 412 + }; 413 + 414 + static const char *const rx_mix_text_v2_5[] = { 415 + "ZERO", "RX0", "RX1", "RX_MIX0", "RX_MIX1", "RX4", "RX5", "RX6", "RX7", "RX8" 439 416 }; 440 417 441 418 static const char *const rx_mix_ec_text[] = { ··· 493 434 SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG1, 494 435 0, 5, rx_mix_text_v2_1); 495 436 437 + static const struct soc_enum rx0_prim_inp0_chain_enum_v2_5 = 438 + SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG0, 439 + 0, 12, rx_text_v2_5); 440 + 441 + static const struct soc_enum rx0_prim_inp1_chain_enum_v2_5 = 442 + SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG0, 443 + 4, 12, rx_text_v2_5); 444 + 445 + static const struct soc_enum rx0_prim_inp2_chain_enum_v2_5 = 446 + SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG1, 447 + 4, 12, rx_text_v2_5); 448 + 449 + static const struct soc_enum rx0_mix_chain_enum_v2_5 = 450 + SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT0_CFG1, 451 + 0, 10, rx_mix_text_v2_5); 452 + 496 453 static const struct soc_enum rx0_sidetone_mix_enum = 497 454 SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_sidetone_mix_text); 498 455 ··· 523 448 524 449 static const struct snd_kcontrol_new rx0_mix_mux_v2_1 = 525 450 SOC_DAPM_ENUM("WSA_RX0 MIX Mux", rx0_mix_chain_enum_v2_1); 451 + 452 + static const struct snd_kcontrol_new rx0_prim_inp0_mux_v2_5 = 453 + SOC_DAPM_ENUM("WSA_RX0 INP0 Mux", rx0_prim_inp0_chain_enum_v2_5); 454 + 455 + static const struct snd_kcontrol_new rx0_prim_inp1_mux_v2_5 = 456 + SOC_DAPM_ENUM("WSA_RX0 INP1 Mux", rx0_prim_inp1_chain_enum_v2_5); 457 + 458 + static const struct snd_kcontrol_new rx0_prim_inp2_mux_v2_5 = 459 + SOC_DAPM_ENUM("WSA_RX0 INP2 Mux", rx0_prim_inp2_chain_enum_v2_5); 460 + 461 + static const struct snd_kcontrol_new rx0_mix_mux_v2_5 = 462 + SOC_DAPM_ENUM("WSA_RX0 MIX Mux", rx0_mix_chain_enum_v2_5); 526 463 527 464 static const struct snd_kcontrol_new rx0_sidetone_mix_mux = 528 465 SOC_DAPM_ENUM("WSA_RX0 SIDETONE MIX Mux", rx0_sidetone_mix_enum); ··· 556 469 SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG1, 557 470 0, 5, rx_mix_text_v2_1); 558 471 472 + static const struct soc_enum rx1_prim_inp0_chain_enum_v2_5 = 473 + SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG0, 474 + 0, 12, rx_text_v2_5); 475 + 476 + static const struct soc_enum rx1_prim_inp1_chain_enum_v2_5 = 477 + SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG0, 478 + 4, 12, rx_text_v2_5); 479 + 480 + static const struct soc_enum rx1_prim_inp2_chain_enum_v2_5 = 481 + SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG1, 482 + 4, 12, rx_text_v2_5); 483 + 484 + static const struct soc_enum rx1_mix_chain_enum_v2_5 = 485 + SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_INT1_CFG1, 486 + 0, 10, rx_mix_text_v2_5); 487 + 559 488 static const struct snd_kcontrol_new rx1_prim_inp0_mux_v2_1 = 560 489 SOC_DAPM_ENUM("WSA_RX1 INP0 Mux", rx1_prim_inp0_chain_enum_v2_1); 561 490 ··· 583 480 584 481 static const struct snd_kcontrol_new rx1_mix_mux_v2_1 = 585 482 SOC_DAPM_ENUM("WSA_RX1 MIX Mux", rx1_mix_chain_enum_v2_1); 483 + 484 + static const struct snd_kcontrol_new rx1_prim_inp0_mux_v2_5 = 485 + SOC_DAPM_ENUM("WSA_RX1 INP0 Mux", rx1_prim_inp0_chain_enum_v2_5); 486 + 487 + static const struct snd_kcontrol_new rx1_prim_inp1_mux_v2_5 = 488 + SOC_DAPM_ENUM("WSA_RX1 INP1 Mux", rx1_prim_inp1_chain_enum_v2_5); 489 + 490 + static const struct snd_kcontrol_new rx1_prim_inp2_mux_v2_5 = 491 + SOC_DAPM_ENUM("WSA_RX1 INP2 Mux", rx1_prim_inp2_chain_enum_v2_5); 492 + 493 + static const struct snd_kcontrol_new rx1_mix_mux_v2_5 = 494 + SOC_DAPM_ENUM("WSA_RX1 MIX Mux", rx1_mix_chain_enum_v2_5); 586 495 587 496 static const struct soc_enum rx_mix_ec0_enum = 588 497 SOC_ENUM_SINGLE(CDC_WSA_RX_INP_MUX_RX_MIX_CFG0, ··· 744 629 { CDC_WSA_SOFTCLIP1_SOFTCLIP_CTRL, 0x38}, 745 630 }; 746 631 632 + static const struct reg_default wsa_defaults_v2_5[] = { 633 + { CDC_WSA_TOP_FS_UNGATE, 0xFF}, 634 + { CDC_WSA_TOP_GRP_SEL, 0x08}, 635 + { CDC_WSA_TOP_FS_UNGATE2, 0x1F}, 636 + { CDC_WSA_TX0_SPKR_PROT_PATH_CTL, 0x04}, 637 + { CDC_WSA_TX0_SPKR_PROT_PATH_CFG0, 0x02}, 638 + { CDC_WSA_TX1_SPKR_PROT_PATH_CTL, 0x04}, 639 + { CDC_WSA_TX1_SPKR_PROT_PATH_CFG0, 0x02}, 640 + { CDC_WSA_TX2_SPKR_PROT_PATH_CTL, 0x04}, 641 + { CDC_WSA_TX2_SPKR_PROT_PATH_CFG0, 0x02}, 642 + { CDC_WSA_TX3_SPKR_PROT_PATH_CTL, 0x04}, 643 + { CDC_WSA_TX3_SPKR_PROT_PATH_CFG0, 0x02}, 644 + { CDC_2_5_WSA_COMPANDER0_CTL8, 0x00}, 645 + { CDC_2_5_WSA_COMPANDER0_CTL9, 0x00}, 646 + { CDC_2_5_WSA_COMPANDER0_CTL10, 0x06}, 647 + { CDC_2_5_WSA_COMPANDER0_CTL11, 0x12}, 648 + { CDC_2_5_WSA_COMPANDER0_CTL12, 0x1E}, 649 + { CDC_2_5_WSA_COMPANDER0_CTL13, 0x24}, 650 + { CDC_2_5_WSA_COMPANDER0_CTL14, 0x24}, 651 + { CDC_2_5_WSA_COMPANDER0_CTL15, 0x24}, 652 + { CDC_2_5_WSA_COMPANDER0_CTL16, 0x00}, 653 + { CDC_2_5_WSA_COMPANDER0_CTL17, 0x24}, 654 + { CDC_2_5_WSA_COMPANDER0_CTL18, 0x2A}, 655 + { CDC_2_5_WSA_COMPANDER0_CTL19, 0x16}, 656 + { CDC_2_5_WSA_COMPANDER1_CTL0, 0x60}, 657 + { CDC_2_5_WSA_COMPANDER1_CTL1, 0xDB}, 658 + { CDC_2_5_WSA_COMPANDER1_CTL2, 0xFF}, 659 + { CDC_2_5_WSA_COMPANDER1_CTL3, 0x35}, 660 + { CDC_2_5_WSA_COMPANDER1_CTL4, 0xFF}, 661 + { CDC_2_5_WSA_COMPANDER1_CTL5, 0x00}, 662 + { CDC_2_5_WSA_COMPANDER1_CTL6, 0x01}, 663 + { CDC_2_5_WSA_COMPANDER1_CTL7, 0x28}, 664 + { CDC_2_5_WSA_COMPANDER1_CTL8, 0x00}, 665 + { CDC_2_5_WSA_COMPANDER1_CTL9, 0x00}, 666 + { CDC_2_5_WSA_COMPANDER1_CTL10, 0x06}, 667 + { CDC_2_5_WSA_COMPANDER1_CTL11, 0x12}, 668 + { CDC_2_5_WSA_COMPANDER1_CTL12, 0x1E}, 669 + { CDC_2_5_WSA_COMPANDER1_CTL13, 0x24}, 670 + { CDC_2_5_WSA_COMPANDER1_CTL14, 0x24}, 671 + { CDC_2_5_WSA_COMPANDER1_CTL15, 0x24}, 672 + { CDC_2_5_WSA_COMPANDER1_CTL16, 0x00}, 673 + { CDC_2_5_WSA_COMPANDER1_CTL17, 0x24}, 674 + { CDC_2_5_WSA_COMPANDER1_CTL18, 0x2A}, 675 + { CDC_2_5_WSA_COMPANDER1_CTL19, 0x16}, 676 + { CDC_2_5_WSA_SOFTCLIP0_CRC, 0x00}, 677 + { CDC_2_5_WSA_SOFTCLIP0_SOFTCLIP_CTRL, 0x38}, 678 + { CDC_2_5_WSA_SOFTCLIP1_CRC, 0x00}, 679 + { CDC_2_5_WSA_SOFTCLIP1_SOFTCLIP_CTRL, 0x38}, 680 + }; 681 + 747 682 static bool wsa_is_wronly_register(struct device *dev, 748 683 unsigned int reg) 749 684 { ··· 827 662 return false; 828 663 } 829 664 665 + static bool wsa_is_rw_register_v2_5(struct device *dev, unsigned int reg) 666 + { 667 + switch (reg) { 668 + case CDC_WSA_TOP_FS_UNGATE: 669 + case CDC_WSA_TOP_GRP_SEL: 670 + case CDC_WSA_TOP_FS_UNGATE2: 671 + case CDC_2_5_WSA_COMPANDER0_CTL8: 672 + case CDC_2_5_WSA_COMPANDER0_CTL9: 673 + case CDC_2_5_WSA_COMPANDER0_CTL10: 674 + case CDC_2_5_WSA_COMPANDER0_CTL11: 675 + case CDC_2_5_WSA_COMPANDER0_CTL12: 676 + case CDC_2_5_WSA_COMPANDER0_CTL13: 677 + case CDC_2_5_WSA_COMPANDER0_CTL14: 678 + case CDC_2_5_WSA_COMPANDER0_CTL15: 679 + case CDC_2_5_WSA_COMPANDER0_CTL16: 680 + case CDC_2_5_WSA_COMPANDER0_CTL17: 681 + case CDC_2_5_WSA_COMPANDER0_CTL18: 682 + case CDC_2_5_WSA_COMPANDER0_CTL19: 683 + case CDC_2_5_WSA_COMPANDER1_CTL0: 684 + case CDC_2_5_WSA_COMPANDER1_CTL1: 685 + case CDC_2_5_WSA_COMPANDER1_CTL2: 686 + case CDC_2_5_WSA_COMPANDER1_CTL3: 687 + case CDC_2_5_WSA_COMPANDER1_CTL4: 688 + case CDC_2_5_WSA_COMPANDER1_CTL5: 689 + case CDC_2_5_WSA_COMPANDER1_CTL7: 690 + case CDC_2_5_WSA_COMPANDER1_CTL8: 691 + case CDC_2_5_WSA_COMPANDER1_CTL9: 692 + case CDC_2_5_WSA_COMPANDER1_CTL10: 693 + case CDC_2_5_WSA_COMPANDER1_CTL11: 694 + case CDC_2_5_WSA_COMPANDER1_CTL12: 695 + case CDC_2_5_WSA_COMPANDER1_CTL13: 696 + case CDC_2_5_WSA_COMPANDER1_CTL14: 697 + case CDC_2_5_WSA_COMPANDER1_CTL15: 698 + case CDC_2_5_WSA_COMPANDER1_CTL16: 699 + case CDC_2_5_WSA_COMPANDER1_CTL17: 700 + case CDC_2_5_WSA_COMPANDER1_CTL18: 701 + case CDC_2_5_WSA_COMPANDER1_CTL19: 702 + case CDC_2_5_WSA_SOFTCLIP0_CRC: 703 + case CDC_2_5_WSA_SOFTCLIP0_SOFTCLIP_CTRL: 704 + case CDC_2_5_WSA_SOFTCLIP1_CRC: 705 + case CDC_2_5_WSA_SOFTCLIP1_SOFTCLIP_CTRL: 706 + return true; 707 + } 708 + 709 + return false; 710 + } 711 + 830 712 static bool wsa_is_rw_register(struct device *dev, unsigned int reg) 831 713 { 714 + struct wsa_macro *wsa = dev_get_drvdata(dev); 715 + 832 716 switch (reg) { 833 717 case CDC_WSA_CLK_RST_CTRL_MCLK_CONTROL: 834 718 case CDC_WSA_CLK_RST_CTRL_FS_CNT_CONTROL: ··· 982 768 return true; 983 769 } 984 770 771 + if (wsa->codec_version >= LPASS_CODEC_VERSION_2_5) 772 + return wsa_is_rw_register_v2_5(dev, reg); 773 + 985 774 return wsa_is_rw_register_v2_1(dev, reg); 986 775 } 987 776 ··· 1009 792 return wsa_is_rw_register(dev, reg); 1010 793 } 1011 794 795 + static bool wsa_is_readable_register_v2_5(struct device *dev, unsigned int reg) 796 + { 797 + switch (reg) { 798 + case CDC_2_5_WSA_COMPANDER1_CTL6: 799 + return true; 800 + } 801 + 802 + return wsa_is_rw_register(dev, reg); 803 + } 804 + 1012 805 static bool wsa_is_readable_register(struct device *dev, unsigned int reg) 1013 806 { 807 + struct wsa_macro *wsa = dev_get_drvdata(dev); 808 + 1014 809 switch (reg) { 1015 810 case CDC_WSA_INTR_CTRL_CLR_COMMIT: 1016 811 case CDC_WSA_INTR_CTRL_PIN1_CLEAR0: ··· 1043 814 return true; 1044 815 } 1045 816 817 + if (wsa->codec_version >= LPASS_CODEC_VERSION_2_5) 818 + return wsa_is_readable_register_v2_5(dev, reg); 819 + 1046 820 return wsa_is_readable_register_v2_1(dev, reg); 1047 821 } 1048 822 ··· 1059 827 return false; 1060 828 } 1061 829 830 + static bool wsa_is_volatile_register_v2_5(struct device *dev, unsigned int reg) 831 + { 832 + switch (reg) { 833 + case CDC_2_5_WSA_COMPANDER1_CTL6: 834 + return true; 835 + } 836 + 837 + return false; 838 + } 839 + 1062 840 static bool wsa_is_volatile_register(struct device *dev, unsigned int reg) 1063 841 { 842 + struct wsa_macro *wsa = dev_get_drvdata(dev); 843 + 1064 844 /* Update volatile list for rx/tx macros */ 1065 845 switch (reg) { 1066 846 case CDC_WSA_INTR_CTRL_PIN1_STATUS0: ··· 1090 846 case CDC_WSA_SPLINE_ASRC1_STATUS_FIFO: 1091 847 return true; 1092 848 } 849 + 850 + if (wsa->codec_version >= LPASS_CODEC_VERSION_2_5) 851 + return wsa_is_volatile_register_v2_5(dev, reg); 1093 852 1094 853 return wsa_is_volatile_register_v2_1(dev, reg); 1095 854 } ··· 2445 2198 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2446 2199 }; 2447 2200 2201 + static const struct snd_soc_dapm_widget wsa_macro_dapm_widgets_v2_5[] = { 2202 + SND_SOC_DAPM_MUX("WSA_RX0 INP0", SND_SOC_NOPM, 0, 0, &rx0_prim_inp0_mux_v2_5), 2203 + SND_SOC_DAPM_MUX("WSA_RX0 INP1", SND_SOC_NOPM, 0, 0, &rx0_prim_inp1_mux_v2_5), 2204 + SND_SOC_DAPM_MUX("WSA_RX0 INP2", SND_SOC_NOPM, 0, 0, &rx0_prim_inp2_mux_v2_5), 2205 + SND_SOC_DAPM_MUX_E("WSA_RX0 MIX INP", SND_SOC_NOPM, WSA_MACRO_RX_MIX0, 2206 + 0, &rx0_mix_mux_v2_5, wsa_macro_enable_mix_path, 2207 + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2208 + SND_SOC_DAPM_MUX("WSA_RX1 INP0", SND_SOC_NOPM, 0, 0, &rx1_prim_inp0_mux_v2_5), 2209 + SND_SOC_DAPM_MUX("WSA_RX1 INP1", SND_SOC_NOPM, 0, 0, &rx1_prim_inp1_mux_v2_5), 2210 + SND_SOC_DAPM_MUX("WSA_RX1 INP2", SND_SOC_NOPM, 0, 0, &rx1_prim_inp2_mux_v2_5), 2211 + SND_SOC_DAPM_MUX_E("WSA_RX1 MIX INP", SND_SOC_NOPM, WSA_MACRO_RX_MIX1, 2212 + 0, &rx1_mix_mux_v2_5, wsa_macro_enable_mix_path, 2213 + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 2214 + }; 2215 + 2448 2216 static const struct snd_soc_dapm_route wsa_audio_map[] = { 2449 2217 /* VI Feedback */ 2450 2218 {"WSA_AIF_VI Mixer", "WSA_SPKR_VI_1", "VIINPUT_WSA"}, ··· 2625 2363 2626 2364 wsa_macro_set_spkr_mode(comp, WSA_MACRO_SPKR_MODE_1); 2627 2365 2628 - widgets = wsa_macro_dapm_widgets_v2_1; 2629 - num_widgets = ARRAY_SIZE(wsa_macro_dapm_widgets_v2_1); 2366 + switch (wsa->codec_version) { 2367 + case LPASS_CODEC_VERSION_1_0: 2368 + case LPASS_CODEC_VERSION_1_1: 2369 + case LPASS_CODEC_VERSION_1_2: 2370 + case LPASS_CODEC_VERSION_2_0: 2371 + case LPASS_CODEC_VERSION_2_1: 2372 + widgets = wsa_macro_dapm_widgets_v2_1; 2373 + num_widgets = ARRAY_SIZE(wsa_macro_dapm_widgets_v2_1); 2374 + break; 2375 + case LPASS_CODEC_VERSION_2_5: 2376 + case LPASS_CODEC_VERSION_2_6: 2377 + case LPASS_CODEC_VERSION_2_7: 2378 + case LPASS_CODEC_VERSION_2_8: 2379 + widgets = wsa_macro_dapm_widgets_v2_5; 2380 + num_widgets = ARRAY_SIZE(wsa_macro_dapm_widgets_v2_5); 2381 + break; 2382 + default: 2383 + return -EINVAL; 2384 + } 2630 2385 2631 2386 return snd_soc_dapm_new_controls(dapm, widgets, num_widgets); 2632 2387 } ··· 2766 2487 2767 2488 wsa->codec_version = lpass_macro_get_codec_version(); 2768 2489 switch (wsa->codec_version) { 2769 - default: 2490 + case LPASS_CODEC_VERSION_1_0: 2491 + case LPASS_CODEC_VERSION_1_1: 2492 + case LPASS_CODEC_VERSION_1_2: 2493 + case LPASS_CODEC_VERSION_2_0: 2494 + case LPASS_CODEC_VERSION_2_1: 2770 2495 wsa->reg_layout = &wsa_codec_v2_1; 2771 2496 def_count = ARRAY_SIZE(wsa_defaults) + ARRAY_SIZE(wsa_defaults_v2_1); 2772 2497 reg_defaults = devm_kmalloc_array(dev, def_count, ··· 2782 2499 memcpy(&reg_defaults[ARRAY_SIZE(wsa_defaults)], 2783 2500 wsa_defaults_v2_1, sizeof(wsa_defaults_v2_1)); 2784 2501 break; 2502 + 2503 + case LPASS_CODEC_VERSION_2_5: 2504 + case LPASS_CODEC_VERSION_2_6: 2505 + case LPASS_CODEC_VERSION_2_7: 2506 + case LPASS_CODEC_VERSION_2_8: 2507 + wsa->reg_layout = &wsa_codec_v2_5; 2508 + def_count = ARRAY_SIZE(wsa_defaults) + ARRAY_SIZE(wsa_defaults_v2_5); 2509 + reg_defaults = devm_kmalloc_array(dev, def_count, 2510 + sizeof(*reg_defaults), 2511 + GFP_KERNEL); 2512 + if (!reg_defaults) 2513 + return -ENOMEM; 2514 + memcpy(&reg_defaults[0], wsa_defaults, sizeof(wsa_defaults)); 2515 + memcpy(&reg_defaults[ARRAY_SIZE(wsa_defaults)], 2516 + wsa_defaults_v2_5, sizeof(wsa_defaults_v2_5)); 2517 + break; 2518 + 2519 + default: 2520 + dev_err(wsa->dev, "Unsupported Codec version (%d)\n", wsa->codec_version); 2521 + return -EINVAL; 2785 2522 } 2786 2523 2787 2524 reg_config = devm_kmemdup(dev, &wsa_regmap_config,