ASoC: SOF: Intel: icl: Set IPC4-specific DSP ops
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Fri, 9 Sep 2022 11:43:31 +0000 (14:43 +0300)
committerMark Brown <broonie@kernel.org>
Fri, 9 Sep 2022 17:48:49 +0000 (18:48 +0100)
Add implementation of low level, platform dependent IPC4 message handling
and set the DSP ops for IPC4 for ICL platform.

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

index 4e37b7f..6a8af2d 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/kconfig.h>
 #include <linux/export.h>
 #include <linux/bits.h>
+#include "../ipc4-priv.h"
 #include "../ops.h"
 #include "hda.h"
 #include "hda-ipc.h"
@@ -106,11 +107,30 @@ int sof_icl_ops_init(struct snd_sof_dev *sdev)
        /* probe/remove/shutdown */
        sof_icl_ops.shutdown    = hda_dsp_shutdown;
 
-       /* doorbell */
-       sof_icl_ops.irq_thread  = cnl_ipc_irq_thread;
+       if (sdev->pdata->ipc_type == SOF_IPC) {
+               /* doorbell */
+               sof_icl_ops.irq_thread  = cnl_ipc_irq_thread;
 
-       /* ipc */
-       sof_icl_ops.send_msg    = cnl_ipc_send_msg;
+               /* ipc */
+               sof_icl_ops.send_msg    = cnl_ipc_send_msg;
+       }
+
+       if (sdev->pdata->ipc_type == SOF_INTEL_IPC4) {
+               struct sof_ipc4_fw_data *ipc4_data;
+
+               sdev->private = devm_kzalloc(sdev->dev, sizeof(*ipc4_data), GFP_KERNEL);
+               if (!sdev->private)
+                       return -ENOMEM;
+
+               ipc4_data = sdev->private;
+               ipc4_data->manifest_fw_hdr_offset = SOF_MAN4_FW_HDR_OFFSET;
+
+               /* doorbell */
+               sof_icl_ops.irq_thread  = cnl_ipc4_irq_thread;
+
+               /* ipc */
+               sof_icl_ops.send_msg    = cnl_ipc4_send_msg;
+       }
 
        /* debug */
        sof_icl_ops.debug_map   = icl_dsp_debugfs;