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.15-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 are device-specific like quirks, new
IDs, and other safe (or rather boring) changes"

* tag 'sound-6.15-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
firmware: cs_dsp: test_bin_error: Fix uninitialized data used as fw version
ASoC: codecs: Add of_match_table for aw888081 driver
ASoC: fsl: fsl_qmc_audio: Reset audio data pointers on TRIGGER_START event
mailmap: Add entry for Srinivas Kandagatla
MAINTAINERS: use kernel.org alias
ASoC: cs42l43: Reset clamp override on jack removal
ALSA: hda/realtek - Fixed ASUS platform headset Mic issue
ALSA: hda/cirrus_scodec_test: Don't select dependencies
ALSA: azt2320: Replace deprecated strcpy() with strscpy()
ASoC: hdmi-codec: use RTD ID instead of DAI ID for ELD entry
ASoC: Intel: avs: Constrain path based on BE capabilities
ALSA: hda/tas2781: Remove unnecessary NULL check before release_firmware()
ASoC: Intel: avs: Fix null-ptr-deref in avs_component_probe()
ASoC: fsl_asrc_dma: get codec or cpu dai from backend
ASoC: qcom: Fix sc7280 lpass potential buffer overflow
ASoC: dwc: always enable/disable i2s irqs
ASoC: Intel: sof_sdw: Add quirk for Asus Zenbook S16
ASoC: codecs:lpass-wsa-macro: Fix logic of enabling vi channels
ASoC: codecs:lpass-wsa-macro: Fix vi feedback rate

+307 -110
+2
.mailmap
··· 688 688 Simon Wunderlich <sw@simonwunderlich.de> <simon@open-mesh.com> 689 689 Simon Wunderlich <sw@simonwunderlich.de> <siwu@hrz.tu-chemnitz.de> 690 690 Sricharan Ramabadhran <quic_srichara@quicinc.com> <sricharan@codeaurora.org> 691 + Srinivas Kandagatla <srini@kernel.org> <srinivas.kandagatla@st.com> 692 + Srinivas Kandagatla <srini@kernel.org> <srinivas.kandagatla@linaro.org> 691 693 Srinivas Ramana <quic_sramana@quicinc.com> <sramana@codeaurora.org> 692 694 Sriram R <quic_srirrama@quicinc.com> <srirrama@codeaurora.org> 693 695 Sriram Yagnaraman <sriram.yagnaraman@ericsson.com> <sriram.yagnaraman@est.tech>
+4 -4
MAINTAINERS
··· 17374 17374 F: drivers/nvme/target/ 17375 17375 17376 17376 NVMEM FRAMEWORK 17377 - M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> 17377 + M: Srinivas Kandagatla <srini@kernel.org> 17378 17378 S: Maintained 17379 17379 T: git git://git.kernel.org/pub/scm/linux/kernel/git/srini/nvmem.git 17380 17380 F: Documentation/ABI/stable/sysfs-bus-nvmem ··· 19579 19579 F: drivers/crypto/intel/qat/ 19580 19580 19581 19581 QCOM AUDIO (ASoC) DRIVERS 19582 - M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> 19582 + M: Srinivas Kandagatla <srini@kernel.org> 19583 19583 L: linux-sound@vger.kernel.org 19584 19584 L: linux-arm-msm@vger.kernel.org 19585 19585 S: Supported ··· 19879 19879 F: drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c 19880 19880 19881 19881 QUALCOMM FASTRPC DRIVER 19882 - M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> 19882 + M: Srinivas Kandagatla <srini@kernel.org> 19883 19883 M: Amol Maheshwari <amahesh@qti.qualcomm.com> 19884 19884 L: linux-arm-msm@vger.kernel.org 19885 19885 L: dri-devel@lists.freedesktop.org ··· 21927 21927 F: drivers/media/rc/serial_ir.c 21928 21928 21929 21929 SERIAL LOW-POWER INTER-CHIP MEDIA BUS (SLIMbus) 21930 - M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> 21930 + M: Srinivas Kandagatla <srini@kernel.org> 21931 21931 L: linux-sound@vger.kernel.org 21932 21932 S: Maintained 21933 21933 F: Documentation/devicetree/bindings/slimbus/
-30
drivers/firmware/cirrus/test/cs_dsp_mock_mem_maps.c
··· 462 462 EXPORT_SYMBOL_NS_GPL(cs_dsp_mock_xm_header_get_alg_base_in_words, "FW_CS_DSP_KUNIT_TEST_UTILS"); 463 463 464 464 /** 465 - * cs_dsp_mock_xm_header_get_fw_version_from_regmap() - Firmware version. 466 - * 467 - * @priv: Pointer to struct cs_dsp_test. 468 - * 469 - * Return: Firmware version word value. 470 - */ 471 - unsigned int cs_dsp_mock_xm_header_get_fw_version_from_regmap(struct cs_dsp_test *priv) 472 - { 473 - unsigned int xm = cs_dsp_mock_base_addr_for_mem(priv, WMFW_ADSP2_XM); 474 - union { 475 - struct wmfw_id_hdr adsp2; 476 - struct wmfw_v3_id_hdr halo; 477 - } hdr; 478 - 479 - switch (priv->dsp->type) { 480 - case WMFW_ADSP2: 481 - regmap_raw_read(priv->dsp->regmap, xm, &hdr.adsp2, sizeof(hdr.adsp2)); 482 - return be32_to_cpu(hdr.adsp2.ver); 483 - case WMFW_HALO: 484 - regmap_raw_read(priv->dsp->regmap, xm, &hdr.halo, sizeof(hdr.halo)); 485 - return be32_to_cpu(hdr.halo.ver); 486 - default: 487 - KUNIT_FAIL(priv->test, NULL); 488 - return 0; 489 - } 490 - } 491 - EXPORT_SYMBOL_NS_GPL(cs_dsp_mock_xm_header_get_fw_version_from_regmap, 492 - "FW_CS_DSP_KUNIT_TEST_UTILS"); 493 - 494 - /** 495 465 * cs_dsp_mock_xm_header_get_fw_version() - Firmware version. 496 466 * 497 467 * @header: Pointer to struct cs_dsp_mock_xm_header.
+1 -1
drivers/firmware/cirrus/test/cs_dsp_test_bin.c
··· 2198 2198 2199 2199 priv->local->bin_builder = 2200 2200 cs_dsp_mock_bin_init(priv, 1, 2201 - cs_dsp_mock_xm_header_get_fw_version_from_regmap(priv)); 2201 + cs_dsp_mock_xm_header_get_fw_version(xm_hdr)); 2202 2202 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, priv->local->bin_builder); 2203 2203 2204 2204 /* We must provide a dummy wmfw to load */
+1 -1
drivers/firmware/cirrus/test/cs_dsp_test_bin_error.c
··· 451 451 452 452 local->bin_builder = 453 453 cs_dsp_mock_bin_init(priv, 1, 454 - cs_dsp_mock_xm_header_get_fw_version_from_regmap(priv)); 454 + cs_dsp_mock_xm_header_get_fw_version(local->xm_header)); 455 455 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, local->bin_builder); 456 456 457 457 /* Init cs_dsp */
-1
include/linux/firmware/cirrus/cs_dsp_test_utils.h
··· 104 104 unsigned int cs_dsp_mock_xm_header_get_alg_base_in_words(struct cs_dsp_test *priv, 105 105 unsigned int alg_id, 106 106 int mem_type); 107 - unsigned int cs_dsp_mock_xm_header_get_fw_version_from_regmap(struct cs_dsp_test *priv); 108 107 unsigned int cs_dsp_mock_xm_header_get_fw_version(struct cs_dsp_mock_xm_header *header); 109 108 void cs_dsp_mock_xm_header_drop_from_regmap_cache(struct cs_dsp_test *priv); 110 109 int cs_dsp_mock_xm_header_write_to_regmap(struct cs_dsp_mock_xm_header *header);
+2 -2
sound/isa/azt2320.c
··· 189 189 if (error < 0) 190 190 return error; 191 191 192 - strcpy(card->driver, "AZT2320"); 193 - strcpy(card->shortname, "Aztech AZT2320"); 192 + strscpy(card->driver, "AZT2320"); 193 + strscpy(card->shortname, "Aztech AZT2320"); 194 194 sprintf(card->longname, "%s, WSS at 0x%lx, irq %i, dma %i&%i", 195 195 card->shortname, chip->port, irq[dev], dma1[dev], dma2[dev]); 196 196
+1 -3
sound/pci/hda/Kconfig
··· 96 96 97 97 config SND_HDA_CIRRUS_SCODEC_KUNIT_TEST 98 98 tristate "KUnit test for Cirrus side-codec library" if !KUNIT_ALL_TESTS 99 - select SND_HDA_CIRRUS_SCODEC 100 - select GPIOLIB 101 - depends on KUNIT 99 + depends on SND_HDA_CIRRUS_SCODEC && GPIOLIB && KUNIT 102 100 default KUNIT_ALL_TESTS 103 101 help 104 102 This builds KUnit tests for the cirrus side-codec library.
+15 -8
sound/pci/hda/patch_realtek.c
··· 7969 7969 ALC233_FIXUP_MEDION_MTL_SPK, 7970 7970 ALC294_FIXUP_BASS_SPEAKER_15, 7971 7971 ALC283_FIXUP_DELL_HP_RESUME, 7972 + ALC294_FIXUP_ASUS_CS35L41_SPI_2, 7972 7973 }; 7973 7974 7974 7975 /* A special fixup for Lenovo C940 and Yoga Duet 7; ··· 10334 10333 .type = HDA_FIXUP_FUNC, 10335 10334 .v.func = alc283_fixup_dell_hp_resume, 10336 10335 }, 10336 + [ALC294_FIXUP_ASUS_CS35L41_SPI_2] = { 10337 + .type = HDA_FIXUP_FUNC, 10338 + .v.func = cs35l41_fixup_spi_two, 10339 + .chained = true, 10340 + .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC, 10341 + }, 10337 10342 }; 10338 10343 10339 10344 static const struct hda_quirk alc269_fixup_tbl[] = { ··· 10842 10835 SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE), 10843 10836 SND_PCI_QUIRK(0x1043, 0x12a3, "Asus N7691ZM", ALC269_FIXUP_ASUS_N7601ZM), 10844 10837 SND_PCI_QUIRK(0x1043, 0x12af, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2), 10845 - SND_PCI_QUIRK(0x1043, 0x12b4, "ASUS B3405CCA / P3405CCA", ALC245_FIXUP_CS35L41_SPI_2), 10838 + SND_PCI_QUIRK(0x1043, 0x12b4, "ASUS B3405CCA / P3405CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2), 10846 10839 SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC), 10847 10840 SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC), 10848 10841 SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE), ··· 10932 10925 SND_PCI_QUIRK(0x1043, 0x1fb3, "ASUS ROG Flow Z13 GZ302EA", ALC287_FIXUP_CS35L41_I2C_2), 10933 10926 SND_PCI_QUIRK(0x1043, 0x3011, "ASUS B5605CVA", ALC245_FIXUP_CS35L41_SPI_2), 10934 10927 SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2), 10935 - SND_PCI_QUIRK(0x1043, 0x3061, "ASUS B3405CCA", ALC245_FIXUP_CS35L41_SPI_2), 10936 - SND_PCI_QUIRK(0x1043, 0x3071, "ASUS B5405CCA", ALC245_FIXUP_CS35L41_SPI_2), 10937 - SND_PCI_QUIRK(0x1043, 0x30c1, "ASUS B3605CCA / P3605CCA", ALC245_FIXUP_CS35L41_SPI_2), 10938 - SND_PCI_QUIRK(0x1043, 0x30d1, "ASUS B5405CCA", ALC245_FIXUP_CS35L41_SPI_2), 10939 - SND_PCI_QUIRK(0x1043, 0x30e1, "ASUS B5605CCA", ALC245_FIXUP_CS35L41_SPI_2), 10928 + SND_PCI_QUIRK(0x1043, 0x3061, "ASUS B3405CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2), 10929 + SND_PCI_QUIRK(0x1043, 0x3071, "ASUS B5405CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2), 10930 + SND_PCI_QUIRK(0x1043, 0x30c1, "ASUS B3605CCA / P3605CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2), 10931 + SND_PCI_QUIRK(0x1043, 0x30d1, "ASUS B5405CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2), 10932 + SND_PCI_QUIRK(0x1043, 0x30e1, "ASUS B5605CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2), 10940 10933 SND_PCI_QUIRK(0x1043, 0x31d0, "ASUS Zen AIO 27 Z272SD_A272SD", ALC274_FIXUP_ASUS_ZEN_AIO_27), 10941 - SND_PCI_QUIRK(0x1043, 0x31e1, "ASUS B5605CCA", ALC245_FIXUP_CS35L41_SPI_2), 10942 - SND_PCI_QUIRK(0x1043, 0x31f1, "ASUS B3605CCA", ALC245_FIXUP_CS35L41_SPI_2), 10934 + SND_PCI_QUIRK(0x1043, 0x31e1, "ASUS B5605CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2), 10935 + SND_PCI_QUIRK(0x1043, 0x31f1, "ASUS B3605CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2), 10943 10936 SND_PCI_QUIRK(0x1043, 0x3a20, "ASUS G614JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS), 10944 10937 SND_PCI_QUIRK(0x1043, 0x3a30, "ASUS G814JVR/JIR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS), 10945 10938 SND_PCI_QUIRK(0x1043, 0x3a40, "ASUS G814JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
+1 -2
sound/pci/hda/tas2781_hda_spi.c
··· 1003 1003 */ 1004 1004 1005 1005 out: 1006 - if (fmw) 1007 - release_firmware(fmw); 1006 + release_firmware(fmw); 1008 1007 pm_runtime_mark_last_busy(tas_hda->priv->dev); 1009 1008 pm_runtime_put_autosuspend(tas_hda->priv->dev); 1010 1009 }
+10
sound/soc/codecs/aw88081.c
··· 1295 1295 aw88081_dai, ARRAY_SIZE(aw88081_dai)); 1296 1296 } 1297 1297 1298 + #if defined(CONFIG_OF) 1299 + static const struct of_device_id aw88081_of_match[] = { 1300 + { .compatible = "awinic,aw88081" }, 1301 + { .compatible = "awinic,aw88083" }, 1302 + { } 1303 + }; 1304 + MODULE_DEVICE_TABLE(of, aw88081_of_match); 1305 + #endif 1306 + 1298 1307 static struct i2c_driver aw88081_i2c_driver = { 1299 1308 .driver = { 1300 1309 .name = AW88081_I2C_NAME, 1310 + .of_match_table = of_match_ptr(aw88081_of_match), 1301 1311 }, 1302 1312 .probe = aw88081_i2c_probe, 1303 1313 .id_table = aw88081_i2c_id,
+3
sound/soc/codecs/cs42l43-jack.c
··· 702 702 CS42L43_PGA_WIDESWING_MODE_EN_MASK, 0); 703 703 regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CTRL, 704 704 CS42L43_JACK_STEREO_CONFIG_MASK, 0); 705 + regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CLAMP_CTRL, 706 + CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK, 707 + CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_MASK); 705 708 regmap_update_bits(cs42l43->regmap, CS42L43_HS2, 706 709 CS42L43_HSDET_MODE_MASK | CS42L43_HSDET_MANUAL_MODE_MASK, 707 710 0x2 << CS42L43_HSDET_MODE_SHIFT);
+19 -3
sound/soc/codecs/hdmi-codec.c
··· 842 842 static int hdmi_dai_proc_new(struct hdmi_codec_priv *hcp, 843 843 struct snd_soc_dai *dai) 844 844 { 845 + struct snd_soc_component *component = dai->component; 846 + struct snd_soc_card *card = component->card; 847 + struct snd_soc_dai *d; 848 + struct snd_soc_pcm_runtime *rtd; 845 849 struct snd_info_entry *entry; 846 850 char name[32]; 847 - int err; 851 + int err, i, id = 0; 848 852 849 - snprintf(name, sizeof(name), "eld#%d", dai->id); 850 - err = snd_card_proc_new(dai->component->card->snd_card, name, &entry); 853 + /* 854 + * To avoid duplicate proc entry, find its rtd and use rtd->id 855 + * instead of dai->id 856 + */ 857 + for_each_card_rtds(card, rtd) { 858 + for_each_rtd_dais(rtd, i, d) 859 + if (d == dai) { 860 + id = rtd->id; 861 + goto found; 862 + } 863 + } 864 + found: 865 + snprintf(name, sizeof(name), "eld#%d", id); 866 + err = snd_card_proc_new(card->snd_card, name, &entry); 851 867 if (err < 0) 852 868 return err; 853 869
+95 -44
sound/soc/codecs/lpass-wsa-macro.c
··· 63 63 #define CDC_WSA_TX_SPKR_PROT_CLK_DISABLE 0 64 64 #define CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK GENMASK(3, 0) 65 65 #define CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K 0 66 + #define CDC_WSA_TX_SPKR_PROT_PCM_RATE_16K 1 67 + #define CDC_WSA_TX_SPKR_PROT_PCM_RATE_24K 2 68 + #define CDC_WSA_TX_SPKR_PROT_PCM_RATE_32K 3 69 + #define CDC_WSA_TX_SPKR_PROT_PCM_RATE_48K 4 66 70 #define CDC_WSA_TX0_SPKR_PROT_PATH_CFG0 (0x0248) 67 71 #define CDC_WSA_TX1_SPKR_PROT_PATH_CTL (0x0264) 68 72 #define CDC_WSA_TX1_SPKR_PROT_PATH_CFG0 (0x0268) ··· 411 407 int ear_spkr_gain; 412 408 int spkr_gain_offset; 413 409 int spkr_mode; 410 + u32 pcm_rate_vi; 414 411 int is_softclip_on[WSA_MACRO_SOFTCLIP_MAX]; 415 412 int softclip_clk_users[WSA_MACRO_SOFTCLIP_MAX]; 416 413 struct regmap *regmap; ··· 1285 1280 struct snd_soc_dai *dai) 1286 1281 { 1287 1282 struct snd_soc_component *component = dai->component; 1283 + struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 1288 1284 int ret; 1289 1285 1290 1286 switch (substream->stream) { ··· 1297 1291 __func__, params_rate(params)); 1298 1292 return ret; 1299 1293 } 1294 + break; 1295 + case SNDRV_PCM_STREAM_CAPTURE: 1296 + if (dai->id == WSA_MACRO_AIF_VI) 1297 + wsa->pcm_rate_vi = params_rate(params); 1298 + 1300 1299 break; 1301 1300 default: 1302 1301 break; ··· 1459 1448 } 1460 1449 } 1461 1450 1451 + static void wsa_macro_enable_disable_vi_sense(struct snd_soc_component *component, bool enable, 1452 + u32 tx_reg0, u32 tx_reg1, u32 val) 1453 + { 1454 + if (enable) { 1455 + /* Enable V&I sensing */ 1456 + snd_soc_component_update_bits(component, tx_reg0, 1457 + CDC_WSA_TX_SPKR_PROT_RESET_MASK, 1458 + CDC_WSA_TX_SPKR_PROT_RESET); 1459 + snd_soc_component_update_bits(component, tx_reg1, 1460 + CDC_WSA_TX_SPKR_PROT_RESET_MASK, 1461 + CDC_WSA_TX_SPKR_PROT_RESET); 1462 + snd_soc_component_update_bits(component, tx_reg0, 1463 + CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK, 1464 + val); 1465 + snd_soc_component_update_bits(component, tx_reg1, 1466 + CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK, 1467 + val); 1468 + snd_soc_component_update_bits(component, tx_reg0, 1469 + CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK, 1470 + CDC_WSA_TX_SPKR_PROT_CLK_ENABLE); 1471 + snd_soc_component_update_bits(component, tx_reg1, 1472 + CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK, 1473 + CDC_WSA_TX_SPKR_PROT_CLK_ENABLE); 1474 + snd_soc_component_update_bits(component, tx_reg0, 1475 + CDC_WSA_TX_SPKR_PROT_RESET_MASK, 1476 + CDC_WSA_TX_SPKR_PROT_NO_RESET); 1477 + snd_soc_component_update_bits(component, tx_reg1, 1478 + CDC_WSA_TX_SPKR_PROT_RESET_MASK, 1479 + CDC_WSA_TX_SPKR_PROT_NO_RESET); 1480 + } else { 1481 + snd_soc_component_update_bits(component, tx_reg0, 1482 + CDC_WSA_TX_SPKR_PROT_RESET_MASK, 1483 + CDC_WSA_TX_SPKR_PROT_RESET); 1484 + snd_soc_component_update_bits(component, tx_reg1, 1485 + CDC_WSA_TX_SPKR_PROT_RESET_MASK, 1486 + CDC_WSA_TX_SPKR_PROT_RESET); 1487 + snd_soc_component_update_bits(component, tx_reg0, 1488 + CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK, 1489 + CDC_WSA_TX_SPKR_PROT_CLK_DISABLE); 1490 + snd_soc_component_update_bits(component, tx_reg1, 1491 + CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK, 1492 + CDC_WSA_TX_SPKR_PROT_CLK_DISABLE); 1493 + } 1494 + } 1495 + 1496 + static void wsa_macro_enable_disable_vi_feedback(struct snd_soc_component *component, 1497 + bool enable, u32 rate) 1498 + { 1499 + struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 1500 + 1501 + if (test_bit(WSA_MACRO_TX0, &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) 1502 + wsa_macro_enable_disable_vi_sense(component, enable, 1503 + CDC_WSA_TX0_SPKR_PROT_PATH_CTL, 1504 + CDC_WSA_TX1_SPKR_PROT_PATH_CTL, rate); 1505 + 1506 + if (test_bit(WSA_MACRO_TX1, &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) 1507 + wsa_macro_enable_disable_vi_sense(component, enable, 1508 + CDC_WSA_TX2_SPKR_PROT_PATH_CTL, 1509 + CDC_WSA_TX3_SPKR_PROT_PATH_CTL, rate); 1510 + } 1511 + 1462 1512 static int wsa_macro_mclk_event(struct snd_soc_dapm_widget *w, 1463 1513 struct snd_kcontrol *kcontrol, int event) 1464 1514 { ··· 1536 1464 { 1537 1465 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 1538 1466 struct wsa_macro *wsa = snd_soc_component_get_drvdata(component); 1539 - u32 tx_reg0, tx_reg1; 1467 + u32 rate_val; 1540 1468 1541 - if (test_bit(WSA_MACRO_TX0, &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) { 1542 - tx_reg0 = CDC_WSA_TX0_SPKR_PROT_PATH_CTL; 1543 - tx_reg1 = CDC_WSA_TX1_SPKR_PROT_PATH_CTL; 1544 - } else if (test_bit(WSA_MACRO_TX1, &wsa->active_ch_mask[WSA_MACRO_AIF_VI])) { 1545 - tx_reg0 = CDC_WSA_TX2_SPKR_PROT_PATH_CTL; 1546 - tx_reg1 = CDC_WSA_TX3_SPKR_PROT_PATH_CTL; 1469 + switch (wsa->pcm_rate_vi) { 1470 + case 8000: 1471 + rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K; 1472 + break; 1473 + case 16000: 1474 + rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_16K; 1475 + break; 1476 + case 24000: 1477 + rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_24K; 1478 + break; 1479 + case 32000: 1480 + rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_32K; 1481 + break; 1482 + case 48000: 1483 + rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_48K; 1484 + break; 1485 + default: 1486 + rate_val = CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K; 1487 + break; 1547 1488 } 1548 1489 1549 1490 switch (event) { 1550 1491 case SND_SOC_DAPM_POST_PMU: 1551 - /* Enable V&I sensing */ 1552 - snd_soc_component_update_bits(component, tx_reg0, 1553 - CDC_WSA_TX_SPKR_PROT_RESET_MASK, 1554 - CDC_WSA_TX_SPKR_PROT_RESET); 1555 - snd_soc_component_update_bits(component, tx_reg1, 1556 - CDC_WSA_TX_SPKR_PROT_RESET_MASK, 1557 - CDC_WSA_TX_SPKR_PROT_RESET); 1558 - snd_soc_component_update_bits(component, tx_reg0, 1559 - CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK, 1560 - CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K); 1561 - snd_soc_component_update_bits(component, tx_reg1, 1562 - CDC_WSA_TX_SPKR_PROT_PCM_RATE_MASK, 1563 - CDC_WSA_TX_SPKR_PROT_PCM_RATE_8K); 1564 - snd_soc_component_update_bits(component, tx_reg0, 1565 - CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK, 1566 - CDC_WSA_TX_SPKR_PROT_CLK_ENABLE); 1567 - snd_soc_component_update_bits(component, tx_reg1, 1568 - CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK, 1569 - CDC_WSA_TX_SPKR_PROT_CLK_ENABLE); 1570 - snd_soc_component_update_bits(component, tx_reg0, 1571 - CDC_WSA_TX_SPKR_PROT_RESET_MASK, 1572 - CDC_WSA_TX_SPKR_PROT_NO_RESET); 1573 - snd_soc_component_update_bits(component, tx_reg1, 1574 - CDC_WSA_TX_SPKR_PROT_RESET_MASK, 1575 - CDC_WSA_TX_SPKR_PROT_NO_RESET); 1492 + /* Enable V&I sensing */ 1493 + wsa_macro_enable_disable_vi_feedback(component, true, rate_val); 1576 1494 break; 1577 1495 case SND_SOC_DAPM_POST_PMD: 1578 1496 /* Disable V&I sensing */ 1579 - snd_soc_component_update_bits(component, tx_reg0, 1580 - CDC_WSA_TX_SPKR_PROT_RESET_MASK, 1581 - CDC_WSA_TX_SPKR_PROT_RESET); 1582 - snd_soc_component_update_bits(component, tx_reg1, 1583 - CDC_WSA_TX_SPKR_PROT_RESET_MASK, 1584 - CDC_WSA_TX_SPKR_PROT_RESET); 1585 - snd_soc_component_update_bits(component, tx_reg0, 1586 - CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK, 1587 - CDC_WSA_TX_SPKR_PROT_CLK_DISABLE); 1588 - snd_soc_component_update_bits(component, tx_reg1, 1589 - CDC_WSA_TX_SPKR_PROT_CLK_EN_MASK, 1590 - CDC_WSA_TX_SPKR_PROT_CLK_DISABLE); 1497 + wsa_macro_enable_disable_vi_feedback(component, false, rate_val); 1591 1498 break; 1592 1499 } 1593 1500
+6 -7
sound/soc/dwc/dwc-i2s.c
··· 199 199 else 200 200 i2s_write_reg(dev->i2s_base, IRER, 1); 201 201 202 - /* I2S needs to enable IRQ to make a handshake with DMAC on the JH7110 SoC */ 203 - if (dev->use_pio || dev->is_jh7110) 204 - i2s_enable_irqs(dev, substream->stream, config->chan_nr); 205 - else 202 + if (!(dev->use_pio || dev->is_jh7110)) 206 203 i2s_enable_dma(dev, substream->stream); 207 204 205 + i2s_enable_irqs(dev, substream->stream, config->chan_nr); 208 206 i2s_write_reg(dev->i2s_base, CER, 1); 209 207 } 210 208 ··· 216 218 else 217 219 i2s_write_reg(dev->i2s_base, IRER, 0); 218 220 219 - if (dev->use_pio || dev->is_jh7110) 220 - i2s_disable_irqs(dev, substream->stream, 8); 221 - else 221 + if (!(dev->use_pio || dev->is_jh7110)) 222 222 i2s_disable_dma(dev, substream->stream); 223 + 224 + i2s_disable_irqs(dev, substream->stream, 8); 225 + 223 226 224 227 if (!dev->active) { 225 228 i2s_write_reg(dev->i2s_base, CER, 0);
+14 -1
sound/soc/fsl/fsl_asrc_dma.c
··· 156 156 for_each_dpcm_be(rtd, stream, dpcm) { 157 157 struct snd_soc_pcm_runtime *be = dpcm->be; 158 158 struct snd_pcm_substream *substream_be; 159 - struct snd_soc_dai *dai = snd_soc_rtd_to_cpu(be, 0); 159 + struct snd_soc_dai *dai_cpu = snd_soc_rtd_to_cpu(be, 0); 160 + struct snd_soc_dai *dai_codec = snd_soc_rtd_to_codec(be, 0); 161 + struct snd_soc_dai *dai; 160 162 161 163 if (dpcm->fe != rtd) 162 164 continue; 165 + 166 + /* 167 + * With audio graph card, original cpu dai is changed to codec 168 + * device in backend, so if cpu dai is dummy device in backend, 169 + * get the codec dai device, which is the real hardware device 170 + * connected. 171 + */ 172 + if (!snd_soc_dai_is_dummy(dai_cpu)) 173 + dai = dai_cpu; 174 + else 175 + dai = dai_codec; 163 176 164 177 substream_be = snd_soc_dpcm_get_substream(be, stream); 165 178 dma_params_be = snd_soc_dai_get_dma_data(dai, substream_be);
+3
sound/soc/fsl/fsl_qmc_audio.c
··· 250 250 switch (cmd) { 251 251 case SNDRV_PCM_TRIGGER_START: 252 252 bitmap_zero(prtd->chans_pending, 64); 253 + prtd->buffer_ended = 0; 254 + prtd->ch_dma_addr_current = prtd->ch_dma_addr_start; 255 + 253 256 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { 254 257 for (i = 0; i < prtd->channels; i++) 255 258 prtd->qmc_dai->chans[i].prtd_tx = prtd;
+72
sound/soc/intel/avs/path.c
··· 115 115 return NULL; 116 116 } 117 117 118 + static struct acpi_nhlt_config * 119 + avs_nhlt_config_or_default(struct avs_dev *adev, struct avs_tplg_module *t); 120 + 121 + int avs_path_set_constraint(struct avs_dev *adev, struct avs_tplg_path_template *template, 122 + struct snd_pcm_hw_constraint_list *rate_list, 123 + struct snd_pcm_hw_constraint_list *channels_list, 124 + struct snd_pcm_hw_constraint_list *sample_bits_list) 125 + { 126 + struct avs_tplg_path *path_template; 127 + unsigned int *rlist, *clist, *slist; 128 + size_t i; 129 + 130 + i = 0; 131 + list_for_each_entry(path_template, &template->path_list, node) 132 + i++; 133 + 134 + rlist = kcalloc(i, sizeof(rlist), GFP_KERNEL); 135 + clist = kcalloc(i, sizeof(clist), GFP_KERNEL); 136 + slist = kcalloc(i, sizeof(slist), GFP_KERNEL); 137 + 138 + i = 0; 139 + list_for_each_entry(path_template, &template->path_list, node) { 140 + struct avs_tplg_pipeline *pipeline_template; 141 + 142 + list_for_each_entry(pipeline_template, &path_template->ppl_list, node) { 143 + struct avs_tplg_module *module_template; 144 + 145 + list_for_each_entry(module_template, &pipeline_template->mod_list, node) { 146 + const guid_t *type = &module_template->cfg_ext->type; 147 + struct acpi_nhlt_config *blob; 148 + 149 + if (!guid_equal(type, &AVS_COPIER_MOD_UUID) && 150 + !guid_equal(type, &AVS_WOVHOSTM_MOD_UUID)) 151 + continue; 152 + 153 + switch (module_template->cfg_ext->copier.dma_type) { 154 + case AVS_DMA_DMIC_LINK_INPUT: 155 + case AVS_DMA_I2S_LINK_OUTPUT: 156 + case AVS_DMA_I2S_LINK_INPUT: 157 + break; 158 + default: 159 + continue; 160 + } 161 + 162 + blob = avs_nhlt_config_or_default(adev, module_template); 163 + if (IS_ERR(blob)) 164 + continue; 165 + 166 + rlist[i] = path_template->fe_fmt->sampling_freq; 167 + clist[i] = path_template->fe_fmt->num_channels; 168 + slist[i] = path_template->fe_fmt->bit_depth; 169 + i++; 170 + } 171 + } 172 + } 173 + 174 + if (i) { 175 + rate_list->count = i; 176 + rate_list->list = rlist; 177 + channels_list->count = i; 178 + channels_list->list = clist; 179 + sample_bits_list->count = i; 180 + sample_bits_list->list = slist; 181 + } else { 182 + kfree(rlist); 183 + kfree(clist); 184 + kfree(slist); 185 + } 186 + 187 + return i; 188 + } 189 + 118 190 static void avs_init_node_id(union avs_connector_node_id *node_id, 119 191 struct avs_tplg_modcfg_ext *te, u32 dma_id) 120 192 {
+5
sound/soc/intel/avs/path.h
··· 69 69 int avs_path_pause(struct avs_path *path); 70 70 int avs_path_run(struct avs_path *path, int trigger); 71 71 72 + int avs_path_set_constraint(struct avs_dev *adev, struct avs_tplg_path_template *template, 73 + struct snd_pcm_hw_constraint_list *rate_list, 74 + struct snd_pcm_hw_constraint_list *channels_list, 75 + struct snd_pcm_hw_constraint_list *sample_bits_list); 76 + 72 77 int avs_peakvol_set_volume(struct avs_dev *adev, struct avs_path_module *mod, 73 78 struct soc_mixer_control *mc, long *input); 74 79 int avs_peakvol_set_mute(struct avs_dev *adev, struct avs_path_module *mod,
+50 -2
sound/soc/intel/avs/pcm.c
··· 31 31 struct hdac_ext_stream *host_stream; 32 32 }; 33 33 34 + struct snd_pcm_hw_constraint_list rate_list; 35 + struct snd_pcm_hw_constraint_list channels_list; 36 + struct snd_pcm_hw_constraint_list sample_bits_list; 37 + 34 38 struct work_struct period_elapsed_work; 35 39 struct snd_pcm_substream *substream; 36 40 }; ··· 78 74 schedule_work(&data->period_elapsed_work); 79 75 } 80 76 77 + static int hw_rule_param_size(struct snd_pcm_hw_params *params, struct snd_pcm_hw_rule *rule); 78 + static int avs_hw_constraints_init(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) 79 + { 80 + struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 81 + struct snd_pcm_runtime *runtime = substream->runtime; 82 + struct snd_pcm_hw_constraint_list *r, *c, *s; 83 + struct avs_tplg_path_template *template; 84 + struct avs_dma_data *data; 85 + int ret; 86 + 87 + ret = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); 88 + if (ret < 0) 89 + return ret; 90 + 91 + data = snd_soc_dai_get_dma_data(dai, substream); 92 + r = &(data->rate_list); 93 + c = &(data->channels_list); 94 + s = &(data->sample_bits_list); 95 + 96 + template = avs_dai_find_path_template(dai, !rtd->dai_link->no_pcm, substream->stream); 97 + ret = avs_path_set_constraint(data->adev, template, r, c, s); 98 + if (ret <= 0) 99 + return ret; 100 + 101 + ret = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, r); 102 + if (ret < 0) 103 + return ret; 104 + 105 + ret = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, c); 106 + if (ret < 0) 107 + return ret; 108 + 109 + ret = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_SAMPLE_BITS, s); 110 + if (ret < 0) 111 + return ret; 112 + 113 + return 0; 114 + } 115 + 81 116 static int avs_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) 82 117 { 83 118 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); ··· 144 101 if (rtd->dai_link->ignore_suspend) 145 102 adev->num_lp_paths++; 146 103 147 - return 0; 104 + return avs_hw_constraints_init(substream, dai); 148 105 } 149 106 150 107 static void avs_dai_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) ··· 156 113 157 114 if (rtd->dai_link->ignore_suspend) 158 115 data->adev->num_lp_paths--; 116 + 117 + kfree(data->rate_list.list); 118 + kfree(data->channels_list.list); 119 + kfree(data->sample_bits_list.list); 159 120 160 121 snd_soc_dai_set_dma_data(dai, substream, NULL); 161 122 kfree(data); ··· 974 927 else 975 928 mach->tplg_filename = devm_kasprintf(adev->dev, GFP_KERNEL, 976 929 "hda-generic-tplg.bin"); 977 - 930 + if (!mach->tplg_filename) 931 + return -ENOMEM; 978 932 filename = kasprintf(GFP_KERNEL, "%s/%s", component->driver->topology_name_prefix, 979 933 mach->tplg_filename); 980 934 if (!filename)
+1
sound/soc/intel/boards/sof_sdw.c
··· 764 764 765 765 static const struct snd_pci_quirk sof_sdw_ssid_quirk_table[] = { 766 766 SND_PCI_QUIRK(0x1043, 0x1e13, "ASUS Zenbook S14", SOC_SDW_CODEC_MIC), 767 + SND_PCI_QUIRK(0x1043, 0x1f43, "ASUS Zenbook S16", SOC_SDW_CODEC_MIC), 767 768 {} 768 769 }; 769 770
+2 -1
sound/soc/qcom/lpass.h
··· 13 13 #include <linux/platform_device.h> 14 14 #include <linux/regmap.h> 15 15 #include <dt-bindings/sound/qcom,lpass.h> 16 + #include <dt-bindings/sound/qcom,q6afe.h> 16 17 #include "lpass-hdmi.h" 17 18 18 19 #define LPASS_AHBIX_CLOCK_FREQUENCY 131072000 19 - #define LPASS_MAX_PORTS (LPASS_CDC_DMA_VA_TX8 + 1) 20 + #define LPASS_MAX_PORTS (DISPLAY_PORT_RX_7 + 1) 20 21 #define LPASS_MAX_MI2S_PORTS (8) 21 22 #define LPASS_MAX_DMA_CHANNELS (8) 22 23 #define LPASS_MAX_HDMI_DMA_CHANNELS (4)