int pinctl;
        int err = 0;
 
+       mutex_lock(&spec->pcm_lock);
        if (hinfo->nid) {
                pcm_idx = hinfo_to_pcm_index(codec, hinfo);
-               if (snd_BUG_ON(pcm_idx < 0))
-                       return -EINVAL;
+               if (snd_BUG_ON(pcm_idx < 0)) {
+                       err = -EINVAL;
+                       goto unlock;
+               }
                cvt_idx = cvt_nid_to_cvt_index(codec, hinfo->nid);
-               if (snd_BUG_ON(cvt_idx < 0))
-                       return -EINVAL;
+               if (snd_BUG_ON(cvt_idx < 0)) {
+                       err = -EINVAL;
+                       goto unlock;
+               }
                per_cvt = get_cvt(spec, cvt_idx);
-
                snd_BUG_ON(!per_cvt->assigned);
                per_cvt->assigned = 0;
                hinfo->nid = 0;
 
                azx_stream(get_azx_dev(substream))->stripe = 0;
 
-               mutex_lock(&spec->pcm_lock);
                snd_hda_spdif_ctls_unassign(codec, pcm_idx);
                clear_bit(pcm_idx, &spec->pcm_in_use);
                pin_idx = hinfo_to_pin_index(codec, hinfo);
                per_pin->setup = false;
                per_pin->channels = 0;
                mutex_unlock(&per_pin->lock);
-       unlock:
-               mutex_unlock(&spec->pcm_lock);
        }
 
+unlock:
+       mutex_unlock(&spec->pcm_lock);
+
        return err;
 }