diff options
| -rw-r--r-- | sound/firewire/bebob/bebob.c | 10 | ||||
| -rw-r--r-- | sound/firewire/bebob/bebob_stream.c | 4 | ||||
| -rw-r--r-- | sound/firewire/dice/dice.c | 5 | ||||
| -rw-r--r-- | sound/firewire/fireworks/fireworks.c | 10 | ||||
| -rw-r--r-- | sound/firewire/fireworks/fireworks_stream.c | 4 | ||||
| -rw-r--r-- | sound/firewire/oxfw/oxfw.c | 10 |
6 files changed, 15 insertions, 28 deletions
diff --git a/sound/firewire/bebob/bebob.c b/sound/firewire/bebob/bebob.c index b612599fb543..611b7dae7ee5 100644 --- a/sound/firewire/bebob/bebob.c +++ b/sound/firewire/bebob/bebob.c | |||
| @@ -127,8 +127,11 @@ bebob_card_free(struct snd_card *card) | |||
| 127 | { | 127 | { |
| 128 | struct snd_bebob *bebob = card->private_data; | 128 | struct snd_bebob *bebob = card->private_data; |
| 129 | 129 | ||
| 130 | snd_bebob_stream_destroy_duplex(bebob); | ||
| 130 | fw_unit_put(bebob->unit); | 131 | fw_unit_put(bebob->unit); |
| 131 | 132 | ||
| 133 | kfree(bebob->maudio_special_quirk); | ||
| 134 | |||
| 132 | if (bebob->card_index >= 0) { | 135 | if (bebob->card_index >= 0) { |
| 133 | mutex_lock(&devices_mutex); | 136 | mutex_lock(&devices_mutex); |
| 134 | clear_bit(bebob->card_index, devices_used); | 137 | clear_bit(bebob->card_index, devices_used); |
| @@ -314,10 +317,9 @@ static void bebob_remove(struct fw_unit *unit) | |||
| 314 | if (bebob == NULL) | 317 | if (bebob == NULL) |
| 315 | return; | 318 | return; |
| 316 | 319 | ||
| 317 | kfree(bebob->maudio_special_quirk); | 320 | /* Awake bus-reset waiters. */ |
| 318 | 321 | if (!completion_done(&bebob->bus_reset)) | |
| 319 | snd_bebob_stream_destroy_duplex(bebob); | 322 | complete_all(&bebob->bus_reset); |
| 320 | snd_card_disconnect(bebob->card); | ||
| 321 | 323 | ||
| 322 | /* No need to wait for releasing card object in this context. */ | 324 | /* No need to wait for releasing card object in this context. */ |
| 323 | snd_card_free_when_closed(bebob->card); | 325 | snd_card_free_when_closed(bebob->card); |
diff --git a/sound/firewire/bebob/bebob_stream.c b/sound/firewire/bebob/bebob_stream.c index fcca3eebc91f..98e4fc8121a1 100644 --- a/sound/firewire/bebob/bebob_stream.c +++ b/sound/firewire/bebob/bebob_stream.c | |||
| @@ -716,14 +716,10 @@ void snd_bebob_stream_update_duplex(struct snd_bebob *bebob) | |||
| 716 | */ | 716 | */ |
| 717 | void snd_bebob_stream_destroy_duplex(struct snd_bebob *bebob) | 717 | void snd_bebob_stream_destroy_duplex(struct snd_bebob *bebob) |
| 718 | { | 718 | { |
| 719 | mutex_lock(&bebob->mutex); | ||
| 720 | |||
| 721 | amdtp_stream_destroy(&bebob->rx_stream); | 719 | amdtp_stream_destroy(&bebob->rx_stream); |
| 722 | amdtp_stream_destroy(&bebob->tx_stream); | 720 | amdtp_stream_destroy(&bebob->tx_stream); |
| 723 | 721 | ||
| 724 | destroy_both_connections(bebob); | 722 | destroy_both_connections(bebob); |
| 725 | |||
| 726 | mutex_unlock(&bebob->mutex); | ||
| 727 | } | 723 | } |
| 728 | 724 | ||
| 729 | /* | 725 | /* |
diff --git a/sound/firewire/dice/dice.c b/sound/firewire/dice/dice.c index 797f0726fc74..70a111d7f428 100644 --- a/sound/firewire/dice/dice.c +++ b/sound/firewire/dice/dice.c | |||
| @@ -236,6 +236,7 @@ static void dice_card_free(struct snd_card *card) | |||
| 236 | { | 236 | { |
| 237 | struct snd_dice *dice = card->private_data; | 237 | struct snd_dice *dice = card->private_data; |
| 238 | 238 | ||
| 239 | snd_dice_stream_destroy_duplex(dice); | ||
| 239 | snd_dice_transaction_destroy(dice); | 240 | snd_dice_transaction_destroy(dice); |
| 240 | fw_unit_put(dice->unit); | 241 | fw_unit_put(dice->unit); |
| 241 | 242 | ||
| @@ -313,10 +314,6 @@ static void dice_remove(struct fw_unit *unit) | |||
| 313 | { | 314 | { |
| 314 | struct snd_dice *dice = dev_get_drvdata(&unit->device); | 315 | struct snd_dice *dice = dev_get_drvdata(&unit->device); |
| 315 | 316 | ||
| 316 | snd_card_disconnect(dice->card); | ||
| 317 | |||
| 318 | snd_dice_stream_destroy_duplex(dice); | ||
| 319 | |||
| 320 | /* No need to wait for releasing card object in this context. */ | 317 | /* No need to wait for releasing card object in this context. */ |
| 321 | snd_card_free_when_closed(dice->card); | 318 | snd_card_free_when_closed(dice->card); |
| 322 | } | 319 | } |
diff --git a/sound/firewire/fireworks/fireworks.c b/sound/firewire/fireworks/fireworks.c index 1e33394d8a93..2682e7e3e5c9 100644 --- a/sound/firewire/fireworks/fireworks.c +++ b/sound/firewire/fireworks/fireworks.c | |||
| @@ -184,8 +184,12 @@ efw_card_free(struct snd_card *card) | |||
| 184 | { | 184 | { |
| 185 | struct snd_efw *efw = card->private_data; | 185 | struct snd_efw *efw = card->private_data; |
| 186 | 186 | ||
| 187 | snd_efw_stream_destroy_duplex(efw); | ||
| 188 | snd_efw_transaction_remove_instance(efw); | ||
| 187 | fw_unit_put(efw->unit); | 189 | fw_unit_put(efw->unit); |
| 188 | 190 | ||
| 191 | kfree(efw->resp_buf); | ||
| 192 | |||
| 189 | if (efw->card_index >= 0) { | 193 | if (efw->card_index >= 0) { |
| 190 | mutex_lock(&devices_mutex); | 194 | mutex_lock(&devices_mutex); |
| 191 | clear_bit(efw->card_index, devices_used); | 195 | clear_bit(efw->card_index, devices_used); |
| @@ -193,7 +197,6 @@ efw_card_free(struct snd_card *card) | |||
| 193 | } | 197 | } |
| 194 | 198 | ||
| 195 | mutex_destroy(&efw->mutex); | 199 | mutex_destroy(&efw->mutex); |
| 196 | kfree(efw->resp_buf); | ||
| 197 | } | 200 | } |
| 198 | 201 | ||
| 199 | static int | 202 | static int |
| @@ -297,11 +300,6 @@ static void efw_remove(struct fw_unit *unit) | |||
| 297 | { | 300 | { |
| 298 | struct snd_efw *efw = dev_get_drvdata(&unit->device); | 301 | struct snd_efw *efw = dev_get_drvdata(&unit->device); |
| 299 | 302 | ||
| 300 | snd_efw_stream_destroy_duplex(efw); | ||
| 301 | snd_efw_transaction_remove_instance(efw); | ||
| 302 | |||
| 303 | snd_card_disconnect(efw->card); | ||
| 304 | |||
| 305 | /* No need to wait for releasing card object in this context. */ | 303 | /* No need to wait for releasing card object in this context. */ |
| 306 | snd_card_free_when_closed(efw->card); | 304 | snd_card_free_when_closed(efw->card); |
| 307 | } | 305 | } |
diff --git a/sound/firewire/fireworks/fireworks_stream.c b/sound/firewire/fireworks/fireworks_stream.c index f817b7ae097e..c55db1bddc80 100644 --- a/sound/firewire/fireworks/fireworks_stream.c +++ b/sound/firewire/fireworks/fireworks_stream.c | |||
| @@ -324,12 +324,8 @@ void snd_efw_stream_update_duplex(struct snd_efw *efw) | |||
| 324 | 324 | ||
| 325 | void snd_efw_stream_destroy_duplex(struct snd_efw *efw) | 325 | void snd_efw_stream_destroy_duplex(struct snd_efw *efw) |
| 326 | { | 326 | { |
| 327 | mutex_lock(&efw->mutex); | ||
| 328 | |||
| 329 | destroy_stream(efw, &efw->rx_stream); | 327 | destroy_stream(efw, &efw->rx_stream); |
| 330 | destroy_stream(efw, &efw->tx_stream); | 328 | destroy_stream(efw, &efw->tx_stream); |
| 331 | |||
| 332 | mutex_unlock(&efw->mutex); | ||
| 333 | } | 329 | } |
| 334 | 330 | ||
| 335 | void snd_efw_stream_lock_changed(struct snd_efw *efw) | 331 | void snd_efw_stream_lock_changed(struct snd_efw *efw) |
diff --git a/sound/firewire/oxfw/oxfw.c b/sound/firewire/oxfw/oxfw.c index 1607b26404c3..8c6ce019f437 100644 --- a/sound/firewire/oxfw/oxfw.c +++ b/sound/firewire/oxfw/oxfw.c | |||
| @@ -115,6 +115,10 @@ static void oxfw_card_free(struct snd_card *card) | |||
| 115 | struct snd_oxfw *oxfw = card->private_data; | 115 | struct snd_oxfw *oxfw = card->private_data; |
| 116 | unsigned int i; | 116 | unsigned int i; |
| 117 | 117 | ||
| 118 | snd_oxfw_stream_destroy_simplex(oxfw, &oxfw->rx_stream); | ||
| 119 | if (oxfw->has_output) | ||
| 120 | snd_oxfw_stream_destroy_simplex(oxfw, &oxfw->tx_stream); | ||
| 121 | |||
| 118 | fw_unit_put(oxfw->unit); | 122 | fw_unit_put(oxfw->unit); |
| 119 | 123 | ||
| 120 | for (i = 0; i < SND_OXFW_STREAM_FORMAT_ENTRIES; i++) { | 124 | for (i = 0; i < SND_OXFW_STREAM_FORMAT_ENTRIES; i++) { |
| @@ -220,12 +224,6 @@ static void oxfw_remove(struct fw_unit *unit) | |||
| 220 | { | 224 | { |
| 221 | struct snd_oxfw *oxfw = dev_get_drvdata(&unit->device); | 225 | struct snd_oxfw *oxfw = dev_get_drvdata(&unit->device); |
| 222 | 226 | ||
| 223 | snd_card_disconnect(oxfw->card); | ||
| 224 | |||
| 225 | snd_oxfw_stream_destroy_simplex(oxfw, &oxfw->rx_stream); | ||
| 226 | if (oxfw->has_output) | ||
| 227 | snd_oxfw_stream_destroy_simplex(oxfw, &oxfw->tx_stream); | ||
| 228 | |||
| 229 | /* No need to wait for releasing card object in this context. */ | 227 | /* No need to wait for releasing card object in this context. */ |
| 230 | snd_card_free_when_closed(oxfw->card); | 228 | snd_card_free_when_closed(oxfw->card); |
| 231 | } | 229 | } |
