ALSA: hda - Fix playback noise with 24/32 bit sample size on BXT
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. v2: move Intel specific code to hda_intel.c Signed-off-by: Lu, Han <han.lu@intel.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
a74a821624
commit
7c23b7c199
|
@ -93,6 +93,9 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
|
|||
#define AZX_REG_HSW_EM4 0x100c
|
||||
#define AZX_REG_HSW_EM5 0x1010
|
||||
|
||||
/* Skylake/Broxton display HD-A controller Extended Mode registers */
|
||||
#define AZX_REG_SKL_EM4L 0x1040
|
||||
|
||||
/* PCI space */
|
||||
#define AZX_PCIREG_TCSEL 0x44
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue