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

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'sound-6.16-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull sound fixes from Takashi Iwai:
"A collection of small fixes. All changes are device-specific at this
time:

- Fixes for Cirrus codecs with SoundWire, including firmware name
updates

- Fix for i.MX8 SoC DSP

- Usual HD-audio, USB-audio, and ASoC AMD quirks

- Fixes for legendary SoundBlaster AWE32 ISA device (a real one, we
still got a bug report after 25 years)

- Minor build fixes"

* tag 'sound-6.16-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (24 commits)
ALSA: hda/realtek: Enable headset Mic on Positivo P15X
ASoC: Intel: sof-function-topology-lib: Print out the unsupported dmic count
ASoC: doc: cs35l56: Add CS35L63 to the list of supported devices
ASoC: SOF: imx8: add core shutdown operation for imx8/imx8x
ALSA: hda/realtek: Add quirk for Asus GA605K
ALSA: hda/realtek: enable headset mic on Latitude 5420 Rugged
ASoC: amd: yc: update quirk data for HP Victus
ASoC: apple: mca: Drop default ARCH_APPLE in Kconfig
ALSA: usb-audio: Rename ALSA kcontrol PCM and PCM1 for the KTMicro sound card
ASoC: amd: yc: Add quirk for MSI Bravo 17 D7VF internal mic
ASoC: doc: cs35l56: Update to add new SoundWire firmware filename suffix
ASoC: cs35l56: Use SoundWire address as alternate firmware suffix on L56 B0
ASoC: cs35l56: Use SoundWire address as firmware name suffix for new silicon
ASoC: sdw_utils: Fix potential NULL pointer deref in is_sdca_endpoint_present()
ALSA: sb: Force to disable DMAs once when DMA mode is changed
ALSA: sb: Don't allow changing the DMA mode during operations
ALSA: hda/realtek: Add quirk for Asus GU605C
ALSA: hda/realtek: Fix built-in mic on ASUS VivoBook X513EA
ALSA: hda/realtek - Add mute LED support for HP Victus 16-s1xxx and HP Victus 15-fa1xxx
ALSA: ctxfi: Replace deprecated strcpy() with strscpy()
...

+207 -37
+19 -5
Documentation/sound/codecs/cs35l56.rst
··· 1 1 .. SPDX-License-Identifier: GPL-2.0-only 2 2 3 - ===================================================================== 4 - Audio drivers for Cirrus Logic CS35L54/56/57 Boosted Smart Amplifiers 5 - ===================================================================== 3 + ======================================================================== 4 + Audio drivers for Cirrus Logic CS35L54/56/57/63 Boosted Smart Amplifiers 5 + ======================================================================== 6 6 :Copyright: 2025 Cirrus Logic, Inc. and 7 7 Cirrus Logic International Semiconductor Ltd. 8 8 ··· 13 13 14 14 The high-level summary of this document is: 15 15 16 - **If you have a laptop that uses CS35L54/56/57 amplifiers but audio is not 16 + **If you have a laptop that uses CS35L54/56/57/63 amplifiers but audio is not 17 17 working, DO NOT ATTEMPT TO USE FIRMWARE AND SETTINGS FROM ANOTHER LAPTOP, 18 18 EVEN IF THAT LAPTOP SEEMS SIMILAR.** 19 19 20 - The CS35L54/56/57 amplifiers must be correctly configured for the power 20 + The CS35L54/56/57/63 amplifiers must be correctly configured for the power 21 21 supply voltage, speaker impedance, maximum speaker voltage/current, and 22 22 other external hardware connections. 23 23 ··· 34 34 * CS35L54 35 35 * CS35L56 36 36 * CS35L57 37 + * CS35L63 37 38 38 39 There are two drivers in the kernel 39 40 ··· 105 104 106 105 The format of the firmware file names is: 107 106 107 + SoundWire (except CS35L56 Rev B0): 108 + cs35lxx-b0-dsp1-misc-SSID[-spkidX]-l?u? 109 + 110 + SoundWire CS35L56 Rev B0: 111 + cs35lxx-b0-dsp1-misc-SSID[-spkidX]-ampN 112 + 113 + Non-SoundWire (HDA and I2S): 108 114 cs35lxx-b0-dsp1-misc-SSID[-spkidX]-ampN 109 115 110 116 Where: ··· 119 111 * cs35lxx-b0 is the amplifier model and silicon revision. This information 120 112 is logged by the driver during initialization. 121 113 * SSID is the 8-digit hexadecimal SSID value. 114 + * l?u? is the physical address on the SoundWire bus of the amp this 115 + file applies to. 122 116 * ampN is the amplifier number (for example amp1). This is the same as 123 117 the prefix on the ALSA control names except that it is always lower-case 124 118 in the file name. 125 119 * spkidX is an optional part, used for laptops that have firmware 126 120 configurations for different makes and models of internal speakers. 121 + 122 + The CS35L56 Rev B0 continues to use the old filename scheme because a 123 + large number of firmware files have already been published with these 124 + names. 127 125 128 126 Sound Open Firmware and ALSA topology files 129 127 -------------------------------------------
+7
sound/isa/sb/sb16_main.c
··· 703 703 unsigned char nval, oval; 704 704 int change; 705 705 706 + if (chip->mode & (SB_MODE_PLAYBACK | SB_MODE_CAPTURE)) 707 + return -EBUSY; 708 + 706 709 nval = ucontrol->value.enumerated.item[0]; 707 710 if (nval > 2) 708 711 return -EINVAL; ··· 714 711 change = nval != oval; 715 712 snd_sb16_set_dma_mode(chip, nval); 716 713 spin_unlock_irqrestore(&chip->reg_lock, flags); 714 + if (change) { 715 + snd_dma_disable(chip->dma8); 716 + snd_dma_disable(chip->dma16); 717 + } 717 718 return change; 718 719 } 719 720
+2 -2
sound/pci/ctxfi/xfi.c
··· 98 98 if (err < 0) 99 99 goto error; 100 100 101 - strcpy(card->driver, "SB-XFi"); 102 - strcpy(card->shortname, "Creative X-Fi"); 101 + strscpy(card->driver, "SB-XFi"); 102 + strscpy(card->shortname, "Creative X-Fi"); 103 103 snprintf(card->longname, sizeof(card->longname), "%s %s %s", 104 104 card->shortname, atc->chip_name, atc->model_name); 105 105
+2
sound/pci/hda/hda_intel.c
··· 2283 2283 SND_PCI_QUIRK(0x1734, 0x1232, "KONTRON SinglePC", 0), 2284 2284 /* Dell ALC3271 */ 2285 2285 SND_PCI_QUIRK(0x1028, 0x0962, "Dell ALC3271", 0), 2286 + /* https://bugzilla.kernel.org/show_bug.cgi?id=220210 */ 2287 + SND_PCI_QUIRK(0x17aa, 0x5079, "Lenovo Thinkpad E15", 0), 2286 2288 {} 2287 2289 }; 2288 2290
+30
sound/pci/hda/patch_realtek.c
··· 8030 8030 ALC294_FIXUP_ASUS_CS35L41_SPI_2, 8031 8031 ALC274_FIXUP_HP_AIO_BIND_DACS, 8032 8032 ALC287_FIXUP_PREDATOR_SPK_CS35L41_I2C_2, 8033 + ALC285_FIXUP_ASUS_GA605K_HEADSET_MIC, 8034 + ALC285_FIXUP_ASUS_GA605K_I2C_SPEAKER2_TO_DAC1, 8035 + ALC269_FIXUP_POSITIVO_P15X_HEADSET_MIC, 8033 8036 }; 8034 8037 8035 8038 /* A special fixup for Lenovo C940 and Yoga Duet 7; ··· 10417 10414 .type = HDA_FIXUP_FUNC, 10418 10415 .v.func = alc274_fixup_hp_aio_bind_dacs, 10419 10416 }, 10417 + [ALC285_FIXUP_ASUS_GA605K_HEADSET_MIC] = { 10418 + .type = HDA_FIXUP_PINS, 10419 + .v.pins = (const struct hda_pintbl[]) { 10420 + { 0x19, 0x03a11050 }, 10421 + { 0x1b, 0x03a11c30 }, 10422 + { } 10423 + }, 10424 + .chained = true, 10425 + .chain_id = ALC285_FIXUP_ASUS_GA605K_I2C_SPEAKER2_TO_DAC1 10426 + }, 10427 + [ALC285_FIXUP_ASUS_GA605K_I2C_SPEAKER2_TO_DAC1] = { 10428 + .type = HDA_FIXUP_FUNC, 10429 + .v.func = alc285_fixup_speaker2_to_dac1, 10430 + }, 10431 + [ALC269_FIXUP_POSITIVO_P15X_HEADSET_MIC] = { 10432 + .type = HDA_FIXUP_FUNC, 10433 + .v.func = alc269_fixup_limit_int_mic_boost, 10434 + .chained = true, 10435 + .chain_id = ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE, 10436 + }, 10420 10437 }; 10421 10438 10422 10439 static const struct hda_quirk alc269_fixup_tbl[] = { ··· 10532 10509 SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), 10533 10510 SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), 10534 10511 SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB), 10512 + SND_PCI_QUIRK(0x1028, 0x0879, "Dell Latitude 5420 Rugged", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE), 10535 10513 SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE), 10536 10514 SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE), 10537 10515 SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), ··· 10811 10787 SND_PCI_QUIRK(0x103c, 0x8b97, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 10812 10788 SND_PCI_QUIRK(0x103c, 0x8bb3, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2), 10813 10789 SND_PCI_QUIRK(0x103c, 0x8bb4, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2), 10790 + SND_PCI_QUIRK(0x103c, 0x8bc8, "HP Victus 15-fa1xxx", ALC245_FIXUP_HP_MUTE_LED_COEFBIT), 10814 10791 SND_PCI_QUIRK(0x103c, 0x8bcd, "HP Omen 16-xd0xxx", ALC245_FIXUP_HP_MUTE_LED_V1_COEFBIT), 10815 10792 SND_PCI_QUIRK(0x103c, 0x8bdd, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2), 10816 10793 SND_PCI_QUIRK(0x103c, 0x8bde, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2), ··· 10865 10840 SND_PCI_QUIRK(0x103c, 0x8c91, "HP EliteBook 660", ALC236_FIXUP_HP_GPIO_LED), 10866 10841 SND_PCI_QUIRK(0x103c, 0x8c96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 10867 10842 SND_PCI_QUIRK(0x103c, 0x8c97, "HP ZBook", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), 10843 + SND_PCI_QUIRK(0x103c, 0x8c9c, "HP Victus 16-s1xxx (MB 8C9C)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT), 10868 10844 SND_PCI_QUIRK(0x103c, 0x8ca1, "HP ZBook Power", ALC236_FIXUP_HP_GPIO_LED), 10869 10845 SND_PCI_QUIRK(0x103c, 0x8ca2, "HP ZBook Power", ALC236_FIXUP_HP_GPIO_LED), 10870 10846 SND_PCI_QUIRK(0x103c, 0x8ca4, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), ··· 10930 10904 SND_PCI_QUIRK(0x103c, 0x8e60, "HP Trekker ", ALC287_FIXUP_CS35L41_I2C_2), 10931 10905 SND_PCI_QUIRK(0x103c, 0x8e61, "HP Trekker ", ALC287_FIXUP_CS35L41_I2C_2), 10932 10906 SND_PCI_QUIRK(0x103c, 0x8e62, "HP Trekker ", ALC287_FIXUP_CS35L41_I2C_2), 10907 + SND_PCI_QUIRK(0x1043, 0x1032, "ASUS VivoBook X513EA", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE), 10908 + SND_PCI_QUIRK(0x1043, 0x1034, "ASUS GU605C", ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1), 10933 10909 SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC), 10934 10910 SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300), 10935 10911 SND_PCI_QUIRK(0x1043, 0x1054, "ASUS G614FH/FM/FP", ALC287_FIXUP_CS35L41_I2C_2), ··· 10960 10932 SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE), 10961 10933 SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE), 10962 10934 SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE), 10935 + SND_PCI_QUIRK(0x1043, 0x1314, "ASUS GA605K", ALC285_FIXUP_ASUS_GA605K_HEADSET_MIC), 10963 10936 SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE), 10964 10937 SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK), 10965 10938 SND_PCI_QUIRK(0x1043, 0x1433, "ASUS GX650PY/PZ/PV/PU/PYV/PZV/PIV/PVV", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC), ··· 11413 11384 SND_PCI_QUIRK(0x2782, 0x0214, "VAIO VJFE-CL", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), 11414 11385 SND_PCI_QUIRK(0x2782, 0x0228, "Infinix ZERO BOOK 13", ALC269VB_FIXUP_INFINIX_ZERO_BOOK_13), 11415 11386 SND_PCI_QUIRK(0x2782, 0x0232, "CHUWI CoreBook XPro", ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO), 11387 + SND_PCI_QUIRK(0x2782, 0x1407, "Positivo P15X", ALC269_FIXUP_POSITIVO_P15X_HEADSET_MIC), 11416 11388 SND_PCI_QUIRK(0x2782, 0x1701, "Infinix Y4 Max", ALC269VC_FIXUP_INFINIX_Y4_MAX), 11417 11389 SND_PCI_QUIRK(0x2782, 0x1705, "MEDION E15433", ALC269VC_FIXUP_INFINIX_Y4_MAX), 11418 11390 SND_PCI_QUIRK(0x2782, 0x1707, "Vaio VJFE-ADL", ALC298_FIXUP_SPK_VOLUME),
+14
sound/soc/amd/yc/acp6x-mach.c
··· 454 454 { 455 455 .driver_data = &acp6x_card, 456 456 .matches = { 457 + DMI_MATCH(DMI_BOARD_VENDOR, "Micro-Star International Co., Ltd."), 458 + DMI_MATCH(DMI_PRODUCT_NAME, "Bravo 17 D7VF"), 459 + } 460 + }, 461 + { 462 + .driver_data = &acp6x_card, 463 + .matches = { 457 464 DMI_MATCH(DMI_BOARD_VENDOR, "Alienware"), 458 465 DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m17 R5 AMD"), 459 466 } ··· 519 512 .matches = { 520 513 DMI_MATCH(DMI_BOARD_VENDOR, "HP"), 521 514 DMI_MATCH(DMI_PRODUCT_NAME, "OMEN by HP Gaming Laptop 16z-n000"), 515 + } 516 + }, 517 + { 518 + .driver_data = &acp6x_card, 519 + .matches = { 520 + DMI_MATCH(DMI_BOARD_VENDOR, "HP"), 521 + DMI_MATCH(DMI_PRODUCT_NAME, "Victus by HP Gaming Laptop 15-fb2xxx"), 522 522 } 523 523 }, 524 524 {
-1
sound/soc/apple/Kconfig
··· 2 2 tristate "Apple Silicon MCA driver" 3 3 depends on ARCH_APPLE || COMPILE_TEST 4 4 select SND_DMAENGINE_PCM 5 - default ARCH_APPLE 6 5 help 7 6 This option enables an ASoC platform driver for MCA peripherals found 8 7 on Apple Silicon SoCs.
+10 -8
sound/soc/codecs/cs35l56-sdw.c
··· 238 238 .val_format_endian_default = REGMAP_ENDIAN_BIG, 239 239 }; 240 240 241 - static int cs35l56_sdw_set_cal_index(struct cs35l56_private *cs35l56) 241 + static int cs35l56_sdw_get_unique_id(struct cs35l56_private *cs35l56) 242 242 { 243 243 int ret; 244 244 245 - /* SoundWire UniqueId is used to index the calibration array */ 246 245 ret = sdw_read_no_pm(cs35l56->sdw_peripheral, SDW_SCP_DEVID_0); 247 246 if (ret < 0) 248 247 return ret; 249 248 250 - cs35l56->base.cal_index = ret & 0xf; 249 + cs35l56->sdw_unique_id = ret & 0xf; 251 250 252 251 return 0; 253 252 } ··· 258 259 259 260 pm_runtime_get_noresume(cs35l56->base.dev); 260 261 261 - if (cs35l56->base.cal_index < 0) { 262 - ret = cs35l56_sdw_set_cal_index(cs35l56); 263 - if (ret < 0) 264 - goto out; 265 - } 262 + ret = cs35l56_sdw_get_unique_id(cs35l56); 263 + if (ret) 264 + goto out; 265 + 266 + /* SoundWire UniqueId is used to index the calibration array */ 267 + if (cs35l56->base.cal_index < 0) 268 + cs35l56->base.cal_index = cs35l56->sdw_unique_id; 266 269 267 270 ret = cs35l56_init(cs35l56); 268 271 if (ret < 0) { ··· 588 587 589 588 cs35l56->base.dev = dev; 590 589 cs35l56->sdw_peripheral = peripheral; 590 + cs35l56->sdw_link_num = peripheral->bus->link_id; 591 591 INIT_WORK(&cs35l56->sdw_irq_work, cs35l56_sdw_irq_work); 592 592 593 593 dev_set_drvdata(dev, cs35l56);
+63 -9
sound/soc/codecs/cs35l56.c
··· 706 706 return ret; 707 707 } 708 708 709 + static int cs35l56_dsp_download_and_power_up(struct cs35l56_private *cs35l56, 710 + bool load_firmware) 711 + { 712 + int ret; 713 + 714 + /* 715 + * Abort the first load if it didn't find the suffixed bins and 716 + * we have an alternate fallback suffix. 717 + */ 718 + cs35l56->dsp.bin_mandatory = (load_firmware && cs35l56->fallback_fw_suffix); 719 + 720 + ret = wm_adsp_power_up(&cs35l56->dsp, load_firmware); 721 + if ((ret == -ENOENT) && cs35l56->dsp.bin_mandatory) { 722 + cs35l56->dsp.fwf_suffix = cs35l56->fallback_fw_suffix; 723 + cs35l56->fallback_fw_suffix = NULL; 724 + cs35l56->dsp.bin_mandatory = false; 725 + ret = wm_adsp_power_up(&cs35l56->dsp, load_firmware); 726 + } 727 + 728 + if (ret) { 729 + dev_dbg(cs35l56->base.dev, "wm_adsp_power_up ret %d\n", ret); 730 + return ret; 731 + } 732 + 733 + return 0; 734 + } 735 + 709 736 static void cs35l56_reinit_patch(struct cs35l56_private *cs35l56) 710 737 { 711 738 int ret; 712 739 713 - /* Use wm_adsp to load and apply the firmware patch and coefficient files */ 714 - ret = wm_adsp_power_up(&cs35l56->dsp, true); 715 - if (ret) { 716 - dev_dbg(cs35l56->base.dev, "%s: wm_adsp_power_up ret %d\n", __func__, ret); 740 + ret = cs35l56_dsp_download_and_power_up(cs35l56, true); 741 + if (ret) 717 742 return; 718 - } 719 743 720 744 cs35l56_write_cal(cs35l56); 721 745 ··· 774 750 * but only if firmware is missing. If firmware is already patched just 775 751 * power-up wm_adsp without downloading firmware. 776 752 */ 777 - ret = wm_adsp_power_up(&cs35l56->dsp, !!firmware_missing); 778 - if (ret) { 779 - dev_dbg(cs35l56->base.dev, "%s: wm_adsp_power_up ret %d\n", __func__, ret); 753 + ret = cs35l56_dsp_download_and_power_up(cs35l56, firmware_missing); 754 + if (ret) 780 755 goto err; 781 - } 782 756 783 757 mutex_lock(&cs35l56->base.irq_lock); 784 758 ··· 875 853 pm_runtime_put_autosuspend(cs35l56->base.dev); 876 854 } 877 855 856 + static int cs35l56_set_fw_suffix(struct cs35l56_private *cs35l56) 857 + { 858 + if (cs35l56->dsp.fwf_suffix) 859 + return 0; 860 + 861 + if (!cs35l56->sdw_peripheral) 862 + return 0; 863 + 864 + cs35l56->dsp.fwf_suffix = devm_kasprintf(cs35l56->base.dev, GFP_KERNEL, 865 + "l%uu%u", 866 + cs35l56->sdw_link_num, 867 + cs35l56->sdw_unique_id); 868 + if (!cs35l56->dsp.fwf_suffix) 869 + return -ENOMEM; 870 + 871 + /* 872 + * There are published firmware files for L56 B0 silicon using 873 + * the ALSA prefix as the filename suffix. Default to trying these 874 + * first, with the new name as an alternate. 875 + */ 876 + if ((cs35l56->base.type == 0x56) && (cs35l56->base.rev == 0xb0)) { 877 + cs35l56->fallback_fw_suffix = cs35l56->dsp.fwf_suffix; 878 + cs35l56->dsp.fwf_suffix = cs35l56->component->name_prefix; 879 + } 880 + 881 + return 0; 882 + } 883 + 878 884 static int cs35l56_component_probe(struct snd_soc_component *component) 879 885 { 880 886 struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(component); ··· 942 892 return -ENOMEM; 943 893 944 894 cs35l56->component = component; 895 + ret = cs35l56_set_fw_suffix(cs35l56); 896 + if (ret) 897 + return ret; 898 + 945 899 wm_adsp2_component_probe(&cs35l56->dsp, component); 946 900 947 901 debugfs_create_bool("init_done", 0444, debugfs_root, &cs35l56->base.init_done);
+3
sound/soc/codecs/cs35l56.h
··· 38 38 struct snd_soc_component *component; 39 39 struct regulator_bulk_data supplies[CS35L56_NUM_BULK_SUPPLIES]; 40 40 struct sdw_slave *sdw_peripheral; 41 + const char *fallback_fw_suffix; 41 42 struct work_struct sdw_irq_work; 42 43 bool sdw_irq_no_unmask; 43 44 bool soft_resetting; ··· 53 52 bool tdm_mode; 54 53 bool sysclk_set; 55 54 u8 old_sdw_clock_scale; 55 + u8 sdw_link_num; 56 + u8 sdw_unique_id; 56 57 }; 57 58 58 59 extern const struct dev_pm_ops cs35l56_pm_ops_i2c_spi;
+4
sound/soc/codecs/cs48l32.c
··· 2162 2162 n_slots_multiple = 1; 2163 2163 2164 2164 sclk_target = snd_soc_tdm_params_to_bclk(params, slotw, n_slots, n_slots_multiple); 2165 + if (sclk_target < 0) { 2166 + cs48l32_asp_err(dai, "Invalid parameters\n"); 2167 + return sclk_target; 2168 + } 2165 2169 2166 2170 for (i = 0; i < ARRAY_SIZE(cs48l32_sclk_rates); i++) { 2167 2171 if ((cs48l32_sclk_rates[i].freq >= sclk_target) &&
+1 -2
sound/soc/codecs/es8326.c
··· 1079 1079 regmap_update_bits(es8326->regmap, ES8326_HPDET_TYPE, 0x03, 0x00); 1080 1080 regmap_write(es8326->regmap, ES8326_INTOUT_IO, 1081 1081 es8326->interrupt_clk); 1082 - regmap_write(es8326->regmap, ES8326_SDINOUT1_IO, 1083 - (ES8326_IO_DMIC_CLK << ES8326_SDINOUT1_SHIFT)); 1082 + regmap_write(es8326->regmap, ES8326_SDINOUT1_IO, ES8326_IO_INPUT); 1084 1083 regmap_write(es8326->regmap, ES8326_SDINOUT23_IO, ES8326_IO_INPUT); 1085 1084 1086 1085 regmap_write(es8326->regmap, ES8326_ANA_PDN, 0x00);
+18 -9
sound/soc/codecs/wm_adsp.c
··· 783 783 char **coeff_filename) 784 784 { 785 785 const char *system_name = dsp->system_name; 786 - const char *asoc_component_prefix = dsp->component->name_prefix; 786 + const char *suffix = dsp->component->name_prefix; 787 787 int ret = 0; 788 788 789 - if (system_name && asoc_component_prefix) { 789 + if (dsp->fwf_suffix) 790 + suffix = dsp->fwf_suffix; 791 + 792 + if (system_name && suffix) { 790 793 if (!wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename, 791 794 cirrus_dir, system_name, 792 - asoc_component_prefix, "wmfw")) { 795 + suffix, "wmfw")) { 793 796 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename, 794 797 cirrus_dir, system_name, 795 - asoc_component_prefix, "bin"); 798 + suffix, "bin"); 796 799 return 0; 797 800 } 798 801 } ··· 804 801 if (!wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename, 805 802 cirrus_dir, system_name, 806 803 NULL, "wmfw")) { 807 - if (asoc_component_prefix) 804 + if (suffix) 808 805 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename, 809 806 cirrus_dir, system_name, 810 - asoc_component_prefix, "bin"); 807 + suffix, "bin"); 811 808 812 809 if (!*coeff_firmware) 813 810 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename, ··· 819 816 820 817 /* Check system-specific bin without wmfw before falling back to generic */ 821 818 if (dsp->wmfw_optional && system_name) { 822 - if (asoc_component_prefix) 819 + if (suffix) 823 820 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename, 824 821 cirrus_dir, system_name, 825 - asoc_component_prefix, "bin"); 822 + suffix, "bin"); 826 823 827 824 if (!*coeff_firmware) 828 825 wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename, ··· 853 850 adsp_err(dsp, "Failed to request firmware <%s>%s-%s-%s<-%s<%s>>.wmfw\n", 854 851 cirrus_dir, dsp->part, 855 852 dsp->fwf_name ? dsp->fwf_name : dsp->cs_dsp.name, 856 - wm_adsp_fw[dsp->fw].file, system_name, asoc_component_prefix); 853 + wm_adsp_fw[dsp->fw].file, system_name, suffix); 857 854 858 855 return -ENOENT; 859 856 } ··· 1000 997 return ret; 1001 998 } 1002 999 1000 + if (dsp->bin_mandatory && !coeff_firmware) { 1001 + ret = -ENOENT; 1002 + goto err; 1003 + } 1004 + 1003 1005 ret = cs_dsp_power_up(&dsp->cs_dsp, 1004 1006 wmfw_firmware, wmfw_filename, 1005 1007 coeff_firmware, coeff_filename, 1006 1008 wm_adsp_fw_text[dsp->fw]); 1007 1009 1010 + err: 1008 1011 wm_adsp_release_firmware_files(dsp, 1009 1012 wmfw_firmware, wmfw_filename, 1010 1013 coeff_firmware, coeff_filename);
+2
sound/soc/codecs/wm_adsp.h
··· 29 29 const char *part; 30 30 const char *fwf_name; 31 31 const char *system_name; 32 + const char *fwf_suffix; 32 33 struct snd_soc_component *component; 33 34 34 35 unsigned int sys_config_size; 35 36 36 37 int fw; 37 38 bool wmfw_optional; 39 + bool bin_mandatory; 38 40 39 41 struct work_struct boot_work; 40 42 int (*control_add)(struct wm_adsp *dsp, struct cs_dsp_coeff_ctl *cs_ctl);
+2 -1
sound/soc/intel/common/sof-function-topology-lib.c
··· 73 73 break; 74 74 default: 75 75 dev_warn(card->dev, 76 - "only -2ch and -4ch are supported for dmic\n"); 76 + "unsupported number of dmics: %d\n", 77 + mach_params.dmic_num); 77 78 continue; 78 79 } 79 80 tplg_dev = TPLG_DEVICE_INTEL_PCH_DMIC;
+1
sound/soc/loongson/loongson_i2s.c
··· 9 9 #include <linux/module.h> 10 10 #include <linux/platform_device.h> 11 11 #include <linux/delay.h> 12 + #include <linux/export.h> 12 13 #include <linux/pm_runtime.h> 13 14 #include <linux/dma-mapping.h> 14 15 #include <sound/soc.h>
+2
sound/soc/sdw_utils/soc_sdw_utils.c
··· 1205 1205 int i; 1206 1206 1207 1207 dlc = kzalloc(sizeof(*dlc), GFP_KERNEL); 1208 + if (!dlc) 1209 + return -ENOMEM; 1208 1210 1209 1211 adr_end = &adr_dev->endpoints[end_index]; 1210 1212 dai_info = &codec_info->dais[adr_end->num];
+15
sound/soc/sof/imx/imx8.c
··· 40 40 struct reset_control *run_stall; 41 41 }; 42 42 43 + static int imx8_shutdown(struct snd_sof_dev *sdev) 44 + { 45 + /* 46 + * Force the DSP to stall. After the firmware image is loaded, 47 + * the stall will be removed during run() by a matching 48 + * imx_sc_pm_cpu_start() call. 49 + */ 50 + imx_sc_pm_cpu_start(get_chip_pdata(sdev), IMX_SC_R_DSP, false, 51 + RESET_VECTOR_VADDR); 52 + 53 + return 0; 54 + } 55 + 43 56 /* 44 57 * DSP control. 45 58 */ ··· 294 281 static const struct imx_chip_ops imx8_chip_ops = { 295 282 .probe = imx8_probe, 296 283 .core_kick = imx8_run, 284 + .core_shutdown = imx8_shutdown, 297 285 }; 298 286 299 287 static const struct imx_chip_ops imx8x_chip_ops = { 300 288 .probe = imx8_probe, 301 289 .core_kick = imx8x_run, 290 + .core_shutdown = imx8_shutdown, 302 291 }; 303 292 304 293 static const struct imx_chip_ops imx8m_chip_ops = {
+12
sound/usb/mixer_maps.c
··· 383 383 { 0 } /* terminator */ 384 384 }; 385 385 386 + /* KTMicro USB */ 387 + static struct usbmix_name_map s31b2_0022_map[] = { 388 + { 23, "Speaker Playback" }, 389 + { 18, "Headphone Playback" }, 390 + { 0 } 391 + }; 392 + 386 393 /* ASUS ROG Zenith II with Realtek ALC1220-VB */ 387 394 static const struct usbmix_name_map asus_zenith_ii_map[] = { 388 395 { 19, NULL, 12 }, /* FU, Input Gain Pad - broken response, disabled */ ··· 698 691 /* Microsoft USB Link headset */ 699 692 .id = USB_ID(0x045e, 0x083c), 700 693 .map = ms_usb_link_map, 694 + }, 695 + { 696 + /* KTMicro USB */ 697 + .id = USB_ID(0X31b2, 0x0022), 698 + .map = s31b2_0022_map, 701 699 }, 702 700 { 0 } /* terminator */ 703 701 };