ALSA: firewire: block .remove callback of bus driver till all of ALSA character devic...
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Wed, 10 Oct 2018 06:34:59 +0000 (15:34 +0900)
committerTakashi Iwai <tiwai@suse.de>
Wed, 10 Oct 2018 10:11:34 +0000 (12:11 +0200)
At present, in .remove callback of bus driver just decrease reference
count of device for ALSA card instance. This delegates release of the
device to a process in which the last of ALSA character device is
released.

On the other hand, the other drivers such as for devices on PCIe are
programmed to block .remove callback of bus driver till all of ALSA
character devices are released.

For consistency of behaviour for whole drivers, this probably confuses
users. This commit takes drivers in ALSA firewire stack to imitate the
above behaviour.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/firewire/bebob/bebob.c
sound/firewire/digi00x/digi00x.c
sound/firewire/fireface/ff.c
sound/firewire/fireworks/fireworks.c
sound/firewire/isight.c
sound/firewire/motu/motu.c
sound/firewire/oxfw/oxfw.c
sound/firewire/tascam/tascam.c

index 72b0421..3a5579c 100644 (file)
@@ -374,8 +374,8 @@ static void bebob_remove(struct fw_unit *unit)
        cancel_delayed_work_sync(&bebob->dwork);
 
        if (bebob->registered) {
-               /* No need to wait for releasing card object in this context. */
-               snd_card_free_when_closed(bebob->card);
+               // Block till all of ALSA character devices are released.
+               snd_card_free(bebob->card);
        } else {
                /* Don't forget this case. */
                bebob_free(bebob);
index 654420f..554d7ff 100644 (file)
@@ -172,8 +172,8 @@ static void snd_dg00x_remove(struct fw_unit *unit)
        cancel_delayed_work_sync(&dg00x->dwork);
 
        if (dg00x->registered) {
-               /* No need to wait for releasing card object in this context. */
-               snd_card_free_when_closed(dg00x->card);
+               // Block till all of ALSA character devices are released.
+               snd_card_free(dg00x->card);
        } else {
                /* Don't forget this case. */
                dg00x_free(dg00x);
index 98731bd..73425df 100644 (file)
@@ -145,8 +145,8 @@ static void snd_ff_remove(struct fw_unit *unit)
        cancel_work_sync(&ff->dwork.work);
 
        if (ff->registered) {
-               /* No need to wait for releasing card object in this context. */
-               snd_card_free_when_closed(ff->card);
+               // Block till all of ALSA character devices are released.
+               snd_card_free(ff->card);
        } else {
                /* Don't forget this case. */
                ff_free(ff);
index f680e2f..5a17ead 100644 (file)
@@ -358,8 +358,8 @@ static void efw_remove(struct fw_unit *unit)
        cancel_delayed_work_sync(&efw->dwork);
 
        if (efw->registered) {
-               /* No need to wait for releasing card object in this context. */
-               snd_card_free_when_closed(efw->card);
+               // Block till all of ALSA character devices are released.
+               snd_card_free(efw->card);
        } else {
                /* Don't forget this case. */
                efw_free(efw);
index 3095747..1f591c8 100644 (file)
@@ -703,7 +703,8 @@ static void isight_remove(struct fw_unit *unit)
        isight_stop_streaming(isight);
        mutex_unlock(&isight->mutex);
 
-       snd_card_free_when_closed(isight->card);
+       // Block till all of ALSA character devices are released.
+       snd_card_free(isight->card);
 }
 
 static const struct ieee1394_device_id isight_id_table[] = {
index fd57264..12680c8 100644 (file)
@@ -172,8 +172,8 @@ static void motu_remove(struct fw_unit *unit)
        cancel_delayed_work_sync(&motu->dwork);
 
        if (motu->registered) {
-               /* No need to wait for releasing card object in this context. */
-               snd_card_free_when_closed(motu->card);
+               // Block till all of ALSA character devices are released.
+               snd_card_free(motu->card);
        } else {
                /* Don't forget this case. */
                motu_free(motu);
index 6ac5517..36f905b 100644 (file)
@@ -327,8 +327,8 @@ static void oxfw_remove(struct fw_unit *unit)
        cancel_delayed_work_sync(&oxfw->dwork);
 
        if (oxfw->registered) {
-               /* No need to wait for releasing card object in this context. */
-               snd_card_free_when_closed(oxfw->card);
+               // Block till all of ALSA character devices are released.
+               snd_card_free(oxfw->card);
        } else {
                /* Don't forget this case. */
                oxfw_free(oxfw);
index 53f2015..6f7aaa8 100644 (file)
@@ -212,8 +212,8 @@ static void snd_tscm_remove(struct fw_unit *unit)
        cancel_delayed_work_sync(&tscm->dwork);
 
        if (tscm->registered) {
-               /* No need to wait for releasing card object in this context. */
-               snd_card_free_when_closed(tscm->card);
+               // Block till all of ALSA character devices are released.
+               snd_card_free(tscm->card);
        } else {
                /* Don't forget this case. */
                tscm_free(tscm);