@@ -126,6 +126,17 @@ name_device(struct snd_bebob *bebob)
126
126
return err ;
127
127
}
128
128
129
+ static void bebob_free (struct snd_bebob * bebob )
130
+ {
131
+ snd_bebob_stream_destroy_duplex (bebob );
132
+ fw_unit_put (bebob -> unit );
133
+
134
+ kfree (bebob -> maudio_special_quirk );
135
+
136
+ mutex_destroy (& bebob -> mutex );
137
+ kfree (bebob );
138
+ }
139
+
129
140
/*
130
141
* This module releases the FireWire unit data after all ALSA character devices
131
142
* are released by applications. This is for releasing stream data or finishing
@@ -137,18 +148,11 @@ bebob_card_free(struct snd_card *card)
137
148
{
138
149
struct snd_bebob * bebob = card -> private_data ;
139
150
140
- snd_bebob_stream_destroy_duplex (bebob );
141
- fw_unit_put (bebob -> unit );
142
-
143
- kfree (bebob -> maudio_special_quirk );
144
-
145
- if (bebob -> card_index >= 0 ) {
146
- mutex_lock (& devices_mutex );
147
- clear_bit (bebob -> card_index , devices_used );
148
- mutex_unlock (& devices_mutex );
149
- }
151
+ mutex_lock (& devices_mutex );
152
+ clear_bit (bebob -> card_index , devices_used );
153
+ mutex_unlock (& devices_mutex );
150
154
151
- mutex_destroy ( & bebob -> mutex );
155
+ bebob_free ( card -> private_data );
152
156
}
153
157
154
158
static const struct snd_bebob_spec *
@@ -176,81 +180,57 @@ check_audiophile_booted(struct fw_unit *unit)
176
180
return strncmp (name , "FW Audiophile Bootloader" , 15 ) != 0 ;
177
181
}
178
182
179
- static int
180
- bebob_probe (struct fw_unit * unit ,
181
- const struct ieee1394_device_id * entry )
183
+ static void
184
+ do_registration (struct work_struct * work )
182
185
{
183
- struct snd_card * card ;
184
- struct snd_bebob * bebob ;
185
- const struct snd_bebob_spec * spec ;
186
+ struct snd_bebob * bebob =
187
+ container_of (work , struct snd_bebob , dwork .work );
186
188
unsigned int card_index ;
187
189
int err ;
188
190
191
+ if (bebob -> registered )
192
+ return ;
193
+
189
194
mutex_lock (& devices_mutex );
190
195
191
196
for (card_index = 0 ; card_index < SNDRV_CARDS ; card_index ++ ) {
192
197
if (!test_bit (card_index , devices_used ) && enable [card_index ])
193
198
break ;
194
199
}
195
200
if (card_index >= SNDRV_CARDS ) {
196
- err = - ENOENT ;
197
- goto end ;
201
+ mutex_unlock ( & devices_mutex ) ;
202
+ return ;
198
203
}
199
204
200
- if ((entry -> vendor_id == VEN_FOCUSRITE ) &&
201
- (entry -> model_id == MODEL_FOCUSRITE_SAFFIRE_BOTH ))
202
- spec = get_saffire_spec (unit );
203
- else if ((entry -> vendor_id == VEN_MAUDIO1 ) &&
204
- (entry -> model_id == MODEL_MAUDIO_AUDIOPHILE_BOTH ) &&
205
- !check_audiophile_booted (unit ))
206
- spec = NULL ;
207
- else
208
- spec = (const struct snd_bebob_spec * )entry -> driver_data ;
209
-
210
- if (spec == NULL ) {
211
- if ((entry -> vendor_id == VEN_MAUDIO1 ) ||
212
- (entry -> vendor_id == VEN_MAUDIO2 ))
213
- err = snd_bebob_maudio_load_firmware (unit );
214
- else
215
- err = - ENOSYS ;
216
- goto end ;
205
+ err = snd_card_new (& bebob -> unit -> device , index [card_index ],
206
+ id [card_index ], THIS_MODULE , 0 , & bebob -> card );
207
+ if (err < 0 ) {
208
+ mutex_unlock (& devices_mutex );
209
+ return ;
217
210
}
218
211
219
- err = snd_card_new (& unit -> device , index [card_index ], id [card_index ],
220
- THIS_MODULE , sizeof (struct snd_bebob ), & card );
221
- if (err < 0 )
222
- goto end ;
223
- bebob = card -> private_data ;
224
- bebob -> card_index = card_index ;
225
- set_bit (card_index , devices_used );
226
- card -> private_free = bebob_card_free ;
227
-
228
- bebob -> card = card ;
229
- bebob -> unit = fw_unit_get (unit );
230
- bebob -> spec = spec ;
231
- mutex_init (& bebob -> mutex );
232
- spin_lock_init (& bebob -> lock );
233
- init_waitqueue_head (& bebob -> hwdep_wait );
234
-
235
212
err = name_device (bebob );
236
213
if (err < 0 )
237
214
goto error ;
238
215
239
- if ((entry -> vendor_id == VEN_MAUDIO1 ) &&
240
- (entry -> model_id == MODEL_MAUDIO_FW1814 ))
241
- err = snd_bebob_maudio_special_discover (bebob , true);
242
- else if ((entry -> vendor_id == VEN_MAUDIO1 ) &&
243
- (entry -> model_id == MODEL_MAUDIO_PROJECTMIX ))
244
- err = snd_bebob_maudio_special_discover (bebob , false);
245
- else
216
+ if (bebob -> spec == & maudio_special_spec ) {
217
+ if (bebob -> entry -> model_id == MODEL_MAUDIO_FW1814 )
218
+ err = snd_bebob_maudio_special_discover (bebob , true);
219
+ else
220
+ err = snd_bebob_maudio_special_discover (bebob , false);
221
+ } else {
246
222
err = snd_bebob_stream_discover (bebob );
223
+ }
224
+ if (err < 0 )
225
+ goto error ;
226
+
227
+ err = snd_bebob_stream_init_duplex (bebob );
247
228
if (err < 0 )
248
229
goto error ;
249
230
250
231
snd_bebob_proc_init (bebob );
251
232
252
- if ((bebob -> midi_input_ports > 0 ) ||
253
- (bebob -> midi_output_ports > 0 )) {
233
+ if (bebob -> midi_input_ports > 0 || bebob -> midi_output_ports > 0 ) {
254
234
err = snd_bebob_create_midi_devices (bebob );
255
235
if (err < 0 )
256
236
goto error ;
@@ -264,16 +244,75 @@ bebob_probe(struct fw_unit *unit,
264
244
if (err < 0 )
265
245
goto error ;
266
246
267
- err = snd_bebob_stream_init_duplex (bebob );
247
+ err = snd_card_register (bebob -> card );
268
248
if (err < 0 )
269
249
goto error ;
270
250
271
- if (!bebob -> maudio_special_quirk ) {
272
- err = snd_card_register (card );
273
- if (err < 0 ) {
274
- snd_bebob_stream_destroy_duplex (bebob );
275
- goto error ;
276
- }
251
+ set_bit (card_index , devices_used );
252
+ mutex_unlock (& devices_mutex );
253
+
254
+ /*
255
+ * After registered, bebob instance can be released corresponding to
256
+ * releasing the sound card instance.
257
+ */
258
+ bebob -> card -> private_free = bebob_card_free ;
259
+ bebob -> card -> private_data = bebob ;
260
+ bebob -> registered = true;
261
+
262
+ return ;
263
+ error :
264
+ mutex_unlock (& devices_mutex );
265
+ snd_bebob_stream_destroy_duplex (bebob );
266
+ snd_card_free (bebob -> card );
267
+ dev_info (& bebob -> unit -> device ,
268
+ "Sound card registration failed: %d\n" , err );
269
+ }
270
+
271
+ static int
272
+ bebob_probe (struct fw_unit * unit , const struct ieee1394_device_id * entry )
273
+ {
274
+ struct snd_bebob * bebob ;
275
+ const struct snd_bebob_spec * spec ;
276
+
277
+ if (entry -> vendor_id == VEN_FOCUSRITE &&
278
+ entry -> model_id == MODEL_FOCUSRITE_SAFFIRE_BOTH )
279
+ spec = get_saffire_spec (unit );
280
+ else if (entry -> vendor_id == VEN_MAUDIO1 &&
281
+ entry -> model_id == MODEL_MAUDIO_AUDIOPHILE_BOTH &&
282
+ !check_audiophile_booted (unit ))
283
+ spec = NULL ;
284
+ else
285
+ spec = (const struct snd_bebob_spec * )entry -> driver_data ;
286
+
287
+ if (spec == NULL ) {
288
+ if (entry -> vendor_id == VEN_MAUDIO1 ||
289
+ entry -> vendor_id == VEN_MAUDIO2 )
290
+ return snd_bebob_maudio_load_firmware (unit );
291
+ else
292
+ return - ENODEV ;
293
+ }
294
+
295
+ /* Allocate this independent of sound card instance. */
296
+ bebob = kzalloc (sizeof (struct snd_bebob ), GFP_KERNEL );
297
+ if (bebob == NULL )
298
+ return - ENOMEM ;
299
+
300
+ bebob -> unit = fw_unit_get (unit );
301
+ bebob -> entry = entry ;
302
+ bebob -> spec = spec ;
303
+ dev_set_drvdata (& unit -> device , bebob );
304
+
305
+ mutex_init (& bebob -> mutex );
306
+ spin_lock_init (& bebob -> lock );
307
+ init_waitqueue_head (& bebob -> hwdep_wait );
308
+
309
+ /* Allocate and register this sound card later. */
310
+ INIT_DEFERRABLE_WORK (& bebob -> dwork , do_registration );
311
+
312
+ if (entry -> vendor_id != VEN_MAUDIO1 ||
313
+ (entry -> model_id != MODEL_MAUDIO_FW1814 &&
314
+ entry -> model_id != MODEL_MAUDIO_PROJECTMIX )) {
315
+ snd_fw_schedule_registration (unit , & bebob -> dwork );
277
316
} else {
278
317
/*
279
318
* This is a workaround. This bus reset seems to have an effect
@@ -285,19 +324,11 @@ bebob_probe(struct fw_unit *unit,
285
324
* signals from dbus and starts I/Os. To avoid I/Os till the
286
325
* future bus reset, registration is done in next update().
287
326
*/
288
- bebob -> deferred_registration = true;
289
327
fw_schedule_bus_reset (fw_parent_device (bebob -> unit )-> card ,
290
328
false, true);
291
329
}
292
330
293
- dev_set_drvdata (& unit -> device , bebob );
294
- end :
295
- mutex_unlock (& devices_mutex );
296
- return err ;
297
- error :
298
- mutex_unlock (& devices_mutex );
299
- snd_card_free (card );
300
- return err ;
331
+ return 0 ;
301
332
}
302
333
303
334
/*
@@ -324,15 +355,11 @@ bebob_update(struct fw_unit *unit)
324
355
if (bebob == NULL )
325
356
return ;
326
357
327
- fcp_bus_reset (bebob -> unit );
328
-
329
- if (bebob -> deferred_registration ) {
330
- if (snd_card_register (bebob -> card ) < 0 ) {
331
- snd_bebob_stream_destroy_duplex (bebob );
332
- snd_card_free (bebob -> card );
333
- }
334
- bebob -> deferred_registration = false;
335
- }
358
+ /* Postpone a workqueue for deferred registration. */
359
+ if (!bebob -> registered )
360
+ snd_fw_schedule_registration (unit , & bebob -> dwork );
361
+ else
362
+ fcp_bus_reset (bebob -> unit );
336
363
}
337
364
338
365
static void bebob_remove (struct fw_unit * unit )
@@ -342,8 +369,20 @@ static void bebob_remove(struct fw_unit *unit)
342
369
if (bebob == NULL )
343
370
return ;
344
371
345
- /* No need to wait for releasing card object in this context. */
346
- snd_card_free_when_closed (bebob -> card );
372
+ /*
373
+ * Confirm to stop the work for registration before the sound card is
374
+ * going to be released. The work is not scheduled again because bus
375
+ * reset handler is not called anymore.
376
+ */
377
+ cancel_delayed_work_sync (& bebob -> dwork );
378
+
379
+ if (bebob -> registered ) {
380
+ /* No need to wait for releasing card object in this context. */
381
+ snd_card_free_when_closed (bebob -> card );
382
+ } else {
383
+ /* Don't forget this case. */
384
+ bebob_free (bebob );
385
+ }
347
386
}
348
387
349
388
static const struct snd_bebob_rate_spec normal_rate_spec = {
0 commit comments