Unverified Commit b081d856 authored by Laurentiu Mihalcea's avatar Laurentiu Mihalcea Committed by Mark Brown
Browse files

ASoC: SOF: imx8: add core shutdown operation for imx8/imx8x



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: default avatarLaurentiu Mihalcea <laurentiu.mihalcea@nxp.com>
Reviewed-by: default avatarDaniel Baluta <daniel.baluta@nxp.com>
Link: https://patch.msgid.link/20250613194310.1128733-1-laurentiumihalcea111@gmail.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 13b86ea9
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -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 = {