return offset;
 }
 
-/* ASoC PCM operations */
-static struct snd_pcm_ops soc_pcm_ops = {
-       .open           = soc_pcm_open,
-       .close          = soc_pcm_close,
-       .hw_params      = soc_pcm_hw_params,
-       .hw_free        = soc_pcm_hw_free,
-       .prepare        = soc_pcm_prepare,
-       .trigger        = soc_pcm_trigger,
-       .pointer        = soc_pcm_pointer,
-};
-
 /* create a new pcm */
 int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
 {
        struct snd_soc_platform *platform = rtd->platform;
        struct snd_soc_dai *codec_dai = rtd->codec_dai;
        struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+       struct snd_pcm_ops *soc_pcm_ops = &rtd->ops;
        struct snd_pcm *pcm;
        char new_name[64];
        int ret = 0, playback = 0, capture = 0;
 
+       soc_pcm_ops->open       = soc_pcm_open;
+       soc_pcm_ops->close      = soc_pcm_close;
+       soc_pcm_ops->hw_params  = soc_pcm_hw_params;
+       soc_pcm_ops->hw_free    = soc_pcm_hw_free;
+       soc_pcm_ops->prepare    = soc_pcm_prepare;
+       soc_pcm_ops->trigger    = soc_pcm_trigger;
+       soc_pcm_ops->pointer    = soc_pcm_pointer;
+
        /* check client and interface hw capabilities */
        snprintf(new_name, sizeof(new_name), "%s %s-%d",
                        rtd->dai_link->stream_name, codec_dai->name, num);
        rtd->pcm = pcm;
        pcm->private_data = rtd;
        if (platform->driver->ops) {
-               soc_pcm_ops.mmap = platform->driver->ops->mmap;
-               soc_pcm_ops.pointer = platform->driver->ops->pointer;
-               soc_pcm_ops.ioctl = platform->driver->ops->ioctl;
-               soc_pcm_ops.copy = platform->driver->ops->copy;
-               soc_pcm_ops.silence = platform->driver->ops->silence;
-               soc_pcm_ops.ack = platform->driver->ops->ack;
-               soc_pcm_ops.page = platform->driver->ops->page;
+               soc_pcm_ops->mmap = platform->driver->ops->mmap;
+               soc_pcm_ops->pointer = platform->driver->ops->pointer;
+               soc_pcm_ops->ioctl = platform->driver->ops->ioctl;
+               soc_pcm_ops->copy = platform->driver->ops->copy;
+               soc_pcm_ops->silence = platform->driver->ops->silence;
+               soc_pcm_ops->ack = platform->driver->ops->ack;
+               soc_pcm_ops->page = platform->driver->ops->page;
        }
 
        if (playback)
-               snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &soc_pcm_ops);
+               snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, soc_pcm_ops);
 
        if (capture)
-               snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &soc_pcm_ops);
+               snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, soc_pcm_ops);
 
        if (platform->driver->pcm_new) {
                ret = platform->driver->pcm_new(rtd);