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 'asoc-fix-v6.11-merge-window' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus

ASoC: Fixes for v6.11

A selection of routine fixes and quirks that came in since the merge
window. The fsl-asoc-card change is a fix for systems with multiple
cards where updating templates in place leaks data from one card to
another.

+84 -39
+7
sound/soc/amd/yc/acp6x-mach.c
··· 224 224 .driver_data = &acp6x_card, 225 225 .matches = { 226 226 DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), 227 + DMI_MATCH(DMI_PRODUCT_NAME, "21M5"), 228 + } 229 + }, 230 + { 231 + .driver_data = &acp6x_card, 232 + .matches = { 233 + DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), 227 234 DMI_MATCH(DMI_PRODUCT_NAME, "82QF"), 228 235 } 229 236 },
+1 -1
sound/soc/codecs/tas2781-fmwlib.c
··· 2162 2162 return; 2163 2163 2164 2164 cal = cal_fmw->calibrations; 2165 - if (cal) 2165 + if (!cal) 2166 2166 return; 2167 2167 2168 2168 load_calib_data(priv, &cal->dev_data);
+29 -17
sound/soc/fsl/fsl-asoc-card.c
··· 306 306 return 0; 307 307 } 308 308 309 - SND_SOC_DAILINK_DEFS(hifi, 310 - DAILINK_COMP_ARRAY(COMP_EMPTY()), 311 - DAILINK_COMP_ARRAY(COMP_EMPTY(), COMP_EMPTY()), 312 - DAILINK_COMP_ARRAY(COMP_EMPTY())); 313 - 314 - SND_SOC_DAILINK_DEFS(hifi_fe, 315 - DAILINK_COMP_ARRAY(COMP_EMPTY()), 316 - DAILINK_COMP_ARRAY(COMP_DUMMY()), 317 - DAILINK_COMP_ARRAY(COMP_EMPTY())); 318 - 319 - SND_SOC_DAILINK_DEFS(hifi_be, 320 - DAILINK_COMP_ARRAY(COMP_EMPTY()), 321 - DAILINK_COMP_ARRAY(COMP_EMPTY(), COMP_EMPTY())); 322 - 323 309 static const struct snd_soc_dai_link fsl_asoc_card_dai[] = { 324 310 /* Default ASoC DAI Link*/ 325 311 { 326 312 .name = "HiFi", 327 313 .stream_name = "HiFi", 328 314 .ops = &fsl_asoc_card_ops, 329 - SND_SOC_DAILINK_REG(hifi), 330 315 }, 331 316 /* DPCM Link between Front-End and Back-End (Optional) */ 332 317 { ··· 320 335 .dpcm_playback = 1, 321 336 .dpcm_capture = 1, 322 337 .dynamic = 1, 323 - SND_SOC_DAILINK_REG(hifi_fe), 324 338 }, 325 339 { 326 340 .name = "HiFi-ASRC-BE", ··· 329 345 .dpcm_playback = 1, 330 346 .dpcm_capture = 1, 331 347 .no_pcm = 1, 332 - SND_SOC_DAILINK_REG(hifi_be), 333 348 }, 334 349 }; 335 350 ··· 620 637 struct platform_device *cpu_pdev; 621 638 struct fsl_asoc_card_priv *priv; 622 639 struct device *codec_dev[2] = { NULL, NULL }; 640 + struct snd_soc_dai_link_component *dlc; 623 641 const char *codec_dai_name[2]; 624 642 const char *codec_dev_name[2]; 625 643 u32 asrc_fmt = 0; ··· 701 717 702 718 memcpy(priv->dai_link, fsl_asoc_card_dai, 703 719 sizeof(struct snd_soc_dai_link) * ARRAY_SIZE(priv->dai_link)); 720 + /* 721 + * "Default ASoC DAI Link": 1 cpus, 2 codecs, 1 platforms 722 + * "DPCM Link Front-End": 1 cpus, 1 codecs (dummy), 1 platforms 723 + * "DPCM Link Back-End": 1 cpus, 2 codecs 724 + * totally 10 components 725 + */ 726 + dlc = devm_kcalloc(&pdev->dev, 10, sizeof(*dlc), GFP_KERNEL); 727 + if (!dlc) { 728 + ret = -ENOMEM; 729 + goto asrc_fail; 730 + } 731 + 732 + priv->dai_link[0].cpus = &dlc[0]; 733 + priv->dai_link[0].num_cpus = 1; 734 + priv->dai_link[0].codecs = &dlc[1]; 704 735 priv->dai_link[0].num_codecs = 1; 736 + priv->dai_link[0].platforms = &dlc[3]; 737 + priv->dai_link[0].num_platforms = 1; 738 + 739 + priv->dai_link[1].cpus = &dlc[4]; 740 + priv->dai_link[1].num_cpus = 1; 741 + priv->dai_link[1].codecs = &dlc[5]; 742 + priv->dai_link[1].num_codecs = 0; /* dummy */ 743 + priv->dai_link[1].platforms = &dlc[6]; 744 + priv->dai_link[1].num_platforms = 1; 745 + 746 + priv->dai_link[2].cpus = &dlc[7]; 747 + priv->dai_link[2].num_cpus = 1; 748 + priv->dai_link[2].codecs = &dlc[8]; 705 749 priv->dai_link[2].num_codecs = 1; 706 750 707 751 priv->card.dapm_routes = audio_map;
+9
sound/soc/intel/common/soc-acpi-intel-ssp-common.c
··· 64 64 CODEC_MAP_ENTRY("RT1015P", "rt1015", RT1015P_ACPI_HID, CODEC_RT1015P), 65 65 CODEC_MAP_ENTRY("RT1019P", "rt1019", RT1019P_ACPI_HID, CODEC_RT1019P), 66 66 CODEC_MAP_ENTRY("RT1308", "rt1308", RT1308_ACPI_HID, CODEC_RT1308), 67 + 68 + /* 69 + * Monolithic components 70 + * 71 + * Only put components that can serve as both the amp and the codec below this line. 72 + * This will ensure that if the part is used just as a codec and there is an amp as well 73 + * then the amp will be selected properly. 74 + */ 75 + CODEC_MAP_ENTRY("RT5650", "rt5650", RT5650_ACPI_HID, CODEC_RT5650), 67 76 }; 68 77 69 78 enum snd_soc_acpi_intel_codec
+1 -1
sound/soc/intel/common/soc-intel-quirks.h
··· 11 11 12 12 #include <linux/platform_data/x86/soc.h> 13 13 14 - #if IS_ENABLED(CONFIG_X86) 14 + #if IS_REACHABLE(CONFIG_IOSF_MBI) 15 15 16 16 #include <linux/dmi.h> 17 17 #include <asm/iosf_mbi.h>
-1
sound/soc/sof/amd/pci-vangogh.c
··· 34 34 .dsp_intr_base = ACP5X_DSP_SW_INTR_BASE, 35 35 .sram_pte_offset = ACP5X_SRAM_PTE_OFFSET, 36 36 .hw_semaphore_offset = ACP5X_AXI2DAGB_SEM_0, 37 - .acp_clkmux_sel = ACP5X_CLKMUX_SEL, 38 37 .probe_reg_offset = ACP5X_FUTURE_REG_ACLK_0, 39 38 }; 40 39
+1 -1
sound/soc/sof/imx/imx8m.c
··· 234 234 /* set default mailbox offset for FW ready message */ 235 235 sdev->dsp_box.offset = MBOX_OFFSET; 236 236 237 - priv->regmap = syscon_regmap_lookup_by_compatible("fsl,dsp-ctrl"); 237 + priv->regmap = syscon_regmap_lookup_by_phandle(np, "fsl,dsp-ctrl"); 238 238 if (IS_ERR(priv->regmap)) { 239 239 dev_err(sdev->dev, "cannot find dsp-ctrl registers"); 240 240 ret = PTR_ERR(priv->regmap);
+11 -7
sound/soc/sof/intel/hda-loader.c
··· 310 310 return ret; 311 311 } 312 312 313 - /* Wait for completion of transfer */ 314 - time_left = wait_for_completion_timeout(&hda_stream->ioc, 315 - msecs_to_jiffies(HDA_CL_DMA_IOC_TIMEOUT_MS)); 313 + if (sdev->pdata->ipc_type == SOF_IPC_TYPE_4) { 314 + /* Wait for completion of transfer */ 315 + time_left = wait_for_completion_timeout(&hda_stream->ioc, 316 + msecs_to_jiffies(HDA_CL_DMA_IOC_TIMEOUT_MS)); 316 317 317 - if (!time_left) { 318 - dev_err(sdev->dev, "Code loader DMA did not complete\n"); 319 - return -ETIMEDOUT; 318 + if (!time_left) { 319 + dev_err(sdev->dev, "Code loader DMA did not complete\n"); 320 + return -ETIMEDOUT; 321 + } 322 + dev_dbg(sdev->dev, "Code loader DMA done\n"); 320 323 } 321 - dev_dbg(sdev->dev, "Code loader DMA done, waiting for FW_ENTERED status\n"); 324 + 325 + dev_dbg(sdev->dev, "waiting for FW_ENTERED status\n"); 322 326 323 327 status = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, 324 328 chip->rom_status_reg, reg,
+9 -8
sound/soc/sof/intel/hda.c
··· 1307 1307 const struct sof_dev_desc *desc = sof_pdata->desc; 1308 1308 struct hdac_bus *bus = sof_to_bus(sdev); 1309 1309 struct snd_soc_acpi_mach *mach = NULL; 1310 - enum snd_soc_acpi_intel_codec codec_type; 1310 + enum snd_soc_acpi_intel_codec codec_type, amp_type; 1311 1311 const char *tplg_filename; 1312 1312 const char *tplg_suffix; 1313 + bool amp_name_valid; 1313 1314 1314 1315 /* Try I2S or DMIC if it is supported */ 1315 1316 if (interface_mask & (BIT(SOF_DAI_INTEL_SSP) | BIT(SOF_DAI_INTEL_DMIC))) ··· 1414 1413 } 1415 1414 } 1416 1415 1417 - codec_type = snd_soc_acpi_intel_detect_amp_type(sdev->dev); 1416 + amp_type = snd_soc_acpi_intel_detect_amp_type(sdev->dev); 1417 + codec_type = snd_soc_acpi_intel_detect_codec_type(sdev->dev); 1418 + amp_name_valid = amp_type != CODEC_NONE && amp_type != codec_type; 1418 1419 1419 - if (tplg_fixup && 1420 - mach->tplg_quirk_mask & SND_SOC_ACPI_TPLG_INTEL_AMP_NAME && 1421 - codec_type != CODEC_NONE) { 1422 - tplg_suffix = snd_soc_acpi_intel_get_amp_tplg_suffix(codec_type); 1420 + if (tplg_fixup && amp_name_valid && 1421 + mach->tplg_quirk_mask & SND_SOC_ACPI_TPLG_INTEL_AMP_NAME) { 1422 + tplg_suffix = snd_soc_acpi_intel_get_amp_tplg_suffix(amp_type); 1423 1423 if (!tplg_suffix) { 1424 1424 dev_err(sdev->dev, "no tplg suffix found, amp %d\n", 1425 - codec_type); 1425 + amp_type); 1426 1426 return NULL; 1427 1427 } 1428 1428 ··· 1438 1436 add_extension = true; 1439 1437 } 1440 1438 1441 - codec_type = snd_soc_acpi_intel_detect_codec_type(sdev->dev); 1442 1439 1443 1440 if (tplg_fixup && 1444 1441 mach->tplg_quirk_mask & SND_SOC_ACPI_TPLG_INTEL_CODEC_NAME &&
+15 -3
sound/soc/sof/ipc4-topology.c
··· 1358 1358 ipc4_copier = dai->private; 1359 1359 1360 1360 if (pipeline->use_chain_dma) { 1361 - pipeline->msg.primary = 0; 1361 + /* 1362 + * Preserve the DMA Link ID and clear other bits since 1363 + * the DMA Link ID is only configured once during 1364 + * dai_config, other fields are expected to be 0 for 1365 + * re-configuration 1366 + */ 1367 + pipeline->msg.primary &= SOF_IPC4_GLB_CHAIN_DMA_LINK_ID_MASK; 1362 1368 pipeline->msg.extension = 0; 1363 1369 } 1364 1370 ··· 3101 3095 return 0; 3102 3096 3103 3097 if (pipeline->use_chain_dma) { 3104 - pipeline->msg.primary &= ~SOF_IPC4_GLB_CHAIN_DMA_LINK_ID_MASK; 3105 - pipeline->msg.primary |= SOF_IPC4_GLB_CHAIN_DMA_LINK_ID(data->dai_data); 3098 + /* 3099 + * Only configure the DMA Link ID for ChainDMA when this op is 3100 + * invoked with SOF_DAI_CONFIG_FLAGS_HW_PARAMS 3101 + */ 3102 + if (flags & SOF_DAI_CONFIG_FLAGS_HW_PARAMS) { 3103 + pipeline->msg.primary &= ~SOF_IPC4_GLB_CHAIN_DMA_LINK_ID_MASK; 3104 + pipeline->msg.primary |= SOF_IPC4_GLB_CHAIN_DMA_LINK_ID(data->dai_data); 3105 + } 3106 3106 return 0; 3107 3107 } 3108 3108
+1
sound/soc/tegra/Kconfig
··· 78 78 79 79 config SND_SOC_TEGRA210_I2S 80 80 tristate "Tegra210 I2S module" 81 + select SND_SIMPLE_CARD_UTILS 81 82 help 82 83 Config to enable the Inter-IC Sound (I2S) Controller which 83 84 implements full-duplex and bidirectional and single direction