aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2016-02-22 09:18:13 -0500
committerTakashi Iwai <tiwai@suse.de>2016-02-22 11:13:48 -0500
commit7e31a0159461818a1bda49662921b98a29c1187b (patch)
tree174862aff07c916328c2d36cef4ab85e6a0ccce4 /sound/pci/hda
parent67ec1072b053c15564e6090ab30127895dc77a89 (diff)
ALSA: hda - Apply clock gate workaround to Skylake, too
Some Skylake machines show the codec probe errors in certain situations, e.g. HP Z240 desktop fails to probe the onboard Realtek codec at reloading the snd-hda-intel module like: snd_hda_intel 0000:00:1f.3: spurious response 0x200:0x2, last cmd=0x000000 snd_hda_intel 0000:00:1f.3: azx_get_response timeout, switching to polling mode: lastcmd=0x000f0000 snd_hda_intel 0000:00:1f.3: No response from codec, disabling MSI: last cmd=0x000f0000 snd_hda_intel 0000:00:1f.3: Codec #0 probe error; disabling it... hdaudio hdaudioC0D2: no AFG or MFG node found snd_hda_intel 0000:00:1f.3: no codecs initialized Also, HP G470 G3 suffers from the similar problem, as reported in bugzilla below. On this machine, the codec probe error appears even at a fresh boot. As Libin suggested, the same workaround used for Broxton in the commit [6639484ddaf6: ALSA: hda - disable dynamic clock gating on Broxton before reset] can be applied for Skylake in order to fix this problem. The Intel HW team also confirmed that this is needed for SKL. This patch makes the workaround applied to both SKL and BXT platforms. The referred macros are moved and one superfluous macro (IS_BROXTON()) is another one (IS_BXT()) as well. Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=112731 Suggested-by: Libin Yang <libin.yang@linux.intel.com> Cc: <stable@vger.kernel.org> # v4.4+ Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/hda')
-rw-r--r--sound/pci/hda/hda_intel.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index ce6b97f31390..e5240cb3749f 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -363,7 +363,10 @@ enum {
363 ((pci)->device == 0x0d0c) || \ 363 ((pci)->device == 0x0d0c) || \
364 ((pci)->device == 0x160c)) 364 ((pci)->device == 0x160c))
365 365
366#define IS_BROXTON(pci) ((pci)->device == 0x5a98) 366#define IS_SKL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa170)
367#define IS_SKL_LP(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x9d70)
368#define IS_BXT(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x5a98)
369#define IS_SKL_PLUS(pci) (IS_SKL(pci) || IS_SKL_LP(pci) || IS_BXT(pci))
367 370
368static char *driver_short_names[] = { 371static char *driver_short_names[] = {
369 [AZX_DRIVER_ICH] = "HDA Intel", 372 [AZX_DRIVER_ICH] = "HDA Intel",
@@ -540,13 +543,13 @@ static void hda_intel_init_chip(struct azx *chip, bool full_reset)
540 543
541 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) 544 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
542 snd_hdac_set_codec_wakeup(bus, true); 545 snd_hdac_set_codec_wakeup(bus, true);
543 if (IS_BROXTON(pci)) { 546 if (IS_SKL_PLUS(pci)) {
544 pci_read_config_dword(pci, INTEL_HDA_CGCTL, &val); 547 pci_read_config_dword(pci, INTEL_HDA_CGCTL, &val);
545 val = val & ~INTEL_HDA_CGCTL_MISCBDCGE; 548 val = val & ~INTEL_HDA_CGCTL_MISCBDCGE;
546 pci_write_config_dword(pci, INTEL_HDA_CGCTL, val); 549 pci_write_config_dword(pci, INTEL_HDA_CGCTL, val);
547 } 550 }
548 azx_init_chip(chip, full_reset); 551 azx_init_chip(chip, full_reset);
549 if (IS_BROXTON(pci)) { 552 if (IS_SKL_PLUS(pci)) {
550 pci_read_config_dword(pci, INTEL_HDA_CGCTL, &val); 553 pci_read_config_dword(pci, INTEL_HDA_CGCTL, &val);
551 val = val | INTEL_HDA_CGCTL_MISCBDCGE; 554 val = val | INTEL_HDA_CGCTL_MISCBDCGE;
552 pci_write_config_dword(pci, INTEL_HDA_CGCTL, val); 555 pci_write_config_dword(pci, INTEL_HDA_CGCTL, val);
@@ -555,7 +558,7 @@ static void hda_intel_init_chip(struct azx *chip, bool full_reset)
555 snd_hdac_set_codec_wakeup(bus, false); 558 snd_hdac_set_codec_wakeup(bus, false);
556 559
557 /* reduce dma latency to avoid noise */ 560 /* reduce dma latency to avoid noise */
558 if (IS_BROXTON(pci)) 561 if (IS_BXT(pci))
559 bxt_reduce_dma_latency(chip); 562 bxt_reduce_dma_latency(chip);
560} 563}
561 564
@@ -977,11 +980,6 @@ static int azx_resume(struct device *dev)
977/* put codec down to D3 at hibernation for Intel SKL+; 980/* put codec down to D3 at hibernation for Intel SKL+;
978 * otherwise BIOS may still access the codec and screw up the driver 981 * otherwise BIOS may still access the codec and screw up the driver
979 */ 982 */
980#define IS_SKL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa170)
981#define IS_SKL_LP(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x9d70)
982#define IS_BXT(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x5a98)
983#define IS_SKL_PLUS(pci) (IS_SKL(pci) || IS_SKL_LP(pci) || IS_BXT(pci))
984
985static int azx_freeze_noirq(struct device *dev) 983static int azx_freeze_noirq(struct device *dev)
986{ 984{
987 struct pci_dev *pci = to_pci_dev(dev); 985 struct pci_dev *pci = to_pci_dev(dev);