OSDN Git Service

ASoC: SOF: control: Extend the optionality of IPC ops to IPC as well
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Wed, 21 Dec 2022 10:23:22 +0000 (12:23 +0200)
committerMark Brown <broonie@kernel.org>
Sun, 25 Dec 2022 23:32:33 +0000 (23:32 +0000)
The IPC ops are optional, but they require that the ops struct is to be
allocated with all callbacks set to NULL.

Update the code to extend the optionality to:
sdev->ipc == NULL
sdev->ipc->ops == NULL
sdev->ipc->ops->[tplg] == NULL
sdev->ipc->ops->[tplg]->control == NULL
sdev->ipc->ops->[tplg]->control->ops == NULL (treated optional currently)

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: Rander Wang <rander.wang@intel.com>
Link: https://lore.kernel.org/r/20221221102328.9635-6-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/control.c

index e0e9efd..75e13f4 100644 (file)
@@ -22,9 +22,9 @@ int snd_sof_volume_get(struct snd_kcontrol *kcontrol,
        struct snd_sof_control *scontrol = sm->dobj.private;
        struct snd_soc_component *scomp = scontrol->scomp;
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
-       const struct sof_ipc_tplg_ops *tplg_ops = sdev->ipc->ops->tplg;
+       const struct sof_ipc_tplg_ops *tplg_ops = sof_ipc_get_ops(sdev, tplg);
 
-       if (tplg_ops->control->volume_get)
+       if (tplg_ops && tplg_ops->control && tplg_ops->control->volume_get)
                return tplg_ops->control->volume_get(scontrol, ucontrol);
 
        return 0;
@@ -37,9 +37,9 @@ int snd_sof_volume_put(struct snd_kcontrol *kcontrol,
        struct snd_sof_control *scontrol = sm->dobj.private;
        struct snd_soc_component *scomp = scontrol->scomp;
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
-       const struct sof_ipc_tplg_ops *tplg_ops = sdev->ipc->ops->tplg;
+       const struct sof_ipc_tplg_ops *tplg_ops = sof_ipc_get_ops(sdev, tplg);
 
-       if (tplg_ops->control->volume_put)
+       if (tplg_ops && tplg_ops->control && tplg_ops->control->volume_put)
                return tplg_ops->control->volume_put(scontrol, ucontrol);
 
        return false;
@@ -74,9 +74,9 @@ int snd_sof_switch_get(struct snd_kcontrol *kcontrol,
        struct snd_sof_control *scontrol = sm->dobj.private;
        struct snd_soc_component *scomp = scontrol->scomp;
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
-       const struct sof_ipc_tplg_ops *tplg_ops = sdev->ipc->ops->tplg;
+       const struct sof_ipc_tplg_ops *tplg_ops = sof_ipc_get_ops(sdev, tplg);
 
-       if (tplg_ops->control->switch_get)
+       if (tplg_ops && tplg_ops->control && tplg_ops->control->switch_get)
                return tplg_ops->control->switch_get(scontrol, ucontrol);
 
        return 0;
@@ -89,9 +89,9 @@ int snd_sof_switch_put(struct snd_kcontrol *kcontrol,
        struct snd_sof_control *scontrol = sm->dobj.private;
        struct snd_soc_component *scomp = scontrol->scomp;
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
-       const struct sof_ipc_tplg_ops *tplg_ops = sdev->ipc->ops->tplg;
+       const struct sof_ipc_tplg_ops *tplg_ops = sof_ipc_get_ops(sdev, tplg);
 
-       if (tplg_ops->control->switch_put)
+       if (tplg_ops && tplg_ops->control && tplg_ops->control->switch_put)
                return tplg_ops->control->switch_put(scontrol, ucontrol);
 
        return false;
@@ -104,9 +104,9 @@ int snd_sof_enum_get(struct snd_kcontrol *kcontrol,
        struct snd_sof_control *scontrol = se->dobj.private;
        struct snd_soc_component *scomp = scontrol->scomp;
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
-       const struct sof_ipc_tplg_ops *tplg_ops = sdev->ipc->ops->tplg;
+       const struct sof_ipc_tplg_ops *tplg_ops = sof_ipc_get_ops(sdev, tplg);
 
-       if (tplg_ops->control->enum_get)
+       if (tplg_ops && tplg_ops->control && tplg_ops->control->enum_get)
                return tplg_ops->control->enum_get(scontrol, ucontrol);
 
        return 0;
@@ -119,9 +119,9 @@ int snd_sof_enum_put(struct snd_kcontrol *kcontrol,
        struct snd_sof_control *scontrol = se->dobj.private;
        struct snd_soc_component *scomp = scontrol->scomp;
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
-       const struct sof_ipc_tplg_ops *tplg_ops = sdev->ipc->ops->tplg;
+       const struct sof_ipc_tplg_ops *tplg_ops = sof_ipc_get_ops(sdev, tplg);
 
-       if (tplg_ops->control->enum_put)
+       if (tplg_ops && tplg_ops->control && tplg_ops->control->enum_put)
                return tplg_ops->control->enum_put(scontrol, ucontrol);
 
        return false;
@@ -134,9 +134,9 @@ int snd_sof_bytes_get(struct snd_kcontrol *kcontrol,
        struct snd_sof_control *scontrol = be->dobj.private;
        struct snd_soc_component *scomp = scontrol->scomp;
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
-       const struct sof_ipc_tplg_ops *tplg_ops = sdev->ipc->ops->tplg;
+       const struct sof_ipc_tplg_ops *tplg_ops = sof_ipc_get_ops(sdev, tplg);
 
-       if (tplg_ops->control->bytes_get)
+       if (tplg_ops && tplg_ops->control && tplg_ops->control->bytes_get)
                return tplg_ops->control->bytes_get(scontrol, ucontrol);
 
        return 0;
@@ -149,9 +149,9 @@ int snd_sof_bytes_put(struct snd_kcontrol *kcontrol,
        struct snd_sof_control *scontrol = be->dobj.private;
        struct snd_soc_component *scomp = scontrol->scomp;
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
-       const struct sof_ipc_tplg_ops *tplg_ops = sdev->ipc->ops->tplg;
+       const struct sof_ipc_tplg_ops *tplg_ops = sof_ipc_get_ops(sdev, tplg);
 
-       if (tplg_ops->control->bytes_put)
+       if (tplg_ops && tplg_ops->control && tplg_ops->control->bytes_put)
                return tplg_ops->control->bytes_put(scontrol, ucontrol);
 
        return 0;
@@ -165,13 +165,13 @@ int snd_sof_bytes_ext_put(struct snd_kcontrol *kcontrol,
        struct snd_sof_control *scontrol = be->dobj.private;
        struct snd_soc_component *scomp = scontrol->scomp;
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
-       const struct sof_ipc_tplg_ops *tplg_ops = sdev->ipc->ops->tplg;
+       const struct sof_ipc_tplg_ops *tplg_ops = sof_ipc_get_ops(sdev, tplg);
 
        /* make sure we have at least a header */
        if (size < sizeof(struct snd_ctl_tlv))
                return -EINVAL;
 
-       if (tplg_ops->control->bytes_ext_put)
+       if (tplg_ops && tplg_ops->control && tplg_ops->control->bytes_ext_put)
                return tplg_ops->control->bytes_ext_put(scontrol, binary_data, size);
 
        return 0;
@@ -184,7 +184,7 @@ int snd_sof_bytes_ext_volatile_get(struct snd_kcontrol *kcontrol, unsigned int _
        struct snd_sof_control *scontrol = be->dobj.private;
        struct snd_soc_component *scomp = scontrol->scomp;
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
-       const struct sof_ipc_tplg_ops *tplg_ops = sdev->ipc->ops->tplg;
+       const struct sof_ipc_tplg_ops *tplg_ops = sof_ipc_get_ops(sdev, tplg);
        int ret, err;
 
        ret = pm_runtime_resume_and_get(scomp->dev);
@@ -193,7 +193,7 @@ int snd_sof_bytes_ext_volatile_get(struct snd_kcontrol *kcontrol, unsigned int _
                return ret;
        }
 
-       if (tplg_ops->control->bytes_ext_volatile_get)
+       if (tplg_ops && tplg_ops->control && tplg_ops->control->bytes_ext_volatile_get)
                ret = tplg_ops->control->bytes_ext_volatile_get(scontrol, binary_data, size);
 
        pm_runtime_mark_last_busy(scomp->dev);
@@ -212,9 +212,9 @@ int snd_sof_bytes_ext_get(struct snd_kcontrol *kcontrol,
        struct snd_sof_control *scontrol = be->dobj.private;
        struct snd_soc_component *scomp = scontrol->scomp;
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
-       const struct sof_ipc_tplg_ops *tplg_ops = sdev->ipc->ops->tplg;
+       const struct sof_ipc_tplg_ops *tplg_ops = sof_ipc_get_ops(sdev, tplg);
 
-       if (tplg_ops->control->bytes_ext_get)
+       if (tplg_ops && tplg_ops->control && tplg_ops->control->bytes_ext_get)
                return tplg_ops->control->bytes_ext_get(scontrol, binary_data, size);
 
        return 0;