ALSA: pcm: Don't ignore internal PCMs in snd_pcm_dev_disconnect()
authorTakashi Iwai <tiwai@suse.de>
Fri, 20 Feb 2015 16:05:27 +0000 (17:05 +0100)
committerTakashi Iwai <tiwai@suse.de>
Fri, 20 Feb 2015 18:52:04 +0000 (19:52 +0100)
Some codes in snd_pcm_dev_disconnect() are still valid even for
internal PCMs, but they are skipped because of the check of
list_empty(&pcm->list) at the beginning.  Remove this check and put
pcm->internal checks appropriately for internal PCM object to process
through this function.

Acked-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/pcm.c

index 542dbc6..e9b8746 100644 (file)
@@ -1124,9 +1124,6 @@ static int snd_pcm_dev_disconnect(struct snd_device *device)
        int cidx;
 
        mutex_lock(&register_mutex);
-       if (list_empty(&pcm->list))
-               goto unlock;
-
        mutex_lock(&pcm->open_mutex);
        wake_up(&pcm->open_wait);
        list_del_init(&pcm->list);
@@ -1146,14 +1143,14 @@ static int snd_pcm_dev_disconnect(struct snd_device *device)
                        notify->n_disconnect(pcm);
        }
        for (cidx = 0; cidx < 2; cidx++) {
-               snd_unregister_device(&pcm->streams[cidx].dev);
+               if (!pcm->internal)
+                       snd_unregister_device(&pcm->streams[cidx].dev);
                if (pcm->streams[cidx].chmap_kctl) {
                        snd_ctl_remove(pcm->card, pcm->streams[cidx].chmap_kctl);
                        pcm->streams[cidx].chmap_kctl = NULL;
                }
        }
        mutex_unlock(&pcm->open_mutex);
- unlock:
        mutex_unlock(&register_mutex);
        return 0;
 }