From: Greg Kroah-Hartman Date: Mon, 25 Jan 2016 21:49:25 +0000 (-0800) Subject: 4.3-stable patches X-Git-Tag: v3.10.96~37 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e0e8e0f60af3190e5948739f6cb304b536fc56fb;p=thirdparty%2Fkernel%2Fstable-queue.git 4.3-stable patches added patches: alsa-hda-add-a-fixup-for-thinkpad-x1-carbon-2nd.patch alsa-hda-add-fixup-for-acer-aspire-one-cloudbook-14.patch alsa-hda-add-inverted-dmic-for-packard-bell-dots.patch alsa-hda-add-keycode-map-for-alc-input-device.patch alsa-hda-add-mic-mute-hotkey-quirk-for-lenovo-thinkcentre-aio.patch alsa-hda-apply-click-noise-workaround-for-thinkpads-generically.patch alsa-hda-apply-hp-headphone-fixups-more-generically.patch alsa-hda-ca0132-quirk-for-alienware-17-2015.patch alsa-hda-fix-headphone-mic-input-on-a-few-dell-alc293-machines.patch alsa-hda-fix-headphone-noise-after-dell-xps-13-resume-back-from-s3.patch alsa-hda-fix-noise-on-dell-latitude-e6440.patch alsa-hda-fix-noise-on-gigabyte-z170x-mobo.patch alsa-hda-fix-noise-problems-on-thinkpad-t440s.patch alsa-hda-fixing-speaker-noise-on-the-two-latest-thinkpad-models.patch alsa-hda-realtek-fix-silent-headphone-output-on-macpro-4-1-v2.patch alsa-hda-set-codec-to-d3-at-reboot-shutdown-on-thinkpads.patch alsa-hda-set-skl-hda-controller-power-at-freeze-and-thaw.patch alsa-hda-skip-eld-notification-during-system-suspend.patch alsa-rme96-fix-unexpected-volume-reset-after-rate-changes.patch alsa-usb-audio-add-a-more-accurate-volume-quirk-for-audioquest-dragonfly.patch alsa-usb-audio-add-sample-rate-inquiry-quirk-for-audioquest-dragonfly.patch --- diff --git a/queue-4.3/alsa-hda-add-a-fixup-for-thinkpad-x1-carbon-2nd.patch b/queue-4.3/alsa-hda-add-a-fixup-for-thinkpad-x1-carbon-2nd.patch new file mode 100644 index 00000000000..10025c9d420 --- /dev/null +++ b/queue-4.3/alsa-hda-add-a-fixup-for-thinkpad-x1-carbon-2nd.patch @@ -0,0 +1,32 @@ +From b6903c0ed9f0bcbbe88f67f7ed43d1721cbc6235 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Thu, 10 Dec 2015 12:20:20 +0100 +Subject: ALSA: hda - Add a fixup for Thinkpad X1 Carbon 2nd + +From: Takashi Iwai + +commit b6903c0ed9f0bcbbe88f67f7ed43d1721cbc6235 upstream. + +Apply the same fixup for Thinkpad with dock to Thinkpad X1 Carbon 2nd, +too. This reduces the annoying loud cracking noise problem, as well +as the support of missing docking port. + +Bugzilla: https://bugzilla.suse.com/show_bug.cgi?id=958439 +Reported-and-tested-by: Benjamin Poirier +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -5368,6 +5368,7 @@ static const struct snd_pci_quirk alc269 + SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK), + SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK), + SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), ++ SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK), + SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK), + SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK), + SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE), diff --git a/queue-4.3/alsa-hda-add-fixup-for-acer-aspire-one-cloudbook-14.patch b/queue-4.3/alsa-hda-add-fixup-for-acer-aspire-one-cloudbook-14.patch new file mode 100644 index 00000000000..3d764ed8e9e --- /dev/null +++ b/queue-4.3/alsa-hda-add-fixup-for-acer-aspire-one-cloudbook-14.patch @@ -0,0 +1,31 @@ +From b9c2fa52135d49a931c56ed2bfc17d61f771b412 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Thu, 19 Nov 2015 16:39:50 +0100 +Subject: ALSA: hda - Add fixup for Acer Aspire One Cloudbook 14 + +From: Takashi Iwai + +commit b9c2fa52135d49a931c56ed2bfc17d61f771b412 upstream. + +For making the speakers on Acer Aspire One Cloudbook 14 to work, we +need the as same quirk as for another Chromebook. This patch adds the +corresponding fixup entry. + +Reported-by: Patrick +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -5190,6 +5190,7 @@ static const struct snd_pci_quirk alc269 + SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK), + SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572), + SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS), ++ SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK), + SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), + SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS), + SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X), diff --git a/queue-4.3/alsa-hda-add-inverted-dmic-for-packard-bell-dots.patch b/queue-4.3/alsa-hda-add-inverted-dmic-for-packard-bell-dots.patch new file mode 100644 index 00000000000..5b3cc35ab30 --- /dev/null +++ b/queue-4.3/alsa-hda-add-inverted-dmic-for-packard-bell-dots.patch @@ -0,0 +1,31 @@ +From 02f6ff90400d055f08b0ba0b5f0707630b6faed7 Mon Sep 17 00:00:00 2001 +From: David Henningsson +Date: Mon, 7 Dec 2015 11:29:31 +0100 +Subject: ALSA: hda - Add inverted dmic for Packard Bell DOTS + +From: David Henningsson + +commit 02f6ff90400d055f08b0ba0b5f0707630b6faed7 upstream. + +On the internal mic of the Packard Bell DOTS, one channel +has an inverted signal. Add a quirk to fix this up. + +BugLink: https://bugs.launchpad.net/bugs/1523232 +Signed-off-by: David Henningsson +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -6419,6 +6419,7 @@ static const struct hda_fixup alc662_fix + static const struct snd_pci_quirk alc662_fixup_tbl[] = { + SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2), + SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC), ++ SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC), + SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE), + SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE), + SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC), diff --git a/queue-4.3/alsa-hda-add-keycode-map-for-alc-input-device.patch b/queue-4.3/alsa-hda-add-keycode-map-for-alc-input-device.patch new file mode 100644 index 00000000000..1a8ad4599d2 --- /dev/null +++ b/queue-4.3/alsa-hda-add-keycode-map-for-alc-input-device.patch @@ -0,0 +1,80 @@ +From c7b60a89516beb20a352ec85c73a8fccd5becf26 Mon Sep 17 00:00:00 2001 +From: Hui Wang +Date: Mon, 28 Dec 2015 11:35:25 +0800 +Subject: ALSA: hda - Add keycode map for alc input device + +From: Hui Wang + +commit c7b60a89516beb20a352ec85c73a8fccd5becf26 upstream. + +Then users can remap the keycode from userspace. If without the remap, +the input device will pass KEY_MICMUTE to userspace, but in X11 layer, +it uses KEY_F20 rather than KEY_MICMUTE for XF86AudioMicMute. After +adding the keycode map, users can remap the keycode to any value users +want. + +Signed-off-by: Hui Wang +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 19 ++++++++++++++++--- + 1 file changed, 16 insertions(+), 3 deletions(-) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -67,6 +67,10 @@ enum { + ALC_HEADSET_TYPE_OMTP, + }; + ++enum { ++ ALC_KEY_MICMUTE_INDEX, ++}; ++ + struct alc_customize_define { + unsigned int sku_cfg; + unsigned char port_connectivity; +@@ -123,6 +127,7 @@ struct alc_spec { + unsigned int pll_coef_idx, pll_coef_bit; + unsigned int coef0; + struct input_dev *kb_dev; ++ u8 alc_mute_keycode_map[1]; + }; + + /* +@@ -3472,24 +3477,32 @@ static void gpio2_mic_hotkey_event(struc + + /* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore + send both key on and key off event for every interrupt. */ +- input_report_key(spec->kb_dev, KEY_MICMUTE, 1); ++ input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1); + input_sync(spec->kb_dev); +- input_report_key(spec->kb_dev, KEY_MICMUTE, 0); ++ input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0); + input_sync(spec->kb_dev); + } + + static int alc_register_micmute_input_device(struct hda_codec *codec) + { + struct alc_spec *spec = codec->spec; ++ int i; + + spec->kb_dev = input_allocate_device(); + if (!spec->kb_dev) { + codec_err(codec, "Out of memory (input_allocate_device)\n"); + return -ENOMEM; + } ++ ++ spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE; ++ + spec->kb_dev->name = "Microphone Mute Button"; + spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY); +- spec->kb_dev->keybit[BIT_WORD(KEY_MICMUTE)] = BIT_MASK(KEY_MICMUTE); ++ spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]); ++ spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map); ++ spec->kb_dev->keycode = spec->alc_mute_keycode_map; ++ for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++) ++ set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit); + + if (input_register_device(spec->kb_dev)) { + codec_err(codec, "input_register_device failed\n"); diff --git a/queue-4.3/alsa-hda-add-mic-mute-hotkey-quirk-for-lenovo-thinkcentre-aio.patch b/queue-4.3/alsa-hda-add-mic-mute-hotkey-quirk-for-lenovo-thinkcentre-aio.patch new file mode 100644 index 00000000000..7b24237d7c0 --- /dev/null +++ b/queue-4.3/alsa-hda-add-mic-mute-hotkey-quirk-for-lenovo-thinkcentre-aio.patch @@ -0,0 +1,159 @@ +From 3694cb2947db50753caf432db067487eafae7b9b Mon Sep 17 00:00:00 2001 +From: Kailang +Date: Mon, 28 Dec 2015 11:35:24 +0800 +Subject: ALSA: hda - Add mic mute hotkey quirk for Lenovo ThinkCentre AIO + +From: Kailang + +commit 3694cb2947db50753caf432db067487eafae7b9b upstream. + +The Lenovo ThinkCenter AIO uses Line2 (NID 0x1b) to implement the +micmute hotkey, here we register an input device and use Line2 unsol +event to collect the hotkey pressing or releasing. + +In the meanwhile, the micmute led is controlled by GPIO2, so we +use an existing function alc_fixup_gpio_mic_mute_hook() to control +the led. + +[Hui: And there are two places to register the input device, to make +the code simple and clean, move the two same code sections into a +function.] + +Signed-off-by: Kailang +Signed-off-by: Hui Wang +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 84 +++++++++++++++++++++++++++++++++++------- + 1 file changed, 71 insertions(+), 13 deletions(-) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -3478,6 +3478,29 @@ static void gpio2_mic_hotkey_event(struc + input_sync(spec->kb_dev); + } + ++static int alc_register_micmute_input_device(struct hda_codec *codec) ++{ ++ struct alc_spec *spec = codec->spec; ++ ++ spec->kb_dev = input_allocate_device(); ++ if (!spec->kb_dev) { ++ codec_err(codec, "Out of memory (input_allocate_device)\n"); ++ return -ENOMEM; ++ } ++ spec->kb_dev->name = "Microphone Mute Button"; ++ spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY); ++ spec->kb_dev->keybit[BIT_WORD(KEY_MICMUTE)] = BIT_MASK(KEY_MICMUTE); ++ ++ if (input_register_device(spec->kb_dev)) { ++ codec_err(codec, "input_register_device failed\n"); ++ input_free_device(spec->kb_dev); ++ spec->kb_dev = NULL; ++ return -ENOMEM; ++ } ++ ++ return 0; ++} ++ + static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec, + const struct hda_fixup *fix, int action) + { +@@ -3495,20 +3518,8 @@ static void alc280_fixup_hp_gpio2_mic_ho + struct alc_spec *spec = codec->spec; + + if (action == HDA_FIXUP_ACT_PRE_PROBE) { +- spec->kb_dev = input_allocate_device(); +- if (!spec->kb_dev) { +- codec_err(codec, "Out of memory (input_allocate_device)\n"); +- return; +- } +- spec->kb_dev->name = "Microphone Mute Button"; +- spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY); +- spec->kb_dev->keybit[BIT_WORD(KEY_MICMUTE)] = BIT_MASK(KEY_MICMUTE); +- if (input_register_device(spec->kb_dev)) { +- codec_err(codec, "input_register_device failed\n"); +- input_free_device(spec->kb_dev); +- spec->kb_dev = NULL; ++ if (alc_register_micmute_input_device(codec) != 0) + return; +- } + + snd_hda_add_verbs(codec, gpio_init); + snd_hda_codec_write_cache(codec, codec->core.afg, 0, +@@ -3538,6 +3549,47 @@ static void alc280_fixup_hp_gpio2_mic_ho + } + } + ++static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec, ++ const struct hda_fixup *fix, int action) ++{ ++ /* Line2 = mic mute hotkey ++ GPIO2 = mic mute LED */ ++ static const struct hda_verb gpio_init[] = { ++ { 0x01, AC_VERB_SET_GPIO_MASK, 0x04 }, ++ { 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04 }, ++ {} ++ }; ++ ++ struct alc_spec *spec = codec->spec; ++ ++ if (action == HDA_FIXUP_ACT_PRE_PROBE) { ++ if (alc_register_micmute_input_device(codec) != 0) ++ return; ++ ++ snd_hda_add_verbs(codec, gpio_init); ++ snd_hda_jack_detect_enable_callback(codec, 0x1b, ++ gpio2_mic_hotkey_event); ++ ++ spec->gen.cap_sync_hook = alc_fixup_gpio_mic_mute_hook; ++ spec->gpio_led = 0; ++ spec->mute_led_polarity = 0; ++ spec->gpio_mic_led_mask = 0x04; ++ return; ++ } ++ ++ if (!spec->kb_dev) ++ return; ++ ++ switch (action) { ++ case HDA_FIXUP_ACT_PROBE: ++ spec->init_amp = ALC_INIT_DEFAULT; ++ break; ++ case HDA_FIXUP_ACT_FREE: ++ input_unregister_device(spec->kb_dev); ++ spec->kb_dev = NULL; ++ } ++} ++ + static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec, + const struct hda_fixup *fix, int action) + { +@@ -4638,6 +4690,7 @@ enum { + ALC275_FIXUP_DELL_XPS, + ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE, + ALC293_FIXUP_LENOVO_SPK_NOISE, ++ ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, + }; + + static const struct hda_fixup alc269_fixups[] = { +@@ -5247,6 +5300,10 @@ static const struct hda_fixup alc269_fix + .chained = true, + .chain_id = ALC269_FIXUP_THINKPAD_ACPI + }, ++ [ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = { ++ .type = HDA_FIXUP_FUNC, ++ .v.func = alc233_fixup_lenovo_line2_mic_hotkey, ++ }, + }; + + static const struct snd_pci_quirk alc269_fixup_tbl[] = { +@@ -5396,6 +5453,7 @@ static const struct snd_pci_quirk alc269 + SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK), + SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK), + SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE), ++ SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), + SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), + SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP), + SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), diff --git a/queue-4.3/alsa-hda-apply-click-noise-workaround-for-thinkpads-generically.patch b/queue-4.3/alsa-hda-apply-click-noise-workaround-for-thinkpads-generically.patch new file mode 100644 index 00000000000..0194ddb2dbb --- /dev/null +++ b/queue-4.3/alsa-hda-apply-click-noise-workaround-for-thinkpads-generically.patch @@ -0,0 +1,62 @@ +From 157f0b7f6c0cc0bc88647390006e959e267a0143 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Thu, 10 Dec 2015 23:30:43 +0100 +Subject: ALSA: hda - Apply click noise workaround for Thinkpads generically + +From: Takashi Iwai + +commit 157f0b7f6c0cc0bc88647390006e959e267a0143 upstream. + +It seems that a workaround for Thinkpad T440s crackling noise can be +applied generically to all Thinkpad models: namely, disabling the +default alc269 shutup callback. This patch moves it to the existing +alc_fixup_tpt440_dock() while also replacing the rest code with +another existing alc_fixup_disable_aamix(). It resulted in a good +code reduction. + +Bugzilla: https://bugzilla.suse.com/show_bug.cgi?id=958439 +Reported-and-tested-by: Benjamin Poirier +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 15 ++------------- + 1 file changed, 2 insertions(+), 13 deletions(-) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -4208,24 +4208,13 @@ static void alc_fixup_tpt440_dock(struct + struct alc_spec *spec = codec->spec; + + if (action == HDA_FIXUP_ACT_PRE_PROBE) { ++ spec->shutup = alc_no_shutup; /* reduce click noise */ + spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP; + codec->power_save_node = 0; /* avoid click noises */ + snd_hda_apply_pincfgs(codec, pincfgs); + } + } + +-/* additional fixup for Thinkpad T440s noise problem */ +-static void alc_fixup_tpt440(struct hda_codec *codec, +- const struct hda_fixup *fix, int action) +-{ +- struct alc_spec *spec = codec->spec; +- +- if (action == HDA_FIXUP_ACT_PRE_PROBE) { +- spec->shutup = alc_no_shutup; /* reduce click noise */ +- spec->gen.mixer_nid = 0; /* reduce background noise */ +- } +-} +- + static void alc_shutup_dell_xps13(struct hda_codec *codec) + { + struct alc_spec *spec = codec->spec; +@@ -5076,7 +5065,7 @@ static const struct hda_fixup alc269_fix + }, + [ALC292_FIXUP_TPT440] = { + .type = HDA_FIXUP_FUNC, +- .v.func = alc_fixup_tpt440, ++ .v.func = alc_fixup_disable_aamix, + .chained = true, + .chain_id = ALC292_FIXUP_TPT440_DOCK, + }, diff --git a/queue-4.3/alsa-hda-apply-hp-headphone-fixups-more-generically.patch b/queue-4.3/alsa-hda-apply-hp-headphone-fixups-more-generically.patch new file mode 100644 index 00000000000..6460847333c --- /dev/null +++ b/queue-4.3/alsa-hda-apply-hp-headphone-fixups-more-generically.patch @@ -0,0 +1,88 @@ +From 196543d54574f50e3fd04df4e3048181e006a9da Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Mon, 9 Nov 2015 14:46:35 +0100 +Subject: ALSA: hda - Apply HP headphone fixups more generically + +From: Takashi Iwai + +commit 196543d54574f50e3fd04df4e3048181e006a9da upstream. + +It turned out that many HP laptops suffer from the same problem as +fixed in commit [c932b98c1e47: ALSA: hda - Apply pin fixup for HP +ProBook 6550b]. But, it's tiresome to list up all such PCI SSIDs, as +there are really lots of HP machines. + +Instead, we do a bit more clever, try to check the supposedly dock and +built-in headphone pins, and apply the fixup when both seem valid. +This rule can be applied generically to all models using the same +quirk, so we'll fix all in a shot. + +Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=107491 +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_sigmatel.c | 45 ++++++++++++++++++++++++++--------------- + 1 file changed, 29 insertions(+), 16 deletions(-) + +--- a/sound/pci/hda/patch_sigmatel.c ++++ b/sound/pci/hda/patch_sigmatel.c +@@ -3110,6 +3110,29 @@ static void stac92hd71bxx_fixup_hp_hdx(s + spec->gpio_led = 0x08; + } + ++static bool is_hp_output(struct hda_codec *codec, hda_nid_t pin) ++{ ++ unsigned int pin_cfg = snd_hda_codec_get_pincfg(codec, pin); ++ ++ /* count line-out, too, as BIOS sets often so */ ++ return get_defcfg_connect(pin_cfg) != AC_JACK_PORT_NONE && ++ (get_defcfg_device(pin_cfg) == AC_JACK_LINE_OUT || ++ get_defcfg_device(pin_cfg) == AC_JACK_HP_OUT); ++} ++ ++static void fixup_hp_headphone(struct hda_codec *codec, hda_nid_t pin) ++{ ++ unsigned int pin_cfg = snd_hda_codec_get_pincfg(codec, pin); ++ ++ /* It was changed in the BIOS to just satisfy MS DTM. ++ * Lets turn it back into slaved HP ++ */ ++ pin_cfg = (pin_cfg & (~AC_DEFCFG_DEVICE)) | ++ (AC_JACK_HP_OUT << AC_DEFCFG_DEVICE_SHIFT); ++ pin_cfg = (pin_cfg & (~(AC_DEFCFG_DEF_ASSOC | AC_DEFCFG_SEQUENCE))) | ++ 0x1f; ++ snd_hda_codec_set_pincfg(codec, pin, pin_cfg); ++} + + static void stac92hd71bxx_fixup_hp(struct hda_codec *codec, + const struct hda_fixup *fix, int action) +@@ -3119,22 +3142,12 @@ static void stac92hd71bxx_fixup_hp(struc + if (action != HDA_FIXUP_ACT_PRE_PROBE) + return; + +- if (hp_blike_system(codec->core.subsystem_id)) { +- unsigned int pin_cfg = snd_hda_codec_get_pincfg(codec, 0x0f); +- if (get_defcfg_device(pin_cfg) == AC_JACK_LINE_OUT || +- get_defcfg_device(pin_cfg) == AC_JACK_SPEAKER || +- get_defcfg_device(pin_cfg) == AC_JACK_HP_OUT) { +- /* It was changed in the BIOS to just satisfy MS DTM. +- * Lets turn it back into slaved HP +- */ +- pin_cfg = (pin_cfg & (~AC_DEFCFG_DEVICE)) +- | (AC_JACK_HP_OUT << +- AC_DEFCFG_DEVICE_SHIFT); +- pin_cfg = (pin_cfg & (~(AC_DEFCFG_DEF_ASSOC +- | AC_DEFCFG_SEQUENCE))) +- | 0x1f; +- snd_hda_codec_set_pincfg(codec, 0x0f, pin_cfg); +- } ++ /* when both output A and F are assigned, these are supposedly ++ * dock and built-in headphones; fix both pin configs ++ */ ++ if (is_hp_output(codec, 0x0a) && is_hp_output(codec, 0x0f)) { ++ fixup_hp_headphone(codec, 0x0a); ++ fixup_hp_headphone(codec, 0x0f); + } + + if (find_mute_led_cfg(codec, 1)) diff --git a/queue-4.3/alsa-hda-ca0132-quirk-for-alienware-17-2015.patch b/queue-4.3/alsa-hda-ca0132-quirk-for-alienware-17-2015.patch new file mode 100644 index 00000000000..77c47cbf748 --- /dev/null +++ b/queue-4.3/alsa-hda-ca0132-quirk-for-alienware-17-2015.patch @@ -0,0 +1,32 @@ +From 5328e1ea87fb2b5cf695115df4325c1913209e97 Mon Sep 17 00:00:00 2001 +From: Gabriele Martino +Date: Wed, 9 Dec 2015 17:05:58 +0100 +Subject: ALSA: hda/ca0132 - quirk for Alienware 17 2015 + +From: Gabriele Martino + +commit 5328e1ea87fb2b5cf695115df4325c1913209e97 upstream. + +The Alienware 17 (2015) has the same card and pin configuration of the +Alienware 15, so the same quirks must be applied. + +Signed-off-by: Gabriele Martino +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_ca0132.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/sound/pci/hda/patch_ca0132.c ++++ b/sound/pci/hda/patch_ca0132.c +@@ -778,7 +778,8 @@ static const struct hda_pintbl alienware + }; + + static const struct snd_pci_quirk ca0132_quirks[] = { +- SND_PCI_QUIRK(0x1028, 0x0685, "Alienware 15", QUIRK_ALIENWARE), ++ SND_PCI_QUIRK(0x1028, 0x0685, "Alienware 15 2015", QUIRK_ALIENWARE), ++ SND_PCI_QUIRK(0x1028, 0x0688, "Alienware 17 2015", QUIRK_ALIENWARE), + {} + }; + diff --git a/queue-4.3/alsa-hda-fix-headphone-mic-input-on-a-few-dell-alc293-machines.patch b/queue-4.3/alsa-hda-fix-headphone-mic-input-on-a-few-dell-alc293-machines.patch new file mode 100644 index 00000000000..99a36944953 --- /dev/null +++ b/queue-4.3/alsa-hda-fix-headphone-mic-input-on-a-few-dell-alc293-machines.patch @@ -0,0 +1,61 @@ +From c04017ea81dc1eccae87be7ac7b82b2972f9931f Mon Sep 17 00:00:00 2001 +From: David Henningsson +Date: Tue, 15 Dec 2015 14:44:03 +0100 +Subject: ALSA: hda - Fix headphone mic input on a few Dell ALC293 machines + +From: David Henningsson + +commit c04017ea81dc1eccae87be7ac7b82b2972f9931f upstream. + +These laptops support both headphone, headset and mic modes +for the 3.5mm jack. + +BugLink: https://bugs.launchpad.net/bugs/1526330 +Signed-off-by: David Henningsson +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 17 ++++++++++++----- + 1 file changed, 12 insertions(+), 5 deletions(-) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -4605,6 +4605,7 @@ enum { + ALC288_FIXUP_DISABLE_AAMIX, + ALC292_FIXUP_DELL_E7X, + ALC292_FIXUP_DISABLE_AAMIX, ++ ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, + ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, + ALC275_FIXUP_DELL_XPS, + ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE, +@@ -5168,6 +5169,12 @@ static const struct hda_fixup alc269_fix + .chained = true, + .chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE + }, ++ [ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = { ++ .type = HDA_FIXUP_FUNC, ++ .v.func = alc_fixup_disable_aamix, ++ .chained = true, ++ .chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE ++ }, + [ALC292_FIXUP_DELL_E7X] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc_fixup_dell_xps13, +@@ -5246,11 +5253,11 @@ static const struct snd_pci_quirk alc269 + SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), + SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), + SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), +- SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC292_FIXUP_DISABLE_AAMIX), +- SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC292_FIXUP_DISABLE_AAMIX), +- SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC292_FIXUP_DISABLE_AAMIX), +- SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC292_FIXUP_DISABLE_AAMIX), +- SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC292_FIXUP_DISABLE_AAMIX), ++ SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK), ++ SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK), ++ SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK), ++ SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK), ++ SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK), + SND_PCI_QUIRK(0x1028, 0x0704, "Dell XPS 13", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), + SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), + SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), diff --git a/queue-4.3/alsa-hda-fix-headphone-noise-after-dell-xps-13-resume-back-from-s3.patch b/queue-4.3/alsa-hda-fix-headphone-noise-after-dell-xps-13-resume-back-from-s3.patch new file mode 100644 index 00000000000..df369f5c6eb --- /dev/null +++ b/queue-4.3/alsa-hda-fix-headphone-noise-after-dell-xps-13-resume-back-from-s3.patch @@ -0,0 +1,61 @@ +From 8c69729b4439bbda88c3073df7243f755cc418ed Mon Sep 17 00:00:00 2001 +From: Hui Wang +Date: Tue, 24 Nov 2015 11:08:18 +0800 +Subject: ALSA: hda - Fix headphone noise after Dell XPS 13 resume back from S3 + +From: Hui Wang + +commit 8c69729b4439bbda88c3073df7243f755cc418ed upstream. + +We have a machine Dell XPS 13 with the codec alc256, after resume back +from S3, the headphone has noise when play sound. + +Through comparing with the coeff vaule before and after S3, we found +restoring a coeff register will help remove noise. + +BugLink: https://bugs.launchpad.net/bugs/1519168 +Cc: Kailang Yang +Signed-off-by: Hui Wang +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -4597,6 +4597,7 @@ enum { + ALC292_FIXUP_DISABLE_AAMIX, + ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, + ALC275_FIXUP_DELL_XPS, ++ ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE, + }; + + static const struct hda_fixup alc269_fixups[] = { +@@ -5177,6 +5178,17 @@ static const struct hda_fixup alc269_fix + {} + } + }, ++ [ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE] = { ++ .type = HDA_FIXUP_VERBS, ++ .v.verbs = (const struct hda_verb[]) { ++ /* Disable pass-through path for FRONT 14h */ ++ {0x20, AC_VERB_SET_COEF_INDEX, 0x36}, ++ {0x20, AC_VERB_SET_PROC_COEF, 0x1737}, ++ {} ++ }, ++ .chained = true, ++ .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE ++ }, + }; + + static const struct snd_pci_quirk alc269_fixup_tbl[] = { +@@ -5216,6 +5228,7 @@ static const struct snd_pci_quirk alc269 + SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC292_FIXUP_DISABLE_AAMIX), + SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC292_FIXUP_DISABLE_AAMIX), + SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC292_FIXUP_DISABLE_AAMIX), ++ SND_PCI_QUIRK(0x1028, 0x0704, "Dell XPS 13", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), + SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), + SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), + SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), diff --git a/queue-4.3/alsa-hda-fix-noise-on-dell-latitude-e6440.patch b/queue-4.3/alsa-hda-fix-noise-on-dell-latitude-e6440.patch new file mode 100644 index 00000000000..c72a28a804f --- /dev/null +++ b/queue-4.3/alsa-hda-fix-noise-on-dell-latitude-e6440.patch @@ -0,0 +1,31 @@ +From 86f799b82f5c011404ddef54600bc5e99b7e0cf2 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Sat, 14 Nov 2015 17:46:31 +0100 +Subject: ALSA: hda - Fix noise on Dell Latitude E6440 + +From: Takashi Iwai + +commit 86f799b82f5c011404ddef54600bc5e99b7e0cf2 upstream. + +Dell Latitude E6440 (1028:05bd) needs the same fixup as applied to +other Latitude E7xxx models for the click noise due to the recent +power-saving changes. + +Bugzilla: http://bugzilla.opensuse.org/show_bug.cgi?id=954876 +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -5192,6 +5192,7 @@ static const struct snd_pci_quirk alc269 + SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS), + SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), + SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS), ++ SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X), + SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X), + SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X), + SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER), diff --git a/queue-4.3/alsa-hda-fix-noise-on-gigabyte-z170x-mobo.patch b/queue-4.3/alsa-hda-fix-noise-on-gigabyte-z170x-mobo.patch new file mode 100644 index 00000000000..6a590e403bc --- /dev/null +++ b/queue-4.3/alsa-hda-fix-noise-on-gigabyte-z170x-mobo.patch @@ -0,0 +1,59 @@ +From 0c25ad80408e95e0a4fbaf0056950206e95f726f Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Tue, 24 Nov 2015 20:02:12 +0100 +Subject: ALSA: hda - Fix noise on Gigabyte Z170X mobo + +From: Takashi Iwai + +commit 0c25ad80408e95e0a4fbaf0056950206e95f726f upstream. + +Gigabyte Z710X mobo with ALC1150 codec gets significant noises from +the analog loopback routes even if their inputs are all muted. +Simply kill the aamix for fixing it. + +Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=108301 +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -1769,6 +1769,7 @@ enum { + ALC882_FIXUP_NO_PRIMARY_HP, + ALC887_FIXUP_ASUS_BASS, + ALC887_FIXUP_BASS_CHMAP, ++ ALC882_FIXUP_DISABLE_AAMIX, + }; + + static void alc889_fixup_coef(struct hda_codec *codec, +@@ -1930,6 +1931,8 @@ static void alc882_fixup_no_primary_hp(s + + static void alc_fixup_bass_chmap(struct hda_codec *codec, + const struct hda_fixup *fix, int action); ++static void alc_fixup_disable_aamix(struct hda_codec *codec, ++ const struct hda_fixup *fix, int action); + + static const struct hda_fixup alc882_fixups[] = { + [ALC882_FIXUP_ABIT_AW9D_MAX] = { +@@ -2161,6 +2164,10 @@ static const struct hda_fixup alc882_fix + .type = HDA_FIXUP_FUNC, + .v.func = alc_fixup_bass_chmap, + }, ++ [ALC882_FIXUP_DISABLE_AAMIX] = { ++ .type = HDA_FIXUP_FUNC, ++ .v.func = alc_fixup_disable_aamix, ++ }, + }; + + static const struct snd_pci_quirk alc882_fixup_tbl[] = { +@@ -2228,6 +2235,7 @@ static const struct snd_pci_quirk alc882 + SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD), + SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3), + SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE), ++ SND_PCI_QUIRK(0x1458, 0xa182, "Gigabyte Z170X-UD3", ALC882_FIXUP_DISABLE_AAMIX), + SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX), + SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD), + SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD), diff --git a/queue-4.3/alsa-hda-fix-noise-problems-on-thinkpad-t440s.patch b/queue-4.3/alsa-hda-fix-noise-problems-on-thinkpad-t440s.patch new file mode 100644 index 00000000000..22e915dbcda --- /dev/null +++ b/queue-4.3/alsa-hda-fix-noise-problems-on-thinkpad-t440s.patch @@ -0,0 +1,95 @@ +From 9a811230481243f384b8036c6a558bfdbd961f78 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Wed, 9 Dec 2015 15:17:43 +0100 +Subject: ALSA: hda - Fix noise problems on Thinkpad T440s + +From: Takashi Iwai + +commit 9a811230481243f384b8036c6a558bfdbd961f78 upstream. + +Lenovo Thinkpad T440s suffers from constant background noises, and it +seems to be a generic hardware issue on this model: + https://forums.lenovo.com/t5/ThinkPad-T400-T500-and-newer-T/T440s-speaker-noise/td-p/1339883 + +As the noise comes from the analog loopback path, disabling the path +is the easy workaround. + +Also, the machine gives significant cracking noises at PM suspend. A +workaround found by trial-and-error is to disable the shutup callback +currently used for ALC269-variant. + +This patch addresses these noise issues by introducing a new fixup +chain. Although the same workaround might be applicable to other +Thinkpad models, it's applied only to T440s (17aa:220c) in this patch, +so far, just to be safe (you chicken!). As a compromise, a new model +option string "tp440" is provided now, though, so that owners of other +Thinkpad models can test it more easily. + +Bugzilla: https://bugzilla.opensuse.org/show_bug.cgi?id=958504 +Reported-and-tested-by: Tim Hardeck +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 22 +++++++++++++++++++++- + 1 file changed, 21 insertions(+), 1 deletion(-) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -4214,6 +4214,18 @@ static void alc_fixup_tpt440_dock(struct + } + } + ++/* additional fixup for Thinkpad T440s noise problem */ ++static void alc_fixup_tpt440(struct hda_codec *codec, ++ const struct hda_fixup *fix, int action) ++{ ++ struct alc_spec *spec = codec->spec; ++ ++ if (action == HDA_FIXUP_ACT_PRE_PROBE) { ++ spec->shutup = alc_no_shutup; /* reduce click noise */ ++ spec->gen.mixer_nid = 0; /* reduce background noise */ ++ } ++} ++ + static void alc_shutup_dell_xps13(struct hda_codec *codec) + { + struct alc_spec *spec = codec->spec; +@@ -4588,6 +4600,7 @@ enum { + ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC, + ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, + ALC292_FIXUP_TPT440_DOCK, ++ ALC292_FIXUP_TPT440, + ALC283_FIXUP_BXBT2807_MIC, + ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED, + ALC282_FIXUP_ASPIRE_V5_PINS, +@@ -5061,6 +5074,12 @@ static const struct hda_fixup alc269_fix + .chained = true, + .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST + }, ++ [ALC292_FIXUP_TPT440] = { ++ .type = HDA_FIXUP_FUNC, ++ .v.func = alc_fixup_tpt440, ++ .chained = true, ++ .chain_id = ALC292_FIXUP_TPT440_DOCK, ++ }, + [ALC283_FIXUP_BXBT2807_MIC] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl[]) { +@@ -5342,7 +5361,7 @@ static const struct snd_pci_quirk alc269 + SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK), + SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK), + SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK), +- SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440_DOCK), ++ SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440), + SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK), + SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK), + SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK), +@@ -5442,6 +5461,7 @@ static const struct hda_model_fixup alc2 + {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"}, + {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"}, + {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"}, ++ {.id = ALC292_FIXUP_TPT440, .name = "tpt440"}, + {} + }; + diff --git a/queue-4.3/alsa-hda-fixing-speaker-noise-on-the-two-latest-thinkpad-models.patch b/queue-4.3/alsa-hda-fixing-speaker-noise-on-the-two-latest-thinkpad-models.patch new file mode 100644 index 00000000000..95aa14c006c --- /dev/null +++ b/queue-4.3/alsa-hda-fixing-speaker-noise-on-the-two-latest-thinkpad-models.patch @@ -0,0 +1,70 @@ +From 23adc192b862b69ad80a40bd5206e337f41264ac Mon Sep 17 00:00:00 2001 +From: Hui Wang +Date: Tue, 8 Dec 2015 12:27:18 +0800 +Subject: ALSA: hda - Fixing speaker noise on the two latest thinkpad models + +From: Hui Wang + +commit 23adc192b862b69ad80a40bd5206e337f41264ac upstream. + +We have two latest thinkpad laptop models which are all based on the +Intel skylake platforms, and all of them have the codec alc293 on +them. When the machines boot to the desktop, an greeting dialogue +shows up with the notification sound. But on these two models, there +is noise with the notification sound. We have 3 SKUs for each of +the models, all of them have this problem. + +So far, this problem is only specific to these two thinkpad models, +we did not find this problem on the old thinkpad models with the +codec alc293 or alc292. + +A workaround for this problem is disabling the aamix. + +BugLink: https://bugs.launchpad.net/bugs/1523517 +Signed-off-by: Hui Wang +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -4606,6 +4606,7 @@ enum { + ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, + ALC275_FIXUP_DELL_XPS, + ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE, ++ ALC293_FIXUP_LENOVO_SPK_NOISE, + }; + + static const struct hda_fixup alc269_fixups[] = { +@@ -5197,6 +5198,12 @@ static const struct hda_fixup alc269_fix + .chained = true, + .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE + }, ++ [ALC293_FIXUP_LENOVO_SPK_NOISE] = { ++ .type = HDA_FIXUP_FUNC, ++ .v.func = alc_fixup_disable_aamix, ++ .chained = true, ++ .chain_id = ALC269_FIXUP_THINKPAD_ACPI ++ }, + }; + + static const struct snd_pci_quirk alc269_fixup_tbl[] = { +@@ -5344,6 +5351,7 @@ static const struct snd_pci_quirk alc269 + SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), + SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK), + SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK), ++ SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE), + SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), + SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP), + SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), +@@ -5353,6 +5361,7 @@ static const struct snd_pci_quirk alc269 + SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK), + SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK), + SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK), ++ SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE), + SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), + SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K), + SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD), diff --git a/queue-4.3/alsa-hda-realtek-fix-silent-headphone-output-on-macpro-4-1-v2.patch b/queue-4.3/alsa-hda-realtek-fix-silent-headphone-output-on-macpro-4-1-v2.patch new file mode 100644 index 00000000000..5e904a908af --- /dev/null +++ b/queue-4.3/alsa-hda-realtek-fix-silent-headphone-output-on-macpro-4-1-v2.patch @@ -0,0 +1,70 @@ +From 9f660a1c43890c2cdd1f423fd73654e7ca08fe56 Mon Sep 17 00:00:00 2001 +From: Mario Kleiner +Date: Tue, 22 Dec 2015 00:45:43 +0100 +Subject: ALSA: hda/realtek - Fix silent headphone output on MacPro 4,1 (v2) + +From: Mario Kleiner + +commit 9f660a1c43890c2cdd1f423fd73654e7ca08fe56 upstream. + +Without this patch, internal speaker and line-out work, +but front headphone output jack stays silent on the +Mac Pro 4,1. + +This code path also gets executed on the MacPro 5,1 due +to identical codec SSID, but i don't know if it has any +positive or adverse effects there or not. + +(v2) Implement feedback from Takashi Iwai: Reuse + alc889_fixup_mbp_vref and just add a new nid + 0x19 for the MacPro 4,1. + +Signed-off-by: Mario Kleiner +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -1785,6 +1785,7 @@ enum { + ALC889_FIXUP_MBA11_VREF, + ALC889_FIXUP_MBA21_VREF, + ALC889_FIXUP_MP11_VREF, ++ ALC889_FIXUP_MP41_VREF, + ALC882_FIXUP_INV_DMIC, + ALC882_FIXUP_NO_PRIMARY_HP, + ALC887_FIXUP_ASUS_BASS, +@@ -1873,7 +1874,7 @@ static void alc889_fixup_mbp_vref(struct + const struct hda_fixup *fix, int action) + { + struct alc_spec *spec = codec->spec; +- static hda_nid_t nids[2] = { 0x14, 0x15 }; ++ static hda_nid_t nids[3] = { 0x14, 0x15, 0x19 }; + int i; + + if (action != HDA_FIXUP_ACT_INIT) +@@ -2163,6 +2164,12 @@ static const struct hda_fixup alc882_fix + .chained = true, + .chain_id = ALC885_FIXUP_MACPRO_GPIO, + }, ++ [ALC889_FIXUP_MP41_VREF] = { ++ .type = HDA_FIXUP_FUNC, ++ .v.func = alc889_fixup_mbp_vref, ++ .chained = true, ++ .chain_id = ALC885_FIXUP_MACPRO_GPIO, ++ }, + [ALC882_FIXUP_INV_DMIC] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc_fixup_inv_dmic, +@@ -2245,7 +2252,7 @@ static const struct snd_pci_quirk alc882 + SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF), + SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF), + SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF), +- SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 5,1", ALC885_FIXUP_MACPRO_GPIO), ++ SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF), + SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF), + SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF), + SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF), diff --git a/queue-4.3/alsa-hda-set-codec-to-d3-at-reboot-shutdown-on-thinkpads.patch b/queue-4.3/alsa-hda-set-codec-to-d3-at-reboot-shutdown-on-thinkpads.patch new file mode 100644 index 00000000000..968cab129b8 --- /dev/null +++ b/queue-4.3/alsa-hda-set-codec-to-d3-at-reboot-shutdown-on-thinkpads.patch @@ -0,0 +1,84 @@ +From 70a0976b0c0d90f4246d7e63359d796ec82b87d6 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Tue, 15 Dec 2015 14:59:58 +0100 +Subject: ALSA: hda - Set codec to D3 at reboot/shutdown on Thinkpads + +From: Takashi Iwai + +commit 70a0976b0c0d90f4246d7e63359d796ec82b87d6 upstream. + +Lenovo Thinkpads with Realtek codecs may still have some loud +crackling noises at reboot/shutdown even though a few previous fixes +have been applied. It's because the previous fix (disabling the +default shutup callback) takes effect only at transition of the codec +power state. Meanwhile, at reboot or shutdown, we don't take down the +codec power as default, thus it triggers the same problem unless the +codec is powered down casually by runtime PM. + +This patch tries to address the issue. It gives two things: +- implement the separate reboot_notify hook to struct alc_spec, and + call it optionally if defined. +- turn off the codec to D3 for Thinkpad models via this new callback + +Bugzilla: https://bugzilla.suse.com/show_bug.cgi?id=958439 +Reported-and-tested-by: Benjamin Poirier +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 23 ++++++++++++++++++++++- + 1 file changed, 22 insertions(+), 1 deletion(-) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -111,6 +111,7 @@ struct alc_spec { + void (*power_hook)(struct hda_codec *codec); + #endif + void (*shutup)(struct hda_codec *codec); ++ void (*reboot_notify)(struct hda_codec *codec); + + int init_amp; + int codec_variant; /* flag for other variants */ +@@ -773,6 +774,25 @@ static inline void alc_shutup(struct hda + snd_hda_shutup_pins(codec); + } + ++static void alc_reboot_notify(struct hda_codec *codec) ++{ ++ struct alc_spec *spec = codec->spec; ++ ++ if (spec && spec->reboot_notify) ++ spec->reboot_notify(codec); ++ else ++ alc_shutup(codec); ++} ++ ++/* power down codec to D3 at reboot/shutdown; set as reboot_notify ops */ ++static void alc_d3_at_reboot(struct hda_codec *codec) ++{ ++ snd_hda_codec_set_power_to_all(codec, codec->core.afg, AC_PWRST_D3); ++ snd_hda_codec_write(codec, codec->core.afg, 0, ++ AC_VERB_SET_POWER_STATE, AC_PWRST_D3); ++ msleep(10); ++} ++ + #define alc_free snd_hda_gen_free + + #ifdef CONFIG_PM +@@ -818,7 +838,7 @@ static const struct hda_codec_ops alc_pa + .suspend = alc_suspend, + .check_power_status = snd_hda_gen_check_power_status, + #endif +- .reboot_notify = alc_shutup, ++ .reboot_notify = alc_reboot_notify, + }; + + +@@ -4209,6 +4229,7 @@ static void alc_fixup_tpt440_dock(struct + + if (action == HDA_FIXUP_ACT_PRE_PROBE) { + spec->shutup = alc_no_shutup; /* reduce click noise */ ++ spec->reboot_notify = alc_d3_at_reboot; /* reduce noise */ + spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP; + codec->power_save_node = 0; /* avoid click noises */ + snd_hda_apply_pincfgs(codec, pincfgs); diff --git a/queue-4.3/alsa-hda-set-skl-hda-controller-power-at-freeze-and-thaw.patch b/queue-4.3/alsa-hda-set-skl-hda-controller-power-at-freeze-and-thaw.patch new file mode 100644 index 00000000000..fd8868cf044 --- /dev/null +++ b/queue-4.3/alsa-hda-set-skl-hda-controller-power-at-freeze-and-thaw.patch @@ -0,0 +1,85 @@ +From 3e6db33aaf1d42a30339f831ec4850570d6cc7a3 Mon Sep 17 00:00:00 2001 +From: Xiong Zhang +Date: Fri, 18 Dec 2015 13:29:18 +0800 +Subject: ALSA: hda - Set SKL+ hda controller power at freeze() and thaw() + +From: Xiong Zhang + +commit 3e6db33aaf1d42a30339f831ec4850570d6cc7a3 upstream. + +It takes three minutes to enter into hibernation on some OEM SKL +machines and we see many codec spurious response after thaw() opertion. +This is because HDA is still in D0 state after freeze() call and +pci_pm_freeze/pci_pm_freeze_noirq() don't set D3 hot in pci_bus driver. +It seems bios still access HDA when system enter into freeze state, +HDA will receive codec response interrupt immediately after thaw() call. +Because of this unexpected interrupt, HDA enter into a abnormal +state and slow down the system enter into hibernation. + +In this patch, we put HDA into D3 hot state in azx_freeze_noirq() and +put HDA into D0 state in azx_thaw_noirq(). + +V2: Only apply this fix to SKL+ + Fix compile error when CONFIG_PM_SLEEP isn't defined + +[Yet another fix for CONFIG_PM_SLEEP ifdef and the additional comment + by tiwai] + +Signed-off-by: Xiong Zhang +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/hda_intel.c | 34 ++++++++++++++++++++++++++++++++++ + 1 file changed, 34 insertions(+) + +--- a/sound/pci/hda/hda_intel.c ++++ b/sound/pci/hda/hda_intel.c +@@ -927,6 +927,36 @@ static int azx_resume(struct device *dev + } + #endif /* CONFIG_PM_SLEEP || SUPPORT_VGA_SWITCHEROO */ + ++#ifdef CONFIG_PM_SLEEP ++/* put codec down to D3 at hibernation for Intel SKL+; ++ * otherwise BIOS may still access the codec and screw up the driver ++ */ ++#define IS_SKL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa170) ++#define IS_SKL_LP(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x9d70) ++#define IS_BXT(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x5a98) ++#define IS_SKL_PLUS(pci) (IS_SKL(pci) || IS_SKL_LP(pci) || IS_BXT(pci)) ++ ++static int azx_freeze_noirq(struct device *dev) ++{ ++ struct pci_dev *pci = to_pci_dev(dev); ++ ++ if (IS_SKL_PLUS(pci)) ++ pci_set_power_state(pci, PCI_D3hot); ++ ++ return 0; ++} ++ ++static int azx_thaw_noirq(struct device *dev) ++{ ++ struct pci_dev *pci = to_pci_dev(dev); ++ ++ if (IS_SKL_PLUS(pci)) ++ pci_set_power_state(pci, PCI_D0); ++ ++ return 0; ++} ++#endif /* CONFIG_PM_SLEEP */ ++ + #ifdef CONFIG_PM + static int azx_runtime_suspend(struct device *dev) + { +@@ -1036,6 +1066,10 @@ static int azx_runtime_idle(struct devic + + static const struct dev_pm_ops azx_pm = { + SET_SYSTEM_SLEEP_PM_OPS(azx_suspend, azx_resume) ++#ifdef CONFIG_PM_SLEEP ++ .freeze_noirq = azx_freeze_noirq, ++ .thaw_noirq = azx_thaw_noirq, ++#endif + SET_RUNTIME_PM_OPS(azx_runtime_suspend, azx_runtime_resume, azx_runtime_idle) + }; + diff --git a/queue-4.3/alsa-hda-skip-eld-notification-during-system-suspend.patch b/queue-4.3/alsa-hda-skip-eld-notification-during-system-suspend.patch new file mode 100644 index 00000000000..0cbd4511c85 --- /dev/null +++ b/queue-4.3/alsa-hda-skip-eld-notification-during-system-suspend.patch @@ -0,0 +1,69 @@ +From 8ae743e82f0b86f3b860c27fc2c8f574cf959fd0 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Fri, 27 Nov 2015 14:23:00 +0100 +Subject: ALSA: hda - Skip ELD notification during system suspend + +From: Takashi Iwai + +commit 8ae743e82f0b86f3b860c27fc2c8f574cf959fd0 upstream. + +The recent addition of ELD notifier for Intel HDMI/DP codec may lead +the bad codec connection found as kernel messages like below: + Suspending console(s) (use no_console_suspend to debug) + hdmi_present_sense: snd_hda_codec_hdmi hdaudioC0D2: HDMI status: Codec=2 Pin=6 Presence_Detect=1 ELD_Valid=1 + snd_hda_intel 0000:00:1f.3: spurious response 0x0:0x2, last cmd=0x206f2e08 + snd_hda_intel 0000:00:1f.3: spurious response 0x0:0x2, last cmd=0x206f2e08 + .... + snd_hda_codec_hdmi hdaudioC0D2: HDMI: ELD buf size is 0, force 128 + snd_hda_intel 0000:00:1f.3: azx_get_response timeout, switching to polling mode: last cmd=0x206f2f00 + snd_hda_intel 0000:00:1f.3: No response from codec, disabling MSI: last cmd=0x206f2f00 + snd_hda_intel 0000:00:1f.3: azx_get_response timeout, switching to single_cmd mode: last cmd=0x206f2f00 + azx_single_wait_for_response: 42 callbacks suppressed + +This seems appearing when the sound driver went to suspend before i915 +driver. Then i915 driver disables HDMI/DP audio bit and calls the +registered notifier, and the HDA codec tries to handle it as a +hot(un)plug. But since the driver is already in the suspended state, +it fails miserably. + +As this is a sort of spurious wakeup, it can be ignored safely, as +long as it's delivered during the system suspend. OTOH, if a +notification comes during the runtime suspend, the situation is +different: we need to wake up. But during the system suspend, such a +notification can't be the reason for a wakeup. + +This patch addresses it by a simple check of the current sound card +status. The skipped notification doesn't matter because the HDA +driver will check the plugged status forcibly at the resume in +return. + +Then, why the card status, not a runtime PM status or else? The HDA +controller driver is supposed to set the card status to D3 at the +system suspend but not at the runtime suspend. So we can see it as a +flag that is set only for the system suspend. Admittedly, it's a bit +ugly, but it should work well for now. + +Reported-and-tested-by: "Zhang, Xiong Y" +Fixes: 25adc137c546 ('ALSA: hda - Wake the codec up on pin/ELD notify events') +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_hdmi.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/sound/pci/hda/patch_hdmi.c ++++ b/sound/pci/hda/patch_hdmi.c +@@ -2330,6 +2330,12 @@ static void intel_pin_eld_notify(void *a + struct hda_codec *codec = audio_ptr; + int pin_nid = port + 0x04; + ++ /* skip notification during system suspend (but not in runtime PM); ++ * the state will be updated at resume ++ */ ++ if (snd_power_get_state(codec->card) != SNDRV_CTL_POWER_D0) ++ return; ++ + check_presence_and_report(codec, pin_nid); + } + diff --git a/queue-4.3/alsa-rme96-fix-unexpected-volume-reset-after-rate-changes.patch b/queue-4.3/alsa-rme96-fix-unexpected-volume-reset-after-rate-changes.patch new file mode 100644 index 00000000000..65c282e5301 --- /dev/null +++ b/queue-4.3/alsa-rme96-fix-unexpected-volume-reset-after-rate-changes.patch @@ -0,0 +1,107 @@ +From a74a821624c0c75388a193337babd17a8c02c740 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Fri, 4 Dec 2015 16:44:24 +0100 +Subject: ALSA: rme96: Fix unexpected volume reset after rate changes + +From: Takashi Iwai + +commit a74a821624c0c75388a193337babd17a8c02c740 upstream. + +rme96 driver needs to reset DAC depending on the sample rate, and this +results in resetting to the max volume suddenly. It's because of the +missing call of snd_rme96_apply_dac_volume(). + +However, calling this function right after the DAC reset still may not +work, and we need some delay before this call. Since the DAC reset +and the procedure after that are performed in the spinlock, we delay +the DAC volume restore at the end after the spinlock. + +Reported-and-tested-by: Sylvain LABOISNE +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/rme96.c | 41 ++++++++++++++++++++++++++--------------- + 1 file changed, 26 insertions(+), 15 deletions(-) + +--- a/sound/pci/rme96.c ++++ b/sound/pci/rme96.c +@@ -741,10 +741,11 @@ snd_rme96_playback_setrate(struct rme96 + { + /* change to/from double-speed: reset the DAC (if available) */ + snd_rme96_reset_dac(rme96); ++ return 1; /* need to restore volume */ + } else { + writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER); ++ return 0; + } +- return 0; + } + + static int +@@ -980,6 +981,7 @@ snd_rme96_playback_hw_params(struct snd_ + struct rme96 *rme96 = snd_pcm_substream_chip(substream); + struct snd_pcm_runtime *runtime = substream->runtime; + int err, rate, dummy; ++ bool apply_dac_volume = false; + + runtime->dma_area = (void __force *)(rme96->iobase + + RME96_IO_PLAY_BUFFER); +@@ -993,24 +995,26 @@ snd_rme96_playback_hw_params(struct snd_ + { + /* slave clock */ + if ((int)params_rate(params) != rate) { +- spin_unlock_irq(&rme96->lock); +- return -EIO; +- } +- } else if ((err = snd_rme96_playback_setrate(rme96, params_rate(params))) < 0) { +- spin_unlock_irq(&rme96->lock); +- return err; +- } +- if ((err = snd_rme96_playback_setformat(rme96, params_format(params))) < 0) { +- spin_unlock_irq(&rme96->lock); +- return err; ++ err = -EIO; ++ goto error; ++ } ++ } else { ++ err = snd_rme96_playback_setrate(rme96, params_rate(params)); ++ if (err < 0) ++ goto error; ++ apply_dac_volume = err > 0; /* need to restore volume later? */ + } ++ ++ err = snd_rme96_playback_setformat(rme96, params_format(params)); ++ if (err < 0) ++ goto error; + snd_rme96_setframelog(rme96, params_channels(params), 1); + if (rme96->capture_periodsize != 0) { + if (params_period_size(params) << rme96->playback_frlog != + rme96->capture_periodsize) + { +- spin_unlock_irq(&rme96->lock); +- return -EBUSY; ++ err = -EBUSY; ++ goto error; + } + } + rme96->playback_periodsize = +@@ -1021,9 +1025,16 @@ snd_rme96_playback_hw_params(struct snd_ + rme96->wcreg &= ~(RME96_WCR_PRO | RME96_WCR_DOLBY | RME96_WCR_EMP); + writel(rme96->wcreg |= rme96->wcreg_spdif_stream, rme96->iobase + RME96_IO_CONTROL_REGISTER); + } ++ ++ err = 0; ++ error: + spin_unlock_irq(&rme96->lock); +- +- return 0; ++ if (apply_dac_volume) { ++ usleep_range(3000, 10000); ++ snd_rme96_apply_dac_volume(rme96); ++ } ++ ++ return err; + } + + static int diff --git a/queue-4.3/alsa-usb-audio-add-a-more-accurate-volume-quirk-for-audioquest-dragonfly.patch b/queue-4.3/alsa-usb-audio-add-a-more-accurate-volume-quirk-for-audioquest-dragonfly.patch new file mode 100644 index 00000000000..ba87d1f61f1 --- /dev/null +++ b/queue-4.3/alsa-usb-audio-add-a-more-accurate-volume-quirk-for-audioquest-dragonfly.patch @@ -0,0 +1,146 @@ +From 42e3121d90f42e57f6dbd6083dff2f57b3ec7daa Mon Sep 17 00:00:00 2001 +From: Anssi Hannula +Date: Sun, 13 Dec 2015 20:49:58 +0200 +Subject: ALSA: usb-audio: Add a more accurate volume quirk for AudioQuest DragonFly + +From: Anssi Hannula + +commit 42e3121d90f42e57f6dbd6083dff2f57b3ec7daa upstream. + +AudioQuest DragonFly DAC reports a volume control range of 0..50 +(0x0000..0x0032) which in USB Audio means a range of 0 .. 0.2dB, which +is obviously incorrect and would cause software using the dB information +in e.g. volume sliders to have a massive volume difference in 100..102% +range. + +Commit 2d1cb7f658fb ("ALSA: usb-audio: add dB range mapping for some +devices") added a dB range mapping for it with range 0..50 dB. + +However, the actual volume mapping seems to be neither linear volume nor +linear dB scale, but instead quite close to the cubic mapping e.g. +alsamixer uses, with a range of approx. -53...0 dB. + +Replace the previous quirk with a custom dB mapping based on some basic +output measurements, using a 10-item range TLV (which will still fit in +alsa-lib MAX_TLV_RANGE_SIZE). + +Tested on AudioQuest DragonFly HW v1.2. The quirk is only applied if the +range is 0..50, so if this gets fixed/changed in later HW revisions it +will no longer be applied. + +v2: incorporated Takashi Iwai's suggestion for the quirk application +method + +Signed-off-by: Anssi Hannula +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/usb/mixer.c | 2 ++ + sound/usb/mixer_maps.c | 12 ------------ + sound/usb/mixer_quirks.c | 37 +++++++++++++++++++++++++++++++++++++ + sound/usb/mixer_quirks.h | 4 ++++ + 4 files changed, 43 insertions(+), 12 deletions(-) + +--- a/sound/usb/mixer.c ++++ b/sound/usb/mixer.c +@@ -1354,6 +1354,8 @@ static void build_feature_ctl(struct mix + } + } + ++ snd_usb_mixer_fu_apply_quirk(state->mixer, cval, unitid, kctl); ++ + range = (cval->max - cval->min) / cval->res; + /* + * Are there devices with volume range more than 255? I use a bit more +--- a/sound/usb/mixer_maps.c ++++ b/sound/usb/mixer_maps.c +@@ -348,13 +348,6 @@ static struct usbmix_name_map bose_compa + { 0 } /* terminator */ + }; + +-/* Dragonfly DAC 1.2, the dB conversion factor is 1 instead of 256 */ +-static struct usbmix_dB_map dragonfly_1_2_dB = {0, 5000}; +-static struct usbmix_name_map dragonfly_1_2_map[] = { +- { 7, NULL, .dB = &dragonfly_1_2_dB }, +- { 0 } /* terminator */ +-}; +- + /* + * Control map entries + */ +@@ -470,11 +463,6 @@ static struct usbmix_ctl_map usbmix_ctl_ + .id = USB_ID(0x05a7, 0x1020), + .map = bose_companion5_map, + }, +- { +- /* Dragonfly DAC 1.2 */ +- .id = USB_ID(0x21b4, 0x0081), +- .map = dragonfly_1_2_map, +- }, + { 0 } /* terminator */ + }; + +--- a/sound/usb/mixer_quirks.c ++++ b/sound/usb/mixer_quirks.c +@@ -37,6 +37,7 @@ + #include + #include + #include ++#include + + #include "usbaudio.h" + #include "mixer.h" +@@ -1824,4 +1825,40 @@ void snd_usb_mixer_rc_memory_change(stru + break; + } + } ++ ++static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer, ++ struct snd_kcontrol *kctl) ++{ ++ /* Approximation using 10 ranges based on output measurement on hw v1.2. ++ * This seems close to the cubic mapping e.g. alsamixer uses. */ ++ static const DECLARE_TLV_DB_RANGE(scale, ++ 0, 1, TLV_DB_MINMAX_ITEM(-5300, -4970), ++ 2, 5, TLV_DB_MINMAX_ITEM(-4710, -4160), ++ 6, 7, TLV_DB_MINMAX_ITEM(-3884, -3710), ++ 8, 14, TLV_DB_MINMAX_ITEM(-3443, -2560), ++ 15, 16, TLV_DB_MINMAX_ITEM(-2475, -2324), ++ 17, 19, TLV_DB_MINMAX_ITEM(-2228, -2031), ++ 20, 26, TLV_DB_MINMAX_ITEM(-1910, -1393), ++ 27, 31, TLV_DB_MINMAX_ITEM(-1322, -1032), ++ 32, 40, TLV_DB_MINMAX_ITEM(-968, -490), ++ 41, 50, TLV_DB_MINMAX_ITEM(-441, 0), ++ ); ++ ++ usb_audio_info(mixer->chip, "applying DragonFly dB scale quirk\n"); ++ kctl->tlv.p = scale; ++ kctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ; ++ kctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK; ++} ++ ++void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer, ++ struct usb_mixer_elem_info *cval, int unitid, ++ struct snd_kcontrol *kctl) ++{ ++ switch (mixer->chip->usb_id) { ++ case USB_ID(0x21b4, 0x0081): /* AudioQuest DragonFly */ ++ if (unitid == 7 && cval->min == 0 && cval->max == 50) ++ snd_dragonfly_quirk_db_scale(mixer, kctl); ++ break; ++ } ++} + +--- a/sound/usb/mixer_quirks.h ++++ b/sound/usb/mixer_quirks.h +@@ -9,5 +9,9 @@ void snd_emuusb_set_samplerate(struct sn + void snd_usb_mixer_rc_memory_change(struct usb_mixer_interface *mixer, + int unitid); + ++void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer, ++ struct usb_mixer_elem_info *cval, int unitid, ++ struct snd_kcontrol *kctl); ++ + #endif /* SND_USB_MIXER_QUIRKS_H */ + diff --git a/queue-4.3/alsa-usb-audio-add-sample-rate-inquiry-quirk-for-audioquest-dragonfly.patch b/queue-4.3/alsa-usb-audio-add-sample-rate-inquiry-quirk-for-audioquest-dragonfly.patch new file mode 100644 index 00000000000..48b498e65ec --- /dev/null +++ b/queue-4.3/alsa-usb-audio-add-sample-rate-inquiry-quirk-for-audioquest-dragonfly.patch @@ -0,0 +1,31 @@ +From 12a6116e66695a728bcb9616416c508ce9c051a1 Mon Sep 17 00:00:00 2001 +From: Anssi Hannula +Date: Sun, 13 Dec 2015 20:49:59 +0200 +Subject: ALSA: usb-audio: Add sample rate inquiry quirk for AudioQuest DragonFly + +From: Anssi Hannula + +commit 12a6116e66695a728bcb9616416c508ce9c051a1 upstream. + +Avoid getting sample rate on AudioQuest DragonFly as it is unsupported +and causes noisy "cannot get freq at ep 0x1" messages when playback +starts. + +Signed-off-by: Anssi Hannula +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/usb/quirks.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/sound/usb/quirks.c ++++ b/sound/usb/quirks.c +@@ -1122,6 +1122,7 @@ bool snd_usb_get_sample_rate_quirk(struc + case USB_ID(0x045E, 0x0779): /* MS Lifecam HD-3000 */ + case USB_ID(0x04D8, 0xFEEA): /* Benchmark DAC1 Pre */ + case USB_ID(0x074D, 0x3553): /* Outlaw RR2150 (Micronas UAC3553B) */ ++ case USB_ID(0x21B4, 0x0081): /* AudioQuest DragonFly */ + return true; + } + return false; diff --git a/queue-4.3/series b/queue-4.3/series index 47db68c2b3a..131d4fb47d5 100644 --- a/queue-4.3/series +++ b/queue-4.3/series @@ -24,3 +24,24 @@ alsa-hda-fix-lost-4k-bdl-boundary-workaround.patch alsa-hda-add-intel-lewisburg-device-ids-audio.patch alsa-hda-apply-pin-fixup-for-hp-probook-6550b.patch alsa-fireworks-bebob-oxfw-dice-enable-to-make-as-built-in.patch +alsa-hda-apply-hp-headphone-fixups-more-generically.patch +alsa-hda-fix-noise-on-dell-latitude-e6440.patch +alsa-hda-add-fixup-for-acer-aspire-one-cloudbook-14.patch +alsa-hda-fix-headphone-noise-after-dell-xps-13-resume-back-from-s3.patch +alsa-hda-fix-noise-on-gigabyte-z170x-mobo.patch +alsa-hda-skip-eld-notification-during-system-suspend.patch +alsa-rme96-fix-unexpected-volume-reset-after-rate-changes.patch +alsa-hda-add-inverted-dmic-for-packard-bell-dots.patch +alsa-hda-fixing-speaker-noise-on-the-two-latest-thinkpad-models.patch +alsa-hda-fix-noise-problems-on-thinkpad-t440s.patch +alsa-hda-ca0132-quirk-for-alienware-17-2015.patch +alsa-hda-add-a-fixup-for-thinkpad-x1-carbon-2nd.patch +alsa-hda-apply-click-noise-workaround-for-thinkpads-generically.patch +alsa-hda-fix-headphone-mic-input-on-a-few-dell-alc293-machines.patch +alsa-hda-set-codec-to-d3-at-reboot-shutdown-on-thinkpads.patch +alsa-usb-audio-add-a-more-accurate-volume-quirk-for-audioquest-dragonfly.patch +alsa-usb-audio-add-sample-rate-inquiry-quirk-for-audioquest-dragonfly.patch +alsa-hda-set-skl-hda-controller-power-at-freeze-and-thaw.patch +alsa-hda-realtek-fix-silent-headphone-output-on-macpro-4-1-v2.patch +alsa-hda-add-mic-mute-hotkey-quirk-for-lenovo-thinkcentre-aio.patch +alsa-hda-add-keycode-map-for-alc-input-device.patch