ASoC: Intel: Skylake: Use recommended SDxFMT programming sequence
authorPaweł Harłoziński <pawel.harlozinski@intel.com>
Thu, 13 Jun 2019 19:04:31 +0000 (21:04 +0200)
committerMark Brown <broonie@kernel.org>
Tue, 25 Jun 2019 14:32:36 +0000 (15:32 +0100)
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: Paweł Harłoziński <pawel.harlozinski@intel.com>
Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/hda_codec.h
sound/pci/hda/hda_intel.c
sound/soc/intel/skylake/skl-pcm.c

index cc7c8d42d4fd9a8a494f6b0cf59d48a8fbf2f902..ad46a082b00f76cf58b766ccf62e6cc123aea648 100644 (file)
@@ -31,6 +31,9 @@
 #include <sound/hda_verbs.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
  */
index 0741eae23f1053bfb7030f41eb2ec6764a463e3d..07144bcc70591e3c0842c62ee05bcaee11ba0d29 100644 (file)
@@ -373,9 +373,6 @@ enum {
                                        ((pci)->device == 0x0d0c) || \
                                        ((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[] = {
        [AZX_DRIVER_ICH] = "HDA Intel",
        [AZX_DRIVER_PCH] = "HDA Intel PCH",
index b00ee2730908ca9eaa325971239255343fcdb448..4fc78be2f7518bbbd217ecd57219b05ca44e0c0c 100644 (file)
@@ -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)
 {
        struct hdac_bus *bus = dev_get_drvdata(dev);
+       struct skl *skl = bus_to_skl(bus);
        unsigned int format_val;
        struct hdac_stream *hstream;
        struct hdac_ext_stream *stream;
@@ -165,7 +166,18 @@ int skl_pcm_host_dma_prepare(struct device *dev, struct skl_pipe_params *params)
        if (err < 0)
                return err;
 
-       err = snd_hdac_stream_setup(hdac_stream(stream));
+       /*
+        * 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));
+               snd_hdac_ext_stream_decouple(bus, stream, true);
+       } else {
+               err = snd_hdac_stream_setup(hdac_stream(stream));
+       }
+
        if (err < 0)
                return err;