ASoC: SOF: imx8: Add ops for i.MX8QM
authorPaul Olaru <paul.olaru@nxp.com>
Mon, 10 Feb 2020 09:58:15 +0000 (11:58 +0200)
committerMark Brown <broonie@kernel.org>
Tue, 11 Feb 2020 11:26:22 +0000 (11:26 +0000)
i.MX8QM and i.MX8QXP are mostly identical platforms with minor hardware
differences. One of these differences affects the firmware boot process,
requiring the run operation to differ. All other ops are reused.

Signed-off-by: Paul Olaru <paul.olaru@nxp.com>
Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20200210095817.13226-3-daniel.baluta@oss.nxp.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/imx/imx8.c

index 9ffc2a9..b692752 100644 (file)
@@ -178,6 +178,24 @@ static int imx8x_run(struct snd_sof_dev *sdev)
        return 0;
 }
 
+static int imx8_run(struct snd_sof_dev *sdev)
+{
+       struct imx8_priv *dsp_priv = (struct imx8_priv *)sdev->private;
+       int ret;
+
+       ret = imx_sc_misc_set_control(dsp_priv->sc_ipc, IMX_SC_R_DSP,
+                                     IMX_SC_C_OFS_SEL, 0);
+       if (ret < 0) {
+               dev_err(sdev->dev, "Error system address offset source select\n");
+               return ret;
+       }
+
+       imx_sc_pm_cpu_start(dsp_priv->sc_ipc, IMX_SC_R_DSP, true,
+                           RESET_VECTOR_VADDR);
+
+       return 0;
+}
+
 static int imx8_probe(struct snd_sof_dev *sdev)
 {
        struct platform_device *pdev =
@@ -360,6 +378,39 @@ static struct snd_soc_dai_driver imx8_dai[] = {
 },
 };
 
+/* i.MX8 ops */
+struct snd_sof_dsp_ops sof_imx8_ops = {
+       /* probe and remove */
+       .probe          = imx8_probe,
+       .remove         = imx8_remove,
+       /* DSP core boot */
+       .run            = imx8_run,
+
+       /* Block IO */
+       .block_read     = sof_block_read,
+       .block_write    = sof_block_write,
+
+       /* ipc */
+       .send_msg       = imx8_send_msg,
+       .fw_ready       = sof_fw_ready,
+       .get_mailbox_offset     = imx8_get_mailbox_offset,
+       .get_window_offset      = imx8_get_window_offset,
+
+       .ipc_msg_data   = imx8_ipc_msg_data,
+       .ipc_pcm_params = imx8_ipc_pcm_params,
+
+       /* module loading */
+       .load_module    = snd_sof_parse_module_memcpy,
+       .get_bar_index  = imx8_get_bar_index,
+       /* firmware loading */
+       .load_firmware  = snd_sof_load_firmware_memcpy,
+
+       /* DAI drivers */
+       .drv = imx8_dai,
+       .num_drv = 1, /* we have only 1 ESAI interface on i.MX8 */
+};
+EXPORT_SYMBOL(sof_imx8_ops);
+
 /* i.MX8X ops */
 struct snd_sof_dsp_ops sof_imx8x_ops = {
        /* probe and remove */