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;
        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;
        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;
        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;
        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;
        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;
        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;
        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;
        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;
        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);
                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);
        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;