|
@@ -355,6 +355,8 @@ enum {
|
|
|
((pci)->device == 0x0d0c) || \
|
|
|
((pci)->device == 0x160c))
|
|
|
|
|
|
+#define IS_BROXTON(pci) ((pci)->device == 0x5a98)
|
|
|
+
|
|
|
static char *driver_short_names[] = {
|
|
|
[AZX_DRIVER_ICH] = "HDA Intel",
|
|
|
[AZX_DRIVER_PCH] = "HDA Intel PCH",
|
|
@@ -506,15 +508,36 @@ static void azx_init_pci(struct azx *chip)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * In BXT-P A0, HD-Audio DMA requests is later than expected,
|
|
|
+ * and makes an audio stream sensitive to system latencies when
|
|
|
+ * 24/32 bits are playing.
|
|
|
+ * Adjusting threshold of DMA fifo to force the DMA request
|
|
|
+ * sooner to improve latency tolerance at the expense of power.
|
|
|
+ */
|
|
|
+static void bxt_reduce_dma_latency(struct azx *chip)
|
|
|
+{
|
|
|
+ u32 val;
|
|
|
+
|
|
|
+ val = azx_readl(chip, SKL_EM4L);
|
|
|
+ val &= (0x3 << 20);
|
|
|
+ azx_writel(chip, SKL_EM4L, val);
|
|
|
+}
|
|
|
+
|
|
|
static void hda_intel_init_chip(struct azx *chip, bool full_reset)
|
|
|
{
|
|
|
struct hdac_bus *bus = azx_bus(chip);
|
|
|
+ struct pci_dev *pci = chip->pci;
|
|
|
|
|
|
if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
|
|
|
snd_hdac_set_codec_wakeup(bus, true);
|
|
|
azx_init_chip(chip, full_reset);
|
|
|
if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
|
|
|
snd_hdac_set_codec_wakeup(bus, false);
|
|
|
+
|
|
|
+ /* reduce dma latency to avoid noise */
|
|
|
+ if (IS_BROXTON(pci))
|
|
|
+ bxt_reduce_dma_latency(chip);
|
|
|
}
|
|
|
|
|
|
/* calculate runtime delay from LPIB */
|