ASoC: SOF: Intel: hda-loader: do not wait for HDaudio IOC
authorKai Vehmanen <kai.vehmanen@linux.intel.com>
Tue, 8 Oct 2024 06:07:10 +0000 (09:07 +0300)
committerMark Brown <broonie@kernel.org>
Tue, 8 Oct 2024 09:49:14 +0000 (10:49 +0100)
Commit 9ee3f0d8c999 ("ASOC: SOF: Intel: hda-loader: only wait for
HDaudio IOC for IPC4 devices") removed DMA wait for IPC3 case.
Proceed and remove the wait for IPC4 devices as well.

There is no dependency to IPC version in the load logic and
checking the firmware status is a sufficient check in case of
errors.

The removed code also had a bug in that -ETIMEDOUT is returned
without stopping the DMA transfer.

Cc: stable@vger.kernel.org
Link: https://github.com/thesofproject/linux/issues/5135
Fixes: 9ee3f0d8c999 ("ASOC: SOF: Intel: hda-loader: only wait for HDaudio IOC for IPC4 devices")
Suggested-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Link: https://patch.msgid.link/20241008060710.15409-1-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/intel/hda-loader.c

index 75f6240cf3e1d3c4ded00423e7d3c3f5775c0092..9d8ebb7c6a106033df8cffa4d8a9db485c64552d 100644 (file)
@@ -294,14 +294,9 @@ int hda_cl_copy_fw(struct snd_sof_dev *sdev, struct hdac_ext_stream *hext_stream
 {
        struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
        const struct sof_intel_dsp_desc *chip = hda->desc;
-       struct sof_intel_hda_stream *hda_stream;
-       unsigned long time_left;
        unsigned int reg;
        int ret, status;
 
-       hda_stream = container_of(hext_stream, struct sof_intel_hda_stream,
-                                 hext_stream);
-
        dev_dbg(sdev->dev, "Code loader DMA starting\n");
 
        ret = hda_cl_trigger(sdev->dev, hext_stream, SNDRV_PCM_TRIGGER_START);
@@ -310,18 +305,6 @@ int hda_cl_copy_fw(struct snd_sof_dev *sdev, struct hdac_ext_stream *hext_stream
                return ret;
        }
 
-       if (sdev->pdata->ipc_type == SOF_IPC_TYPE_4) {
-               /* Wait for completion of transfer */
-               time_left = wait_for_completion_timeout(&hda_stream->ioc,
-                                                       msecs_to_jiffies(HDA_CL_DMA_IOC_TIMEOUT_MS));
-
-               if (!time_left) {
-                       dev_err(sdev->dev, "Code loader DMA did not complete\n");
-                       return -ETIMEDOUT;
-               }
-               dev_dbg(sdev->dev, "Code loader DMA done\n");
-       }
-
        dev_dbg(sdev->dev, "waiting for FW_ENTERED status\n");
 
        status = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR,