ASoC: SOF: Add ops_free
authorRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Thu, 9 Jun 2022 03:26:37 +0000 (20:26 -0700)
committerMark Brown <broonie@kernel.org>
Fri, 10 Jun 2022 12:32:05 +0000 (13:32 +0100)
Add the ops_free callback in struct sof_dev_desc.

Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20220609032643.916882-18-ranjani.sridharan@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/sof.h
sound/soc/sof/core.c
sound/soc/sof/ops.h

index 1a82a0d..367dccf 100644 (file)
@@ -138,6 +138,7 @@ struct sof_dev_desc {
 
        struct snd_sof_dsp_ops *ops;
        int (*ops_init)(struct snd_sof_dev *sdev);
+       void (*ops_free)(struct snd_sof_dev *sdev);
 };
 
 int sof_dai_get_mclk(struct snd_soc_pcm_runtime *rtd);
index 53719c0..c99b5e6 100644 (file)
@@ -189,7 +189,7 @@ static int sof_probe_continue(struct snd_sof_dev *sdev)
        ret = snd_sof_probe(sdev);
        if (ret < 0) {
                dev_err(sdev->dev, "error: failed to probe DSP %d\n", ret);
-               return ret;
+               goto probe_err;
        }
 
        sof_set_fw_state(sdev, SOF_FW_BOOT_PREPARE);
@@ -317,6 +317,8 @@ dbg_err:
        snd_sof_free_debug(sdev);
 dsp_err:
        snd_sof_remove(sdev);
+probe_err:
+       sof_ops_free(sdev);
 
        /* all resources freed, update state to match */
        sof_set_fw_state(sdev, SOF_FW_BOOT_NOT_STARTED);
@@ -374,6 +376,7 @@ int snd_sof_device_probe(struct device *dev, struct snd_sof_pdata *plat_data)
            !sof_ops(sdev)->block_read || !sof_ops(sdev)->block_write ||
            !sof_ops(sdev)->send_msg || !sof_ops(sdev)->load_firmware ||
            !sof_ops(sdev)->ipc_msg_data) {
+               sof_ops_free(sdev);
                dev_err(dev, "error: missing mandatory ops\n");
                return -EINVAL;
        }
@@ -457,6 +460,8 @@ int snd_sof_device_remove(struct device *dev)
                snd_sof_remove(sdev);
        }
 
+       sof_ops_free(sdev);
+
        /* release firmware */
        snd_sof_fw_unload(sdev);
 
index b79ae4f..55d43ad 100644 (file)
@@ -29,6 +29,12 @@ static inline int sof_ops_init(struct snd_sof_dev *sdev)
        return 0;
 }
 
+static inline void sof_ops_free(struct snd_sof_dev *sdev)
+{
+       if (sdev->pdata->desc->ops_free)
+               sdev->pdata->desc->ops_free(sdev);
+}
+
 /* Mandatory operations are verified during probing */
 
 /* init */