]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: SOF: imx8: add core shutdown operation for imx8/imx8x
authorLaurentiu Mihalcea <laurentiu.mihalcea@nxp.com>
Fri, 13 Jun 2025 19:43:10 +0000 (15:43 -0400)
committerMark Brown <broonie@kernel.org>
Mon, 16 Jun 2025 12:26:13 +0000 (13:26 +0100)
Currently, the DSP core from i.MX8QM/i.MX8QXP is able to operate while the
firmware image is being loaded. Because of this, the DSP may change the
content of the firmware data just after it was loaded, thus leading to the
data having unexpected values when the DSP is reset (via run()).

Fix this by implementing the core_shutdown() operation that will put the
DSP in stall during suspend(). The stall will be removed during the run()
opertion, thus guaranteeing that the DSP core will not be able to run
while the firmware image is being loaded.

Signed-off-by: Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com>
Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com>
Link: https://patch.msgid.link/20250613194310.1128733-1-laurentiumihalcea111@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/imx/imx8.c

index a40a8047873e5c95550d6ecb69a701cb91878a29..b73dd91bd5292a39b34222161f088ea17668c84c 100644 (file)
@@ -40,6 +40,19 @@ struct imx8m_chip_data {
        struct reset_control *run_stall;
 };
 
+static int imx8_shutdown(struct snd_sof_dev *sdev)
+{
+       /*
+        * Force the DSP to stall. After the firmware image is loaded,
+        * the stall will be removed during run() by a matching
+        * imx_sc_pm_cpu_start() call.
+        */
+       imx_sc_pm_cpu_start(get_chip_pdata(sdev), IMX_SC_R_DSP, false,
+                           RESET_VECTOR_VADDR);
+
+       return 0;
+}
+
 /*
  * DSP control.
  */
@@ -281,11 +294,13 @@ static int imx8_ops_init(struct snd_sof_dev *sdev)
 static const struct imx_chip_ops imx8_chip_ops = {
        .probe = imx8_probe,
        .core_kick = imx8_run,
+       .core_shutdown = imx8_shutdown,
 };
 
 static const struct imx_chip_ops imx8x_chip_ops = {
        .probe = imx8_probe,
        .core_kick = imx8x_run,
+       .core_shutdown = imx8_shutdown,
 };
 
 static const struct imx_chip_ops imx8m_chip_ops = {