aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/firewire/bebob/bebob.c17
-rw-r--r--sound/firewire/fireworks/fireworks.c21
2 files changed, 13 insertions, 25 deletions
diff --git a/sound/firewire/bebob/bebob.c b/sound/firewire/bebob/bebob.c
index 34ed8afbb30c..3bc68499974a 100644
--- a/sound/firewire/bebob/bebob.c
+++ b/sound/firewire/bebob/bebob.c
@@ -128,6 +128,10 @@ end:
static void bebob_free(struct snd_bebob *bebob)
{
+ mutex_lock(&devices_mutex);
+ clear_bit(bebob->card_index, devices_used);
+ mutex_unlock(&devices_mutex);
+
snd_bebob_stream_destroy_duplex(bebob);
}
@@ -140,12 +144,6 @@ static void bebob_free(struct snd_bebob *bebob)
static void
bebob_card_free(struct snd_card *card)
{
- struct snd_bebob *bebob = card->private_data;
-
- mutex_lock(&devices_mutex);
- clear_bit(bebob->card_index, devices_used);
- mutex_unlock(&devices_mutex);
-
bebob_free(card->private_data);
}
@@ -186,7 +184,6 @@ do_registration(struct work_struct *work)
return;
mutex_lock(&devices_mutex);
-
for (card_index = 0; card_index < SNDRV_CARDS; card_index++) {
if (!test_bit(card_index, devices_used) && enable[card_index])
break;
@@ -202,6 +199,8 @@ do_registration(struct work_struct *work)
mutex_unlock(&devices_mutex);
return;
}
+ set_bit(card_index, devices_used);
+ mutex_unlock(&devices_mutex);
err = name_device(bebob);
if (err < 0)
@@ -242,9 +241,6 @@ do_registration(struct work_struct *work)
if (err < 0)
goto error;
- set_bit(card_index, devices_used);
- mutex_unlock(&devices_mutex);
-
/*
* After registered, bebob instance can be released corresponding to
* releasing the sound card instance.
@@ -255,7 +251,6 @@ do_registration(struct work_struct *work)
return;
error:
- mutex_unlock(&devices_mutex);
snd_bebob_stream_destroy_duplex(bebob);
snd_card_free(bebob->card);
dev_info(&bebob->unit->device,
diff --git a/sound/firewire/fireworks/fireworks.c b/sound/firewire/fireworks/fireworks.c
index 5854d2a87a18..da0c31033821 100644
--- a/sound/firewire/fireworks/fireworks.c
+++ b/sound/firewire/fireworks/fireworks.c
@@ -186,6 +186,10 @@ end:
static void efw_free(struct snd_efw *efw)
{
+ mutex_lock(&devices_mutex);
+ clear_bit(efw->card_index, devices_used);
+ mutex_unlock(&devices_mutex);
+
snd_efw_stream_destroy_duplex(efw);
snd_efw_transaction_remove_instance(efw);
}
@@ -199,14 +203,6 @@ static void efw_free(struct snd_efw *efw)
static void
efw_card_free(struct snd_card *card)
{
- struct snd_efw *efw = card->private_data;
-
- if (efw->card_index >= 0) {
- mutex_lock(&devices_mutex);
- clear_bit(efw->card_index, devices_used);
- mutex_unlock(&devices_mutex);
- }
-
efw_free(card->private_data);
}
@@ -220,9 +216,8 @@ do_registration(struct work_struct *work)
if (efw->registered)
return;
- mutex_lock(&devices_mutex);
-
/* check registered cards */
+ mutex_lock(&devices_mutex);
for (card_index = 0; card_index < SNDRV_CARDS; ++card_index) {
if (!test_bit(card_index, devices_used) && enable[card_index])
break;
@@ -238,6 +233,8 @@ do_registration(struct work_struct *work)
mutex_unlock(&devices_mutex);
return;
}
+ set_bit(card_index, devices_used);
+ mutex_unlock(&devices_mutex);
/* prepare response buffer */
snd_efw_resp_buf_size = clamp(snd_efw_resp_buf_size,
@@ -279,9 +276,6 @@ do_registration(struct work_struct *work)
if (err < 0)
goto error;
- set_bit(card_index, devices_used);
- mutex_unlock(&devices_mutex);
-
/*
* After registered, efw instance can be released corresponding to
* releasing the sound card instance.
@@ -292,7 +286,6 @@ do_registration(struct work_struct *work)
return;
error:
- mutex_unlock(&devices_mutex);
snd_efw_transaction_remove_instance(efw);
snd_efw_stream_destroy_duplex(efw);
snd_card_free(efw->card);