@@ -52,7 +52,8 @@ struct snd_usb_midi2_endpoint {
52
52
struct usb_device * dev ;
53
53
const struct usb_ms20_endpoint_descriptor * ms_ep ; /* reference to EP descriptor */
54
54
struct snd_usb_midi2_endpoint * pair ; /* bidirectional pair EP */
55
- struct snd_usb_midi2_ump * rmidi ; /* assigned UMP EP */
55
+ struct snd_usb_midi2_ump * rmidi ; /* assigned UMP EP pair */
56
+ struct snd_ump_endpoint * ump ; /* assigned UMP EP */
56
57
int direction ; /* direction (STR_IN/OUT) */
57
58
unsigned int endpoint ; /* EP number */
58
59
unsigned int pipe ; /* URB pipe */
@@ -133,12 +134,8 @@ static int prepare_output_urb(struct snd_usb_midi2_endpoint *ep,
133
134
{
134
135
int count ;
135
136
136
- if (ep -> substream )
137
- count = snd_rawmidi_transmit (ep -> substream ,
138
- urb -> transfer_buffer ,
139
- ep -> packets );
140
- else
141
- count = - ENODEV ;
137
+ count = snd_ump_transmit (ep -> ump , urb -> transfer_buffer ,
138
+ ep -> packets );
142
139
if (count < 0 ) {
143
140
dev_dbg (& ep -> dev -> dev , "rawmidi transmit error %d\n" , count );
144
141
return count ;
@@ -197,9 +194,9 @@ static void input_urb_complete(struct urb *urb)
197
194
len &= ~3 ; /* align UMP */
198
195
if (len > ep -> packets )
199
196
len = ep -> packets ;
200
- if (len > 0 && ep -> substream ) {
197
+ if (len > 0 ) {
201
198
le32_to_cpu_array ((u32 * )urb -> transfer_buffer , len >> 2 );
202
- snd_rawmidi_receive (ep -> substream , urb -> transfer_buffer , len );
199
+ snd_ump_receive (ep -> ump , ( u32 * ) urb -> transfer_buffer , len );
203
200
}
204
201
dequeue :
205
202
set_bit (ctx -> index , & ep -> urb_free );
@@ -330,68 +327,58 @@ static int alloc_midi_urbs(struct snd_usb_midi2_endpoint *ep)
330
327
}
331
328
332
329
static struct snd_usb_midi2_endpoint *
333
- substream_to_endpoint (struct snd_rawmidi_substream * substream )
330
+ ump_to_endpoint (struct snd_ump_endpoint * ump , int dir )
334
331
{
335
- struct snd_ump_endpoint * ump = rawmidi_to_ump (substream -> rmidi );
336
332
struct snd_usb_midi2_ump * rmidi = ump -> private_data ;
337
333
338
- return rmidi -> eps [substream -> stream ];
334
+ return rmidi -> eps [dir ];
339
335
}
340
336
341
- /* rawmidi open callback */
342
- static int snd_usb_midi_v2_open (struct snd_rawmidi_substream * substream )
337
+ /* ump open callback */
338
+ static int snd_usb_midi_v2_open (struct snd_ump_endpoint * ump , int dir )
343
339
{
344
- struct snd_usb_midi2_endpoint * ep = substream_to_endpoint ( substream );
340
+ struct snd_usb_midi2_endpoint * ep = ump_to_endpoint ( ump , dir );
345
341
int err = 0 ;
346
342
347
343
if (!ep || !ep -> endpoint )
348
344
return - ENODEV ;
349
345
if (ep -> disconnected )
350
346
return - EIO ;
351
- if (ep -> substream )
352
- return - EBUSY ;
353
347
if (ep -> direction == STR_OUT ) {
354
348
err = alloc_midi_urbs (ep );
355
349
if (err )
356
350
return err ;
357
351
}
358
- spin_lock_irq (& ep -> lock );
359
- ep -> substream = substream ;
360
- spin_unlock_irq (& ep -> lock );
361
352
return 0 ;
362
353
}
363
354
364
- /* rawmidi close callback */
365
- static int snd_usb_midi_v2_close (struct snd_rawmidi_substream * substream )
355
+ /* ump close callback */
356
+ static void snd_usb_midi_v2_close (struct snd_ump_endpoint * ump , int dir )
366
357
{
367
- struct snd_usb_midi2_endpoint * ep = substream_to_endpoint ( substream );
358
+ struct snd_usb_midi2_endpoint * ep = ump_to_endpoint ( ump , dir );
368
359
369
- spin_lock_irq (& ep -> lock );
370
- ep -> substream = NULL ;
371
- spin_unlock_irq (& ep -> lock );
372
360
if (ep -> direction == STR_OUT ) {
373
361
kill_midi_urbs (ep , false);
374
362
drain_urb_queue (ep );
375
363
free_midi_urbs (ep );
376
364
}
377
- return 0 ;
378
365
}
379
366
380
- /* rawmidi trigger callback */
381
- static void snd_usb_midi_v2_trigger (struct snd_rawmidi_substream * substream ,
367
+ /* ump trigger callback */
368
+ static void snd_usb_midi_v2_trigger (struct snd_ump_endpoint * ump , int dir ,
382
369
int up )
383
370
{
384
- struct snd_usb_midi2_endpoint * ep = substream_to_endpoint ( substream );
371
+ struct snd_usb_midi2_endpoint * ep = ump_to_endpoint ( ump , dir );
385
372
386
373
atomic_set (& ep -> running , up );
387
374
if (up && ep -> direction == STR_OUT && !ep -> disconnected )
388
375
submit_io_urbs (ep );
389
376
}
390
377
391
- /* rawmidi drain callback */
392
- static void snd_usb_midi_v2_drain (struct snd_rawmidi_substream * substream )
378
+ /* ump drain callback */
379
+ static void snd_usb_midi_v2_drain (struct snd_ump_endpoint * ump , int dir )
393
380
{
394
- struct snd_usb_midi2_endpoint * ep = substream_to_endpoint ( substream );
381
+ struct snd_usb_midi2_endpoint * ep = ump_to_endpoint ( ump , dir );
395
382
396
383
drain_urb_queue (ep );
397
384
}
@@ -426,19 +413,13 @@ static int start_input_streams(struct snd_usb_midi2_interface *umidi)
426
413
return err ;
427
414
}
428
415
429
- static const struct snd_rawmidi_ops output_ops = {
416
+ static const struct snd_ump_ops snd_usb_midi_v2_ump_ops = {
430
417
.open = snd_usb_midi_v2_open ,
431
418
.close = snd_usb_midi_v2_close ,
432
419
.trigger = snd_usb_midi_v2_trigger ,
433
420
.drain = snd_usb_midi_v2_drain ,
434
421
};
435
422
436
- static const struct snd_rawmidi_ops input_ops = {
437
- .open = snd_usb_midi_v2_open ,
438
- .close = snd_usb_midi_v2_close ,
439
- .trigger = snd_usb_midi_v2_trigger ,
440
- };
441
-
442
423
/* create a USB MIDI 2.0 endpoint object */
443
424
static int create_midi2_endpoint (struct snd_usb_midi2_interface * umidi ,
444
425
struct usb_host_endpoint * hostep ,
@@ -729,23 +710,19 @@ static int create_midi2_ump(struct snd_usb_midi2_interface *umidi,
729
710
umidi -> chip -> num_rawmidis ++ ;
730
711
731
712
ump -> private_data = rmidi ;
732
-
733
- if (input )
734
- snd_rawmidi_set_ops (& ump -> core , SNDRV_RAWMIDI_STREAM_INPUT ,
735
- & input_ops );
736
- if (output )
737
- snd_rawmidi_set_ops (& ump -> core , SNDRV_RAWMIDI_STREAM_OUTPUT ,
738
- & output_ops );
713
+ ump -> ops = & snd_usb_midi_v2_ump_ops ;
739
714
740
715
rmidi -> eps [STR_IN ] = ep_in ;
741
716
rmidi -> eps [STR_OUT ] = ep_out ;
742
717
if (ep_in ) {
743
718
ep_in -> pair = ep_out ;
744
719
ep_in -> rmidi = rmidi ;
720
+ ep_in -> ump = ump ;
745
721
}
746
722
if (ep_out ) {
747
723
ep_out -> pair = ep_in ;
748
724
ep_out -> rmidi = rmidi ;
725
+ ep_out -> ump = ump ;
749
726
}
750
727
751
728
list_add_tail (& rmidi -> list , & umidi -> rawmidi_list );
0 commit comments