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

ASoC: Merge up fixes

They have build/application dependencies for some new changes coming in.

Mark Brown 402dda23 076f3227

+315 -105
+2
.mailmap
··· 685 685 Simon Wunderlich <sw@simonwunderlich.de> <simon@open-mesh.com> 686 686 Simon Wunderlich <sw@simonwunderlich.de> <siwu@hrz.tu-chemnitz.de> 687 687 Sricharan Ramabadhran <quic_srichara@quicinc.com> <sricharan@codeaurora.org> 688 + Srinivas Kandagatla <srini@kernel.org> <srinivas.kandagatla@st.com> 689 + Srinivas Kandagatla <srini@kernel.org> <srinivas.kandagatla@linaro.org> 688 690 Srinivas Ramana <quic_sramana@quicinc.com> <sramana@codeaurora.org> 689 691 Sriram R <quic_srirrama@quicinc.com> <srirrama@codeaurora.org> 690 692 Sriram Yagnaraman <sriram.yagnaraman@ericsson.com> <sriram.yagnaraman@est.tech>
+10 -4
MAINTAINERS
··· 17371 17371 F: drivers/nvme/target/ 17372 17372 17373 17373 NVMEM FRAMEWORK 17374 - M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> 17374 + M: Srinivas Kandagatla <srini@kernel.org> 17375 17375 S: Maintained 17376 17376 T: git git://git.kernel.org/pub/scm/linux/kernel/git/srini/nvmem.git 17377 17377 F: Documentation/ABI/stable/sysfs-bus-nvmem ··· 19576 19576 F: drivers/crypto/intel/qat/ 19577 19577 19578 19578 QCOM AUDIO (ASoC) DRIVERS 19579 - M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> 19579 + M: Srinivas Kandagatla <srini@kernel.org> 19580 19580 L: linux-sound@vger.kernel.org 19581 19581 L: linux-arm-msm@vger.kernel.org 19582 19582 S: Supported ··· 19876 19876 F: drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c 19877 19877 19878 19878 QUALCOMM FASTRPC DRIVER 19879 - M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> 19879 + M: Srinivas Kandagatla <srini@kernel.org> 19880 19880 M: Amol Maheshwari <amahesh@qti.qualcomm.com> 19881 19881 L: linux-arm-msm@vger.kernel.org 19882 19882 L: dri-devel@lists.freedesktop.org ··· 21931 21931 F: drivers/media/rc/serial_ir.c 21932 21932 21933 21933 SERIAL LOW-POWER INTER-CHIP MEDIA BUS (SLIMbus) 21934 - M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> 21934 + M: Srinivas Kandagatla <srini@kernel.org> 21935 21935 L: linux-sound@vger.kernel.org 21936 21936 S: Maintained 21937 21937 F: Documentation/devicetree/bindings/slimbus/ ··· 22664 22664 F: Documentation/devicetree/bindings/sound/ 22665 22665 F: Documentation/sound/soc/ 22666 22666 F: include/dt-bindings/sound/ 22667 + F: include/sound/cs-amp-lib.h 22668 + F: include/sound/cs35l* 22669 + F: include/sound/cs4271.h 22670 + F: include/sound/cs42l* 22671 + F: include/sound/madera-pdata.h 22667 22672 F: include/sound/soc* 22668 22673 F: include/sound/sof.h 22669 22674 F: include/sound/sof/ 22675 + F: include/sound/wm*.h 22670 22676 F: include/trace/events/sof*.h 22671 22677 F: include/uapi/sound/asoc.h 22672 22678 F: sound/soc/
+1 -4
drivers/firmware/cirrus/Kconfig
··· 6 6 7 7 config FW_CS_DSP_KUNIT_TEST_UTILS 8 8 tristate 9 - depends on KUNIT && REGMAP 10 - select FW_CS_DSP 11 9 12 10 config FW_CS_DSP_KUNIT_TEST 13 11 tristate "KUnit tests for Cirrus Logic cs_dsp" if !KUNIT_ALL_TESTS 14 - depends on KUNIT && REGMAP 12 + depends on KUNIT && REGMAP && FW_CS_DSP 15 13 default KUNIT_ALL_TESTS 16 - select FW_CS_DSP 17 14 select FW_CS_DSP_KUNIT_TEST_UTILS 18 15 help 19 16 This builds KUnit tests for cs_dsp.
-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 -3
sound/soc/codecs/Kconfig
··· 780 780 tristate 781 781 782 782 config SND_SOC_CS_AMP_LIB_TEST 783 - tristate "KUnit test for Cirrus Logic cs-amp-lib" 784 - depends on KUNIT 783 + tristate "KUnit test for Cirrus Logic cs-amp-lib" if !KUNIT_ALL_TESTS 784 + depends on SND_SOC_CS_AMP_LIB && KUNIT 785 785 default KUNIT_ALL_TESTS 786 - select SND_SOC_CS_AMP_LIB 787 786 help 788 787 This builds KUnit tests for the Cirrus Logic common 789 788 amplifier library.
+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,
+10
sound/soc/codecs/cs42l43-jack.c
··· 654 654 655 655 reinit_completion(&priv->type_detect); 656 656 657 + regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CLAMP_CTRL, 658 + CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK, 659 + CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK); 660 + 657 661 cs42l43_start_hs_bias(priv, true); 658 662 regmap_update_bits(cs42l43->regmap, CS42L43_HS2, 659 663 CS42L43_HSDET_MODE_MASK, 0x3 << CS42L43_HSDET_MODE_SHIFT); ··· 668 664 regmap_update_bits(cs42l43->regmap, CS42L43_HS2, 669 665 CS42L43_HSDET_MODE_MASK, 0x2 << CS42L43_HSDET_MODE_SHIFT); 670 666 cs42l43_stop_hs_bias(priv); 667 + 668 + regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CLAMP_CTRL, 669 + CS42L43_SMIC_HPAMP_CLAMP_DIS_FRC_VAL_MASK, 0); 671 670 672 671 if (!time_left) 673 672 return -ETIMEDOUT; ··· 709 702 CS42L43_PGA_WIDESWING_MODE_EN_MASK, 0); 710 703 regmap_update_bits(cs42l43->regmap, CS42L43_STEREO_MIC_CTRL, 711 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); 712 708 regmap_update_bits(cs42l43->regmap, CS42L43_HS2, 713 709 CS42L43_HSDET_MODE_MASK | CS42L43_HSDET_MANUAL_MODE_MASK, 714 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;
+1 -1
sound/soc/fsl/imx-card.c
··· 544 544 if (!card->dai_link) 545 545 return -ENOMEM; 546 546 547 - data->link_data = devm_kcalloc(dev, num_links, sizeof(*link), GFP_KERNEL); 547 + data->link_data = devm_kcalloc(dev, num_links, sizeof(*link_data), GFP_KERNEL); 548 548 if (!data->link_data) 549 549 return -ENOMEM; 550 550
+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
··· 32 32 struct hdac_ext_stream *host_stream; 33 33 }; 34 34 35 + struct snd_pcm_hw_constraint_list rate_list; 36 + struct snd_pcm_hw_constraint_list channels_list; 37 + struct snd_pcm_hw_constraint_list sample_bits_list; 38 + 35 39 struct work_struct period_elapsed_work; 36 40 struct hdac_ext_link *link; 37 41 struct snd_pcm_substream *substream; ··· 80 76 schedule_work(&data->period_elapsed_work); 81 77 } 82 78 79 + static int hw_rule_param_size(struct snd_pcm_hw_params *params, struct snd_pcm_hw_rule *rule); 80 + static int avs_hw_constraints_init(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) 81 + { 82 + struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 83 + struct snd_pcm_runtime *runtime = substream->runtime; 84 + struct snd_pcm_hw_constraint_list *r, *c, *s; 85 + struct avs_tplg_path_template *template; 86 + struct avs_dma_data *data; 87 + int ret; 88 + 89 + ret = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); 90 + if (ret < 0) 91 + return ret; 92 + 93 + data = snd_soc_dai_get_dma_data(dai, substream); 94 + r = &(data->rate_list); 95 + c = &(data->channels_list); 96 + s = &(data->sample_bits_list); 97 + 98 + template = avs_dai_find_path_template(dai, !rtd->dai_link->no_pcm, substream->stream); 99 + ret = avs_path_set_constraint(data->adev, template, r, c, s); 100 + if (ret <= 0) 101 + return ret; 102 + 103 + ret = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, r); 104 + if (ret < 0) 105 + return ret; 106 + 107 + ret = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, c); 108 + if (ret < 0) 109 + return ret; 110 + 111 + ret = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_SAMPLE_BITS, s); 112 + if (ret < 0) 113 + return ret; 114 + 115 + return 0; 116 + } 117 + 83 118 static int avs_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) 84 119 { 85 120 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); ··· 146 103 if (rtd->dai_link->ignore_suspend) 147 104 adev->num_lp_paths++; 148 105 149 - return 0; 106 + return avs_hw_constraints_init(substream, dai); 150 107 } 151 108 152 109 static void avs_dai_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) ··· 158 115 159 116 if (rtd->dai_link->ignore_suspend) 160 117 data->adev->num_lp_paths--; 118 + 119 + kfree(data->rate_list.list); 120 + kfree(data->channels_list.list); 121 + kfree(data->sample_bits_list.list); 161 122 162 123 snd_soc_dai_set_dma_data(dai, substream, NULL); 163 124 kfree(data); ··· 1027 980 else 1028 981 mach->tplg_filename = devm_kasprintf(adev->dev, GFP_KERNEL, 1029 982 "hda-generic-tplg.bin"); 1030 - 983 + if (!mach->tplg_filename) 984 + return -ENOMEM; 1031 985 filename = kasprintf(GFP_KERNEL, "%s/%s", component->driver->topology_name_prefix, 1032 986 mach->tplg_filename); 1033 987 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/intel/common/soc-acpi-intel-ptl-match.c
··· 432 432 .mask = BIT(3), 433 433 .num_adr = ARRAY_SIZE(cs42l43_3_adr), 434 434 .adr_d = cs42l43_3_adr, 435 - } 435 + }, 436 + {} 436 437 }; 437 438 438 439 static const struct snd_soc_acpi_link_adr ptl_rt722_only[] = {
+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)
+2
sound/soc/sdw_utils/soc_sdw_rt_dmic.c
··· 29 29 mic_name = devm_kasprintf(card->dev, GFP_KERNEL, "rt715-sdca"); 30 30 else 31 31 mic_name = devm_kasprintf(card->dev, GFP_KERNEL, "%s", component->name_prefix); 32 + if (!mic_name) 33 + return -ENOMEM; 32 34 33 35 card->components = devm_kasprintf(card->dev, GFP_KERNEL, 34 36 "%s mic:%s", card->components,
+4 -1
sound/soc/soc-pcm.c
··· 1584 1584 /* 1585 1585 * Filter for systems with 'component_chaining' enabled. 1586 1586 * This helps to avoid unnecessary re-configuration of an 1587 - * already active BE on such systems. 1587 + * already active BE on such systems and ensures the BE DAI 1588 + * widget is powered ON after hw_params() BE DAI callback. 1588 1589 */ 1589 1590 if (fe->card->component_chaining && 1590 1591 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_NEW) && 1592 + (be->dpcm[stream].state != SND_SOC_DPCM_STATE_OPEN) && 1593 + (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) && 1591 1594 (be->dpcm[stream].state != SND_SOC_DPCM_STATE_CLOSE)) 1592 1595 continue; 1593 1596
+2
tools/testing/kunit/configs/all_tests.config
··· 20 20 21 21 CONFIG_PCI=y 22 22 CONFIG_USB4=y 23 + CONFIG_I2C=y 23 24 24 25 CONFIG_NET=y 25 26 CONFIG_MCTP=y ··· 52 51 CONFIG_SND=y 53 52 CONFIG_SND_SOC=y 54 53 CONFIG_SND_SOC_TOPOLOGY_BUILD=y 54 + CONFIG_SND_SOC_CS35L56_I2C=y