aboutsummaryrefslogtreecommitdiffstats
path: root/sound/firewire/fireworks
diff options
context:
space:
mode:
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>2015-02-21 09:55:00 -0500
committerTakashi Iwai <tiwai@suse.de>2015-02-23 03:11:24 -0500
commitdec84316dd53c90e93b4ee849483bd4bd1e9a585 (patch)
tree3725938633e83ba9bf303e171323bbb911a0ba9f /sound/firewire/fireworks
parentd23c2cc4485d10f0cedfef99dd2961d9652b1b3f (diff)
ALSA: fireworks/bebob/dice/oxfw: make it possible to shutdown safely
A part of these drivers, especially BeBoB driver, are programmed to wait some events. Thus the drivers should not destroy any data in .remove() context. This commit moves some destructors from 'struct fw_driver.remove()' to 'struct snd_card.private_free()' to shutdown safely. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Cc: <stable@vger.kernel.org> # 3.19+ Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/firewire/fireworks')
-rw-r--r--sound/firewire/fireworks/fireworks.c10
-rw-r--r--sound/firewire/fireworks/fireworks_stream.c4
2 files changed, 4 insertions, 10 deletions
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
199static int 202static 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
325void snd_efw_stream_destroy_duplex(struct snd_efw *efw) 325void 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
335void snd_efw_stream_lock_changed(struct snd_efw *efw) 331void snd_efw_stream_lock_changed(struct snd_efw *efw)