Lines Matching +full:num +full:- +full:ports

2  * usbmidi.c - ALSA USB MIDI driver
4 * Copyright (c) 2002-2009 Clemens Ladisch
7 * Based on the OSS usb-midi driver by NAGANO Daisuke,
163 } ports[0x10]; member
175 } ports[0x10]; member
195 if (err < 0 && err != -ENODEV) in snd_usbmidi_submit_urb()
196 dev_err(&urb->dev->dev, "usb_submit_urb: %d\n", err); in snd_usbmidi_submit_urb()
205 switch (urb->status) { in snd_usbmidi_urb_error()
207 case -ENOENT: in snd_usbmidi_urb_error()
208 case -ECONNRESET: in snd_usbmidi_urb_error()
209 case -ESHUTDOWN: in snd_usbmidi_urb_error()
210 case -ENODEV: in snd_usbmidi_urb_error()
211 return -ENODEV; in snd_usbmidi_urb_error()
213 case -EPROTO: in snd_usbmidi_urb_error()
214 case -ETIME: in snd_usbmidi_urb_error()
215 case -EILSEQ: in snd_usbmidi_urb_error()
216 return -EIO; in snd_usbmidi_urb_error()
218 dev_err(&urb->dev->dev, "urb status %d\n", urb->status); in snd_usbmidi_urb_error()
229 struct usbmidi_in_port *port = &ep->ports[portidx]; in snd_usbmidi_input_data()
231 if (!port->substream) { in snd_usbmidi_input_data()
232 dev_dbg(&ep->umidi->dev->dev, "unexpected port %d!\n", portidx); in snd_usbmidi_input_data()
235 if (!test_bit(port->substream->number, &ep->umidi->input_triggered)) in snd_usbmidi_input_data()
237 snd_rawmidi_receive(port->substream, data, length); in snd_usbmidi_input_data()
244 for (; length > 0; ++data, --length) in dump_urb()
257 struct snd_usb_midi_in_endpoint *ep = urb->context; in snd_usbmidi_in_urb_complete()
259 if (urb->status == 0) { in snd_usbmidi_in_urb_complete()
260 dump_urb("received", urb->transfer_buffer, urb->actual_length); in snd_usbmidi_in_urb_complete()
261 ep->umidi->usb_protocol_ops->input(ep, urb->transfer_buffer, in snd_usbmidi_in_urb_complete()
262 urb->actual_length); in snd_usbmidi_in_urb_complete()
266 if (err != -ENODEV) { in snd_usbmidi_in_urb_complete()
267 ep->error_resubmit = 1; in snd_usbmidi_in_urb_complete()
268 mod_timer(&ep->umidi->error_timer, in snd_usbmidi_in_urb_complete()
275 urb->dev = ep->umidi->dev; in snd_usbmidi_in_urb_complete()
281 struct out_urb_context *context = urb->context; in snd_usbmidi_out_urb_complete()
282 struct snd_usb_midi_out_endpoint *ep = context->ep; in snd_usbmidi_out_urb_complete()
286 spin_lock_irqsave(&ep->buffer_lock, flags); in snd_usbmidi_out_urb_complete()
287 urb_index = context - ep->urbs; in snd_usbmidi_out_urb_complete()
288 ep->active_urbs &= ~(1 << urb_index); in snd_usbmidi_out_urb_complete()
289 if (unlikely(ep->drain_urbs)) { in snd_usbmidi_out_urb_complete()
290 ep->drain_urbs &= ~(1 << urb_index); in snd_usbmidi_out_urb_complete()
291 wake_up(&ep->drain_wait); in snd_usbmidi_out_urb_complete()
293 spin_unlock_irqrestore(&ep->buffer_lock, flags); in snd_usbmidi_out_urb_complete()
294 if (urb->status < 0) { in snd_usbmidi_out_urb_complete()
297 if (err != -ENODEV) in snd_usbmidi_out_urb_complete()
298 mod_timer(&ep->umidi->error_timer, in snd_usbmidi_out_urb_complete()
316 spin_lock_irqsave(&ep->buffer_lock, flags); in snd_usbmidi_do_output()
317 if (ep->umidi->disconnected) { in snd_usbmidi_do_output()
318 spin_unlock_irqrestore(&ep->buffer_lock, flags); in snd_usbmidi_do_output()
322 urb_index = ep->next_urb; in snd_usbmidi_do_output()
324 if (!(ep->active_urbs & (1 << urb_index))) { in snd_usbmidi_do_output()
325 urb = ep->urbs[urb_index].urb; in snd_usbmidi_do_output()
326 urb->transfer_buffer_length = 0; in snd_usbmidi_do_output()
327 ep->umidi->usb_protocol_ops->output(ep, urb); in snd_usbmidi_do_output()
328 if (urb->transfer_buffer_length == 0) in snd_usbmidi_do_output()
331 dump_urb("sending", urb->transfer_buffer, in snd_usbmidi_do_output()
332 urb->transfer_buffer_length); in snd_usbmidi_do_output()
333 urb->dev = ep->umidi->dev; in snd_usbmidi_do_output()
336 ep->active_urbs |= 1 << urb_index; in snd_usbmidi_do_output()
340 if (urb_index == ep->next_urb) in snd_usbmidi_do_output()
343 ep->next_urb = urb_index; in snd_usbmidi_do_output()
344 spin_unlock_irqrestore(&ep->buffer_lock, flags); in snd_usbmidi_do_output()
361 spin_lock(&umidi->disc_lock); in snd_usbmidi_error_timer()
362 if (umidi->disconnected) { in snd_usbmidi_error_timer()
363 spin_unlock(&umidi->disc_lock); in snd_usbmidi_error_timer()
367 struct snd_usb_midi_in_endpoint *in = umidi->endpoints[i].in; in snd_usbmidi_error_timer()
368 if (in && in->error_resubmit) { in snd_usbmidi_error_timer()
369 in->error_resubmit = 0; in snd_usbmidi_error_timer()
371 if (atomic_read(&in->urbs[j]->use_count)) in snd_usbmidi_error_timer()
373 in->urbs[j]->dev = umidi->dev; in snd_usbmidi_error_timer()
374 snd_usbmidi_submit_urb(in->urbs[j], GFP_ATOMIC); in snd_usbmidi_error_timer()
377 if (umidi->endpoints[i].out) in snd_usbmidi_error_timer()
378 snd_usbmidi_do_output(umidi->endpoints[i].out); in snd_usbmidi_error_timer()
380 spin_unlock(&umidi->disc_lock); in snd_usbmidi_error_timer()
383 /* helper function to send static data that may not DMA-able */
390 return -ENOMEM; in send_bulk_static_data()
392 if (ep->urbs[0].urb) in send_bulk_static_data()
393 err = usb_bulk_msg(ep->umidi->dev, ep->urbs[0].urb->pipe, in send_bulk_static_data()
433 * Buggy M-Audio device: running status on input results in a packet that has
446 struct usbmidi_in_port *port = &ep->ports[cable]; in snd_usbmidi_maudio_broken_running_status_input()
454 port->running_status_length = length - 1; in snd_usbmidi_maudio_broken_running_status_input()
456 port->running_status_length != 0 && in snd_usbmidi_maudio_broken_running_status_input()
459 length = port->running_status_length; in snd_usbmidi_maudio_broken_running_status_input()
467 port->running_status_length = 0; in snd_usbmidi_maudio_broken_running_status_input()
486 if (ep->in_sysex && in ch345_broken_sysex_input()
487 cin == ep->last_cin && in ch345_broken_sysex_input()
493 * Either a corrupted running status or a real note-on in ch345_broken_sysex_input()
500 ep->in_sysex = cin == 0x4; in ch345_broken_sysex_input()
501 if (!ep->in_sysex) in ch345_broken_sysex_input()
502 ep->last_cin = cin; in ch345_broken_sysex_input()
517 &buffer[1], buffer_length - 1); in snd_usbmidi_cme_input()
529 (uint8_t *)urb->transfer_buffer + urb->transfer_buffer_length; in snd_usbmidi_output_standard_packet()
534 urb->transfer_buffer_length += 4; in snd_usbmidi_output_standard_packet()
546 (uint8_t *)urb->transfer_buffer + urb->transfer_buffer_length; in snd_usbmidi_output_midiman_packet()
551 urb->transfer_buffer_length += 4; in snd_usbmidi_output_midiman_packet()
560 uint8_t p0 = port->cable; in snd_usbmidi_transmit_byte()
562 port->ep->umidi->usb_protocol_ops->output_packet; in snd_usbmidi_transmit_byte()
569 port->data[0] = b; in snd_usbmidi_transmit_byte()
570 port->state = STATE_SYSEX_1; in snd_usbmidi_transmit_byte()
574 port->data[0] = b; in snd_usbmidi_transmit_byte()
575 port->state = STATE_1PARAM; in snd_usbmidi_transmit_byte()
578 port->data[0] = b; in snd_usbmidi_transmit_byte()
579 port->state = STATE_2PARAM_1; in snd_usbmidi_transmit_byte()
583 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
587 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
590 switch (port->state) { in snd_usbmidi_transmit_byte()
595 output_packet(urb, p0 | 0x06, port->data[0], in snd_usbmidi_transmit_byte()
599 output_packet(urb, p0 | 0x07, port->data[0], in snd_usbmidi_transmit_byte()
600 port->data[1], 0xf7); in snd_usbmidi_transmit_byte()
603 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
607 port->data[0] = b; in snd_usbmidi_transmit_byte()
609 port->state = STATE_1PARAM; in snd_usbmidi_transmit_byte()
611 port->state = STATE_2PARAM_1; in snd_usbmidi_transmit_byte()
613 switch (port->state) { in snd_usbmidi_transmit_byte()
615 if (port->data[0] < 0xf0) { in snd_usbmidi_transmit_byte()
616 p0 |= port->data[0] >> 4; in snd_usbmidi_transmit_byte()
619 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
621 output_packet(urb, p0, port->data[0], b, 0); in snd_usbmidi_transmit_byte()
624 port->data[1] = b; in snd_usbmidi_transmit_byte()
625 port->state = STATE_2PARAM_2; in snd_usbmidi_transmit_byte()
628 if (port->data[0] < 0xf0) { in snd_usbmidi_transmit_byte()
629 p0 |= port->data[0] >> 4; in snd_usbmidi_transmit_byte()
630 port->state = STATE_2PARAM_1; in snd_usbmidi_transmit_byte()
633 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
635 output_packet(urb, p0, port->data[0], port->data[1], b); in snd_usbmidi_transmit_byte()
638 port->data[0] = b; in snd_usbmidi_transmit_byte()
639 port->state = STATE_SYSEX_1; in snd_usbmidi_transmit_byte()
642 port->data[1] = b; in snd_usbmidi_transmit_byte()
643 port->state = STATE_SYSEX_2; in snd_usbmidi_transmit_byte()
646 output_packet(urb, p0 | 0x04, port->data[0], in snd_usbmidi_transmit_byte()
647 port->data[1], b); in snd_usbmidi_transmit_byte()
648 port->state = STATE_SYSEX_0; in snd_usbmidi_transmit_byte()
659 /* FIXME: lower-numbered ports can starve higher-numbered ports */ in snd_usbmidi_standard_output()
661 struct usbmidi_out_port *port = &ep->ports[p]; in snd_usbmidi_standard_output()
662 if (!port->active) in snd_usbmidi_standard_output()
664 while (urb->transfer_buffer_length + 3 < ep->max_transfer) { in snd_usbmidi_standard_output()
666 if (snd_rawmidi_transmit(port->substream, &b, 1) != 1) { in snd_usbmidi_standard_output()
667 port->active = 0; in snd_usbmidi_standard_output()
727 unsigned int port = (buffer[pos] >> 4) - 1; in snd_usbmidi_akai_input()
744 struct snd_rawmidi_substream *substream = ep->ports[0].substream; in snd_usbmidi_akai_output()
746 if (!ep->ports[0].active) in snd_usbmidi_akai_output()
749 msg = urb->transfer_buffer + urb->transfer_buffer_length; in snd_usbmidi_akai_output()
750 buf_end = ep->max_transfer - MAX_AKAI_SYSEX_LEN - 1; in snd_usbmidi_akai_output()
753 while (urb->transfer_buffer_length < buf_end) { in snd_usbmidi_akai_output()
757 ep->ports[0].active = 0; in snd_usbmidi_akai_output()
760 /* try to skip non-SysEx data */ in snd_usbmidi_akai_output()
775 /* it's incomplete - drop it */ in snd_usbmidi_akai_output()
786 urb->transfer_buffer_length += count + 1; in snd_usbmidi_akai_output()
790 /* less than 9 bytes and no end byte - wait for more */ in snd_usbmidi_akai_output()
792 ep->ports[0].active = 0; in snd_usbmidi_akai_output()
795 /* 9 bytes and no end marker in sight - malformed, skip it */ in snd_usbmidi_akai_output()
816 snd_usbmidi_input_data(ep, 0, &buffer[2], buffer[0] - 1); in snd_usbmidi_novation_input()
825 if (!ep->ports[0].active) in snd_usbmidi_novation_output()
827 transfer_buffer = urb->transfer_buffer; in snd_usbmidi_novation_output()
828 count = snd_rawmidi_transmit(ep->ports[0].substream, in snd_usbmidi_novation_output()
830 ep->max_transfer - 2); in snd_usbmidi_novation_output()
832 ep->ports[0].active = 0; in snd_usbmidi_novation_output()
837 urb->transfer_buffer_length = 2 + count; in snd_usbmidi_novation_output()
860 if (!ep->ports[0].active) in snd_usbmidi_raw_output()
862 count = snd_rawmidi_transmit(ep->ports[0].substream, in snd_usbmidi_raw_output()
863 urb->transfer_buffer, in snd_usbmidi_raw_output()
864 ep->max_transfer); in snd_usbmidi_raw_output()
866 ep->ports[0].active = 0; in snd_usbmidi_raw_output()
869 urb->transfer_buffer_length = count; in snd_usbmidi_raw_output()
885 snd_usbmidi_input_data(ep, 0, buffer + 2, buffer_length - 2); in snd_usbmidi_ftdi_input()
899 while (buffer_length && buffer[buffer_length - 1] == 0xFD) in snd_usbmidi_us122l_input()
900 buffer_length--; in snd_usbmidi_us122l_input()
910 if (!ep->ports[0].active) in snd_usbmidi_us122l_output()
912 switch (snd_usb_get_speed(ep->umidi->dev)) { in snd_usbmidi_us122l_output()
921 count = snd_rawmidi_transmit(ep->ports[0].substream, in snd_usbmidi_us122l_output()
922 urb->transfer_buffer, in snd_usbmidi_us122l_output()
925 ep->ports[0].active = 0; in snd_usbmidi_us122l_output()
929 memset(urb->transfer_buffer + count, 0xFD, ep->max_transfer - count); in snd_usbmidi_us122l_output()
930 urb->transfer_buffer_length = ep->max_transfer; in snd_usbmidi_us122l_output()
988 if (ep->seen_f5) in snd_usbmidi_emagic_input()
996 snd_usbmidi_input_data(ep, ep->current_port, buffer, i); in snd_usbmidi_emagic_input()
998 buffer_length -= i; in snd_usbmidi_emagic_input()
1003 ep->seen_f5 = 1; in snd_usbmidi_emagic_input()
1005 --buffer_length; in snd_usbmidi_emagic_input()
1011 ep->current_port = (buffer[0] - 1) & 15; in snd_usbmidi_emagic_input()
1013 --buffer_length; in snd_usbmidi_emagic_input()
1015 ep->seen_f5 = 0; in snd_usbmidi_emagic_input()
1022 int port0 = ep->current_port; in snd_usbmidi_emagic_output()
1023 uint8_t *buf = urb->transfer_buffer; in snd_usbmidi_emagic_output()
1024 int buf_free = ep->max_transfer; in snd_usbmidi_emagic_output()
1028 /* round-robin, starting at the last current port */ in snd_usbmidi_emagic_output()
1030 struct usbmidi_out_port *port = &ep->ports[portnum]; in snd_usbmidi_emagic_output()
1032 if (!port->active) in snd_usbmidi_emagic_output()
1034 if (snd_rawmidi_transmit_peek(port->substream, buf, 1) != 1) { in snd_usbmidi_emagic_output()
1035 port->active = 0; in snd_usbmidi_emagic_output()
1039 if (portnum != ep->current_port) { in snd_usbmidi_emagic_output()
1042 ep->current_port = portnum; in snd_usbmidi_emagic_output()
1046 buf_free -= 2; in snd_usbmidi_emagic_output()
1051 length = snd_rawmidi_transmit(port->substream, buf, buf_free); in snd_usbmidi_emagic_output()
1054 buf_free -= length; in snd_usbmidi_emagic_output()
1059 if (buf_free < ep->max_transfer && buf_free > 0) { in snd_usbmidi_emagic_output()
1061 --buf_free; in snd_usbmidi_emagic_output()
1063 urb->transfer_buffer_length = ep->max_transfer - buf_free; in snd_usbmidi_emagic_output()
1081 intf = umidi->iface; in update_roland_altsetting()
1082 is_light_load = intf->cur_altsetting != intf->altsetting; in update_roland_altsetting()
1083 if (umidi->roland_load_ctl->private_value == is_light_load) in update_roland_altsetting()
1085 hostif = &intf->altsetting[umidi->roland_load_ctl->private_value]; in update_roland_altsetting()
1087 snd_usbmidi_input_stop(&umidi->list); in update_roland_altsetting()
1088 usb_set_interface(umidi->dev, intfd->bInterfaceNumber, in update_roland_altsetting()
1089 intfd->bAlternateSetting); in update_roland_altsetting()
1090 snd_usbmidi_input_start(&umidi->list); in update_roland_altsetting()
1096 struct snd_usb_midi *umidi = substream->rmidi->private_data; in substream_open()
1099 down_read(&umidi->disc_rwsem); in substream_open()
1100 if (umidi->disconnected) { in substream_open()
1101 up_read(&umidi->disc_rwsem); in substream_open()
1102 return open ? -ENODEV : 0; in substream_open()
1105 mutex_lock(&umidi->mutex); in substream_open()
1107 if (!umidi->opened[0] && !umidi->opened[1]) { in substream_open()
1108 if (umidi->roland_load_ctl) { in substream_open()
1109 ctl = umidi->roland_load_ctl; in substream_open()
1110 ctl->vd[0].access |= in substream_open()
1112 snd_ctl_notify(umidi->card, in substream_open()
1113 SNDRV_CTL_EVENT_MASK_INFO, &ctl->id); in substream_open()
1117 umidi->opened[dir]++; in substream_open()
1118 if (umidi->opened[1]) in substream_open()
1119 snd_usbmidi_input_start(&umidi->list); in substream_open()
1121 umidi->opened[dir]--; in substream_open()
1122 if (!umidi->opened[1]) in substream_open()
1123 snd_usbmidi_input_stop(&umidi->list); in substream_open()
1124 if (!umidi->opened[0] && !umidi->opened[1]) { in substream_open()
1125 if (umidi->roland_load_ctl) { in substream_open()
1126 ctl = umidi->roland_load_ctl; in substream_open()
1127 ctl->vd[0].access &= in substream_open()
1129 snd_ctl_notify(umidi->card, in substream_open()
1130 SNDRV_CTL_EVENT_MASK_INFO, &ctl->id); in substream_open()
1134 mutex_unlock(&umidi->mutex); in substream_open()
1135 up_read(&umidi->disc_rwsem); in substream_open()
1141 struct snd_usb_midi *umidi = substream->rmidi->private_data; in snd_usbmidi_output_open()
1146 if (umidi->endpoints[i].out) in snd_usbmidi_output_open()
1148 if (umidi->endpoints[i].out->ports[j].substream == substream) { in snd_usbmidi_output_open()
1149 port = &umidi->endpoints[i].out->ports[j]; in snd_usbmidi_output_open()
1154 return -ENXIO; in snd_usbmidi_output_open()
1157 substream->runtime->private_data = port; in snd_usbmidi_output_open()
1158 port->state = STATE_UNKNOWN; in snd_usbmidi_output_open()
1171 (struct usbmidi_out_port *)substream->runtime->private_data; in snd_usbmidi_output_trigger()
1173 port->active = up; in snd_usbmidi_output_trigger()
1175 if (port->ep->umidi->disconnected) { in snd_usbmidi_output_trigger()
1181 queue_work(system_highpri_wq, &port->ep->work); in snd_usbmidi_output_trigger()
1187 struct usbmidi_out_port *port = substream->runtime->private_data; in snd_usbmidi_output_drain()
1188 struct snd_usb_midi_out_endpoint *ep = port->ep; in snd_usbmidi_output_drain()
1193 if (ep->umidi->disconnected) in snd_usbmidi_output_drain()
1199 spin_lock_irq(&ep->buffer_lock); in snd_usbmidi_output_drain()
1200 drain_urbs = ep->active_urbs; in snd_usbmidi_output_drain()
1202 ep->drain_urbs |= drain_urbs; in snd_usbmidi_output_drain()
1204 prepare_to_wait(&ep->drain_wait, &wait, in snd_usbmidi_output_drain()
1206 spin_unlock_irq(&ep->buffer_lock); in snd_usbmidi_output_drain()
1208 spin_lock_irq(&ep->buffer_lock); in snd_usbmidi_output_drain()
1209 drain_urbs &= ep->drain_urbs; in snd_usbmidi_output_drain()
1211 finish_wait(&ep->drain_wait, &wait); in snd_usbmidi_output_drain()
1213 spin_unlock_irq(&ep->buffer_lock); in snd_usbmidi_output_drain()
1229 struct snd_usb_midi *umidi = substream->rmidi->private_data; in snd_usbmidi_input_trigger()
1232 set_bit(substream->number, &umidi->input_triggered); in snd_usbmidi_input_trigger()
1234 clear_bit(substream->number, &umidi->input_triggered); in snd_usbmidi_input_trigger()
1253 usb_free_coherent(umidi->dev, buffer_length, in free_urb_and_buffer()
1254 urb->transfer_buffer, urb->transfer_dma); in free_urb_and_buffer()
1267 if (ep->urbs[i]) in snd_usbmidi_in_endpoint_delete()
1268 free_urb_and_buffer(ep->umidi, ep->urbs[i], in snd_usbmidi_in_endpoint_delete()
1269 ep->urbs[i]->transfer_buffer_length); in snd_usbmidi_in_endpoint_delete()
1287 rep->in = NULL; in snd_usbmidi_in_endpoint_create()
1290 return -ENOMEM; in snd_usbmidi_in_endpoint_create()
1291 ep->umidi = umidi; in snd_usbmidi_in_endpoint_create()
1294 ep->urbs[i] = usb_alloc_urb(0, GFP_KERNEL); in snd_usbmidi_in_endpoint_create()
1295 if (!ep->urbs[i]) { in snd_usbmidi_in_endpoint_create()
1296 err = -ENOMEM; in snd_usbmidi_in_endpoint_create()
1300 if (ep_info->in_interval) in snd_usbmidi_in_endpoint_create()
1301 pipe = usb_rcvintpipe(umidi->dev, ep_info->in_ep); in snd_usbmidi_in_endpoint_create()
1303 pipe = usb_rcvbulkpipe(umidi->dev, ep_info->in_ep); in snd_usbmidi_in_endpoint_create()
1304 length = usb_maxpacket(umidi->dev, pipe, 0); in snd_usbmidi_in_endpoint_create()
1306 buffer = usb_alloc_coherent(umidi->dev, length, GFP_KERNEL, in snd_usbmidi_in_endpoint_create()
1307 &ep->urbs[i]->transfer_dma); in snd_usbmidi_in_endpoint_create()
1309 err = -ENOMEM; in snd_usbmidi_in_endpoint_create()
1312 if (ep_info->in_interval) in snd_usbmidi_in_endpoint_create()
1313 usb_fill_int_urb(ep->urbs[i], umidi->dev, in snd_usbmidi_in_endpoint_create()
1316 ep, ep_info->in_interval); in snd_usbmidi_in_endpoint_create()
1318 usb_fill_bulk_urb(ep->urbs[i], umidi->dev, in snd_usbmidi_in_endpoint_create()
1321 ep->urbs[i]->transfer_flags = URB_NO_TRANSFER_DMA_MAP; in snd_usbmidi_in_endpoint_create()
1322 err = usb_urb_ep_type_check(ep->urbs[i]); in snd_usbmidi_in_endpoint_create()
1324 dev_err(&umidi->dev->dev, "invalid MIDI in EP %x\n", in snd_usbmidi_in_endpoint_create()
1325 ep_info->in_ep); in snd_usbmidi_in_endpoint_create()
1330 rep->in = ep; in snd_usbmidi_in_endpoint_create()
1335 return -ENOMEM; in snd_usbmidi_in_endpoint_create()
1347 if (ep->urbs[i].urb) { in snd_usbmidi_out_endpoint_clear()
1348 free_urb_and_buffer(ep->umidi, ep->urbs[i].urb, in snd_usbmidi_out_endpoint_clear()
1349 ep->max_transfer); in snd_usbmidi_out_endpoint_clear()
1350 ep->urbs[i].urb = NULL; in snd_usbmidi_out_endpoint_clear()
1361 * Creates an output endpoint, and initializes output ports.
1373 rep->out = NULL; in snd_usbmidi_out_endpoint_create()
1376 return -ENOMEM; in snd_usbmidi_out_endpoint_create()
1377 ep->umidi = umidi; in snd_usbmidi_out_endpoint_create()
1380 ep->urbs[i].urb = usb_alloc_urb(0, GFP_KERNEL); in snd_usbmidi_out_endpoint_create()
1381 if (!ep->urbs[i].urb) { in snd_usbmidi_out_endpoint_create()
1382 err = -ENOMEM; in snd_usbmidi_out_endpoint_create()
1385 ep->urbs[i].ep = ep; in snd_usbmidi_out_endpoint_create()
1387 if (ep_info->out_interval) in snd_usbmidi_out_endpoint_create()
1388 pipe = usb_sndintpipe(umidi->dev, ep_info->out_ep); in snd_usbmidi_out_endpoint_create()
1390 pipe = usb_sndbulkpipe(umidi->dev, ep_info->out_ep); in snd_usbmidi_out_endpoint_create()
1391 switch (umidi->usb_id) { in snd_usbmidi_out_endpoint_create()
1393 ep->max_transfer = usb_maxpacket(umidi->dev, pipe, 1); in snd_usbmidi_out_endpoint_create()
1404 case USB_ID(0x1a86, 0x752d): /* QinHeng CH345 "USB2.0-MIDI" */ in snd_usbmidi_out_endpoint_create()
1406 ep->max_transfer = 4; in snd_usbmidi_out_endpoint_create()
1411 case USB_ID(0x0644, 0x800e): /* Tascam US-122L */ in snd_usbmidi_out_endpoint_create()
1412 case USB_ID(0x0644, 0x800f): /* Tascam US-144 */ in snd_usbmidi_out_endpoint_create()
1413 ep->max_transfer = 9; in snd_usbmidi_out_endpoint_create()
1417 buffer = usb_alloc_coherent(umidi->dev, in snd_usbmidi_out_endpoint_create()
1418 ep->max_transfer, GFP_KERNEL, in snd_usbmidi_out_endpoint_create()
1419 &ep->urbs[i].urb->transfer_dma); in snd_usbmidi_out_endpoint_create()
1421 err = -ENOMEM; in snd_usbmidi_out_endpoint_create()
1424 if (ep_info->out_interval) in snd_usbmidi_out_endpoint_create()
1425 usb_fill_int_urb(ep->urbs[i].urb, umidi->dev, in snd_usbmidi_out_endpoint_create()
1426 pipe, buffer, ep->max_transfer, in snd_usbmidi_out_endpoint_create()
1428 &ep->urbs[i], ep_info->out_interval); in snd_usbmidi_out_endpoint_create()
1430 usb_fill_bulk_urb(ep->urbs[i].urb, umidi->dev, in snd_usbmidi_out_endpoint_create()
1431 pipe, buffer, ep->max_transfer, in snd_usbmidi_out_endpoint_create()
1433 &ep->urbs[i]); in snd_usbmidi_out_endpoint_create()
1434 err = usb_urb_ep_type_check(ep->urbs[i].urb); in snd_usbmidi_out_endpoint_create()
1436 dev_err(&umidi->dev->dev, "invalid MIDI out EP %x\n", in snd_usbmidi_out_endpoint_create()
1437 ep_info->out_ep); in snd_usbmidi_out_endpoint_create()
1440 ep->urbs[i].urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; in snd_usbmidi_out_endpoint_create()
1443 spin_lock_init(&ep->buffer_lock); in snd_usbmidi_out_endpoint_create()
1444 INIT_WORK(&ep->work, snd_usbmidi_out_work); in snd_usbmidi_out_endpoint_create()
1445 init_waitqueue_head(&ep->drain_wait); in snd_usbmidi_out_endpoint_create()
1448 if (ep_info->out_cables & (1 << i)) { in snd_usbmidi_out_endpoint_create()
1449 ep->ports[i].ep = ep; in snd_usbmidi_out_endpoint_create()
1450 ep->ports[i].cable = i << 4; in snd_usbmidi_out_endpoint_create()
1453 if (umidi->usb_protocol_ops->init_out_endpoint) in snd_usbmidi_out_endpoint_create()
1454 umidi->usb_protocol_ops->init_out_endpoint(ep); in snd_usbmidi_out_endpoint_create()
1456 rep->out = ep; in snd_usbmidi_out_endpoint_create()
1472 struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i]; in snd_usbmidi_free()
1473 if (ep->out) in snd_usbmidi_free()
1474 snd_usbmidi_out_endpoint_delete(ep->out); in snd_usbmidi_free()
1475 if (ep->in) in snd_usbmidi_free()
1476 snd_usbmidi_in_endpoint_delete(ep->in); in snd_usbmidi_free()
1478 mutex_destroy(&umidi->mutex); in snd_usbmidi_free()
1496 down_write(&umidi->disc_rwsem); in snd_usbmidi_disconnect()
1497 spin_lock_irq(&umidi->disc_lock); in snd_usbmidi_disconnect()
1498 umidi->disconnected = 1; in snd_usbmidi_disconnect()
1499 spin_unlock_irq(&umidi->disc_lock); in snd_usbmidi_disconnect()
1500 up_write(&umidi->disc_rwsem); in snd_usbmidi_disconnect()
1502 del_timer_sync(&umidi->error_timer); in snd_usbmidi_disconnect()
1505 struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i]; in snd_usbmidi_disconnect()
1506 if (ep->out) in snd_usbmidi_disconnect()
1507 cancel_work_sync(&ep->out->work); in snd_usbmidi_disconnect()
1508 if (ep->out) { in snd_usbmidi_disconnect()
1510 usb_kill_urb(ep->out->urbs[j].urb); in snd_usbmidi_disconnect()
1511 if (umidi->usb_protocol_ops->finish_out_endpoint) in snd_usbmidi_disconnect()
1512 umidi->usb_protocol_ops->finish_out_endpoint(ep->out); in snd_usbmidi_disconnect()
1513 ep->out->active_urbs = 0; in snd_usbmidi_disconnect()
1514 if (ep->out->drain_urbs) { in snd_usbmidi_disconnect()
1515 ep->out->drain_urbs = 0; in snd_usbmidi_disconnect()
1516 wake_up(&ep->out->drain_wait); in snd_usbmidi_disconnect()
1519 if (ep->in) in snd_usbmidi_disconnect()
1521 usb_kill_urb(ep->in->urbs[j]); in snd_usbmidi_disconnect()
1523 if (ep->out) in snd_usbmidi_disconnect()
1524 snd_usbmidi_out_endpoint_clear(ep->out); in snd_usbmidi_disconnect()
1525 if (ep->in) { in snd_usbmidi_disconnect()
1526 snd_usbmidi_in_endpoint_delete(ep->in); in snd_usbmidi_disconnect()
1527 ep->in = NULL; in snd_usbmidi_disconnect()
1535 struct snd_usb_midi *umidi = rmidi->private_data; in snd_usbmidi_rawmidi_free()
1545 list_for_each_entry(substream, &umidi->rmidi->streams[stream].substreams, in snd_usbmidi_find_substream()
1547 if (substream->number == number) in snd_usbmidi_find_substream()
1554 * This list specifies names for ports that do not fit into the standard
1555 * "(product) MIDI (n)" schema because they aren't external MIDI ports,
1556 * such as internal control or synthesizer ports.
1565 #define PORT_INFO(vendor, product, num, name_, voices_, flags) \ argument
1567 .port = num, .voices = voices_, \
1569 #define EXTERNAL_PORT(vendor, product, num, name) \ argument
1570 PORT_INFO(vendor, product, num, name, 0, \
1574 #define CONTROL_PORT(vendor, product, num, name) \ argument
1575 PORT_INFO(vendor, product, num, name, 0, \
1578 #define GM_SYNTH_PORT(vendor, product, num, name, voices) \ argument
1579 PORT_INFO(vendor, product, num, name, voices, \
1584 #define ROLAND_SYNTH_PORT(vendor, product, num, name, voices) \ argument
1585 PORT_INFO(vendor, product, num, name, voices, \
1593 #define SOUNDCANVAS_PORT(vendor, product, num, name, voices) \ argument
1594 PORT_INFO(vendor, product, num, name, voices, \
1608 /* Roland UA-100 */
1610 /* Roland SC-8850 */
1617 /* Roland U-8 */
1620 /* Roland SC-8820 */
1624 /* Roland SK-500 */
1628 /* Roland SC-D70 */
1632 /* Edirol UM-880 */
1634 /* Edirol SD-90 */
1639 /* Edirol UM-550 */
1641 /* Edirol SD-20 */
1645 /* Edirol SD-80 */
1650 /* Edirol UA-700 */
1661 /* BOSS GS-10 */
1664 /* Edirol UA-1000 */
1667 /* Edirol UR-80 */
1671 /* Edirol PCR-A */
1675 /* BOSS GT-PRO */
1677 /* Edirol UM-3EX */
1679 /* Roland VG-99 */
1682 /* Cakewalk Sonar V-Studio 100 */
1685 /* Roland VB-99 */
1688 /* Roland A-PRO */
1692 /* Roland SD-50 */
1696 /* Roland OCTA-CAPTURE */
1701 /* Roland SPD-SX */
1704 /* Roland A-Series */
1707 /* Roland INTEGRA-7 */
1710 /* M-Audio MidiSport 8x8 */
1738 if (snd_usbmidi_port_info[i].id == umidi->usb_id && in find_port_info()
1748 struct snd_usb_midi *umidi = rmidi->private_data; in snd_usbmidi_get_port_info()
1754 seq_port_info->type = port_info->seq_flags; in snd_usbmidi_get_port_info()
1755 seq_port_info->midi_voices = port_info->voices; in snd_usbmidi_get_port_info()
1769 dev_err(&umidi->dev->dev, "substream %d:%d not found\n", stream, in snd_usbmidi_init_substream()
1776 name_format = port_info ? port_info->name : "%s MIDI %d"; in snd_usbmidi_init_substream()
1777 snprintf(substream->name, sizeof(substream->name), in snd_usbmidi_init_substream()
1778 name_format, umidi->card->shortname, number + 1); in snd_usbmidi_init_substream()
1784 * Creates the endpoints and their ports.
1796 &umidi->endpoints[i]); in snd_usbmidi_create_endpoints()
1803 &umidi->endpoints[i]); in snd_usbmidi_create_endpoints()
1813 &umidi->endpoints[i].out->ports[j].substream); in snd_usbmidi_create_endpoints()
1820 &umidi->endpoints[i].in->ports[j].substream); in snd_usbmidi_create_endpoints()
1825 dev_dbg(&umidi->dev->dev, "created %d output and %d input ports\n", in snd_usbmidi_create_endpoints()
1833 unsigned char *extra = hostep->extra; in find_usb_ms_endpoint_descriptor()
1834 int extralen = hostep->extralen; in find_usb_ms_endpoint_descriptor()
1840 if (ms_ep->bLength > 3 && in find_usb_ms_endpoint_descriptor()
1841 ms_ep->bDescriptorType == USB_DT_CS_ENDPOINT && in find_usb_ms_endpoint_descriptor()
1842 ms_ep->bDescriptorSubtype == UAC_MS_GENERAL) in find_usb_ms_endpoint_descriptor()
1846 extralen -= extra[0]; in find_usb_ms_endpoint_descriptor()
1867 intf = umidi->iface; in snd_usbmidi_get_ms_info()
1869 return -ENXIO; in snd_usbmidi_get_ms_info()
1870 hostif = &intf->altsetting[0]; in snd_usbmidi_get_ms_info()
1872 ms_header = (struct usb_ms_header_descriptor *)hostif->extra; in snd_usbmidi_get_ms_info()
1873 if (hostif->extralen >= 7 && in snd_usbmidi_get_ms_info()
1874 ms_header->bLength >= 7 && in snd_usbmidi_get_ms_info()
1875 ms_header->bDescriptorType == USB_DT_CS_INTERFACE && in snd_usbmidi_get_ms_info()
1876 ms_header->bDescriptorSubtype == UAC_HEADER) in snd_usbmidi_get_ms_info()
1877 dev_dbg(&umidi->dev->dev, "MIDIStreaming version %02x.%02x\n", in snd_usbmidi_get_ms_info()
1878 ms_header->bcdMSC[1], ms_header->bcdMSC[0]); in snd_usbmidi_get_ms_info()
1880 dev_warn(&umidi->dev->dev, in snd_usbmidi_get_ms_info()
1884 for (i = 0; i < intfd->bNumEndpoints; ++i) { in snd_usbmidi_get_ms_info()
1885 hostep = &hostif->endpoint[i]; in snd_usbmidi_get_ms_info()
1895 dev_warn(&umidi->dev->dev, in snd_usbmidi_get_ms_info()
1902 endpoints[epidx].out_interval = ep->bInterval; in snd_usbmidi_get_ms_info()
1903 else if (snd_usb_get_speed(umidi->dev) == USB_SPEED_LOW) in snd_usbmidi_get_ms_info()
1911 (1 << ms_ep->bNumEmbMIDIJack) - 1; in snd_usbmidi_get_ms_info()
1912 dev_dbg(&umidi->dev->dev, "EP %02X: %d jack(s)\n", in snd_usbmidi_get_ms_info()
1913 ep->bEndpointAddress, ms_ep->bNumEmbMIDIJack); in snd_usbmidi_get_ms_info()
1917 dev_warn(&umidi->dev->dev, in snd_usbmidi_get_ms_info()
1924 endpoints[epidx].in_interval = ep->bInterval; in snd_usbmidi_get_ms_info()
1925 else if (snd_usb_get_speed(umidi->dev) == USB_SPEED_LOW) in snd_usbmidi_get_ms_info()
1928 (1 << ms_ep->bNumEmbMIDIJack) - 1; in snd_usbmidi_get_ms_info()
1929 dev_dbg(&umidi->dev->dev, "EP %02X: %d jack(s)\n", in snd_usbmidi_get_ms_info()
1930 ep->bEndpointAddress, ms_ep->bNumEmbMIDIJack); in snd_usbmidi_get_ms_info()
1947 value->value.enumerated.item[0] = kcontrol->private_value; in roland_load_get()
1954 struct snd_usb_midi *umidi = kcontrol->private_data; in roland_load_put()
1957 if (value->value.enumerated.item[0] > 1) in roland_load_put()
1958 return -EINVAL; in roland_load_put()
1959 mutex_lock(&umidi->mutex); in roland_load_put()
1960 changed = value->value.enumerated.item[0] != kcontrol->private_value; in roland_load_put()
1962 kcontrol->private_value = value->value.enumerated.item[0]; in roland_load_put()
1963 mutex_unlock(&umidi->mutex); in roland_load_put()
1986 intf = umidi->iface; in snd_usbmidi_switch_roland_altsetting()
1987 if (!intf || intf->num_altsetting != 2) in snd_usbmidi_switch_roland_altsetting()
1990 hostif = &intf->altsetting[1]; in snd_usbmidi_switch_roland_altsetting()
1995 if (intfd->bNumEndpoints != 2 || in snd_usbmidi_switch_roland_altsetting()
1996 !((get_endpoint(hostif, 0)->bmAttributes & in snd_usbmidi_switch_roland_altsetting()
1998 (get_endpoint(hostif, 1)->bmAttributes & in snd_usbmidi_switch_roland_altsetting()
2002 dev_dbg(&umidi->dev->dev, "switching to altsetting %d with int ep\n", in snd_usbmidi_switch_roland_altsetting()
2003 intfd->bAlternateSetting); in snd_usbmidi_switch_roland_altsetting()
2004 usb_set_interface(umidi->dev, intfd->bInterfaceNumber, in snd_usbmidi_switch_roland_altsetting()
2005 intfd->bAlternateSetting); in snd_usbmidi_switch_roland_altsetting()
2007 umidi->roland_load_ctl = snd_ctl_new1(&roland_load_ctl, umidi); in snd_usbmidi_switch_roland_altsetting()
2008 if (snd_ctl_add(umidi->card, umidi->roland_load_ctl) < 0) in snd_usbmidi_switch_roland_altsetting()
2009 umidi->roland_load_ctl = NULL; in snd_usbmidi_switch_roland_altsetting()
2025 if (USB_ID_VENDOR(umidi->usb_id) == 0x0582) in snd_usbmidi_detect_endpoints()
2031 intf = umidi->iface; in snd_usbmidi_detect_endpoints()
2032 if (!intf || intf->num_altsetting < 1) in snd_usbmidi_detect_endpoints()
2033 return -ENOENT; in snd_usbmidi_detect_endpoints()
2034 hostif = intf->cur_altsetting; in snd_usbmidi_detect_endpoints()
2037 for (i = 0; i < intfd->bNumEndpoints; ++i) { in snd_usbmidi_detect_endpoints()
2046 endpoint[out_eps].out_interval = epd->bInterval; in snd_usbmidi_detect_endpoints()
2053 endpoint[in_eps].in_interval = epd->bInterval; in snd_usbmidi_detect_endpoints()
2057 return (out_eps || in_eps) ? 0 : -ENOENT; in snd_usbmidi_detect_endpoints()
2061 * Detects the endpoints for one-port-per-endpoint protocols.
2079 * Detects the endpoints and ports of Yamaha devices.
2089 intf = umidi->iface; in snd_usbmidi_detect_yamaha()
2091 return -ENOENT; in snd_usbmidi_detect_yamaha()
2092 hostif = intf->altsetting; in snd_usbmidi_detect_yamaha()
2094 if (intfd->bNumEndpoints < 1) in snd_usbmidi_detect_yamaha()
2095 return -ENOENT; in snd_usbmidi_detect_yamaha()
2101 for (cs_desc = hostif->extra; in snd_usbmidi_detect_yamaha()
2102 cs_desc < hostif->extra + hostif->extralen && cs_desc[0] >= 2; in snd_usbmidi_detect_yamaha()
2106 endpoint->in_cables = in snd_usbmidi_detect_yamaha()
2107 (endpoint->in_cables << 1) | 1; in snd_usbmidi_detect_yamaha()
2109 endpoint->out_cables = in snd_usbmidi_detect_yamaha()
2110 (endpoint->out_cables << 1) | 1; in snd_usbmidi_detect_yamaha()
2113 if (!endpoint->in_cables && !endpoint->out_cables) in snd_usbmidi_detect_yamaha()
2114 return -ENOENT; in snd_usbmidi_detect_yamaha()
2120 * Detects the endpoints and ports of Roland devices.
2129 intf = umidi->iface; in snd_usbmidi_detect_roland()
2131 return -ENOENT; in snd_usbmidi_detect_roland()
2132 hostif = intf->altsetting; in snd_usbmidi_detect_roland()
2137 for (cs_desc = hostif->extra; in snd_usbmidi_detect_roland()
2138 cs_desc < hostif->extra + hostif->extralen && cs_desc[0] >= 2; in snd_usbmidi_detect_roland()
2144 endpoint->in_cables = (1 << cs_desc[4]) - 1; in snd_usbmidi_detect_roland()
2145 endpoint->out_cables = (1 << cs_desc[5]) - 1; in snd_usbmidi_detect_roland()
2154 return -ENODEV; in snd_usbmidi_detect_roland()
2158 * Creates the endpoints and their ports for Midiman devices.
2170 intf = umidi->iface; in snd_usbmidi_create_endpoints_midiman()
2172 return -ENOENT; in snd_usbmidi_create_endpoints_midiman()
2173 hostif = intf->altsetting; in snd_usbmidi_create_endpoints_midiman()
2180 * There is one interrupt input endpoint for all input ports, one in snd_usbmidi_create_endpoints_midiman()
2181 * bulk output endpoint for even-numbered ports, and one for odd- in snd_usbmidi_create_endpoints_midiman()
2182 * numbered ports. Both bulk output endpoints have corresponding in snd_usbmidi_create_endpoints_midiman()
2185 if (intfd->bNumEndpoints < (endpoint->out_cables > 0x0001 ? 5 : 3)) { in snd_usbmidi_create_endpoints_midiman()
2186 dev_dbg(&umidi->dev->dev, "not enough endpoints\n"); in snd_usbmidi_create_endpoints_midiman()
2187 return -ENOENT; in snd_usbmidi_create_endpoints_midiman()
2192 dev_dbg(&umidi->dev->dev, "endpoint[0] isn't interrupt\n"); in snd_usbmidi_create_endpoints_midiman()
2193 return -ENXIO; in snd_usbmidi_create_endpoints_midiman()
2197 dev_dbg(&umidi->dev->dev, "endpoint[2] isn't bulk output\n"); in snd_usbmidi_create_endpoints_midiman()
2198 return -ENXIO; in snd_usbmidi_create_endpoints_midiman()
2200 if (endpoint->out_cables > 0x0001) { in snd_usbmidi_create_endpoints_midiman()
2204 dev_dbg(&umidi->dev->dev, in snd_usbmidi_create_endpoints_midiman()
2206 return -ENXIO; in snd_usbmidi_create_endpoints_midiman()
2210 ep_info.out_ep = get_endpoint(hostif, 2)->bEndpointAddress & in snd_usbmidi_create_endpoints_midiman()
2213 ep_info.out_cables = endpoint->out_cables & 0x5555; in snd_usbmidi_create_endpoints_midiman()
2215 &umidi->endpoints[0]); in snd_usbmidi_create_endpoints_midiman()
2219 ep_info.in_ep = get_endpoint(hostif, 0)->bEndpointAddress & in snd_usbmidi_create_endpoints_midiman()
2221 ep_info.in_interval = get_endpoint(hostif, 0)->bInterval; in snd_usbmidi_create_endpoints_midiman()
2222 ep_info.in_cables = endpoint->in_cables; in snd_usbmidi_create_endpoints_midiman()
2224 &umidi->endpoints[0]); in snd_usbmidi_create_endpoints_midiman()
2228 if (endpoint->out_cables > 0x0001) { in snd_usbmidi_create_endpoints_midiman()
2229 ep_info.out_ep = get_endpoint(hostif, 4)->bEndpointAddress & in snd_usbmidi_create_endpoints_midiman()
2231 ep_info.out_cables = endpoint->out_cables & 0xaaaa; in snd_usbmidi_create_endpoints_midiman()
2233 &umidi->endpoints[1]); in snd_usbmidi_create_endpoints_midiman()
2239 if (endpoint->out_cables & (1 << cable)) in snd_usbmidi_create_endpoints_midiman()
2243 &umidi->endpoints[cable & 1].out->ports[cable].substream); in snd_usbmidi_create_endpoints_midiman()
2244 if (endpoint->in_cables & (1 << cable)) in snd_usbmidi_create_endpoints_midiman()
2248 &umidi->endpoints[0].in->ports[cable].substream); in snd_usbmidi_create_endpoints_midiman()
2263 err = snd_rawmidi_new(umidi->card, "USB MIDI", in snd_usbmidi_create_rawmidi()
2264 umidi->next_midi_device++, in snd_usbmidi_create_rawmidi()
2268 strcpy(rmidi->name, umidi->card->shortname); in snd_usbmidi_create_rawmidi()
2269 rmidi->info_flags = SNDRV_RAWMIDI_INFO_OUTPUT | in snd_usbmidi_create_rawmidi()
2272 rmidi->ops = &snd_usbmidi_ops; in snd_usbmidi_create_rawmidi()
2273 rmidi->private_data = umidi; in snd_usbmidi_create_rawmidi()
2274 rmidi->private_free = snd_usbmidi_rawmidi_free; in snd_usbmidi_create_rawmidi()
2280 umidi->rmidi = rmidi; in snd_usbmidi_create_rawmidi()
2293 if (!umidi->input_running) in snd_usbmidi_input_stop()
2296 struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i]; in snd_usbmidi_input_stop()
2297 if (ep->in) in snd_usbmidi_input_stop()
2299 usb_kill_urb(ep->in->urbs[j]); in snd_usbmidi_input_stop()
2301 umidi->input_running = 0; in snd_usbmidi_input_stop()
2314 struct urb *urb = ep->urbs[i]; in snd_usbmidi_input_start_ep()
2315 spin_lock_irqsave(&umidi->disc_lock, flags); in snd_usbmidi_input_start_ep()
2316 if (!atomic_read(&urb->use_count)) { in snd_usbmidi_input_start_ep()
2317 urb->dev = ep->umidi->dev; in snd_usbmidi_input_start_ep()
2320 spin_unlock_irqrestore(&umidi->disc_lock, flags); in snd_usbmidi_input_start_ep()
2333 if (umidi->input_running || !umidi->opened[1]) in snd_usbmidi_input_start()
2336 snd_usbmidi_input_start_ep(umidi, umidi->endpoints[i].in); in snd_usbmidi_input_start()
2337 umidi->input_running = 1; in snd_usbmidi_input_start()
2349 mutex_lock(&umidi->mutex); in snd_usbmidi_suspend()
2351 mutex_unlock(&umidi->mutex); in snd_usbmidi_suspend()
2363 mutex_lock(&umidi->mutex); in snd_usbmidi_resume()
2365 mutex_unlock(&umidi->mutex); in snd_usbmidi_resume()
2385 return -ENOMEM; in __snd_usbmidi_create()
2386 umidi->dev = interface_to_usbdev(iface); in __snd_usbmidi_create()
2387 umidi->card = card; in __snd_usbmidi_create()
2388 umidi->iface = iface; in __snd_usbmidi_create()
2389 umidi->quirk = quirk; in __snd_usbmidi_create()
2390 umidi->usb_protocol_ops = &snd_usbmidi_standard_ops; in __snd_usbmidi_create()
2391 spin_lock_init(&umidi->disc_lock); in __snd_usbmidi_create()
2392 init_rwsem(&umidi->disc_rwsem); in __snd_usbmidi_create()
2393 mutex_init(&umidi->mutex); in __snd_usbmidi_create()
2395 usb_id = USB_ID(le16_to_cpu(umidi->dev->descriptor.idVendor), in __snd_usbmidi_create()
2396 le16_to_cpu(umidi->dev->descriptor.idProduct)); in __snd_usbmidi_create()
2397 umidi->usb_id = usb_id; in __snd_usbmidi_create()
2398 timer_setup(&umidi->error_timer, snd_usbmidi_error_timer, 0); in __snd_usbmidi_create()
2402 switch (quirk ? quirk->type : QUIRK_MIDI_STANDARD_INTERFACE) { in __snd_usbmidi_create()
2405 if (umidi->usb_id == USB_ID(0x0763, 0x0150)) /* M-Audio Uno */ in __snd_usbmidi_create()
2406 umidi->usb_protocol_ops = in __snd_usbmidi_create()
2410 umidi->usb_protocol_ops = &snd_usbmidi_122l_ops; in __snd_usbmidi_create()
2413 memcpy(&endpoints[0], quirk->data, in __snd_usbmidi_create()
2424 umidi->usb_protocol_ops = &snd_usbmidi_midiman_ops; in __snd_usbmidi_create()
2425 memcpy(&endpoints[0], quirk->data, in __snd_usbmidi_create()
2430 umidi->usb_protocol_ops = &snd_usbmidi_novation_ops; in __snd_usbmidi_create()
2434 umidi->usb_protocol_ops = &snd_usbmidi_raw_ops; in __snd_usbmidi_create()
2444 if (umidi->usb_id == USB_ID(0x07fd, 0x0001)) /* MOTU Fastlane */ in __snd_usbmidi_create()
2445 usb_set_interface(umidi->dev, 0, 0); in __snd_usbmidi_create()
2449 umidi->usb_protocol_ops = &snd_usbmidi_emagic_ops; in __snd_usbmidi_create()
2450 memcpy(&endpoints[0], quirk->data, in __snd_usbmidi_create()
2455 umidi->usb_protocol_ops = &snd_usbmidi_cme_ops; in __snd_usbmidi_create()
2459 umidi->usb_protocol_ops = &snd_usbmidi_akai_ops; in __snd_usbmidi_create()
2461 /* endpoint 1 is input-only */ in __snd_usbmidi_create()
2465 umidi->usb_protocol_ops = &snd_usbmidi_ftdi_ops; in __snd_usbmidi_create()
2468 err = usb_control_msg(umidi->dev, usb_sndctrlpipe(umidi->dev, 0), in __snd_usbmidi_create()
2476 umidi->usb_protocol_ops = &snd_usbmidi_ch345_broken_sysex_ops; in __snd_usbmidi_create()
2480 dev_err(&umidi->dev->dev, "invalid quirk type %d\n", in __snd_usbmidi_create()
2481 quirk->type); in __snd_usbmidi_create()
2482 err = -ENXIO; in __snd_usbmidi_create()
2500 if (quirk && quirk->type == QUIRK_MIDI_MIDIMAN) in __snd_usbmidi_create()
2507 usb_autopm_get_interface_no_resume(umidi->iface); in __snd_usbmidi_create()
2509 list_add_tail(&umidi->list, midi_list); in __snd_usbmidi_create()