[snd_soc_dapm_post] = 14,
 };
 
+static void dapm_assert_locked(struct snd_soc_dapm_context *dapm)
+{
+       if (dapm->card && dapm->card->instantiated)
+               lockdep_assert_held(&dapm->card->dapm_mutex);
+}
+
 static void pop_wait(u32 pop_time)
 {
        if (pop_time)
 
 static void dapm_mark_dirty(struct snd_soc_dapm_widget *w, const char *reason)
 {
+       dapm_assert_locked(w->dapm);
+
        if (!dapm_dirty_widget(w)) {
                dev_vdbg(w->dapm->dev, "Marking %s dirty due to %s\n",
                         w->name, reason);
 {
        struct snd_soc_dapm_widget *w;
 
+       lockdep_assert_held(&card->dapm_mutex);
+
        memset(&card->dapm_stats, 0, sizeof(card->dapm_stats));
 
        list_for_each_entry(w, &card->widgets, list) {
        ASYNC_DOMAIN_EXCLUSIVE(async_domain);
        enum snd_soc_bias_level bias;
 
+       lockdep_assert_held(&card->dapm_mutex);
+
        trace_snd_soc_dapm_start(card);
 
        list_for_each_entry(d, &card->dapm_list, list) {
        struct snd_soc_dapm_path *path;
        int found = 0;
 
+       lockdep_assert_held(&card->dapm_mutex);
+
        /* find dapm widget path assoc with kcontrol */
        dapm_kcontrol_for_each_path(path, kcontrol) {
                if (!path->name || !e->texts[mux])
        struct snd_soc_dapm_path *path;
        int found = 0;
 
+       lockdep_assert_held(&card->dapm_mutex);
+
        /* find dapm widget path assoc with kcontrol */
        dapm_kcontrol_for_each_path(path, kcontrol) {
                found = 1;
 {
        struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
 
+       dapm_assert_locked(dapm);
+
        if (!w) {
                dev_err(dapm->dev, "ASoC: DAPM unknown pin %s\n", pin);
                return -EINVAL;