struct mutex mutex;
        struct mutex dapm_mutex;
 
+       /* Mutex for PCM operations */
+       struct mutex pcm_mutex;
+       enum snd_soc_pcm_subclass pcm_subclass;
+
        spinlock_t dpcm_lock;
 
        bool instantiated;
        struct device *dev;
        struct snd_soc_card *card;
        struct snd_soc_dai_link *dai_link;
-       struct mutex pcm_mutex;
-       enum snd_soc_pcm_subclass pcm_subclass;
        struct snd_pcm_ops ops;
 
        unsigned int params_select; /* currently selected param for dai link */
 
        struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
        int ret;
 
-       mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
+       mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
 
        if (cpu_dai->driver->cops && cpu_dai->driver->cops->startup) {
                ret = cpu_dai->driver->cops->startup(cstream, cpu_dai);
 
        snd_soc_runtime_activate(rtd, cstream->direction);
 
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
 
        return 0;
 
        if (cpu_dai->driver->cops && cpu_dai->driver->cops->shutdown)
                cpu_dai->driver->cops->shutdown(cstream, cpu_dai);
 out:
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
        return ret;
 }
 
                        container_of(work, struct snd_soc_pcm_runtime, delayed_work.work);
        struct snd_soc_dai *codec_dai = rtd->codec_dai;
 
-       mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
+       mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
 
        dev_dbg(rtd->dev,
                "Compress ASoC: pop wq checking: %s status: %s waiting: %s\n",
                                          SND_SOC_DAPM_STREAM_STOP);
        }
 
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
 }
 
 static int soc_compr_free(struct snd_compr_stream *cstream)
        struct snd_soc_dai *codec_dai = rtd->codec_dai;
        int stream;
 
-       mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
+       mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
 
        if (cstream->direction == SND_COMPRESS_PLAYBACK)
                stream = SNDRV_PCM_STREAM_PLAYBACK;
                                          SND_SOC_DAPM_STREAM_STOP);
        }
 
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
        return 0;
 }
 
        struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
        int ret;
 
-       mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
+       mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
 
        ret = soc_compr_components_trigger(cstream, cmd);
        if (ret < 0)
        }
 
 out:
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
        return ret;
 }
 
        struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
        int ret;
 
-       mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
+       mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
 
        /*
         * First we call set_params for the CPU DAI, then the component
 
        /* cancel any delayed stream shutdown that is pending */
        rtd->pop_wait = 0;
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
 
        cancel_delayed_work_sync(&rtd->delayed_work);
 
        return 0;
 
 err:
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
        return ret;
 }
 
        struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
        int ret = 0;
 
-       mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
+       mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
 
        if (cpu_dai->driver->cops && cpu_dai->driver->cops->get_params) {
                ret = cpu_dai->driver->cops->get_params(cstream, params, cpu_dai);
        }
 
 err:
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
        return ret;
 }
 
        struct snd_soc_rtdcom_list *rtdcom;
        int ret = 0;
 
-       mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
+       mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
 
        for_each_rtdcom(rtd, rtdcom) {
                component = rtdcom->component;
                break;
        }
 
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
        return ret;
 }
 
        struct snd_soc_rtdcom_list *rtdcom;
        int ret = 0;
 
-       mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
+       mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
 
        for_each_rtdcom(rtd, rtdcom) {
                component = rtdcom->component;
                break;
        }
 
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
        return ret;
 }
 
        struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
        int ret = 0;
 
-       mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
+       mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
 
        if (cpu_dai->driver->cops && cpu_dai->driver->cops->ack) {
                ret = cpu_dai->driver->cops->ack(cstream, bytes, cpu_dai);
        }
 
 err:
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
        return ret;
 }
 
        int ret = 0;
        struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
 
-       mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
+       mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
 
        if (cpu_dai->driver->cops && cpu_dai->driver->cops->pointer)
                cpu_dai->driver->cops->pointer(cstream, tstamp, cpu_dai);
                break;
        }
 
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
        return ret;
 }
 
        struct snd_soc_rtdcom_list *rtdcom;
        int ret = 0;
 
-       mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
+       mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
 
        for_each_rtdcom(rtd, rtdcom) {
                component = rtdcom->component;
                break;
        }
 
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
        return ret;
 }
 
 
        rtd->dev->groups = soc_dev_attr_groups;
        dev_set_name(rtd->dev, "%s", name);
        dev_set_drvdata(rtd->dev, rtd);
-       mutex_init(&rtd->pcm_mutex);
        INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_PLAYBACK].be_clients);
        INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_CAPTURE].be_clients);
        INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_PLAYBACK].fe_clients);
        card->instantiated = 0;
        mutex_init(&card->mutex);
        mutex_init(&card->dapm_mutex);
+       mutex_init(&card->pcm_mutex);
        spin_lock_init(&card->dpcm_lock);
 
        return snd_soc_bind_card(card);
 
  * Increments the active count for all the DAIs and components attached to a PCM
  * runtime. Should typically be called when a stream is opened.
  *
- * Must be called with the rtd->pcm_mutex being held
+ * Must be called with the rtd->card->pcm_mutex being held
  */
 void snd_soc_runtime_activate(struct snd_soc_pcm_runtime *rtd, int stream)
 {
        struct snd_soc_dai *codec_dai;
        int i;
 
-       lockdep_assert_held(&rtd->pcm_mutex);
+       lockdep_assert_held(&rtd->card->pcm_mutex);
 
        if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
                cpu_dai->playback_active++;
  * Decrements the active count for all the DAIs and components attached to a PCM
  * runtime. Should typically be called when a stream is closed.
  *
- * Must be called with the rtd->pcm_mutex being held
+ * Must be called with the rtd->card->pcm_mutex being held
  */
 void snd_soc_runtime_deactivate(struct snd_soc_pcm_runtime *rtd, int stream)
 {
        struct snd_soc_dai *codec_dai;
        int i;
 
-       lockdep_assert_held(&rtd->pcm_mutex);
+       lockdep_assert_held(&rtd->card->pcm_mutex);
 
        if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
                cpu_dai->playback_active--;
                pm_runtime_get_sync(component->dev);
        }
 
-       mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
+       mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
 
        /* startup the audio subsystem */
        ret = snd_soc_dai_startup(cpu_dai, substream);
 
        snd_soc_runtime_activate(rtd, substream->stream);
 
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
        return 0;
 
 config_err:
 
        snd_soc_dai_shutdown(cpu_dai, substream);
 out:
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
 
        for_each_rtdcom(rtd, rtdcom) {
                component = rtdcom->component;
                        container_of(work, struct snd_soc_pcm_runtime, delayed_work.work);
        struct snd_soc_dai *codec_dai = rtd->codec_dais[0];
 
-       mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
+       mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
 
        dev_dbg(rtd->dev, "ASoC: pop wq checking: %s status: %s waiting: %s\n",
                 codec_dai->driver->playback.stream_name,
                                          SND_SOC_DAPM_STREAM_STOP);
        }
 
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
 }
 
 static void codec2codec_close_delayed_work(struct work_struct *work)
        struct snd_soc_dai *codec_dai;
        int i;
 
-       mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
+       mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
 
        snd_soc_runtime_deactivate(rtd, substream->stream);
 
                                          SND_SOC_DAPM_STREAM_STOP);
        }
 
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
 
        for_each_rtdcom(rtd, rtdcom) {
                component = rtdcom->component;
        struct snd_soc_dai *codec_dai;
        int i, ret = 0;
 
-       mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
+       mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
 
        if (rtd->dai_link->ops->prepare) {
                ret = rtd->dai_link->ops->prepare(substream);
        snd_soc_dai_digital_mute(cpu_dai, 0, substream->stream);
 
 out:
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
        return ret;
 }
 
        struct snd_soc_dai *codec_dai;
        int i, ret = 0;
 
-       mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
+       mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
        if (rtd->dai_link->ops->hw_params) {
                ret = rtd->dai_link->ops->hw_params(substream, params);
                if (ret < 0) {
         if (ret)
                goto component_err;
 out:
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
        return ret;
 
 component_err:
        if (rtd->dai_link->ops->hw_free)
                rtd->dai_link->ops->hw_free(substream);
 
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
        return ret;
 }
 
        bool playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
        int i;
 
-       mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
+       mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
 
        /* clear the corresponding DAIs parameters when going to be inactive */
        if (cpu_dai->active == 1) {
 
        snd_soc_dai_hw_free(cpu_dai, substream);
 
-       mutex_unlock(&rtd->pcm_mutex);
+       mutex_unlock(&rtd->card->pcm_mutex);
        return 0;
 }