diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-03-29 17:53:33 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-03-29 17:53:33 -0400 |
commit | 9a4a6f0dc1eaa7b5e4a834b13596faeb0d4b7ac3 (patch) | |
tree | 83f1f62365b0d2c9cafb73f401d190145e87e9ee | |
parent | 0e40da3efeb02ab0333d01abae20d421841db30a (diff) | |
parent | e2a829b3da01b9b32c4d0291d042b8a6e2a98ca3 (diff) |
Merge tag 'sound-5.1-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound fixes from Takashi Iwai:
"The important fixes at this time are a couple fixes in ALSA core: a
fix for PCM is about the OOB access in PCM OSS plugins that has been
for long time, but hasn't hit so often until now just because we
allocated a large buffer via vmalloc(), and surfaced more often after
switching to kvmalloc(). Another fix is for a long-standing PCM
problem wrt racy PM resume.
Others are trivial nospec coverage and usual HD-audio quirks"
* tag 'sound-5.1-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
ALSA: hda/realtek - Fix speakers on Acer Predator Helios 500 Ryzen laptops
ALSA: pcm: Don't suspend stream in unrecoverable PCM state
ALSA: hda/ca0132 - Simplify alt firmware loading code
ALSA: pcm: Fix possible OOB access in PCM oss plugins
ALSA: hda/realtek: Enable headset MIC of ASUS X430UN and X512DK with ALC256
ALSA: hda/realtek: Enable headset mic of ASUS P5440FF with ALC256
ALSA: hda/realtek: Enable ASUS X441MB and X705FD headset MIC with ALC256
ALSA: hda/realtek - Add support for Acer Aspire E5-523G/ES1-432 headset mic
ALSA: hda/realtek: Enable headset MIC of Acer Aspire Z24-890 with ALC286
ALSA: seq: oss: Fix Spectre v1 vulnerability
ALSA: rawmidi: Fix potential Spectre v1 vulnerability
-rw-r--r-- | sound/core/oss/pcm_oss.c | 43 | ||||
-rw-r--r-- | sound/core/pcm_native.c | 9 | ||||
-rw-r--r-- | sound/core/rawmidi.c | 2 | ||||
-rw-r--r-- | sound/core/seq/oss/seq_oss_synth.c | 7 | ||||
-rw-r--r-- | sound/pci/hda/patch_ca0132.c | 20 | ||||
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 35 |
6 files changed, 77 insertions, 39 deletions
diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c index d5b0d7ba83c4..f6ae68017608 100644 --- a/sound/core/oss/pcm_oss.c +++ b/sound/core/oss/pcm_oss.c | |||
@@ -940,6 +940,28 @@ static int snd_pcm_oss_change_params_locked(struct snd_pcm_substream *substream) | |||
940 | oss_frame_size = snd_pcm_format_physical_width(params_format(params)) * | 940 | oss_frame_size = snd_pcm_format_physical_width(params_format(params)) * |
941 | params_channels(params) / 8; | 941 | params_channels(params) / 8; |
942 | 942 | ||
943 | err = snd_pcm_oss_period_size(substream, params, sparams); | ||
944 | if (err < 0) | ||
945 | goto failure; | ||
946 | |||
947 | n = snd_pcm_plug_slave_size(substream, runtime->oss.period_bytes / oss_frame_size); | ||
948 | err = snd_pcm_hw_param_near(substream, sparams, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, n, NULL); | ||
949 | if (err < 0) | ||
950 | goto failure; | ||
951 | |||
952 | err = snd_pcm_hw_param_near(substream, sparams, SNDRV_PCM_HW_PARAM_PERIODS, | ||
953 | runtime->oss.periods, NULL); | ||
954 | if (err < 0) | ||
955 | goto failure; | ||
956 | |||
957 | snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_DROP, NULL); | ||
958 | |||
959 | err = snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_HW_PARAMS, sparams); | ||
960 | if (err < 0) { | ||
961 | pcm_dbg(substream->pcm, "HW_PARAMS failed: %i\n", err); | ||
962 | goto failure; | ||
963 | } | ||
964 | |||
943 | #ifdef CONFIG_SND_PCM_OSS_PLUGINS | 965 | #ifdef CONFIG_SND_PCM_OSS_PLUGINS |
944 | snd_pcm_oss_plugin_clear(substream); | 966 | snd_pcm_oss_plugin_clear(substream); |
945 | if (!direct) { | 967 | if (!direct) { |
@@ -974,27 +996,6 @@ static int snd_pcm_oss_change_params_locked(struct snd_pcm_substream *substream) | |||
974 | } | 996 | } |
975 | #endif | 997 | #endif |
976 | 998 | ||
977 | err = snd_pcm_oss_period_size(substream, params, sparams); | ||
978 | if (err < 0) | ||
979 | goto failure; | ||
980 | |||
981 | n = snd_pcm_plug_slave_size(substream, runtime->oss.period_bytes / oss_frame_size); | ||
982 | err = snd_pcm_hw_param_near(substream, sparams, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, n, NULL); | ||
983 | if (err < 0) | ||
984 | goto failure; | ||
985 | |||
986 | err = snd_pcm_hw_param_near(substream, sparams, SNDRV_PCM_HW_PARAM_PERIODS, | ||
987 | runtime->oss.periods, NULL); | ||
988 | if (err < 0) | ||
989 | goto failure; | ||
990 | |||
991 | snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_DROP, NULL); | ||
992 | |||
993 | if ((err = snd_pcm_kernel_ioctl(substream, SNDRV_PCM_IOCTL_HW_PARAMS, sparams)) < 0) { | ||
994 | pcm_dbg(substream->pcm, "HW_PARAMS failed: %i\n", err); | ||
995 | goto failure; | ||
996 | } | ||
997 | |||
998 | if (runtime->oss.trigger) { | 999 | if (runtime->oss.trigger) { |
999 | sw_params->start_threshold = 1; | 1000 | sw_params->start_threshold = 1; |
1000 | } else { | 1001 | } else { |
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index f731f904e8cc..1d8452912b14 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c | |||
@@ -1445,8 +1445,15 @@ static int snd_pcm_pause(struct snd_pcm_substream *substream, int push) | |||
1445 | static int snd_pcm_pre_suspend(struct snd_pcm_substream *substream, int state) | 1445 | static int snd_pcm_pre_suspend(struct snd_pcm_substream *substream, int state) |
1446 | { | 1446 | { |
1447 | struct snd_pcm_runtime *runtime = substream->runtime; | 1447 | struct snd_pcm_runtime *runtime = substream->runtime; |
1448 | if (runtime->status->state == SNDRV_PCM_STATE_SUSPENDED) | 1448 | switch (runtime->status->state) { |
1449 | case SNDRV_PCM_STATE_SUSPENDED: | ||
1449 | return -EBUSY; | 1450 | return -EBUSY; |
1451 | /* unresumable PCM state; return -EBUSY for skipping suspend */ | ||
1452 | case SNDRV_PCM_STATE_OPEN: | ||
1453 | case SNDRV_PCM_STATE_SETUP: | ||
1454 | case SNDRV_PCM_STATE_DISCONNECTED: | ||
1455 | return -EBUSY; | ||
1456 | } | ||
1450 | runtime->trigger_master = substream; | 1457 | runtime->trigger_master = substream; |
1451 | return 0; | 1458 | return 0; |
1452 | } | 1459 | } |
diff --git a/sound/core/rawmidi.c b/sound/core/rawmidi.c index ee601d7f0926..c0690d1ecd55 100644 --- a/sound/core/rawmidi.c +++ b/sound/core/rawmidi.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/module.h> | 30 | #include <linux/module.h> |
31 | #include <linux/delay.h> | 31 | #include <linux/delay.h> |
32 | #include <linux/mm.h> | 32 | #include <linux/mm.h> |
33 | #include <linux/nospec.h> | ||
33 | #include <sound/rawmidi.h> | 34 | #include <sound/rawmidi.h> |
34 | #include <sound/info.h> | 35 | #include <sound/info.h> |
35 | #include <sound/control.h> | 36 | #include <sound/control.h> |
@@ -601,6 +602,7 @@ static int __snd_rawmidi_info_select(struct snd_card *card, | |||
601 | return -ENXIO; | 602 | return -ENXIO; |
602 | if (info->stream < 0 || info->stream > 1) | 603 | if (info->stream < 0 || info->stream > 1) |
603 | return -EINVAL; | 604 | return -EINVAL; |
605 | info->stream = array_index_nospec(info->stream, 2); | ||
604 | pstr = &rmidi->streams[info->stream]; | 606 | pstr = &rmidi->streams[info->stream]; |
605 | if (pstr->substream_count == 0) | 607 | if (pstr->substream_count == 0) |
606 | return -ENOENT; | 608 | return -ENOENT; |
diff --git a/sound/core/seq/oss/seq_oss_synth.c b/sound/core/seq/oss/seq_oss_synth.c index 278ebb993122..c93945917235 100644 --- a/sound/core/seq/oss/seq_oss_synth.c +++ b/sound/core/seq/oss/seq_oss_synth.c | |||
@@ -617,13 +617,14 @@ int | |||
617 | snd_seq_oss_synth_make_info(struct seq_oss_devinfo *dp, int dev, struct synth_info *inf) | 617 | snd_seq_oss_synth_make_info(struct seq_oss_devinfo *dp, int dev, struct synth_info *inf) |
618 | { | 618 | { |
619 | struct seq_oss_synth *rec; | 619 | struct seq_oss_synth *rec; |
620 | struct seq_oss_synthinfo *info = get_synthinfo_nospec(dp, dev); | ||
620 | 621 | ||
621 | if (dev < 0 || dev >= dp->max_synthdev) | 622 | if (!info) |
622 | return -ENXIO; | 623 | return -ENXIO; |
623 | 624 | ||
624 | if (dp->synths[dev].is_midi) { | 625 | if (info->is_midi) { |
625 | struct midi_info minf; | 626 | struct midi_info minf; |
626 | snd_seq_oss_midi_make_info(dp, dp->synths[dev].midi_mapped, &minf); | 627 | snd_seq_oss_midi_make_info(dp, info->midi_mapped, &minf); |
627 | inf->synth_type = SYNTH_TYPE_MIDI; | 628 | inf->synth_type = SYNTH_TYPE_MIDI; |
628 | inf->synth_subtype = 0; | 629 | inf->synth_subtype = 0; |
629 | inf->nr_voices = 16; | 630 | inf->nr_voices = 16; |
diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c index 29882bda7632..e1ebc6d5f382 100644 --- a/sound/pci/hda/patch_ca0132.c +++ b/sound/pci/hda/patch_ca0132.c | |||
@@ -1005,7 +1005,6 @@ struct ca0132_spec { | |||
1005 | unsigned int scp_resp_header; | 1005 | unsigned int scp_resp_header; |
1006 | unsigned int scp_resp_data[4]; | 1006 | unsigned int scp_resp_data[4]; |
1007 | unsigned int scp_resp_count; | 1007 | unsigned int scp_resp_count; |
1008 | bool alt_firmware_present; | ||
1009 | bool startup_check_entered; | 1008 | bool startup_check_entered; |
1010 | bool dsp_reload; | 1009 | bool dsp_reload; |
1011 | 1010 | ||
@@ -7518,7 +7517,7 @@ static bool ca0132_download_dsp_images(struct hda_codec *codec) | |||
7518 | bool dsp_loaded = false; | 7517 | bool dsp_loaded = false; |
7519 | struct ca0132_spec *spec = codec->spec; | 7518 | struct ca0132_spec *spec = codec->spec; |
7520 | const struct dsp_image_seg *dsp_os_image; | 7519 | const struct dsp_image_seg *dsp_os_image; |
7521 | const struct firmware *fw_entry; | 7520 | const struct firmware *fw_entry = NULL; |
7522 | /* | 7521 | /* |
7523 | * Alternate firmwares for different variants. The Recon3Di apparently | 7522 | * Alternate firmwares for different variants. The Recon3Di apparently |
7524 | * can use the default firmware, but I'll leave the option in case | 7523 | * can use the default firmware, but I'll leave the option in case |
@@ -7529,33 +7528,26 @@ static bool ca0132_download_dsp_images(struct hda_codec *codec) | |||
7529 | case QUIRK_R3D: | 7528 | case QUIRK_R3D: |
7530 | case QUIRK_AE5: | 7529 | case QUIRK_AE5: |
7531 | if (request_firmware(&fw_entry, DESKTOP_EFX_FILE, | 7530 | if (request_firmware(&fw_entry, DESKTOP_EFX_FILE, |
7532 | codec->card->dev) != 0) { | 7531 | codec->card->dev) != 0) |
7533 | codec_dbg(codec, "Desktop firmware not found."); | 7532 | codec_dbg(codec, "Desktop firmware not found."); |
7534 | spec->alt_firmware_present = false; | 7533 | else |
7535 | } else { | ||
7536 | codec_dbg(codec, "Desktop firmware selected."); | 7534 | codec_dbg(codec, "Desktop firmware selected."); |
7537 | spec->alt_firmware_present = true; | ||
7538 | } | ||
7539 | break; | 7535 | break; |
7540 | case QUIRK_R3DI: | 7536 | case QUIRK_R3DI: |
7541 | if (request_firmware(&fw_entry, R3DI_EFX_FILE, | 7537 | if (request_firmware(&fw_entry, R3DI_EFX_FILE, |
7542 | codec->card->dev) != 0) { | 7538 | codec->card->dev) != 0) |
7543 | codec_dbg(codec, "Recon3Di alt firmware not detected."); | 7539 | codec_dbg(codec, "Recon3Di alt firmware not detected."); |
7544 | spec->alt_firmware_present = false; | 7540 | else |
7545 | } else { | ||
7546 | codec_dbg(codec, "Recon3Di firmware selected."); | 7541 | codec_dbg(codec, "Recon3Di firmware selected."); |
7547 | spec->alt_firmware_present = true; | ||
7548 | } | ||
7549 | break; | 7542 | break; |
7550 | default: | 7543 | default: |
7551 | spec->alt_firmware_present = false; | ||
7552 | break; | 7544 | break; |
7553 | } | 7545 | } |
7554 | /* | 7546 | /* |
7555 | * Use default ctefx.bin if no alt firmware is detected, or if none | 7547 | * Use default ctefx.bin if no alt firmware is detected, or if none |
7556 | * exists for your particular codec. | 7548 | * exists for your particular codec. |
7557 | */ | 7549 | */ |
7558 | if (!spec->alt_firmware_present) { | 7550 | if (!fw_entry) { |
7559 | codec_dbg(codec, "Default firmware selected."); | 7551 | codec_dbg(codec, "Default firmware selected."); |
7560 | if (request_firmware(&fw_entry, EFX_FILE, | 7552 | if (request_firmware(&fw_entry, EFX_FILE, |
7561 | codec->card->dev) != 0) | 7553 | codec->card->dev) != 0) |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 191830d4fa40..a3fb3d4c5730 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -5688,6 +5688,8 @@ enum { | |||
5688 | ALC225_FIXUP_WYSE_AUTO_MUTE, | 5688 | ALC225_FIXUP_WYSE_AUTO_MUTE, |
5689 | ALC225_FIXUP_WYSE_DISABLE_MIC_VREF, | 5689 | ALC225_FIXUP_WYSE_DISABLE_MIC_VREF, |
5690 | ALC286_FIXUP_ACER_AIO_HEADSET_MIC, | 5690 | ALC286_FIXUP_ACER_AIO_HEADSET_MIC, |
5691 | ALC256_FIXUP_ASUS_MIC_NO_PRESENCE, | ||
5692 | ALC299_FIXUP_PREDATOR_SPK, | ||
5691 | }; | 5693 | }; |
5692 | 5694 | ||
5693 | static const struct hda_fixup alc269_fixups[] = { | 5695 | static const struct hda_fixup alc269_fixups[] = { |
@@ -6696,6 +6698,22 @@ static const struct hda_fixup alc269_fixups[] = { | |||
6696 | .chained = true, | 6698 | .chained = true, |
6697 | .chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE | 6699 | .chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE |
6698 | }, | 6700 | }, |
6701 | [ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = { | ||
6702 | .type = HDA_FIXUP_PINS, | ||
6703 | .v.pins = (const struct hda_pintbl[]) { | ||
6704 | { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */ | ||
6705 | { } | ||
6706 | }, | ||
6707 | .chained = true, | ||
6708 | .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE | ||
6709 | }, | ||
6710 | [ALC299_FIXUP_PREDATOR_SPK] = { | ||
6711 | .type = HDA_FIXUP_PINS, | ||
6712 | .v.pins = (const struct hda_pintbl[]) { | ||
6713 | { 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */ | ||
6714 | { } | ||
6715 | } | ||
6716 | }, | ||
6699 | }; | 6717 | }; |
6700 | 6718 | ||
6701 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { | 6719 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
@@ -6712,9 +6730,13 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
6712 | SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS), | 6730 | SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS), |
6713 | SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE), | 6731 | SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE), |
6714 | SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK), | 6732 | SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK), |
6733 | SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE), | ||
6734 | SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE), | ||
6735 | SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK), | ||
6715 | SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC), | 6736 | SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC), |
6716 | SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC), | 6737 | SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC), |
6717 | SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC), | 6738 | SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC), |
6739 | SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC), | ||
6718 | SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC), | 6740 | SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC), |
6719 | SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), | 6741 | SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), |
6720 | SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS), | 6742 | SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS), |
@@ -7111,6 +7133,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = { | |||
7111 | {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"}, | 7133 | {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"}, |
7112 | {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"}, | 7134 | {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"}, |
7113 | {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-sense-combo"}, | 7135 | {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-sense-combo"}, |
7136 | {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"}, | ||
7114 | {} | 7137 | {} |
7115 | }; | 7138 | }; |
7116 | #define ALC225_STANDARD_PINS \ | 7139 | #define ALC225_STANDARD_PINS \ |
@@ -7331,6 +7354,18 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { | |||
7331 | {0x14, 0x90170110}, | 7354 | {0x14, 0x90170110}, |
7332 | {0x1b, 0x90a70130}, | 7355 | {0x1b, 0x90a70130}, |
7333 | {0x21, 0x03211020}), | 7356 | {0x21, 0x03211020}), |
7357 | SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE, | ||
7358 | {0x12, 0x90a60130}, | ||
7359 | {0x14, 0x90170110}, | ||
7360 | {0x21, 0x03211020}), | ||
7361 | SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE, | ||
7362 | {0x12, 0x90a60130}, | ||
7363 | {0x14, 0x90170110}, | ||
7364 | {0x21, 0x04211020}), | ||
7365 | SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE, | ||
7366 | {0x1a, 0x90a70130}, | ||
7367 | {0x1b, 0x90170110}, | ||
7368 | {0x21, 0x03211020}), | ||
7334 | SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, | 7369 | SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, |
7335 | {0x12, 0xb7a60130}, | 7370 | {0x12, 0xb7a60130}, |
7336 | {0x13, 0xb8a61140}, | 7371 | {0x13, 0xb8a61140}, |