mirror of https://github.com/torvalds/linux.git
ASoC: SOF: imx9: use SCMI API for LM management
Linux supports NXP's LMM SCMI protocol so switch to using the appropriate API. The SIPs were intended to act as placeholders until the support for said protocol was upstreamed. The underlying CPU protocol command from IMX_SIP_SRC_M_RESET_ADDR_SET is replaced by a LMM protocol command with the same effect (i.e. setting the boot address) since using the CPU protocol would require additional permissions (which TF-A already had). Apart from this, the SIPs are replaced by their equivalent Linux LMM commands. Signed-off-by: Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com> Reviewed-by: Iuliana Prodan <iuliana.prodan@nxp.com> Link: https://patch.msgid.link/20251114143503.2139-1-laurentiumihalcea111@gmail.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
0140fc1189
commit
94000534e0
|
|
@ -35,6 +35,7 @@ config SND_SOC_SOF_IMX8
|
||||||
config SND_SOC_SOF_IMX9
|
config SND_SOC_SOF_IMX9
|
||||||
tristate "SOF support for i.MX9"
|
tristate "SOF support for i.MX9"
|
||||||
depends on IMX_DSP
|
depends on IMX_DSP
|
||||||
|
depends on IMX_SCMI_LMM_DRV
|
||||||
select SND_SOC_SOF_IMX_COMMON
|
select SND_SOC_SOF_IMX_COMMON
|
||||||
help
|
help
|
||||||
This adds support for Sound Open Firmware for NXP i.MX9 platforms.
|
This adds support for Sound Open Firmware for NXP i.MX9 platforms.
|
||||||
|
|
|
||||||
|
|
@ -3,19 +3,11 @@
|
||||||
* Copyright 2025 NXP
|
* Copyright 2025 NXP
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/arm-smccc.h>
|
#include <linux/firmware/imx/sm.h>
|
||||||
|
|
||||||
#include "imx-common.h"
|
#include "imx-common.h"
|
||||||
|
|
||||||
#define IMX_SIP_SRC 0xC2000005
|
#define IMX95_M7_CPU_ID 0x1
|
||||||
#define IMX_SIP_SRC_M_RESET_ADDR_SET 0x03
|
|
||||||
|
|
||||||
#define IMX95_CPU_VEC_FLAGS_BOOT BIT(29)
|
|
||||||
|
|
||||||
#define IMX_SIP_LMM 0xC200000F
|
|
||||||
#define IMX_SIP_LMM_BOOT 0x0
|
|
||||||
#define IMX_SIP_LMM_SHUTDOWN 0x1
|
|
||||||
|
|
||||||
#define IMX95_M7_LM_ID 0x1
|
#define IMX95_M7_LM_ID 0x1
|
||||||
|
|
||||||
static struct snd_soc_dai_driver imx95_dai[] = {
|
static struct snd_soc_dai_driver imx95_dai[] = {
|
||||||
|
|
@ -38,7 +30,6 @@ static int imx95_ops_init(struct snd_sof_dev *sdev)
|
||||||
|
|
||||||
static int imx95_chip_probe(struct snd_sof_dev *sdev)
|
static int imx95_chip_probe(struct snd_sof_dev *sdev)
|
||||||
{
|
{
|
||||||
struct arm_smccc_res smc_res;
|
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
|
|
||||||
|
|
@ -49,31 +40,20 @@ static int imx95_chip_probe(struct snd_sof_dev *sdev)
|
||||||
return dev_err_probe(sdev->dev, -ENODEV,
|
return dev_err_probe(sdev->dev, -ENODEV,
|
||||||
"failed to fetch SRAM region\n");
|
"failed to fetch SRAM region\n");
|
||||||
|
|
||||||
/* set core boot reset address */
|
return scmi_imx_lmm_reset_vector_set(IMX95_M7_LM_ID, IMX95_M7_CPU_ID,
|
||||||
arm_smccc_smc(IMX_SIP_SRC, IMX_SIP_SRC_M_RESET_ADDR_SET, res->start,
|
0, res->start);
|
||||||
IMX95_CPU_VEC_FLAGS_BOOT, 0, 0, 0, 0, &smc_res);
|
|
||||||
|
|
||||||
return smc_res.a0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int imx95_core_kick(struct snd_sof_dev *sdev)
|
static int imx95_core_kick(struct snd_sof_dev *sdev)
|
||||||
{
|
{
|
||||||
struct arm_smccc_res smc_res;
|
return scmi_imx_lmm_operation(IMX95_M7_LM_ID, SCMI_IMX_LMM_BOOT, 0);
|
||||||
|
|
||||||
arm_smccc_smc(IMX_SIP_LMM, IMX_SIP_LMM_BOOT,
|
|
||||||
IMX95_M7_LM_ID, 0, 0, 0, 0, 0, &smc_res);
|
|
||||||
|
|
||||||
return smc_res.a0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int imx95_core_shutdown(struct snd_sof_dev *sdev)
|
static int imx95_core_shutdown(struct snd_sof_dev *sdev)
|
||||||
{
|
{
|
||||||
struct arm_smccc_res smc_res;
|
return scmi_imx_lmm_operation(IMX95_M7_LM_ID,
|
||||||
|
SCMI_IMX_LMM_SHUTDOWN,
|
||||||
arm_smccc_smc(IMX_SIP_LMM, IMX_SIP_LMM_SHUTDOWN,
|
SCMI_IMX_LMM_OP_FORCEFUL);
|
||||||
IMX95_M7_LM_ID, 0, 0, 0, 0, 0, &smc_res);
|
|
||||||
|
|
||||||
return smc_res.a0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct imx_chip_ops imx95_chip_ops = {
|
static const struct imx_chip_ops imx95_chip_ops = {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue