ASoC: SOF: ipc4: Wake up dsp core before sending ipc msg
authorRander Wang <rander.wang@intel.com>
Tue, 14 Feb 2023 10:33:43 +0000 (12:33 +0200)
committerMark Brown <broonie@kernel.org>
Tue, 14 Feb 2023 13:25:13 +0000 (13:25 +0000)
The driver shall update the power state to D0i0 before sending
a generic IPC. Power-related IPCs are the exception to the rule,
they may be sent even when the power-state is D0i3

Signed-off-by: Rander Wang <rander.wang@intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Link: https://lore.kernel.org/r/20230214103345.30669-4-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/ipc4.c

index b27ec16ebdfaad028d9c09c3c4fbdb0f41d8c4b4..8ede4b952997846bd61f614b143dbb0e6c583ebc 100644 (file)
@@ -370,6 +370,17 @@ static int sof_ipc4_tx_msg(struct snd_sof_dev *sdev, void *msg_data, size_t msg_
        if (!msg_data)
                return -EINVAL;
 
+       if (!no_pm) {
+               const struct sof_dsp_power_state target_state = {
+                       .state = SOF_DSP_PM_D0,
+               };
+
+               /* ensure the DSP is in D0i0 before sending a new IPC */
+               ret = snd_sof_dsp_set_power_state(sdev, &target_state);
+               if (ret < 0)
+                       return ret;
+       }
+
        /* Serialise IPC TX */
        mutex_lock(&ipc->tx_mutex);