Commit 7a1954de authored by Cezary Rojewski's avatar Cezary Rojewski Committed by Mark Brown

ASoC: Intel: Skylake: Fix incorrect capture position reporting

HW recommends to set DUM bit on device power up, so that DPIB write
request occurs every frame regardless of whether DPIB has changed or
not. This addresses incorrect position reporting for capture streams.
Signed-off-by: default avatarLeoni Prodduvaka <leoni.prodduvaka@intel.com>
Signed-off-by: default avatarCezary Rojewski <cezary.rojewski@intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 3e802e90
...@@ -192,6 +192,25 @@ void skl_update_d0i3c(struct device *dev, bool enable) ...@@ -192,6 +192,25 @@ void skl_update_d0i3c(struct device *dev, bool enable)
snd_hdac_chip_readb(bus, VS_D0I3C)); snd_hdac_chip_readb(bus, VS_D0I3C));
} }
/**
* skl_dum_set - set DUM bit in EM2 register
* @bus: HD-audio core bus
*
* Addresses incorrect position reporting for capture streams.
* Used on device power up.
*/
static void skl_dum_set(struct hdac_bus *bus)
{
/* For the DUM bit to be set, CRST needs to be out of reset state */
if (!(snd_hdac_chip_readb(bus, GCTL) & AZX_GCTL_RESET)) {
skl_enable_miscbdcge(bus->dev, false);
snd_hdac_bus_exit_link_reset(bus);
skl_enable_miscbdcge(bus->dev, true);
}
snd_hdac_chip_updatel(bus, VS_EM2, AZX_VS_EM2_DUM, AZX_VS_EM2_DUM);
}
/* called from IRQ */ /* called from IRQ */
static void skl_stream_update(struct hdac_bus *bus, struct hdac_stream *hstr) static void skl_stream_update(struct hdac_bus *bus, struct hdac_stream *hstr)
{ {
...@@ -299,6 +318,7 @@ static int _skl_resume(struct hdac_bus *bus) ...@@ -299,6 +318,7 @@ static int _skl_resume(struct hdac_bus *bus)
struct skl *skl = bus_to_skl(bus); struct skl *skl = bus_to_skl(bus);
skl_init_pci(skl); skl_init_pci(skl);
skl_dum_set(bus);
skl_init_chip(bus, true); skl_init_chip(bus, true);
return skl_resume_dsp(skl); return skl_resume_dsp(skl);
...@@ -956,6 +976,7 @@ static int skl_first_init(struct hdac_bus *bus) ...@@ -956,6 +976,7 @@ static int skl_first_init(struct hdac_bus *bus)
/* initialize chip */ /* initialize chip */
skl_init_pci(skl); skl_init_pci(skl);
skl_dum_set(bus);
return skl_init_chip(bus, true); return skl_init_chip(bus, true);
} }
......
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
#define DMA_TRANSMITION_START 2 #define DMA_TRANSMITION_START 2
#define DMA_TRANSMITION_STOP 3 #define DMA_TRANSMITION_STOP 3
#define AZX_VS_EM2_DUM BIT(23)
#define AZX_REG_VS_EM2_L1SEN BIT(13) #define AZX_REG_VS_EM2_L1SEN BIT(13)
struct skl_dsp_resource { struct skl_dsp_resource {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment