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

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

Pull sound fixes from Takashi Iwai:
"As a usual pattern, we've got relatively large updates at rc5:

- A fix for races in ALSA control user elements

- ASoC DAPM regression due to component refactoring

- A fix in error handling of ASoC iteration macro

- ASoC Intel SST Skylake kconfig fix; a new Kconfig will appear as a
consequence, but in the end it's a good cleanup

- HD-audio and USB-audio quirks as always

- Assort of ASoC driver fixes (pcm186x, Intel cht, rockchip, pcm3060,
rsnd, omap, wm_adsp, qcom, sunxi, stm32)"

* tag 'sound-4.20-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (34 commits)
ALSA: usb-audio: Add vendor and product name for Dell WD19 Dock
ALSA: hda/realtek - Support ALC300
ALSA: hda/realtek - Add auto-mute quirk for HP Spectre x360 laptop
ALSA: hda/realtek - fix the pop noise on headphone for lenovo laptops
ALSA: control: Fix race between adding and removing a user element
ALSA: sparc: Fix invalid snd_free_pages() at error path
ALSA: wss: Fix invalid snd_free_pages() at error path
ALSA: hda/realtek - fix headset mic detection for MSI MS-B171
ALSA: hda: Add ASRock N68C-S UCC the power_save blacklist
ALSA: ac97: Fix incorrect bit shift at AC97-SPSA control write
ASoC: omap-dmic: Add pm_qos handling to avoid overruns with CPU_IDLE
ASoC: omap-mcpdm: Add pm_qos handling to avoid under/overruns with CPU_IDLE
ASoC: omap-mcbsp: Fix latency value calculation for pm_qos
ASoC: acpi: fix: continue searching when machine is ignored
ASoC: Intel: Skylake: fix Kconfigs, make HDaudio codec optional
MAINTAINERS: add ASoC maintainers for sound dt-bindings
ASoC: pcm186x: Fix device reset-registers trigger value
ASoC: dapm: Recalculate audio map forcely when card instantiated
ASoC: omap-abe-twl6040: Fix missing audio card caused by deferred probing
ASoC: pcm3060: Rename output widgets
...

+490 -337
+1
MAINTAINERS
··· 14010 14010 F: Documentation/devicetree/bindings/sound/ 14011 14011 F: Documentation/sound/soc/ 14012 14012 F: sound/soc/ 14013 + F: include/dt-bindings/sound/ 14013 14014 F: include/sound/soc* 14014 14015 14015 14016 SOUNDWIRE SUBSYSTEM
+1 -1
include/sound/soc.h
··· 1192 1192 ((i) < rtd->num_codecs) && ((dai) = rtd->codec_dais[i]); \ 1193 1193 (i)++) 1194 1194 #define for_each_rtd_codec_dai_rollback(rtd, i, dai) \ 1195 - for (; ((i--) >= 0) && ((dai) = rtd->codec_dais[i]);) 1195 + for (; ((--i) >= 0) && ((dai) = rtd->codec_dais[i]);) 1196 1196 1197 1197 1198 1198 /* mixer control */
+45 -35
sound/core/control.c
··· 348 348 return 0; 349 349 } 350 350 351 + /* add a new kcontrol object; call with card->controls_rwsem locked */ 352 + static int __snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol) 353 + { 354 + struct snd_ctl_elem_id id; 355 + unsigned int idx; 356 + unsigned int count; 357 + 358 + id = kcontrol->id; 359 + if (id.index > UINT_MAX - kcontrol->count) 360 + return -EINVAL; 361 + 362 + if (snd_ctl_find_id(card, &id)) { 363 + dev_err(card->dev, 364 + "control %i:%i:%i:%s:%i is already present\n", 365 + id.iface, id.device, id.subdevice, id.name, id.index); 366 + return -EBUSY; 367 + } 368 + 369 + if (snd_ctl_find_hole(card, kcontrol->count) < 0) 370 + return -ENOMEM; 371 + 372 + list_add_tail(&kcontrol->list, &card->controls); 373 + card->controls_count += kcontrol->count; 374 + kcontrol->id.numid = card->last_numid + 1; 375 + card->last_numid += kcontrol->count; 376 + 377 + id = kcontrol->id; 378 + count = kcontrol->count; 379 + for (idx = 0; idx < count; idx++, id.index++, id.numid++) 380 + snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_ADD, &id); 381 + 382 + return 0; 383 + } 384 + 351 385 /** 352 386 * snd_ctl_add - add the control instance to the card 353 387 * @card: the card instance ··· 398 364 */ 399 365 int snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol) 400 366 { 401 - struct snd_ctl_elem_id id; 402 - unsigned int idx; 403 - unsigned int count; 404 367 int err = -EINVAL; 405 368 406 369 if (! kcontrol) 407 370 return err; 408 371 if (snd_BUG_ON(!card || !kcontrol->info)) 409 372 goto error; 410 - id = kcontrol->id; 411 - if (id.index > UINT_MAX - kcontrol->count) 412 - goto error; 413 373 414 374 down_write(&card->controls_rwsem); 415 - if (snd_ctl_find_id(card, &id)) { 416 - up_write(&card->controls_rwsem); 417 - dev_err(card->dev, "control %i:%i:%i:%s:%i is already present\n", 418 - id.iface, 419 - id.device, 420 - id.subdevice, 421 - id.name, 422 - id.index); 423 - err = -EBUSY; 424 - goto error; 425 - } 426 - if (snd_ctl_find_hole(card, kcontrol->count) < 0) { 427 - up_write(&card->controls_rwsem); 428 - err = -ENOMEM; 429 - goto error; 430 - } 431 - list_add_tail(&kcontrol->list, &card->controls); 432 - card->controls_count += kcontrol->count; 433 - kcontrol->id.numid = card->last_numid + 1; 434 - card->last_numid += kcontrol->count; 435 - id = kcontrol->id; 436 - count = kcontrol->count; 375 + err = __snd_ctl_add(card, kcontrol); 437 376 up_write(&card->controls_rwsem); 438 - for (idx = 0; idx < count; idx++, id.index++, id.numid++) 439 - snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_ADD, &id); 377 + if (err < 0) 378 + goto error; 440 379 return 0; 441 380 442 381 error: ··· 1368 1361 kctl->tlv.c = snd_ctl_elem_user_tlv; 1369 1362 1370 1363 /* This function manage to free the instance on failure. */ 1371 - err = snd_ctl_add(card, kctl); 1372 - if (err < 0) 1373 - return err; 1364 + down_write(&card->controls_rwsem); 1365 + err = __snd_ctl_add(card, kctl); 1366 + if (err < 0) { 1367 + snd_ctl_free_one(kctl); 1368 + goto unlock; 1369 + } 1374 1370 offset = snd_ctl_get_ioff(kctl, &info->id); 1375 1371 snd_ctl_build_ioff(&info->id, kctl, offset); 1376 1372 /* ··· 1384 1374 * which locks the element. 1385 1375 */ 1386 1376 1387 - down_write(&card->controls_rwsem); 1388 1377 card->user_ctl_count++; 1389 - up_write(&card->controls_rwsem); 1390 1378 1379 + unlock: 1380 + up_write(&card->controls_rwsem); 1391 1381 return 0; 1392 1382 } 1393 1383
-2
sound/isa/wss/wss_lib.c
··· 1531 1531 if (err < 0) { 1532 1532 if (chip->release_dma) 1533 1533 chip->release_dma(chip, chip->dma_private_data, chip->dma1); 1534 - snd_free_pages(runtime->dma_area, runtime->dma_bytes); 1535 1534 return err; 1536 1535 } 1537 1536 chip->playback_substream = substream; ··· 1571 1572 if (err < 0) { 1572 1573 if (chip->release_dma) 1573 1574 chip->release_dma(chip, chip->dma_private_data, chip->dma2); 1574 - snd_free_pages(runtime->dma_area, runtime->dma_bytes); 1575 1575 return err; 1576 1576 } 1577 1577 chip->capture_substream = substream;
+1 -1
sound/pci/ac97/ac97_codec.c
··· 824 824 { 825 825 struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol); 826 826 int reg = kcontrol->private_value & 0xff; 827 - int shift = (kcontrol->private_value >> 8) & 0xff; 827 + int shift = (kcontrol->private_value >> 8) & 0x0f; 828 828 int mask = (kcontrol->private_value >> 16) & 0xff; 829 829 // int invert = (kcontrol->private_value >> 24) & 0xff; 830 830 unsigned short value, old, new;
+2
sound/pci/hda/hda_intel.c
··· 2169 2169 /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */ 2170 2170 SND_PCI_QUIRK(0x1849, 0xc892, "Asrock B85M-ITX", 0), 2171 2171 /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */ 2172 + SND_PCI_QUIRK(0x1849, 0x0397, "Asrock N68C-S UCC", 0), 2173 + /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */ 2172 2174 SND_PCI_QUIRK(0x1849, 0x7662, "Asrock H81M-HDS", 0), 2173 2175 /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */ 2174 2176 SND_PCI_QUIRK(0x1043, 0x8733, "Asus Prime X370-Pro", 0),
+36
sound/pci/hda/patch_realtek.c
··· 388 388 case 0x10ec0285: 389 389 case 0x10ec0298: 390 390 case 0x10ec0289: 391 + case 0x10ec0300: 391 392 alc_update_coef_idx(codec, 0x10, 1<<9, 0); 392 393 break; 393 394 case 0x10ec0275: ··· 2831 2830 ALC269_TYPE_ALC215, 2832 2831 ALC269_TYPE_ALC225, 2833 2832 ALC269_TYPE_ALC294, 2833 + ALC269_TYPE_ALC300, 2834 2834 ALC269_TYPE_ALC700, 2835 2835 }; 2836 2836 ··· 2866 2864 case ALC269_TYPE_ALC215: 2867 2865 case ALC269_TYPE_ALC225: 2868 2866 case ALC269_TYPE_ALC294: 2867 + case ALC269_TYPE_ALC300: 2869 2868 case ALC269_TYPE_ALC700: 2870 2869 ssids = alc269_ssids; 2871 2870 break; ··· 5361 5358 spec->gen.preferred_dacs = preferred_pairs; 5362 5359 } 5363 5360 5361 + /* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */ 5362 + static void alc285_fixup_invalidate_dacs(struct hda_codec *codec, 5363 + const struct hda_fixup *fix, int action) 5364 + { 5365 + if (action != HDA_FIXUP_ACT_PRE_PROBE) 5366 + return; 5367 + 5368 + snd_hda_override_wcaps(codec, 0x03, 0); 5369 + } 5370 + 5364 5371 /* for hda_fixup_thinkpad_acpi() */ 5365 5372 #include "thinkpad_helper.c" 5366 5373 ··· 5508 5495 ALC255_FIXUP_DELL_HEADSET_MIC, 5509 5496 ALC295_FIXUP_HP_X360, 5510 5497 ALC221_FIXUP_HP_HEADSET_MIC, 5498 + ALC285_FIXUP_LENOVO_HEADPHONE_NOISE, 5499 + ALC295_FIXUP_HP_AUTO_MUTE, 5511 5500 }; 5512 5501 5513 5502 static const struct hda_fixup alc269_fixups[] = { ··· 5674 5659 [ALC269_FIXUP_HP_MUTE_LED_MIC3] = { 5675 5660 .type = HDA_FIXUP_FUNC, 5676 5661 .v.func = alc269_fixup_hp_mute_led_mic3, 5662 + .chained = true, 5663 + .chain_id = ALC295_FIXUP_HP_AUTO_MUTE 5677 5664 }, 5678 5665 [ALC269_FIXUP_HP_GPIO_LED] = { 5679 5666 .type = HDA_FIXUP_FUNC, ··· 6379 6362 .chained = true, 6380 6363 .chain_id = ALC269_FIXUP_HEADSET_MIC 6381 6364 }, 6365 + [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = { 6366 + .type = HDA_FIXUP_FUNC, 6367 + .v.func = alc285_fixup_invalidate_dacs, 6368 + }, 6369 + [ALC295_FIXUP_HP_AUTO_MUTE] = { 6370 + .type = HDA_FIXUP_FUNC, 6371 + .v.func = alc_fixup_auto_mute_via_amp, 6372 + }, 6382 6373 }; 6383 6374 6384 6375 static const struct snd_pci_quirk alc269_fixup_tbl[] = { ··· 6557 6532 SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8), 6558 6533 SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC), 6559 6534 SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC), 6535 + SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC), 6560 6536 SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS), 6561 6537 SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE), 6562 6538 SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE), ··· 7060 7034 {0x12, 0x90a60130}, 7061 7035 {0x19, 0x03a11020}, 7062 7036 {0x21, 0x0321101f}), 7037 + SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_HEADPHONE_NOISE, 7038 + {0x12, 0x90a60130}, 7039 + {0x14, 0x90170110}, 7040 + {0x19, 0x04a11040}, 7041 + {0x21, 0x04211020}), 7063 7042 SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, 7064 7043 {0x12, 0x90a60120}, 7065 7044 {0x14, 0x90170110}, ··· 7325 7294 spec->codec_variant = ALC269_TYPE_ALC294; 7326 7295 spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */ 7327 7296 alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */ 7297 + break; 7298 + case 0x10ec0300: 7299 + spec->codec_variant = ALC269_TYPE_ALC300; 7300 + spec->gen.mixer_nid = 0; /* no loopback on ALC300 */ 7328 7301 break; 7329 7302 case 0x10ec0700: 7330 7303 case 0x10ec0701: ··· 8440 8405 HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269), 8441 8406 HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269), 8442 8407 HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269), 8408 + HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269), 8443 8409 HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861), 8444 8410 HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd), 8445 8411 HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
+5 -6
sound/soc/codecs/hdac_hdmi.c
··· 2187 2187 */ 2188 2188 snd_hdac_codec_read(hdev, hdev->afg, 0, AC_VERB_SET_POWER_STATE, 2189 2189 AC_PWRST_D3); 2190 - err = snd_hdac_display_power(bus, false); 2191 - if (err < 0) { 2192 - dev_err(dev, "Cannot turn on display power on i915\n"); 2193 - return err; 2194 - } 2195 2190 2196 2191 hlink = snd_hdac_ext_bus_get_link(bus, dev_name(dev)); 2197 2192 if (!hlink) { ··· 2196 2201 2197 2202 snd_hdac_ext_bus_link_put(bus, hlink); 2198 2203 2199 - return 0; 2204 + err = snd_hdac_display_power(bus, false); 2205 + if (err < 0) 2206 + dev_err(dev, "Cannot turn off display power on i915\n"); 2207 + 2208 + return err; 2200 2209 } 2201 2210 2202 2211 static int hdac_hdmi_runtime_resume(struct device *dev)
+1 -1
sound/soc/codecs/pcm186x.h
··· 139 139 #define PCM186X_MAX_REGISTER PCM186X_CURR_TRIM_CTRL 140 140 141 141 /* PCM186X_PAGE */ 142 - #define PCM186X_RESET 0xff 142 + #define PCM186X_RESET 0xfe 143 143 144 144 /* PCM186X_ADCX_INPUT_SEL_X */ 145 145 #define PCM186X_ADC_INPUT_SEL_POL BIT(7)
+4 -8
sound/soc/codecs/pcm3060.c
··· 198 198 }; 199 199 200 200 static const struct snd_soc_dapm_widget pcm3060_dapm_widgets[] = { 201 - SND_SOC_DAPM_OUTPUT("OUTL+"), 202 - SND_SOC_DAPM_OUTPUT("OUTR+"), 203 - SND_SOC_DAPM_OUTPUT("OUTL-"), 204 - SND_SOC_DAPM_OUTPUT("OUTR-"), 201 + SND_SOC_DAPM_OUTPUT("OUTL"), 202 + SND_SOC_DAPM_OUTPUT("OUTR"), 205 203 206 204 SND_SOC_DAPM_INPUT("INL"), 207 205 SND_SOC_DAPM_INPUT("INR"), 208 206 }; 209 207 210 208 static const struct snd_soc_dapm_route pcm3060_dapm_map[] = { 211 - { "OUTL+", NULL, "Playback" }, 212 - { "OUTR+", NULL, "Playback" }, 213 - { "OUTL-", NULL, "Playback" }, 214 - { "OUTR-", NULL, "Playback" }, 209 + { "OUTL", NULL, "Playback" }, 210 + { "OUTR", NULL, "Playback" }, 215 211 216 212 { "Capture", NULL, "INL" }, 217 213 { "Capture", NULL, "INR" },
+20 -17
sound/soc/codecs/wm_adsp.c
··· 765 765 766 766 static void wm_adsp2_show_fw_status(struct wm_adsp *dsp) 767 767 { 768 - u16 scratch[4]; 768 + unsigned int scratch[4]; 769 + unsigned int addr = dsp->base + ADSP2_SCRATCH0; 770 + unsigned int i; 769 771 int ret; 770 772 771 - ret = regmap_raw_read(dsp->regmap, dsp->base + ADSP2_SCRATCH0, 772 - scratch, sizeof(scratch)); 773 - if (ret) { 774 - adsp_err(dsp, "Failed to read SCRATCH regs: %d\n", ret); 775 - return; 773 + for (i = 0; i < ARRAY_SIZE(scratch); ++i) { 774 + ret = regmap_read(dsp->regmap, addr + i, &scratch[i]); 775 + if (ret) { 776 + adsp_err(dsp, "Failed to read SCRATCH%u: %d\n", i, ret); 777 + return; 778 + } 776 779 } 777 780 778 781 adsp_dbg(dsp, "FW SCRATCH 0:0x%x 1:0x%x 2:0x%x 3:0x%x\n", 779 - be16_to_cpu(scratch[0]), 780 - be16_to_cpu(scratch[1]), 781 - be16_to_cpu(scratch[2]), 782 - be16_to_cpu(scratch[3])); 782 + scratch[0], scratch[1], scratch[2], scratch[3]); 783 783 } 784 784 785 785 static void wm_adsp2v2_show_fw_status(struct wm_adsp *dsp) 786 786 { 787 - u32 scratch[2]; 787 + unsigned int scratch[2]; 788 788 int ret; 789 789 790 - ret = regmap_raw_read(dsp->regmap, dsp->base + ADSP2V2_SCRATCH0_1, 791 - scratch, sizeof(scratch)); 792 - 790 + ret = regmap_read(dsp->regmap, dsp->base + ADSP2V2_SCRATCH0_1, 791 + &scratch[0]); 793 792 if (ret) { 794 - adsp_err(dsp, "Failed to read SCRATCH regs: %d\n", ret); 793 + adsp_err(dsp, "Failed to read SCRATCH0_1: %d\n", ret); 795 794 return; 796 795 } 797 796 798 - scratch[0] = be32_to_cpu(scratch[0]); 799 - scratch[1] = be32_to_cpu(scratch[1]); 797 + ret = regmap_read(dsp->regmap, dsp->base + ADSP2V2_SCRATCH2_3, 798 + &scratch[1]); 799 + if (ret) { 800 + adsp_err(dsp, "Failed to read SCRATCH2_3: %d\n", ret); 801 + return; 802 + } 800 803 801 804 adsp_dbg(dsp, "FW SCRATCH 0:0x%x 1:0x%x 2:0x%x 3:0x%x\n", 802 805 scratch[0] & 0xFFFF,
+23 -3
sound/soc/intel/Kconfig
··· 101 101 codec, then enable this option by saying Y or m. This is a 102 102 recommended option 103 103 104 - config SND_SOC_INTEL_SKYLAKE_SSP_CLK 105 - tristate 106 - 107 104 config SND_SOC_INTEL_SKYLAKE 108 105 tristate "SKL/BXT/KBL/GLK/CNL... Platforms" 109 106 depends on PCI && ACPI 107 + select SND_SOC_INTEL_SKYLAKE_COMMON 108 + help 109 + If you have a Intel Skylake/Broxton/ApolloLake/KabyLake/ 110 + GeminiLake or CannonLake platform with the DSP enabled in the BIOS 111 + then enable this option by saying Y or m. 112 + 113 + if SND_SOC_INTEL_SKYLAKE 114 + 115 + config SND_SOC_INTEL_SKYLAKE_SSP_CLK 116 + tristate 117 + 118 + config SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC 119 + bool "HDAudio codec support" 120 + help 121 + If you have a Intel Skylake/Broxton/ApolloLake/KabyLake/ 122 + GeminiLake or CannonLake platform with an HDaudio codec 123 + then enable this option by saying Y 124 + 125 + config SND_SOC_INTEL_SKYLAKE_COMMON 126 + tristate 110 127 select SND_HDA_EXT_CORE 111 128 select SND_HDA_DSP_LOADER 112 129 select SND_SOC_TOPOLOGY 113 130 select SND_SOC_INTEL_SST 131 + select SND_SOC_HDAC_HDA if SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC 114 132 select SND_SOC_ACPI_INTEL_MATCH 115 133 help 116 134 If you have a Intel Skylake/Broxton/ApolloLake/KabyLake/ 117 135 GeminiLake or CannonLake platform with the DSP enabled in the BIOS 118 136 then enable this option by saying Y or m. 137 + 138 + endif ## SND_SOC_INTEL_SKYLAKE 119 139 120 140 config SND_SOC_ACPI_INTEL_MATCH 121 141 tristate
+14 -10
sound/soc/intel/boards/Kconfig
··· 293 293 Say Y if you have such a device. 294 294 If unsure select "N". 295 295 296 - config SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH 297 - tristate "SKL/KBL/BXT/APL with HDA Codecs" 298 - select SND_SOC_HDAC_HDMI 299 - select SND_SOC_HDAC_HDA 300 - help 301 - This adds support for ASoC machine driver for Intel platforms 302 - SKL/KBL/BXT/APL with iDisp, HDA audio codecs. 303 - Say Y or m if you have such a device. This is a recommended option. 304 - If unsure select "N". 305 - 306 296 config SND_SOC_INTEL_GLK_RT5682_MAX98357A_MACH 307 297 tristate "GLK with RT5682 and MAX98357A in I2S Mode" 308 298 depends on MFD_INTEL_LPSS && I2C && ACPI ··· 308 318 If unsure select "N". 309 319 310 320 endif ## SND_SOC_INTEL_SKYLAKE 321 + 322 + if SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC 323 + 324 + config SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH 325 + tristate "SKL/KBL/BXT/APL with HDA Codecs" 326 + select SND_SOC_HDAC_HDMI 327 + # SND_SOC_HDAC_HDA is already selected 328 + help 329 + This adds support for ASoC machine driver for Intel platforms 330 + SKL/KBL/BXT/APL with iDisp, HDA audio codecs. 331 + Say Y or m if you have such a device. This is a recommended option. 332 + If unsure select "N". 333 + 334 + endif ## SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC 311 335 312 336 endif ## SND_SOC_INTEL_MACH
+29 -3
sound/soc/intel/boards/cht_bsw_max98090_ti.c
··· 19 19 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 20 20 */ 21 21 22 + #include <linux/dmi.h> 22 23 #include <linux/module.h> 23 24 #include <linux/platform_device.h> 24 25 #include <linux/slab.h> ··· 35 34 36 35 #define CHT_PLAT_CLK_3_HZ 19200000 37 36 #define CHT_CODEC_DAI "HiFi" 37 + 38 + #define QUIRK_PMC_PLT_CLK_0 0x01 38 39 39 40 struct cht_mc_private { 40 41 struct clk *mclk; ··· 388 385 .num_controls = ARRAY_SIZE(cht_mc_controls), 389 386 }; 390 387 388 + static const struct dmi_system_id cht_max98090_quirk_table[] = { 389 + { 390 + /* Swanky model Chromebook (Toshiba Chromebook 2) */ 391 + .matches = { 392 + DMI_MATCH(DMI_PRODUCT_NAME, "Swanky"), 393 + }, 394 + .driver_data = (void *)QUIRK_PMC_PLT_CLK_0, 395 + }, 396 + {} 397 + }; 398 + 391 399 static int snd_cht_mc_probe(struct platform_device *pdev) 392 400 { 401 + const struct dmi_system_id *dmi_id; 393 402 struct device *dev = &pdev->dev; 394 403 int ret_val = 0; 395 404 struct cht_mc_private *drv; 405 + const char *mclk_name; 406 + int quirks = 0; 407 + 408 + dmi_id = dmi_first_match(cht_max98090_quirk_table); 409 + if (dmi_id) 410 + quirks = (unsigned long)dmi_id->driver_data; 396 411 397 412 drv = devm_kzalloc(&pdev->dev, sizeof(*drv), GFP_KERNEL); 398 413 if (!drv) ··· 432 411 snd_soc_card_cht.dev = &pdev->dev; 433 412 snd_soc_card_set_drvdata(&snd_soc_card_cht, drv); 434 413 435 - drv->mclk = devm_clk_get(&pdev->dev, "pmc_plt_clk_3"); 414 + if (quirks & QUIRK_PMC_PLT_CLK_0) 415 + mclk_name = "pmc_plt_clk_0"; 416 + else 417 + mclk_name = "pmc_plt_clk_3"; 418 + 419 + drv->mclk = devm_clk_get(&pdev->dev, mclk_name); 436 420 if (IS_ERR(drv->mclk)) { 437 421 dev_err(&pdev->dev, 438 - "Failed to get MCLK from pmc_plt_clk_3: %ld\n", 439 - PTR_ERR(drv->mclk)); 422 + "Failed to get MCLK from %s: %ld\n", 423 + mclk_name, PTR_ERR(drv->mclk)); 440 424 return PTR_ERR(drv->mclk); 441 425 } 442 426
+24 -8
sound/soc/intel/skylake/skl.c
··· 37 37 #include "skl.h" 38 38 #include "skl-sst-dsp.h" 39 39 #include "skl-sst-ipc.h" 40 + #if IS_ENABLED(CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC) 40 41 #include "../../../soc/codecs/hdac_hda.h" 42 + #endif 41 43 42 44 /* 43 45 * initialize the PCI registers ··· 660 658 platform_device_unregister(skl->clk_dev); 661 659 } 662 660 661 + #if IS_ENABLED(CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC) 662 + 663 663 #define IDISP_INTEL_VENDOR_ID 0x80860000 664 664 665 665 /* ··· 680 676 #endif 681 677 } 682 678 679 + #endif /* CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC */ 680 + 683 681 /* 684 682 * Probe the given codec address 685 683 */ ··· 691 685 (AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID; 692 686 unsigned int res = -1; 693 687 struct skl *skl = bus_to_skl(bus); 688 + #if IS_ENABLED(CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC) 694 689 struct hdac_hda_priv *hda_codec; 695 - struct hdac_device *hdev; 696 690 int err; 691 + #endif 692 + struct hdac_device *hdev; 697 693 698 694 mutex_lock(&bus->cmd_mutex); 699 695 snd_hdac_bus_send_cmd(bus, cmd); ··· 705 697 return -EIO; 706 698 dev_dbg(bus->dev, "codec #%d probed OK: %x\n", addr, res); 707 699 700 + #if IS_ENABLED(CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC) 708 701 hda_codec = devm_kzalloc(&skl->pci->dev, sizeof(*hda_codec), 709 702 GFP_KERNEL); 710 703 if (!hda_codec) ··· 724 715 load_codec_module(&hda_codec->codec); 725 716 } 726 717 return 0; 718 + #else 719 + hdev = devm_kzalloc(&skl->pci->dev, sizeof(*hdev), GFP_KERNEL); 720 + if (!hdev) 721 + return -ENOMEM; 722 + 723 + return snd_hdac_ext_bus_device_init(bus, addr, hdev); 724 + #endif /* CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC */ 727 725 } 728 726 729 727 /* Codec initialization */ ··· 831 815 } 832 816 } 833 817 818 + /* 819 + * we are done probing so decrement link counts 820 + */ 821 + list_for_each_entry(hlink, &bus->hlink_list, list) 822 + snd_hdac_ext_bus_link_put(bus, hlink); 823 + 834 824 if (IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI)) { 835 825 err = snd_hdac_display_power(bus, false); 836 826 if (err < 0) { ··· 845 823 return; 846 824 } 847 825 } 848 - 849 - /* 850 - * we are done probing so decrement link counts 851 - */ 852 - list_for_each_entry(hlink, &bus->hlink_list, list) 853 - snd_hdac_ext_bus_link_put(bus, hlink); 854 826 855 827 /* configure PM */ 856 828 pm_runtime_put_noidle(bus->dev); ··· 886 870 hbus = skl_to_hbus(skl); 887 871 bus = skl_to_bus(skl); 888 872 889 - #if IS_ENABLED(CONFIG_SND_SOC_HDAC_HDA) 873 + #if IS_ENABLED(CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC) 890 874 ext_ops = snd_soc_hdac_hda_get_ops(); 891 875 #endif 892 876 snd_hdac_ext_bus_init(bus, &pci->dev, &bus_core_ops, io_ops, ext_ops);
+29 -38
sound/soc/omap/omap-abe-twl6040.c
··· 36 36 #include "../codecs/twl6040.h" 37 37 38 38 struct abe_twl6040 { 39 + struct snd_soc_card card; 40 + struct snd_soc_dai_link dai_links[2]; 39 41 int jack_detection; /* board can detect jack events */ 40 42 int mclk_freq; /* MCLK frequency speed for twl6040 */ 41 43 }; ··· 210 208 ARRAY_SIZE(dmic_audio_map)); 211 209 } 212 210 213 - /* Digital audio interface glue - connects codec <--> CPU */ 214 - static struct snd_soc_dai_link abe_twl6040_dai_links[] = { 215 - { 216 - .name = "TWL6040", 217 - .stream_name = "TWL6040", 218 - .codec_dai_name = "twl6040-legacy", 219 - .codec_name = "twl6040-codec", 220 - .init = omap_abe_twl6040_init, 221 - .ops = &omap_abe_ops, 222 - }, 223 - { 224 - .name = "DMIC", 225 - .stream_name = "DMIC Capture", 226 - .codec_dai_name = "dmic-hifi", 227 - .codec_name = "dmic-codec", 228 - .init = omap_abe_dmic_init, 229 - .ops = &omap_abe_dmic_ops, 230 - }, 231 - }; 232 - 233 - /* Audio machine driver */ 234 - static struct snd_soc_card omap_abe_card = { 235 - .owner = THIS_MODULE, 236 - 237 - .dapm_widgets = twl6040_dapm_widgets, 238 - .num_dapm_widgets = ARRAY_SIZE(twl6040_dapm_widgets), 239 - .dapm_routes = audio_map, 240 - .num_dapm_routes = ARRAY_SIZE(audio_map), 241 - }; 242 - 243 211 static int omap_abe_probe(struct platform_device *pdev) 244 212 { 245 213 struct device_node *node = pdev->dev.of_node; 246 - struct snd_soc_card *card = &omap_abe_card; 214 + struct snd_soc_card *card; 247 215 struct device_node *dai_node; 248 216 struct abe_twl6040 *priv; 249 217 int num_links = 0; ··· 224 252 return -ENODEV; 225 253 } 226 254 227 - card->dev = &pdev->dev; 228 - 229 255 priv = devm_kzalloc(&pdev->dev, sizeof(struct abe_twl6040), GFP_KERNEL); 230 256 if (priv == NULL) 231 257 return -ENOMEM; 258 + 259 + card = &priv->card; 260 + card->dev = &pdev->dev; 261 + card->owner = THIS_MODULE; 262 + card->dapm_widgets = twl6040_dapm_widgets; 263 + card->num_dapm_widgets = ARRAY_SIZE(twl6040_dapm_widgets); 264 + card->dapm_routes = audio_map; 265 + card->num_dapm_routes = ARRAY_SIZE(audio_map); 232 266 233 267 if (snd_soc_of_parse_card_name(card, "ti,model")) { 234 268 dev_err(&pdev->dev, "Card name is not provided\n"); ··· 252 274 dev_err(&pdev->dev, "McPDM node is not provided\n"); 253 275 return -EINVAL; 254 276 } 255 - abe_twl6040_dai_links[0].cpu_of_node = dai_node; 256 - abe_twl6040_dai_links[0].platform_of_node = dai_node; 277 + 278 + priv->dai_links[0].name = "DMIC"; 279 + priv->dai_links[0].stream_name = "TWL6040"; 280 + priv->dai_links[0].cpu_of_node = dai_node; 281 + priv->dai_links[0].platform_of_node = dai_node; 282 + priv->dai_links[0].codec_dai_name = "twl6040-legacy"; 283 + priv->dai_links[0].codec_name = "twl6040-codec"; 284 + priv->dai_links[0].init = omap_abe_twl6040_init; 285 + priv->dai_links[0].ops = &omap_abe_ops; 257 286 258 287 dai_node = of_parse_phandle(node, "ti,dmic", 0); 259 288 if (dai_node) { 260 289 num_links = 2; 261 - abe_twl6040_dai_links[1].cpu_of_node = dai_node; 262 - abe_twl6040_dai_links[1].platform_of_node = dai_node; 290 + priv->dai_links[1].name = "TWL6040"; 291 + priv->dai_links[1].stream_name = "DMIC Capture"; 292 + priv->dai_links[1].cpu_of_node = dai_node; 293 + priv->dai_links[1].platform_of_node = dai_node; 294 + priv->dai_links[1].codec_dai_name = "dmic-hifi"; 295 + priv->dai_links[1].codec_name = "dmic-codec"; 296 + priv->dai_links[1].init = omap_abe_dmic_init; 297 + priv->dai_links[1].ops = &omap_abe_dmic_ops; 263 298 } else { 264 299 num_links = 1; 265 300 } ··· 291 300 return -ENODEV; 292 301 } 293 302 294 - card->dai_link = abe_twl6040_dai_links; 303 + card->dai_link = priv->dai_links; 295 304 card->num_links = num_links; 296 305 297 306 snd_soc_card_set_drvdata(card, priv);
+9
sound/soc/omap/omap-dmic.c
··· 48 48 struct device *dev; 49 49 void __iomem *io_base; 50 50 struct clk *fclk; 51 + struct pm_qos_request pm_qos_req; 52 + int latency; 51 53 int fclk_freq; 52 54 int out_freq; 53 55 int clk_div; ··· 125 123 struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai); 126 124 127 125 mutex_lock(&dmic->mutex); 126 + 127 + pm_qos_remove_request(&dmic->pm_qos_req); 128 128 129 129 if (!dai->active) 130 130 dmic->active = 0; ··· 232 228 /* packet size is threshold * channels */ 233 229 dma_data = snd_soc_dai_get_dma_data(dai, substream); 234 230 dma_data->maxburst = dmic->threshold * channels; 231 + dmic->latency = (OMAP_DMIC_THRES_MAX - dmic->threshold) * USEC_PER_SEC / 232 + params_rate(params); 235 233 236 234 return 0; 237 235 } ··· 243 237 { 244 238 struct omap_dmic *dmic = snd_soc_dai_get_drvdata(dai); 245 239 u32 ctrl; 240 + 241 + if (pm_qos_request_active(&dmic->pm_qos_req)) 242 + pm_qos_update_request(&dmic->pm_qos_req, dmic->latency); 246 243 247 244 /* Configure uplink threshold */ 248 245 omap_dmic_write(dmic, OMAP_DMIC_FIFO_CTRL_REG, dmic->threshold);
+3 -3
sound/soc/omap/omap-mcbsp.c
··· 308 308 pkt_size = channels; 309 309 } 310 310 311 - latency = ((((buffer_size - pkt_size) / channels) * 1000) 312 - / (params->rate_num / params->rate_den)); 313 - 311 + latency = (buffer_size - pkt_size) / channels; 312 + latency = latency * USEC_PER_SEC / 313 + (params->rate_num / params->rate_den); 314 314 mcbsp->latency[substream->stream] = latency; 315 315 316 316 omap_mcbsp_set_threshold(substream, pkt_size);
+42 -1
sound/soc/omap/omap-mcpdm.c
··· 54 54 unsigned long phys_base; 55 55 void __iomem *io_base; 56 56 int irq; 57 + struct pm_qos_request pm_qos_req; 58 + int latency[2]; 57 59 58 60 struct mutex mutex; 59 61 ··· 279 277 struct snd_soc_dai *dai) 280 278 { 281 279 struct omap_mcpdm *mcpdm = snd_soc_dai_get_drvdata(dai); 280 + int tx = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); 281 + int stream1 = tx ? SNDRV_PCM_STREAM_PLAYBACK : SNDRV_PCM_STREAM_CAPTURE; 282 + int stream2 = tx ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; 282 283 283 284 mutex_lock(&mcpdm->mutex); 284 285 ··· 294 289 } 295 290 } 296 291 292 + if (mcpdm->latency[stream2]) 293 + pm_qos_update_request(&mcpdm->pm_qos_req, 294 + mcpdm->latency[stream2]); 295 + else if (mcpdm->latency[stream1]) 296 + pm_qos_remove_request(&mcpdm->pm_qos_req); 297 + 298 + mcpdm->latency[stream1] = 0; 299 + 297 300 mutex_unlock(&mcpdm->mutex); 298 301 } 299 302 ··· 313 300 int stream = substream->stream; 314 301 struct snd_dmaengine_dai_dma_data *dma_data; 315 302 u32 threshold; 316 - int channels; 303 + int channels, latency; 317 304 int link_mask = 0; 318 305 319 306 channels = params_channels(params); ··· 357 344 358 345 dma_data->maxburst = 359 346 (MCPDM_DN_THRES_MAX - threshold) * channels; 347 + latency = threshold; 360 348 } else { 361 349 /* If playback is not running assume a stereo stream to come */ 362 350 if (!mcpdm->config[!stream].link_mask) 363 351 mcpdm->config[!stream].link_mask = (0x3 << 3); 364 352 365 353 dma_data->maxburst = threshold * channels; 354 + latency = (MCPDM_DN_THRES_MAX - threshold); 366 355 } 356 + 357 + /* 358 + * The DMA must act to a DMA request within latency time (usec) to avoid 359 + * under/overflow 360 + */ 361 + mcpdm->latency[stream] = latency * USEC_PER_SEC / params_rate(params); 362 + 363 + if (!mcpdm->latency[stream]) 364 + mcpdm->latency[stream] = 10; 367 365 368 366 /* Check if we need to restart McPDM with this stream */ 369 367 if (mcpdm->config[stream].link_mask && ··· 390 366 struct snd_soc_dai *dai) 391 367 { 392 368 struct omap_mcpdm *mcpdm = snd_soc_dai_get_drvdata(dai); 369 + struct pm_qos_request *pm_qos_req = &mcpdm->pm_qos_req; 370 + int tx = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); 371 + int stream1 = tx ? SNDRV_PCM_STREAM_PLAYBACK : SNDRV_PCM_STREAM_CAPTURE; 372 + int stream2 = tx ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; 373 + int latency = mcpdm->latency[stream2]; 374 + 375 + /* Prevent omap hardware from hitting off between FIFO fills */ 376 + if (!latency || mcpdm->latency[stream1] < latency) 377 + latency = mcpdm->latency[stream1]; 378 + 379 + if (pm_qos_request_active(pm_qos_req)) 380 + pm_qos_update_request(pm_qos_req, latency); 381 + else if (latency) 382 + pm_qos_add_request(pm_qos_req, PM_QOS_CPU_DMA_LATENCY, latency); 393 383 394 384 if (!omap_mcpdm_active(mcpdm)) { 395 385 omap_mcpdm_start(mcpdm); ··· 464 426 465 427 free_irq(mcpdm->irq, (void *)mcpdm); 466 428 pm_runtime_disable(mcpdm->dev); 429 + 430 + if (pm_qos_request_active(&mcpdm->pm_qos_req)) 431 + pm_qos_remove_request(&mcpdm->pm_qos_req); 467 432 468 433 return 0; 469 434 }
+6 -3
sound/soc/qcom/common.c
··· 13 13 struct device_node *cpu = NULL; 14 14 struct device *dev = card->dev; 15 15 struct snd_soc_dai_link *link; 16 + struct of_phandle_args args; 16 17 int ret, num_links; 17 18 18 19 ret = snd_soc_of_parse_card_name(card, "model"); ··· 48 47 goto err; 49 48 } 50 49 51 - link->cpu_of_node = of_parse_phandle(cpu, "sound-dai", 0); 52 - if (!link->cpu_of_node) { 50 + ret = of_parse_phandle_with_args(cpu, "sound-dai", 51 + "#sound-dai-cells", 0, &args); 52 + if (ret) { 53 53 dev_err(card->dev, "error getting cpu phandle\n"); 54 - ret = -EINVAL; 55 54 goto err; 56 55 } 56 + link->cpu_of_node = args.np; 57 + link->id = args.args[0]; 57 58 58 59 ret = snd_soc_of_get_dai_name(cpu, &link->cpu_dai_name); 59 60 if (ret) {
+138 -138
sound/soc/qcom/qdsp6/q6afe-dai.c
··· 1112 1112 } 1113 1113 1114 1114 static const struct snd_soc_dapm_widget q6afe_dai_widgets[] = { 1115 - SND_SOC_DAPM_AIF_OUT("HDMI_RX", "HDMI Playback", 0, 0, 0, 0), 1116 - SND_SOC_DAPM_AIF_OUT("SLIMBUS_0_RX", "Slimbus Playback", 0, 0, 0, 0), 1117 - SND_SOC_DAPM_AIF_OUT("SLIMBUS_1_RX", "Slimbus1 Playback", 0, 0, 0, 0), 1118 - SND_SOC_DAPM_AIF_OUT("SLIMBUS_2_RX", "Slimbus2 Playback", 0, 0, 0, 0), 1119 - SND_SOC_DAPM_AIF_OUT("SLIMBUS_3_RX", "Slimbus3 Playback", 0, 0, 0, 0), 1120 - SND_SOC_DAPM_AIF_OUT("SLIMBUS_4_RX", "Slimbus4 Playback", 0, 0, 0, 0), 1121 - SND_SOC_DAPM_AIF_OUT("SLIMBUS_5_RX", "Slimbus5 Playback", 0, 0, 0, 0), 1122 - SND_SOC_DAPM_AIF_OUT("SLIMBUS_6_RX", "Slimbus6 Playback", 0, 0, 0, 0), 1123 - SND_SOC_DAPM_AIF_IN("SLIMBUS_0_TX", "Slimbus Capture", 0, 0, 0, 0), 1124 - SND_SOC_DAPM_AIF_IN("SLIMBUS_1_TX", "Slimbus1 Capture", 0, 0, 0, 0), 1125 - SND_SOC_DAPM_AIF_IN("SLIMBUS_2_TX", "Slimbus2 Capture", 0, 0, 0, 0), 1126 - SND_SOC_DAPM_AIF_IN("SLIMBUS_3_TX", "Slimbus3 Capture", 0, 0, 0, 0), 1127 - SND_SOC_DAPM_AIF_IN("SLIMBUS_4_TX", "Slimbus4 Capture", 0, 0, 0, 0), 1128 - SND_SOC_DAPM_AIF_IN("SLIMBUS_5_TX", "Slimbus5 Capture", 0, 0, 0, 0), 1129 - SND_SOC_DAPM_AIF_IN("SLIMBUS_6_TX", "Slimbus6 Capture", 0, 0, 0, 0), 1130 - SND_SOC_DAPM_AIF_OUT("QUAT_MI2S_RX", "Quaternary MI2S Playback", 1115 + SND_SOC_DAPM_AIF_IN("HDMI_RX", NULL, 0, 0, 0, 0), 1116 + SND_SOC_DAPM_AIF_IN("SLIMBUS_0_RX", NULL, 0, 0, 0, 0), 1117 + SND_SOC_DAPM_AIF_IN("SLIMBUS_1_RX", NULL, 0, 0, 0, 0), 1118 + SND_SOC_DAPM_AIF_IN("SLIMBUS_2_RX", NULL, 0, 0, 0, 0), 1119 + SND_SOC_DAPM_AIF_IN("SLIMBUS_3_RX", NULL, 0, 0, 0, 0), 1120 + SND_SOC_DAPM_AIF_IN("SLIMBUS_4_RX", NULL, 0, 0, 0, 0), 1121 + SND_SOC_DAPM_AIF_IN("SLIMBUS_5_RX", NULL, 0, 0, 0, 0), 1122 + SND_SOC_DAPM_AIF_IN("SLIMBUS_6_RX", NULL, 0, 0, 0, 0), 1123 + SND_SOC_DAPM_AIF_OUT("SLIMBUS_0_TX", NULL, 0, 0, 0, 0), 1124 + SND_SOC_DAPM_AIF_OUT("SLIMBUS_1_TX", NULL, 0, 0, 0, 0), 1125 + SND_SOC_DAPM_AIF_OUT("SLIMBUS_2_TX", NULL, 0, 0, 0, 0), 1126 + SND_SOC_DAPM_AIF_OUT("SLIMBUS_3_TX", NULL, 0, 0, 0, 0), 1127 + SND_SOC_DAPM_AIF_OUT("SLIMBUS_4_TX", NULL, 0, 0, 0, 0), 1128 + SND_SOC_DAPM_AIF_OUT("SLIMBUS_5_TX", NULL, 0, 0, 0, 0), 1129 + SND_SOC_DAPM_AIF_OUT("SLIMBUS_6_TX", NULL, 0, 0, 0, 0), 1130 + SND_SOC_DAPM_AIF_IN("QUAT_MI2S_RX", NULL, 1131 1131 0, 0, 0, 0), 1132 - SND_SOC_DAPM_AIF_IN("QUAT_MI2S_TX", "Quaternary MI2S Capture", 1132 + SND_SOC_DAPM_AIF_OUT("QUAT_MI2S_TX", NULL, 1133 1133 0, 0, 0, 0), 1134 - SND_SOC_DAPM_AIF_OUT("TERT_MI2S_RX", "Tertiary MI2S Playback", 1134 + SND_SOC_DAPM_AIF_IN("TERT_MI2S_RX", NULL, 1135 1135 0, 0, 0, 0), 1136 - SND_SOC_DAPM_AIF_IN("TERT_MI2S_TX", "Tertiary MI2S Capture", 1136 + SND_SOC_DAPM_AIF_OUT("TERT_MI2S_TX", NULL, 1137 1137 0, 0, 0, 0), 1138 - SND_SOC_DAPM_AIF_OUT("SEC_MI2S_RX", "Secondary MI2S Playback", 1138 + SND_SOC_DAPM_AIF_IN("SEC_MI2S_RX", NULL, 1139 1139 0, 0, 0, 0), 1140 - SND_SOC_DAPM_AIF_IN("SEC_MI2S_TX", "Secondary MI2S Capture", 1140 + SND_SOC_DAPM_AIF_OUT("SEC_MI2S_TX", NULL, 1141 1141 0, 0, 0, 0), 1142 - SND_SOC_DAPM_AIF_OUT("SEC_MI2S_RX_SD1", 1142 + SND_SOC_DAPM_AIF_IN("SEC_MI2S_RX_SD1", 1143 1143 "Secondary MI2S Playback SD1", 1144 1144 0, 0, 0, 0), 1145 - SND_SOC_DAPM_AIF_OUT("PRI_MI2S_RX", "Primary MI2S Playback", 1145 + SND_SOC_DAPM_AIF_IN("PRI_MI2S_RX", NULL, 1146 1146 0, 0, 0, 0), 1147 - SND_SOC_DAPM_AIF_IN("PRI_MI2S_TX", "Primary MI2S Capture", 1147 + SND_SOC_DAPM_AIF_OUT("PRI_MI2S_TX", NULL, 1148 1148 0, 0, 0, 0), 1149 1149 1150 - SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_RX_0", "Primary TDM0 Playback", 1150 + SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_0", NULL, 1151 1151 0, 0, 0, 0), 1152 - SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_RX_1", "Primary TDM1 Playback", 1152 + SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_1", NULL, 1153 1153 0, 0, 0, 0), 1154 - SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_RX_2", "Primary TDM2 Playback", 1154 + SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_2", NULL, 1155 1155 0, 0, 0, 0), 1156 - SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_RX_3", "Primary TDM3 Playback", 1156 + SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_3", NULL, 1157 1157 0, 0, 0, 0), 1158 - SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_RX_4", "Primary TDM4 Playback", 1158 + SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_4", NULL, 1159 1159 0, 0, 0, 0), 1160 - SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_RX_5", "Primary TDM5 Playback", 1160 + SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_5", NULL, 1161 1161 0, 0, 0, 0), 1162 - SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_RX_6", "Primary TDM6 Playback", 1162 + SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_6", NULL, 1163 1163 0, 0, 0, 0), 1164 - SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_RX_7", "Primary TDM7 Playback", 1164 + SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_7", NULL, 1165 1165 0, 0, 0, 0), 1166 - SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_TX_0", "Primary TDM0 Capture", 1166 + SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_0", NULL, 1167 1167 0, 0, 0, 0), 1168 - SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_TX_1", "Primary TDM1 Capture", 1168 + SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_1", NULL, 1169 1169 0, 0, 0, 0), 1170 - SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_TX_2", "Primary TDM2 Capture", 1170 + SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_2", NULL, 1171 1171 0, 0, 0, 0), 1172 - SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_TX_3", "Primary TDM3 Capture", 1172 + SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_3", NULL, 1173 1173 0, 0, 0, 0), 1174 - SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_TX_4", "Primary TDM4 Capture", 1174 + SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_4", NULL, 1175 1175 0, 0, 0, 0), 1176 - SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_TX_5", "Primary TDM5 Capture", 1176 + SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_5", NULL, 1177 1177 0, 0, 0, 0), 1178 - SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_TX_6", "Primary TDM6 Capture", 1178 + SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_6", NULL, 1179 1179 0, 0, 0, 0), 1180 - SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_TX_7", "Primary TDM7 Capture", 1181 - 0, 0, 0, 0), 1182 - 1183 - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_0", "Secondary TDM0 Playback", 1184 - 0, 0, 0, 0), 1185 - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_1", "Secondary TDM1 Playback", 1186 - 0, 0, 0, 0), 1187 - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_2", "Secondary TDM2 Playback", 1188 - 0, 0, 0, 0), 1189 - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_3", "Secondary TDM3 Playback", 1190 - 0, 0, 0, 0), 1191 - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_4", "Secondary TDM4 Playback", 1192 - 0, 0, 0, 0), 1193 - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_5", "Secondary TDM5 Playback", 1194 - 0, 0, 0, 0), 1195 - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_6", "Secondary TDM6 Playback", 1196 - 0, 0, 0, 0), 1197 - SND_SOC_DAPM_AIF_OUT("SEC_TDM_RX_7", "Secondary TDM7 Playback", 1198 - 0, 0, 0, 0), 1199 - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_0", "Secondary TDM0 Capture", 1200 - 0, 0, 0, 0), 1201 - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_1", "Secondary TDM1 Capture", 1202 - 0, 0, 0, 0), 1203 - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_2", "Secondary TDM2 Capture", 1204 - 0, 0, 0, 0), 1205 - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_3", "Secondary TDM3 Capture", 1206 - 0, 0, 0, 0), 1207 - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_4", "Secondary TDM4 Capture", 1208 - 0, 0, 0, 0), 1209 - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_5", "Secondary TDM5 Capture", 1210 - 0, 0, 0, 0), 1211 - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_6", "Secondary TDM6 Capture", 1212 - 0, 0, 0, 0), 1213 - SND_SOC_DAPM_AIF_IN("SEC_TDM_TX_7", "Secondary TDM7 Capture", 1180 + SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_7", NULL, 1214 1181 0, 0, 0, 0), 1215 1182 1216 - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_0", "Tertiary TDM0 Playback", 1183 + SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_0", NULL, 1217 1184 0, 0, 0, 0), 1218 - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_1", "Tertiary TDM1 Playback", 1185 + SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_1", NULL, 1219 1186 0, 0, 0, 0), 1220 - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_2", "Tertiary TDM2 Playback", 1187 + SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_2", NULL, 1221 1188 0, 0, 0, 0), 1222 - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_3", "Tertiary TDM3 Playback", 1189 + SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_3", NULL, 1223 1190 0, 0, 0, 0), 1224 - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_4", "Tertiary TDM4 Playback", 1191 + SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_4", NULL, 1225 1192 0, 0, 0, 0), 1226 - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_5", "Tertiary TDM5 Playback", 1193 + SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_5", NULL, 1227 1194 0, 0, 0, 0), 1228 - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_6", "Tertiary TDM6 Playback", 1195 + SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_6", NULL, 1229 1196 0, 0, 0, 0), 1230 - SND_SOC_DAPM_AIF_OUT("TERT_TDM_RX_7", "Tertiary TDM7 Playback", 1197 + SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_7", NULL, 1231 1198 0, 0, 0, 0), 1232 - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_0", "Tertiary TDM0 Capture", 1199 + SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_0", NULL, 1233 1200 0, 0, 0, 0), 1234 - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_1", "Tertiary TDM1 Capture", 1201 + SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_1", NULL, 1235 1202 0, 0, 0, 0), 1236 - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_2", "Tertiary TDM2 Capture", 1203 + SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_2", NULL, 1237 1204 0, 0, 0, 0), 1238 - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_3", "Tertiary TDM3 Capture", 1205 + SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_3", NULL, 1239 1206 0, 0, 0, 0), 1240 - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_4", "Tertiary TDM4 Capture", 1207 + SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_4", NULL, 1241 1208 0, 0, 0, 0), 1242 - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_5", "Tertiary TDM5 Capture", 1209 + SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_5", NULL, 1243 1210 0, 0, 0, 0), 1244 - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_6", "Tertiary TDM6 Capture", 1211 + SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_6", NULL, 1245 1212 0, 0, 0, 0), 1246 - SND_SOC_DAPM_AIF_IN("TERT_TDM_TX_7", "Tertiary TDM7 Capture", 1247 - 0, 0, 0, 0), 1248 - 1249 - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_0", "Quaternary TDM0 Playback", 1250 - 0, 0, 0, 0), 1251 - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_1", "Quaternary TDM1 Playback", 1252 - 0, 0, 0, 0), 1253 - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_2", "Quaternary TDM2 Playback", 1254 - 0, 0, 0, 0), 1255 - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_3", "Quaternary TDM3 Playback", 1256 - 0, 0, 0, 0), 1257 - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_4", "Quaternary TDM4 Playback", 1258 - 0, 0, 0, 0), 1259 - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_5", "Quaternary TDM5 Playback", 1260 - 0, 0, 0, 0), 1261 - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_6", "Quaternary TDM6 Playback", 1262 - 0, 0, 0, 0), 1263 - SND_SOC_DAPM_AIF_OUT("QUAT_TDM_RX_7", "Quaternary TDM7 Playback", 1264 - 0, 0, 0, 0), 1265 - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_0", "Quaternary TDM0 Capture", 1266 - 0, 0, 0, 0), 1267 - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_1", "Quaternary TDM1 Capture", 1268 - 0, 0, 0, 0), 1269 - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_2", "Quaternary TDM2 Capture", 1270 - 0, 0, 0, 0), 1271 - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_3", "Quaternary TDM3 Capture", 1272 - 0, 0, 0, 0), 1273 - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_4", "Quaternary TDM4 Capture", 1274 - 0, 0, 0, 0), 1275 - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_5", "Quaternary TDM5 Capture", 1276 - 0, 0, 0, 0), 1277 - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_6", "Quaternary TDM6 Capture", 1278 - 0, 0, 0, 0), 1279 - SND_SOC_DAPM_AIF_IN("QUAT_TDM_TX_7", "Quaternary TDM7 Capture", 1213 + SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_7", NULL, 1280 1214 0, 0, 0, 0), 1281 1215 1282 - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_0", "Quinary TDM0 Playback", 1216 + SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_0", NULL, 1283 1217 0, 0, 0, 0), 1284 - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_1", "Quinary TDM1 Playback", 1218 + SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_1", NULL, 1285 1219 0, 0, 0, 0), 1286 - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_2", "Quinary TDM2 Playback", 1220 + SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_2", NULL, 1287 1221 0, 0, 0, 0), 1288 - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_3", "Quinary TDM3 Playback", 1222 + SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_3", NULL, 1289 1223 0, 0, 0, 0), 1290 - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_4", "Quinary TDM4 Playback", 1224 + SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_4", NULL, 1291 1225 0, 0, 0, 0), 1292 - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_5", "Quinary TDM5 Playback", 1226 + SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_5", NULL, 1293 1227 0, 0, 0, 0), 1294 - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_6", "Quinary TDM6 Playback", 1228 + SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_6", NULL, 1295 1229 0, 0, 0, 0), 1296 - SND_SOC_DAPM_AIF_OUT("QUIN_TDM_RX_7", "Quinary TDM7 Playback", 1230 + SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_7", NULL, 1297 1231 0, 0, 0, 0), 1298 - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_0", "Quinary TDM0 Capture", 1232 + SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_0", NULL, 1299 1233 0, 0, 0, 0), 1300 - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_1", "Quinary TDM1 Capture", 1234 + SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_1", NULL, 1301 1235 0, 0, 0, 0), 1302 - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_2", "Quinary TDM2 Capture", 1236 + SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_2", NULL, 1303 1237 0, 0, 0, 0), 1304 - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_3", "Quinary TDM3 Capture", 1238 + SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_3", NULL, 1305 1239 0, 0, 0, 0), 1306 - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_4", "Quinary TDM4 Capture", 1240 + SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_4", NULL, 1307 1241 0, 0, 0, 0), 1308 - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_5", "Quinary TDM5 Capture", 1242 + SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_5", NULL, 1309 1243 0, 0, 0, 0), 1310 - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_6", "Quinary TDM6 Capture", 1244 + SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_6", NULL, 1311 1245 0, 0, 0, 0), 1312 - SND_SOC_DAPM_AIF_IN("QUIN_TDM_TX_7", "Quinary TDM7 Capture", 1246 + SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_7", NULL, 1247 + 0, 0, 0, 0), 1248 + 1249 + SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_0", NULL, 1250 + 0, 0, 0, 0), 1251 + SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_1", NULL, 1252 + 0, 0, 0, 0), 1253 + SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_2", NULL, 1254 + 0, 0, 0, 0), 1255 + SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_3", NULL, 1256 + 0, 0, 0, 0), 1257 + SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_4", NULL, 1258 + 0, 0, 0, 0), 1259 + SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_5", NULL, 1260 + 0, 0, 0, 0), 1261 + SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_6", NULL, 1262 + 0, 0, 0, 0), 1263 + SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_7", NULL, 1264 + 0, 0, 0, 0), 1265 + SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_0", NULL, 1266 + 0, 0, 0, 0), 1267 + SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_1", NULL, 1268 + 0, 0, 0, 0), 1269 + SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_2", NULL, 1270 + 0, 0, 0, 0), 1271 + SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_3", NULL, 1272 + 0, 0, 0, 0), 1273 + SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_4", NULL, 1274 + 0, 0, 0, 0), 1275 + SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_5", NULL, 1276 + 0, 0, 0, 0), 1277 + SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_6", NULL, 1278 + 0, 0, 0, 0), 1279 + SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_7", NULL, 1280 + 0, 0, 0, 0), 1281 + 1282 + SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_0", NULL, 1283 + 0, 0, 0, 0), 1284 + SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_1", NULL, 1285 + 0, 0, 0, 0), 1286 + SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_2", NULL, 1287 + 0, 0, 0, 0), 1288 + SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_3", NULL, 1289 + 0, 0, 0, 0), 1290 + SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_4", NULL, 1291 + 0, 0, 0, 0), 1292 + SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_5", NULL, 1293 + 0, 0, 0, 0), 1294 + SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_6", NULL, 1295 + 0, 0, 0, 0), 1296 + SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_7", NULL, 1297 + 0, 0, 0, 0), 1298 + SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_0", NULL, 1299 + 0, 0, 0, 0), 1300 + SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_1", NULL, 1301 + 0, 0, 0, 0), 1302 + SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_2", NULL, 1303 + 0, 0, 0, 0), 1304 + SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_3", NULL, 1305 + 0, 0, 0, 0), 1306 + SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_4", NULL, 1307 + 0, 0, 0, 0), 1308 + SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_5", NULL, 1309 + 0, 0, 0, 0), 1310 + SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_6", NULL, 1311 + 0, 0, 0, 0), 1312 + SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_7", NULL, 1313 1313 0, 0, 0, 0), 1314 1314 }; 1315 1315
+8 -8
sound/soc/qcom/qdsp6/q6afe.c
··· 49 49 #define AFE_PORT_I2S_SD1 0x2 50 50 #define AFE_PORT_I2S_SD2 0x3 51 51 #define AFE_PORT_I2S_SD3 0x4 52 - #define AFE_PORT_I2S_SD0_MASK BIT(0x1) 53 - #define AFE_PORT_I2S_SD1_MASK BIT(0x2) 54 - #define AFE_PORT_I2S_SD2_MASK BIT(0x3) 55 - #define AFE_PORT_I2S_SD3_MASK BIT(0x4) 56 - #define AFE_PORT_I2S_SD0_1_MASK GENMASK(2, 1) 57 - #define AFE_PORT_I2S_SD2_3_MASK GENMASK(4, 3) 58 - #define AFE_PORT_I2S_SD0_1_2_MASK GENMASK(3, 1) 59 - #define AFE_PORT_I2S_SD0_1_2_3_MASK GENMASK(4, 1) 52 + #define AFE_PORT_I2S_SD0_MASK BIT(0x0) 53 + #define AFE_PORT_I2S_SD1_MASK BIT(0x1) 54 + #define AFE_PORT_I2S_SD2_MASK BIT(0x2) 55 + #define AFE_PORT_I2S_SD3_MASK BIT(0x3) 56 + #define AFE_PORT_I2S_SD0_1_MASK GENMASK(1, 0) 57 + #define AFE_PORT_I2S_SD2_3_MASK GENMASK(3, 2) 58 + #define AFE_PORT_I2S_SD0_1_2_MASK GENMASK(2, 0) 59 + #define AFE_PORT_I2S_SD0_1_2_3_MASK GENMASK(3, 0) 60 60 #define AFE_PORT_I2S_QUAD01 0x5 61 61 #define AFE_PORT_I2S_QUAD23 0x6 62 62 #define AFE_PORT_I2S_6CHS 0x7
-33
sound/soc/qcom/qdsp6/q6asm-dai.c
··· 122 122 .rate_max = 48000, \ 123 123 }, \ 124 124 .name = "MultiMedia"#num, \ 125 - .probe = fe_dai_probe, \ 126 125 .id = MSM_FRONTEND_DAI_MULTIMEDIA##num, \ 127 126 } 128 127 ··· 509 510 } 510 511 } 511 512 } 512 - 513 - static const struct snd_soc_dapm_route afe_pcm_routes[] = { 514 - {"MM_DL1", NULL, "MultiMedia1 Playback" }, 515 - {"MM_DL2", NULL, "MultiMedia2 Playback" }, 516 - {"MM_DL3", NULL, "MultiMedia3 Playback" }, 517 - {"MM_DL4", NULL, "MultiMedia4 Playback" }, 518 - {"MM_DL5", NULL, "MultiMedia5 Playback" }, 519 - {"MM_DL6", NULL, "MultiMedia6 Playback" }, 520 - {"MM_DL7", NULL, "MultiMedia7 Playback" }, 521 - {"MM_DL7", NULL, "MultiMedia8 Playback" }, 522 - {"MultiMedia1 Capture", NULL, "MM_UL1"}, 523 - {"MultiMedia2 Capture", NULL, "MM_UL2"}, 524 - {"MultiMedia3 Capture", NULL, "MM_UL3"}, 525 - {"MultiMedia4 Capture", NULL, "MM_UL4"}, 526 - {"MultiMedia5 Capture", NULL, "MM_UL5"}, 527 - {"MultiMedia6 Capture", NULL, "MM_UL6"}, 528 - {"MultiMedia7 Capture", NULL, "MM_UL7"}, 529 - {"MultiMedia8 Capture", NULL, "MM_UL8"}, 530 - 531 - }; 532 - 533 - static int fe_dai_probe(struct snd_soc_dai *dai) 534 - { 535 - struct snd_soc_dapm_context *dapm; 536 - 537 - dapm = snd_soc_component_get_dapm(dai->component); 538 - snd_soc_dapm_add_routes(dapm, afe_pcm_routes, 539 - ARRAY_SIZE(afe_pcm_routes)); 540 - 541 - return 0; 542 - } 543 - 544 513 545 514 static const struct snd_soc_component_driver q6asm_fe_dai_component = { 546 515 .name = DRV_NAME,
+19
sound/soc/qcom/qdsp6/q6routing.c
··· 909 909 {"MM_UL6", NULL, "MultiMedia6 Mixer"}, 910 910 {"MM_UL7", NULL, "MultiMedia7 Mixer"}, 911 911 {"MM_UL8", NULL, "MultiMedia8 Mixer"}, 912 + 913 + {"MM_DL1", NULL, "MultiMedia1 Playback" }, 914 + {"MM_DL2", NULL, "MultiMedia2 Playback" }, 915 + {"MM_DL3", NULL, "MultiMedia3 Playback" }, 916 + {"MM_DL4", NULL, "MultiMedia4 Playback" }, 917 + {"MM_DL5", NULL, "MultiMedia5 Playback" }, 918 + {"MM_DL6", NULL, "MultiMedia6 Playback" }, 919 + {"MM_DL7", NULL, "MultiMedia7 Playback" }, 920 + {"MM_DL8", NULL, "MultiMedia8 Playback" }, 921 + 922 + {"MultiMedia1 Capture", NULL, "MM_UL1"}, 923 + {"MultiMedia2 Capture", NULL, "MM_UL2"}, 924 + {"MultiMedia3 Capture", NULL, "MM_UL3"}, 925 + {"MultiMedia4 Capture", NULL, "MM_UL4"}, 926 + {"MultiMedia5 Capture", NULL, "MM_UL5"}, 927 + {"MultiMedia6 Capture", NULL, "MM_UL6"}, 928 + {"MultiMedia7 Capture", NULL, "MM_UL7"}, 929 + {"MultiMedia8 Capture", NULL, "MM_UL8"}, 930 + 912 931 }; 913 932 914 933 static int routing_hw_params(struct snd_pcm_substream *substream,
+1
sound/soc/rockchip/rockchip_pcm.c
··· 33 33 34 34 static const struct snd_dmaengine_pcm_config rk_dmaengine_pcm_config = { 35 35 .pcm_hardware = &snd_rockchip_hardware, 36 + .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config, 36 37 .prealloc_buffer_size = 32 * 1024, 37 38 }; 38 39
+1 -1
sound/soc/sh/rcar/ssi.c
··· 306 306 if (rsnd_ssi_is_multi_slave(mod, io)) 307 307 return 0; 308 308 309 - if (ssi->rate) { 309 + if (ssi->usrcnt > 1) { 310 310 if (ssi->rate != rate) { 311 311 dev_err(dev, "SSI parent/child should use same rate\n"); 312 312 return -EINVAL;
+8 -2
sound/soc/soc-acpi.c
··· 10 10 snd_soc_acpi_find_machine(struct snd_soc_acpi_mach *machines) 11 11 { 12 12 struct snd_soc_acpi_mach *mach; 13 + struct snd_soc_acpi_mach *mach_alt; 13 14 14 15 for (mach = machines; mach->id[0]; mach++) { 15 16 if (acpi_dev_present(mach->id, NULL, -1)) { 16 - if (mach->machine_quirk) 17 - mach = mach->machine_quirk(mach); 17 + if (mach->machine_quirk) { 18 + mach_alt = mach->machine_quirk(mach); 19 + if (!mach_alt) 20 + continue; /* not full match, ignore */ 21 + mach = mach_alt; 22 + } 23 + 18 24 return mach; 19 25 } 20 26 }
+1
sound/soc/soc-core.c
··· 2131 2131 } 2132 2132 2133 2133 card->instantiated = 1; 2134 + dapm_mark_endpoints_dirty(card); 2134 2135 snd_soc_dapm_sync(&card->dapm); 2135 2136 mutex_unlock(&card->mutex); 2136 2137 mutex_unlock(&client_mutex);
+1 -1
sound/soc/stm/stm32_sai_sub.c
··· 390 390 char *mclk_name, *p, *s = (char *)pname; 391 391 int ret, i = 0; 392 392 393 - mclk = devm_kzalloc(dev, sizeof(mclk), GFP_KERNEL); 393 + mclk = devm_kzalloc(dev, sizeof(*mclk), GFP_KERNEL); 394 394 if (!mclk) 395 395 return -ENOMEM; 396 396
+1 -1
sound/soc/sunxi/Kconfig
··· 31 31 config SND_SUN50I_CODEC_ANALOG 32 32 tristate "Allwinner sun50i Codec Analog Controls Support" 33 33 depends on (ARM64 && ARCH_SUNXI) || COMPILE_TEST 34 - select SND_SUNXI_ADDA_PR_REGMAP 34 + select SND_SUN8I_ADDA_PR_REGMAP 35 35 help 36 36 Say Y or M if you want to add support for the analog controls for 37 37 the codec embedded in Allwinner A64 SoC.
+5 -7
sound/soc/sunxi/sun8i-codec.c
··· 481 481 { "Right Digital DAC Mixer", "AIF1 Slot 0 Digital DAC Playback Switch", 482 482 "AIF1 Slot 0 Right"}, 483 483 484 - /* ADC routes */ 484 + /* ADC Routes */ 485 + { "AIF1 Slot 0 Right ADC", NULL, "ADC" }, 486 + { "AIF1 Slot 0 Left ADC", NULL, "ADC" }, 487 + 488 + /* ADC Mixer Routes */ 485 489 { "Left Digital ADC Mixer", "AIF1 Data Digital ADC Capture Switch", 486 490 "AIF1 Slot 0 Left ADC" }, 487 491 { "Right Digital ADC Mixer", "AIF1 Data Digital ADC Capture Switch", ··· 609 605 610 606 static int sun8i_codec_remove(struct platform_device *pdev) 611 607 { 612 - struct snd_soc_card *card = platform_get_drvdata(pdev); 613 - struct sun8i_codec *scodec = snd_soc_card_get_drvdata(card); 614 - 615 608 pm_runtime_disable(&pdev->dev); 616 609 if (!pm_runtime_status_suspended(&pdev->dev)) 617 610 sun8i_codec_runtime_suspend(&pdev->dev); 618 - 619 - clk_disable_unprepare(scodec->clk_module); 620 - clk_disable_unprepare(scodec->clk_bus); 621 611 622 612 return 0; 623 613 }
+2 -6
sound/sparc/cs4231.c
··· 1146 1146 runtime->hw = snd_cs4231_playback; 1147 1147 1148 1148 err = snd_cs4231_open(chip, CS4231_MODE_PLAY); 1149 - if (err < 0) { 1150 - snd_free_pages(runtime->dma_area, runtime->dma_bytes); 1149 + if (err < 0) 1151 1150 return err; 1152 - } 1153 1151 chip->playback_substream = substream; 1154 1152 chip->p_periods_sent = 0; 1155 1153 snd_pcm_set_sync(substream); ··· 1165 1167 runtime->hw = snd_cs4231_capture; 1166 1168 1167 1169 err = snd_cs4231_open(chip, CS4231_MODE_RECORD); 1168 - if (err < 0) { 1169 - snd_free_pages(runtime->dma_area, runtime->dma_bytes); 1170 + if (err < 0) 1170 1171 return err; 1171 - } 1172 1172 chip->capture_substream = substream; 1173 1173 chip->c_periods_sent = 0; 1174 1174 snd_pcm_set_sync(substream);
+10
sound/usb/quirks-table.h
··· 3382 3382 .ifnum = QUIRK_NO_INTERFACE 3383 3383 } 3384 3384 }, 3385 + /* Dell WD19 Dock */ 3386 + { 3387 + USB_DEVICE(0x0bda, 0x402e), 3388 + .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { 3389 + .vendor_name = "Dell", 3390 + .product_name = "WD19 Dock", 3391 + .profile_name = "Dell-WD15-Dock", 3392 + .ifnum = QUIRK_NO_INTERFACE 3393 + } 3394 + }, 3385 3395 3386 3396 #undef USB_DEVICE_VENDOR_SPEC