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

Merge tag 'sound-fix-5.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull more sound updates from Takashi Iwai:
"A few last-minute updates, most of them are the regression fixes:

- AMD HD-audio HDMI runtime PM improvements

- Fixes for HD-audio HDMI regressions wrt DP-MST

- A regression fix for the previous aloop enhancement

- A fix for a long-time problem in PCM OSS layer that was spotted by
fuzzer now

- A few HD-audio quirks"

* tag 'sound-fix-5.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
ALSA: pcm: oss: Avoid potential buffer overflows
ALSA: hda: hdmi - Keep old slot assignment behavior for Intel platforms
ALSA: hda: Modify stream stripe mask only when needed
ALSA: hda - fixup for the bass speaker on Lenovo Carbon X1 7th gen
ALSA: hda: hdmi - preserve non-MST PCM routing for Intel platforms
ALSA: hda: hdmi - fix kernel oops caused by invalid PCM idx
ALSA: hda/realtek - Fix inverted bass GPIO pin on Acer 8951G
ALSA: hda/realtek - Dell headphone has noise on unmute for ALC236
ALSA: hda: hdmi - fix regression in connect list handling
ALSA: aloop: Avoid pointer dereference before null-check
ALSA: hda/hdmi - enable automatic runtime pm for AMD HDMI codecs by default
ALSA: hda/hdmi - enable runtime pm for newer AMD display audio
ALSA: hda/hdmi - Add new pci ids for AMD GPU display audio
ALSA: hda/hdmi - fix vgaswitcheroo detection for AMD

+153 -68
+1
include/sound/hdaudio.h
··· 493 493 bool prepared:1; 494 494 bool no_period_wakeup:1; 495 495 bool locked:1; 496 + bool stripe:1; /* apply stripe control */ 496 497 497 498 /* timestamp */ 498 499 unsigned long start_wallclk; /* start + minimum wallclk */
+2
sound/core/oss/linear.c
··· 107 107 } 108 108 } 109 109 #endif 110 + if (frames > dst_channels[0].frames) 111 + frames = dst_channels[0].frames; 110 112 convert(plugin, src_channels, dst_channels, frames); 111 113 return frames; 112 114 }
+2
sound/core/oss/mulaw.c
··· 269 269 } 270 270 } 271 271 #endif 272 + if (frames > dst_channels[0].frames) 273 + frames = dst_channels[0].frames; 272 274 data = (struct mulaw_priv *)plugin->extra_data; 273 275 data->func(plugin, src_channels, dst_channels, frames); 274 276 return frames;
+2
sound/core/oss/route.c
··· 57 57 return -ENXIO; 58 58 if (frames == 0) 59 59 return 0; 60 + if (frames > dst_channels[0].frames) 61 + frames = dst_channels[0].frames; 60 62 61 63 nsrcs = plugin->src_format.channels; 62 64 ndsts = plugin->dst_format.channels;
+4 -4
sound/drivers/aloop.c
··· 727 727 728 728 dpcm_play = cable->streams[SNDRV_PCM_STREAM_PLAYBACK]; 729 729 dpcm_capt = cable->streams[SNDRV_PCM_STREAM_CAPTURE]; 730 - substream_play = (running & (1 << SNDRV_PCM_STREAM_PLAYBACK)) ? 731 - dpcm_play->substream : NULL; 732 - substream_capt = (running & (1 << SNDRV_PCM_STREAM_CAPTURE)) ? 733 - dpcm_capt->substream : NULL; 734 730 735 731 if (event == SNDRV_TIMER_EVENT_MSTOP) { 736 732 if (!dpcm_play || ··· 737 741 } 738 742 } 739 743 744 + substream_play = (running & (1 << SNDRV_PCM_STREAM_PLAYBACK)) ? 745 + dpcm_play->substream : NULL; 746 + substream_capt = (running & (1 << SNDRV_PCM_STREAM_CAPTURE)) ? 747 + dpcm_capt->substream : NULL; 740 748 valid_runtime = (running & (1 << SNDRV_PCM_STREAM_PLAYBACK)) ? 741 749 dpcm_play->substream->runtime : 742 750 dpcm_capt->substream->runtime;
+12 -7
sound/hda/hdac_stream.c
··· 96 96 1 << azx_dev->index, 97 97 1 << azx_dev->index); 98 98 /* set stripe control */ 99 - if (azx_dev->substream) 100 - stripe_ctl = snd_hdac_get_stream_stripe_ctl(bus, azx_dev->substream); 101 - else 102 - stripe_ctl = 0; 103 - snd_hdac_stream_updateb(azx_dev, SD_CTL_3B, SD_CTL_STRIPE_MASK, 104 - stripe_ctl); 99 + if (azx_dev->stripe) { 100 + if (azx_dev->substream) 101 + stripe_ctl = snd_hdac_get_stream_stripe_ctl(bus, azx_dev->substream); 102 + else 103 + stripe_ctl = 0; 104 + snd_hdac_stream_updateb(azx_dev, SD_CTL_3B, SD_CTL_STRIPE_MASK, 105 + stripe_ctl); 106 + } 105 107 /* set DMA start and interrupt mask */ 106 108 snd_hdac_stream_updateb(azx_dev, SD_CTL, 107 109 0, SD_CTL_DMA_START | SD_INT_MASK); ··· 120 118 snd_hdac_stream_updateb(azx_dev, SD_CTL, 121 119 SD_CTL_DMA_START | SD_INT_MASK, 0); 122 120 snd_hdac_stream_writeb(azx_dev, SD_STS, SD_INT_MASK); /* to be sure */ 123 - snd_hdac_stream_updateb(azx_dev, SD_CTL_3B, SD_CTL_STRIPE_MASK, 0); 121 + if (azx_dev->stripe) { 122 + snd_hdac_stream_updateb(azx_dev, SD_CTL_3B, SD_CTL_STRIPE_MASK, 0); 123 + azx_dev->stripe = 0; 124 + } 124 125 azx_dev->running = false; 125 126 } 126 127 EXPORT_SYMBOL_GPL(snd_hdac_stream_clear);
+75 -5
sound/pci/hda/hda_intel.c
··· 35 35 #include <linux/clocksource.h> 36 36 #include <linux/time.h> 37 37 #include <linux/completion.h> 38 + #include <linux/acpi.h> 38 39 39 40 #ifdef CONFIG_X86 40 41 /* for snoop control */ ··· 1402 1401 } 1403 1402 1404 1403 #ifdef SUPPORT_VGA_SWITCHEROO 1404 + #ifdef CONFIG_ACPI 1405 + /* ATPX is in the integrated GPU's namespace */ 1406 + static bool atpx_present(void) 1407 + { 1408 + struct pci_dev *pdev = NULL; 1409 + acpi_handle dhandle, atpx_handle; 1410 + acpi_status status; 1411 + 1412 + while ((pdev = pci_get_class(PCI_BASE_CLASS_DISPLAY << 16, pdev)) != NULL) { 1413 + dhandle = ACPI_HANDLE(&pdev->dev); 1414 + if (dhandle) { 1415 + status = acpi_get_handle(dhandle, "ATPX", &atpx_handle); 1416 + if (!ACPI_FAILURE(status)) { 1417 + pci_dev_put(pdev); 1418 + return true; 1419 + } 1420 + } 1421 + pci_dev_put(pdev); 1422 + } 1423 + return false; 1424 + } 1425 + #else 1426 + static bool atpx_present(void) 1427 + { 1428 + return false; 1429 + } 1430 + #endif 1431 + 1405 1432 /* 1406 1433 * Check of disabled HDMI controller by vga_switcheroo 1407 1434 */ ··· 1441 1412 switch (pci->vendor) { 1442 1413 case PCI_VENDOR_ID_ATI: 1443 1414 case PCI_VENDOR_ID_AMD: 1415 + if (pci->devfn == 1) { 1416 + p = pci_get_domain_bus_and_slot(pci_domain_nr(pci->bus), 1417 + pci->bus->number, 0); 1418 + if (p) { 1419 + /* ATPX is in the integrated GPU's ACPI namespace 1420 + * rather than the dGPU's namespace. However, 1421 + * the dGPU is the one who is involved in 1422 + * vgaswitcheroo. 1423 + */ 1424 + if (((p->class >> 16) == PCI_BASE_CLASS_DISPLAY) && 1425 + atpx_present()) 1426 + return p; 1427 + pci_dev_put(p); 1428 + } 1429 + } 1430 + break; 1444 1431 case PCI_VENDOR_ID_NVIDIA: 1445 1432 if (pci->devfn == 1) { 1446 1433 p = pci_get_domain_bus_and_slot(pci_domain_nr(pci->bus), ··· 2592 2547 { PCI_DEVICE(0x1002, 0xaac8), 2593 2548 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, 2594 2549 { PCI_DEVICE(0x1002, 0xaad8), 2595 - .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, 2596 - { PCI_DEVICE(0x1002, 0xaae8), 2597 - .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, 2550 + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS | 2551 + AZX_DCAPS_PM_RUNTIME }, 2598 2552 { PCI_DEVICE(0x1002, 0xaae0), 2599 - .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, 2553 + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS | 2554 + AZX_DCAPS_PM_RUNTIME }, 2555 + { PCI_DEVICE(0x1002, 0xaae8), 2556 + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS | 2557 + AZX_DCAPS_PM_RUNTIME }, 2600 2558 { PCI_DEVICE(0x1002, 0xaaf0), 2601 - .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, 2559 + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS | 2560 + AZX_DCAPS_PM_RUNTIME }, 2561 + { PCI_DEVICE(0x1002, 0xaaf8), 2562 + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS | 2563 + AZX_DCAPS_PM_RUNTIME }, 2564 + { PCI_DEVICE(0x1002, 0xab00), 2565 + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS | 2566 + AZX_DCAPS_PM_RUNTIME }, 2567 + { PCI_DEVICE(0x1002, 0xab08), 2568 + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS | 2569 + AZX_DCAPS_PM_RUNTIME }, 2570 + { PCI_DEVICE(0x1002, 0xab10), 2571 + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS | 2572 + AZX_DCAPS_PM_RUNTIME }, 2573 + { PCI_DEVICE(0x1002, 0xab18), 2574 + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS | 2575 + AZX_DCAPS_PM_RUNTIME }, 2576 + { PCI_DEVICE(0x1002, 0xab20), 2577 + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS | 2578 + AZX_DCAPS_PM_RUNTIME }, 2579 + { PCI_DEVICE(0x1002, 0xab38), 2580 + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS | 2581 + AZX_DCAPS_PM_RUNTIME }, 2602 2582 /* VIA VT8251/VT8237A */ 2603 2583 { PCI_DEVICE(0x1106, 0x3288), .driver_data = AZX_DRIVER_VIA }, 2604 2584 /* VIA GFX VT7122/VX900 */
+30 -36
sound/pci/hda/patch_hdmi.c
··· 32 32 #include <sound/hda_codec.h> 33 33 #include "hda_local.h" 34 34 #include "hda_jack.h" 35 + #include "hda_controller.h" 35 36 36 37 static bool static_hdmi_pcm; 37 38 module_param(static_hdmi_pcm, bool, 0644); ··· 1250 1249 per_pin->cvt_nid = per_cvt->cvt_nid; 1251 1250 hinfo->nid = per_cvt->cvt_nid; 1252 1251 1252 + /* flip stripe flag for the assigned stream if supported */ 1253 + if (get_wcaps(codec, per_cvt->cvt_nid) & AC_WCAP_STRIPE) 1254 + azx_stream(get_azx_dev(substream))->stripe = 1; 1255 + 1253 1256 snd_hda_set_dev_select(codec, per_pin->pin_nid, per_pin->dev_id); 1254 1257 snd_hda_codec_write_cache(codec, per_pin->pin_nid, 0, 1255 1258 AC_VERB_SET_CONNECT_SEL, ··· 1307 1302 struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); 1308 1303 hda_nid_t pin_nid = per_pin->pin_nid; 1309 1304 int dev_id = per_pin->dev_id; 1305 + int conns; 1310 1306 1311 1307 if (!(get_wcaps(codec, pin_nid) & AC_WCAP_CONN_LIST)) { 1312 1308 codec_warn(codec, ··· 1318 1312 1319 1313 snd_hda_set_dev_select(codec, pin_nid, dev_id); 1320 1314 1315 + if (spec->intel_hsw_fixup) { 1316 + conns = spec->num_cvts; 1317 + memcpy(per_pin->mux_nids, spec->cvt_nids, 1318 + sizeof(hda_nid_t) * conns); 1319 + } else { 1320 + conns = snd_hda_get_raw_connections(codec, pin_nid, 1321 + per_pin->mux_nids, 1322 + HDA_MAX_CONNECTIONS); 1323 + } 1324 + 1321 1325 /* all the device entries on the same pin have the same conn list */ 1322 - per_pin->num_mux_nids = 1323 - snd_hda_get_raw_connections(codec, pin_nid, per_pin->mux_nids, 1324 - HDA_MAX_CONNECTIONS); 1326 + per_pin->num_mux_nids = conns; 1325 1327 1326 1328 return 0; 1327 1329 } ··· 1340 1326 int i; 1341 1327 1342 1328 /* 1343 - * generic_hdmi_build_pcms() allocates (num_nids + dev_num - 1) 1344 - * number of pcms. 1329 + * generic_hdmi_build_pcms() may allocate extra PCMs on some 1330 + * platforms (with maximum of 'num_nids + dev_num - 1') 1345 1331 * 1346 1332 * The per_pin of pin_nid_idx=n and dev_id=m prefers to get pcm-n 1347 1333 * if m==0. This guarantees that dynamic pcm assignments are compatible 1348 - * with the legacy static per_pin-pmc assignment that existed in the 1334 + * with the legacy static per_pin-pcm assignment that existed in the 1349 1335 * days before DP-MST. 1336 + * 1337 + * Intel DP-MST prefers this legacy behavior for compatibility, too. 1350 1338 * 1351 1339 * per_pin of m!=0 prefers to get pcm=(num_nids + (m - 1)). 1352 1340 */ 1353 - if (per_pin->dev_id == 0 && 1354 - !test_bit(per_pin->pin_nid_idx, &spec->pcm_bitmap)) 1355 - return per_pin->pin_nid_idx; 1356 1341 1357 - if (per_pin->dev_id != 0 && 1358 - !(test_bit(spec->num_nids + (per_pin->dev_id - 1), 1359 - &spec->pcm_bitmap))) { 1360 - return spec->num_nids + (per_pin->dev_id - 1); 1342 + if (per_pin->dev_id == 0 || spec->intel_hsw_fixup) { 1343 + if (!test_bit(per_pin->pin_nid_idx, &spec->pcm_bitmap)) 1344 + return per_pin->pin_nid_idx; 1345 + } else { 1346 + i = spec->num_nids + (per_pin->dev_id - 1); 1347 + if (i < spec->pcm_used && !(test_bit(i, &spec->pcm_bitmap))) 1348 + return i; 1361 1349 } 1362 1350 1363 1351 /* have a second try; check the area over num_nids */ ··· 1729 1713 mutex_unlock(&spec->pcm_lock); 1730 1714 } 1731 1715 1732 - static void intel_haswell_fixup_connect_list(struct hda_codec *codec, 1733 - hda_nid_t nid); 1734 - 1735 1716 static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid) 1736 1717 { 1737 1718 struct hdmi_spec *spec = codec->spec; ··· 1803 1790 per_pin->dev_id = i; 1804 1791 per_pin->non_pcm = false; 1805 1792 snd_hda_set_dev_select(codec, pin_nid, i); 1806 - if (spec->intel_hsw_fixup) 1807 - intel_haswell_fixup_connect_list(codec, pin_nid); 1808 1793 err = hdmi_read_pin_conn(codec, pin_idx); 1809 1794 if (err < 0) 1810 1795 return err; ··· 2613 2602 /* 2614 2603 * Intel codec parsers and helpers 2615 2604 */ 2616 - 2617 - static void intel_haswell_fixup_connect_list(struct hda_codec *codec, 2618 - hda_nid_t nid) 2619 - { 2620 - struct hdmi_spec *spec = codec->spec; 2621 - hda_nid_t conns[4]; 2622 - int nconns; 2623 - 2624 - nconns = snd_hda_get_raw_connections(codec, nid, conns, 2625 - ARRAY_SIZE(conns)); 2626 - if (nconns == spec->num_cvts && 2627 - !memcmp(conns, spec->cvt_nids, spec->num_cvts * sizeof(hda_nid_t))) 2628 - return; 2629 - 2630 - /* override pins connection list */ 2631 - codec_dbg(codec, "hdmi: haswell: override pin connection 0x%x\n", nid); 2632 - snd_hda_override_conn_list(codec, nid, spec->num_cvts, spec->cvt_nids); 2633 - } 2634 2605 2635 2606 #define INTEL_GET_VENDOR_VERB 0xf81 2636 2607 #define INTEL_SET_VENDOR_VERB 0x781 ··· 4056 4063 ATI_VERB_SET_MULTICHANNEL_MODE, 4057 4064 ATI_MULTICHANNEL_MODE_SINGLE); 4058 4065 } 4066 + codec->auto_runtime_pm = 1; 4059 4067 4060 4068 return 0; 4061 4069 }
+25 -16
sound/pci/hda/patch_realtek.c
··· 367 367 case 0x10ec0215: 368 368 case 0x10ec0233: 369 369 case 0x10ec0235: 370 - case 0x10ec0236: 371 370 case 0x10ec0255: 372 - case 0x10ec0256: 373 371 case 0x10ec0257: 374 372 case 0x10ec0282: 375 373 case 0x10ec0283: ··· 377 379 case 0x10ec0298: 378 380 case 0x10ec0289: 379 381 case 0x10ec0300: 382 + alc_update_coef_idx(codec, 0x10, 1<<9, 0); 383 + break; 384 + case 0x10ec0236: 385 + case 0x10ec0256: 386 + alc_write_coef_idx(codec, 0x36, 0x5757); 380 387 alc_update_coef_idx(codec, 0x10, 1<<9, 0); 381 388 break; 382 389 case 0x10ec0275: ··· 5547 5544 } 5548 5545 } 5549 5546 5547 + /* force NID 0x17 (Bass Speaker) to DAC1 to share it with the main speaker */ 5548 + static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec, 5549 + const struct hda_fixup *fix, int action) 5550 + { 5551 + if (action == HDA_FIXUP_ACT_PRE_PROBE) { 5552 + hda_nid_t conn[1] = { 0x02 }; 5553 + snd_hda_override_conn_list(codec, 0x17, 1, conn); 5554 + } 5555 + } 5556 + 5550 5557 /* Hook to update amp GPIO4 for automute */ 5551 5558 static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec, 5552 5559 struct hda_jack_callback *jack) ··· 5859 5846 ALC225_FIXUP_DISABLE_MIC_VREF, 5860 5847 ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, 5861 5848 ALC295_FIXUP_DISABLE_DAC3, 5849 + ALC285_FIXUP_SPEAKER2_TO_DAC1, 5862 5850 ALC280_FIXUP_HP_HEADSET_MIC, 5863 5851 ALC221_FIXUP_HP_FRONT_MIC, 5864 5852 ALC292_FIXUP_TPT460, ··· 6660 6646 .type = HDA_FIXUP_FUNC, 6661 6647 .v.func = alc295_fixup_disable_dac3, 6662 6648 }, 6649 + [ALC285_FIXUP_SPEAKER2_TO_DAC1] = { 6650 + .type = HDA_FIXUP_FUNC, 6651 + .v.func = alc285_fixup_speaker2_to_dac1, 6652 + }, 6663 6653 [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = { 6664 6654 .type = HDA_FIXUP_PINS, 6665 6655 .v.pins = (const struct hda_pintbl[]) { ··· 7239 7221 SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), 7240 7222 SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), 7241 7223 SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), 7224 + SND_PCI_QUIRK(0x17aa, 0x2293, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_SPEAKER2_TO_DAC1), 7242 7225 SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), 7243 7226 SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), 7244 7227 SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), ··· 7424 7405 {.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"}, 7425 7406 {.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"}, 7426 7407 {.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"}, 7408 + {.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"}, 7427 7409 {.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"}, 7428 7410 {.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"}, 7429 7411 {.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"}, ··· 8444 8424 case HDA_FIXUP_ACT_PRE_PROBE: 8445 8425 snd_hda_jack_detect_enable_callback(codec, 0x1b, 8446 8426 alc662_aspire_ethos_mute_speakers); 8427 + /* subwoofer needs an extra GPIO setting to become audible */ 8428 + alc_setup_gpio(codec, 0x02); 8447 8429 break; 8448 8430 case HDA_FIXUP_ACT_INIT: 8449 8431 /* Make sure to start in a correct state, i.e. if ··· 8528 8506 ALC662_FIXUP_USI_HEADSET_MODE, 8529 8507 ALC662_FIXUP_LENOVO_MULTI_CODECS, 8530 8508 ALC669_FIXUP_ACER_ASPIRE_ETHOS, 8531 - ALC669_FIXUP_ACER_ASPIRE_ETHOS_SUBWOOFER, 8532 8509 ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET, 8533 8510 }; 8534 8511 ··· 8859 8838 .type = HDA_FIXUP_FUNC, 8860 8839 .v.func = alc662_fixup_aspire_ethos_hp, 8861 8840 }, 8862 - [ALC669_FIXUP_ACER_ASPIRE_ETHOS_SUBWOOFER] = { 8863 - .type = HDA_FIXUP_VERBS, 8864 - /* subwoofer needs an extra GPIO setting to become audible */ 8865 - .v.verbs = (const struct hda_verb[]) { 8866 - {0x01, AC_VERB_SET_GPIO_MASK, 0x02}, 8867 - {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02}, 8868 - {0x01, AC_VERB_SET_GPIO_DATA, 0x00}, 8869 - { } 8870 - }, 8871 - .chained = true, 8872 - .chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET 8873 - }, 8874 8841 [ALC669_FIXUP_ACER_ASPIRE_ETHOS] = { 8875 8842 .type = HDA_FIXUP_PINS, 8876 8843 .v.pins = (const struct hda_pintbl[]) { ··· 8868 8859 { } 8869 8860 }, 8870 8861 .chained = true, 8871 - .chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_SUBWOOFER 8862 + .chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET 8872 8863 }, 8873 8864 }; 8874 8865