ASoC: SOF: Intel: hda-ctrl: add reset cycle before parsing capabilities
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Wed, 25 Mar 2020 21:50:27 +0000 (16:50 -0500)
committerMark Brown <broonie@kernel.org>
Fri, 27 Mar 2020 15:16:37 +0000 (15:16 +0000)
Without this cycle, HDaudio capability parsing fails on some devices.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20200325215027.28716-12-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/intel/hda-ctrl.c

index f88dbcc4ba66a6dcdfc2603a28b015dd8a9fa80a..6288b2f99540475823023512d5f3bea2906bfb6c 100644 (file)
@@ -65,15 +65,32 @@ int hda_dsp_ctrl_get_caps(struct snd_sof_dev *sdev)
        struct hdac_bus *bus = sof_to_bus(sdev);
        u32 cap, offset, feature;
        int count = 0;
+       int ret;
+
+       /*
+        * On some devices, one reset cycle is necessary before reading
+        * capabilities
+        */
+       ret = hda_dsp_ctrl_link_reset(sdev, true);
+       if (ret < 0)
+               return ret;
+       ret = hda_dsp_ctrl_link_reset(sdev, false);
+       if (ret < 0)
+               return ret;
 
        offset = snd_sof_dsp_read(sdev, HDA_DSP_HDA_BAR, SOF_HDA_LLCH);
 
        do {
-               cap = snd_sof_dsp_read(sdev, HDA_DSP_HDA_BAR, offset);
-
                dev_dbg(sdev->dev, "checking for capabilities at offset 0x%x\n",
                        offset & SOF_HDA_CAP_NEXT_MASK);
 
+               cap = snd_sof_dsp_read(sdev, HDA_DSP_HDA_BAR, offset);
+
+               if (cap == -1) {
+                       dev_dbg(bus->dev, "Invalid capability reg read\n");
+                       break;
+               }
+
                feature = (cap & SOF_HDA_CAP_ID_MASK) >> SOF_HDA_CAP_ID_OFF;
 
                switch (feature) {
@@ -106,8 +123,8 @@ int hda_dsp_ctrl_get_caps(struct snd_sof_dev *sdev)
                        bus->mlcap = bus->remap_addr + offset;
                        break;
                default:
-                       dev_vdbg(sdev->dev, "found capability %d at 0x%x\n",
-                                feature, offset);
+                       dev_dbg(sdev->dev, "found capability %d at 0x%x\n",
+                               feature, offset);
                        break;
                }