Commit d5fcaaba authored by Paweł Harłoziński's avatar Paweł Harłoziński Committed by Mark Brown

ASoC: Intel: Skylake: Use recommended SDxFMT programming sequence

For BXT platforms, the recommended sequence to program the SDxFMT is to
first couple the stream, write the format and decouple again.
For all other platforms said sequence remains unchanged.

To prevent code duplication, IS_BXT (and consequently IS_CFL) macro is
relocated to hda_codec.h file so it can be accessed by SKL driver.
Signed-off-by: default avatarPaweł Harłoziński <pawel.harlozinski@intel.com>
Signed-off-by: default avatarCezary Rojewski <cezary.rojewski@intel.com>
Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 24043d60
...@@ -31,6 +31,9 @@ ...@@ -31,6 +31,9 @@
#include <sound/hda_verbs.h> #include <sound/hda_verbs.h>
#include <sound/hda_regmap.h> #include <sound/hda_regmap.h>
#define IS_BXT(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x5a98)
#define IS_CFL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa348)
/* /*
* Structures * Structures
*/ */
......
...@@ -373,9 +373,6 @@ enum { ...@@ -373,9 +373,6 @@ enum {
((pci)->device == 0x0d0c) || \ ((pci)->device == 0x0d0c) || \
((pci)->device == 0x160c)) ((pci)->device == 0x160c))
#define IS_BXT(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x5a98)
#define IS_CFL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa348)
static char *driver_short_names[] = { static char *driver_short_names[] = {
[AZX_DRIVER_ICH] = "HDA Intel", [AZX_DRIVER_ICH] = "HDA Intel",
[AZX_DRIVER_PCH] = "HDA Intel PCH", [AZX_DRIVER_PCH] = "HDA Intel PCH",
......
...@@ -141,6 +141,7 @@ static void skl_set_suspend_active(struct snd_pcm_substream *substream, ...@@ -141,6 +141,7 @@ static void skl_set_suspend_active(struct snd_pcm_substream *substream,
int skl_pcm_host_dma_prepare(struct device *dev, struct skl_pipe_params *params) int skl_pcm_host_dma_prepare(struct device *dev, struct skl_pipe_params *params)
{ {
struct hdac_bus *bus = dev_get_drvdata(dev); struct hdac_bus *bus = dev_get_drvdata(dev);
struct skl *skl = bus_to_skl(bus);
unsigned int format_val; unsigned int format_val;
struct hdac_stream *hstream; struct hdac_stream *hstream;
struct hdac_ext_stream *stream; struct hdac_ext_stream *stream;
...@@ -165,7 +166,18 @@ int skl_pcm_host_dma_prepare(struct device *dev, struct skl_pipe_params *params) ...@@ -165,7 +166,18 @@ int skl_pcm_host_dma_prepare(struct device *dev, struct skl_pipe_params *params)
if (err < 0) if (err < 0)
return err; return err;
/*
* The recommended SDxFMT programming sequence for BXT
* platforms is to couple the stream before writing the format
*/
if (IS_BXT(skl->pci)) {
snd_hdac_ext_stream_decouple(bus, stream, false);
err = snd_hdac_stream_setup(hdac_stream(stream)); err = snd_hdac_stream_setup(hdac_stream(stream));
snd_hdac_ext_stream_decouple(bus, stream, true);
} else {
err = snd_hdac_stream_setup(hdac_stream(stream));
}
if (err < 0) if (err < 0)
return err; return err;
......
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