ASoC: SOF: ipc: ops: Add support for optional init and exit callbacks
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Thu, 20 Oct 2022 12:12:26 +0000 (15:12 +0300)
committerMark Brown <broonie@kernel.org>
Fri, 21 Oct 2022 12:04:59 +0000 (13:04 +0100)
Add support for IPC specific initialization (init) and cleanup (exit)
callback.

These callbacks can be used by IPC implementation to do basic
initialization and cleanup.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Chao Song <chao.song@intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20221020121238.18339-8-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/ipc.c
sound/soc/sof/sof-priv.h

index 6ed3f9b..30781e8 100644 (file)
@@ -200,6 +200,9 @@ struct snd_sof_ipc *snd_sof_ipc_init(struct snd_sof_dev *sdev)
                return NULL;
        }
 
+       if (ops->init && ops->init(sdev))
+               return NULL;
+
        ipc->ops = ops;
 
        return ipc;
@@ -217,5 +220,8 @@ void snd_sof_ipc_free(struct snd_sof_dev *sdev)
        mutex_lock(&ipc->tx_mutex);
        ipc->disable_ipc_tx = true;
        mutex_unlock(&ipc->tx_mutex);
+
+       if (ipc->ops->exit)
+               ipc->ops->exit(sdev);
 }
 EXPORT_SYMBOL(snd_sof_ipc_free);
index 3d70b57..ea6013a 100644 (file)
@@ -443,6 +443,9 @@ struct sof_ipc_pcm_ops;
  * @fw_loader: Pointer to Firmware Loader ops
  * @fw_tracing:        Pointer to Firmware tracing ops
  *
+ * @init:      Optional pointer for IPC related initialization
+ * @exit:      Optional pointer for IPC related cleanup
+ *
  * @tx_msg:    Function pointer for sending a 'short' IPC message
  * @set_get_data: Function pointer for set/get data ('large' IPC message). This
  *             function may split up the 'large' message and use the @tx_msg
@@ -464,6 +467,9 @@ struct sof_ipc_ops {
        const struct sof_ipc_fw_loader_ops *fw_loader;
        const struct sof_ipc_fw_tracing_ops *fw_tracing;
 
+       int (*init)(struct snd_sof_dev *sdev);
+       void (*exit)(struct snd_sof_dev *sdev);
+
        int (*tx_msg)(struct snd_sof_dev *sdev, void *msg_data, size_t msg_bytes,
                      void *reply_data, size_t reply_bytes, bool no_pm);
        int (*set_get_data)(struct snd_sof_dev *sdev, void *data, size_t data_bytes,