{
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
+       const struct sof_ipc_pcm_ops *pcm_ops = sof_ipc_get_ops(sdev, pcm);
        struct snd_sof_platform_stream_params platform_params = { 0 };
-       const struct sof_ipc_pcm_ops *pcm_ops = sdev->ipc->ops->pcm;
        struct snd_pcm_runtime *runtime = substream->runtime;
        struct snd_sof_pcm *spcm;
        int ret;
         * Handle repeated calls to hw_params() without free_pcm() in
         * between. At least ALSA OSS emulation depends on this.
         */
-       if (pcm_ops->hw_free && spcm->prepared[substream->stream]) {
+       if (pcm_ops && pcm_ops->hw_free && spcm->prepared[substream->stream]) {
                ret = pcm_ops->hw_free(component, substream);
                if (ret < 0)
                        return ret;
                        return ret;
        }
 
-       if (pcm_ops->hw_params) {
+       if (pcm_ops && pcm_ops->hw_params) {
                ret = pcm_ops->hw_params(component, substream, params, &platform_params);
                if (ret < 0)
                        return ret;
 {
        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
-       const struct sof_ipc_pcm_ops *pcm_ops = sdev->ipc->ops->pcm;
+       const struct sof_ipc_pcm_ops *pcm_ops = sof_ipc_get_ops(sdev, pcm);
        struct snd_sof_pcm *spcm;
        int ret, err = 0;
 
                spcm->pcm.pcm_id, substream->stream);
 
        /* free PCM in the DSP */
-       if (pcm_ops->hw_free && spcm->prepared[substream->stream]) {
+       if (pcm_ops && pcm_ops->hw_free && spcm->prepared[substream->stream]) {
                ret = pcm_ops->hw_free(component, substream);
                if (ret < 0)
                        err = ret;
 {
        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
-       const struct sof_ipc_pcm_ops *pcm_ops = sdev->ipc->ops->pcm;
+       const struct sof_ipc_pcm_ops *pcm_ops = sof_ipc_get_ops(sdev, pcm);
        struct snd_sof_pcm *spcm;
        bool reset_hw_params = false;
        bool free_widget_list = false;
        if (!ipc_first)
                snd_sof_pcm_platform_trigger(sdev, substream, cmd);
 
-       if (pcm_ops->trigger)
+       if (pcm_ops && pcm_ops->trigger)
                ret = pcm_ops->trigger(component, substream, cmd);
 
        /* need to STOP DMA even if trigger IPC failed */
        struct snd_sof_dai *dai =
                snd_sof_find_dai(component, (char *)rtd->dai_link->name);
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
-       const struct sof_ipc_pcm_ops *pcm_ops = sdev->ipc->ops->pcm;
+       const struct sof_ipc_pcm_ops *pcm_ops = sof_ipc_get_ops(sdev, pcm);
 
        /* no topology exists for this BE, try a common configuration */
        if (!dai) {
                return 0;
        }
 
-       if (pcm_ops->dai_link_fixup)
+       if (pcm_ops && pcm_ops->dai_link_fixup)
                return pcm_ops->dai_link_fixup(rtd, params);
 
        return 0;