mutex_unlock(&sound_oss_mutex);
                return -ENOENT;
        }
-       unregister_sound_special(minor);
        switch (SNDRV_MINOR_OSS_DEVICE(minor)) {
        case SNDRV_MINOR_OSS_PCM:
                track2 = SNDRV_MINOR_OSS(cidx, SNDRV_MINOR_OSS_AUDIO);
                track2 = SNDRV_MINOR_OSS(cidx, SNDRV_MINOR_OSS_DMMIDI1);
                break;
        }
-       if (track2 >= 0) {
-               unregister_sound_special(track2);
+       if (track2 >= 0)
                snd_oss_minors[track2] = NULL;
-       }
        snd_oss_minors[minor] = NULL;
        mutex_unlock(&sound_oss_mutex);
+
+       /* call unregister_sound_special() outside sound_oss_mutex;
+        * otherwise may deadlock, as it can trigger the release of a card
+        */
+       unregister_sound_special(minor);
+       if (track2 >= 0)
+               unregister_sound_special(track2);
+
        kfree(mptr);
        return 0;
 }