#define DRV_NAME       "sof-audio-component"
 
 /* Create DMA buffer page table for DSP */
-static int create_page_table(struct snd_pcm_substream *substream,
+static int create_page_table(struct snd_soc_component *component,
+                            struct snd_pcm_substream *substream,
                             unsigned char *dma_area, size_t size)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_component *component =
-               snd_soc_rtdcom_lookup(rtd, DRV_NAME);
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
        struct snd_sof_pcm *spcm;
        struct snd_dma_buffer *dmab = snd_pcm_get_dma_buf(substream);
 EXPORT_SYMBOL(snd_sof_pcm_period_elapsed);
 
 /* this may get called several times by oss emulation */
-static int sof_pcm_hw_params(struct snd_pcm_substream *substream,
+static int sof_pcm_hw_params(struct snd_soc_component *component,
+                            struct snd_pcm_substream *substream,
                             struct snd_pcm_hw_params *params)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
        struct snd_pcm_runtime *runtime = substream->runtime;
-       struct snd_soc_component *component =
-               snd_soc_rtdcom_lookup(rtd, DRV_NAME);
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
        struct snd_sof_pcm *spcm;
        struct sof_ipc_pcm_params pcm;
                 * ret == 0 means the buffer is not changed
                 * so no need to regenerate the page table
                 */
-               ret = create_page_table(substream, runtime->dma_area,
+               ret = create_page_table(component, substream, runtime->dma_area,
                                        runtime->dma_bytes);
                if (ret < 0)
                        return ret;
        return ret;
 }
 
-static int sof_pcm_hw_free(struct snd_pcm_substream *substream)
+static int sof_pcm_hw_free(struct snd_soc_component *component,
+                          struct snd_pcm_substream *substream)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_component *component =
-               snd_soc_rtdcom_lookup(rtd, DRV_NAME);
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
        struct snd_sof_pcm *spcm;
        int ret, err = 0;
        return err;
 }
 
-static int sof_pcm_prepare(struct snd_pcm_substream *substream)
+static int sof_pcm_prepare(struct snd_soc_component *component,
+                          struct snd_pcm_substream *substream)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_component *component =
-               snd_soc_rtdcom_lookup(rtd, DRV_NAME);
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
        struct snd_sof_pcm *spcm;
        int ret;
                substream->stream);
 
        /* set hw_params */
-       ret = sof_pcm_hw_params(substream, &spcm->params[substream->stream]);
+       ret = sof_pcm_hw_params(component,
+                               substream, &spcm->params[substream->stream]);
        if (ret < 0) {
                dev_err(sdev->dev, "error: set pcm hw_params after resume\n");
                return ret;
  * FE dai link trigger actions are always executed in non-atomic context because
  * they involve IPC's.
  */
-static int sof_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
+static int sof_pcm_trigger(struct snd_soc_component *component,
+                          struct snd_pcm_substream *substream, int cmd)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_component *component =
-               snd_soc_rtdcom_lookup(rtd, DRV_NAME);
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
        struct snd_sof_pcm *spcm;
        struct sof_ipc_stream stream;
                break;
        case SNDRV_PCM_TRIGGER_RESUME:
                /* set up hw_params */
-               ret = sof_pcm_prepare(substream);
+               ret = sof_pcm_prepare(component, substream);
                if (ret < 0) {
                        dev_err(sdev->dev,
                                "error: failed to set up hw_params upon resume\n");
        return ret;
 }
 
-static snd_pcm_uframes_t sof_pcm_pointer(struct snd_pcm_substream *substream)
+static snd_pcm_uframes_t sof_pcm_pointer(struct snd_soc_component *component,
+                                        struct snd_pcm_substream *substream)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_component *component =
-               snd_soc_rtdcom_lookup(rtd, DRV_NAME);
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
        struct snd_sof_pcm *spcm;
        snd_pcm_uframes_t host, dai;
        return host;
 }
 
-static int sof_pcm_open(struct snd_pcm_substream *substream)
+#ifdef CONFIG_SND_DMA_SGBUF
+static struct page *sof_pcm_page(struct snd_soc_component *component,
+                                struct snd_pcm_substream *substream,
+                                unsigned long offset)
+{
+       return snd_pcm_sgbuf_ops_page(substream, offset);
+}
+#else
+#define sof_pcm_page   NULL
+#endif /* CONFIG_SND_DMA_SGBUF */
+
+static int sof_pcm_open(struct snd_soc_component *component,
+                       struct snd_pcm_substream *substream)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
        struct snd_pcm_runtime *runtime = substream->runtime;
-       struct snd_soc_component *component =
-               snd_soc_rtdcom_lookup(rtd, DRV_NAME);
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
        struct snd_sof_pcm *spcm;
        struct snd_soc_tplg_stream_caps *caps;
        return ret;
 }
 
-static int sof_pcm_close(struct snd_pcm_substream *substream)
+static int sof_pcm_close(struct snd_soc_component *component,
+                        struct snd_pcm_substream *substream)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct snd_soc_component *component =
-               snd_soc_rtdcom_lookup(rtd, DRV_NAME);
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
        struct snd_sof_pcm *spcm;
        int err;
        return 0;
 }
 
-static struct snd_pcm_ops sof_pcm_ops = {
-       .open           = sof_pcm_open,
-       .close          = sof_pcm_close,
-       .ioctl          = snd_pcm_lib_ioctl,
-       .hw_params      = sof_pcm_hw_params,
-       .prepare        = sof_pcm_prepare,
-       .hw_free        = sof_pcm_hw_free,
-       .trigger        = sof_pcm_trigger,
-       .pointer        = sof_pcm_pointer,
-       .page           = snd_pcm_sgbuf_ops_page,
-};
-
 /*
  * Pre-allocate playback/capture audio buffer pages.
  * no need to explicitly release memory preallocated by sof_pcm_new in pcm_free
  * snd_pcm_lib_preallocate_free_for_all() is called by the core.
  */
-static int sof_pcm_new(struct snd_soc_pcm_runtime *rtd)
+static int sof_pcm_new(struct snd_soc_component *component,
+                      struct snd_soc_pcm_runtime *rtd)
 {
-       struct snd_soc_component *component =
-               snd_soc_rtdcom_lookup(rtd, DRV_NAME);
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
        struct snd_sof_pcm *spcm;
        struct snd_pcm *pcm = rtd->pcm;
        pd->name = "sof-audio-component";
        pd->probe = sof_pcm_probe;
        pd->remove = sof_pcm_remove;
-       pd->ops = &sof_pcm_ops;
+       pd->open = sof_pcm_open;
+       pd->close = sof_pcm_close;
+       pd->ioctl = snd_soc_pcm_lib_ioctl;
+       pd->hw_params = sof_pcm_hw_params;
+       pd->prepare = sof_pcm_prepare;
+       pd->hw_free = sof_pcm_hw_free;
+       pd->trigger = sof_pcm_trigger;
+       pd->pointer = sof_pcm_pointer;
+       pd->page = sof_pcm_page;
+
 #if IS_ENABLED(CONFIG_SND_SOC_SOF_COMPRESS)
        pd->compr_ops = &sof_compressed_ops;
 #endif
-       pd->pcm_new = sof_pcm_new;
+       pd->pcm_construct = sof_pcm_new;
        pd->ignore_machine = drv_name;
        pd->be_hw_params_fixup = sof_pcm_dai_link_fixup;
        pd->be_pcm_base = SOF_BE_PCM_BASE;