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,
147 } ports[0x10]; member
159 } ports[0x10]; member
179 if (err < 0 && err != -ENODEV) in snd_usbmidi_submit_urb()
180 dev_err(&urb->dev->dev, "usb_submit_urb: %d\n", err); in snd_usbmidi_submit_urb()
189 switch (urb->status) { in snd_usbmidi_urb_error()
191 case -ENOENT: in snd_usbmidi_urb_error()
192 case -ECONNRESET: in snd_usbmidi_urb_error()
193 case -ESHUTDOWN: in snd_usbmidi_urb_error()
194 case -ENODEV: in snd_usbmidi_urb_error()
195 return -ENODEV; in snd_usbmidi_urb_error()
197 case -EPROTO: in snd_usbmidi_urb_error()
198 case -ETIME: in snd_usbmidi_urb_error()
199 case -EILSEQ: in snd_usbmidi_urb_error()
200 return -EIO; in snd_usbmidi_urb_error()
202 dev_err(&urb->dev->dev, "urb status %d\n", urb->status); in snd_usbmidi_urb_error()
213 struct usbmidi_in_port *port = &ep->ports[portidx]; in snd_usbmidi_input_data()
215 if (!port->substream) { in snd_usbmidi_input_data()
216 dev_dbg(&ep->umidi->dev->dev, "unexpected port %d!\n", portidx); in snd_usbmidi_input_data()
219 if (!test_bit(port->substream->number, &ep->umidi->input_triggered)) in snd_usbmidi_input_data()
221 snd_rawmidi_receive(port->substream, data, length); in snd_usbmidi_input_data()
228 for (; length > 0; ++data, --length) in dump_urb()
241 struct snd_usb_midi_in_endpoint *ep = urb->context; in snd_usbmidi_in_urb_complete()
243 if (urb->status == 0) { in snd_usbmidi_in_urb_complete()
244 dump_urb("received", urb->transfer_buffer, urb->actual_length); in snd_usbmidi_in_urb_complete()
245 ep->umidi->usb_protocol_ops->input(ep, urb->transfer_buffer, in snd_usbmidi_in_urb_complete()
246 urb->actual_length); in snd_usbmidi_in_urb_complete()
250 if (err != -ENODEV) { in snd_usbmidi_in_urb_complete()
251 ep->error_resubmit = 1; in snd_usbmidi_in_urb_complete()
252 mod_timer(&ep->umidi->error_timer, in snd_usbmidi_in_urb_complete()
259 urb->dev = ep->umidi->dev; in snd_usbmidi_in_urb_complete()
265 struct out_urb_context *context = urb->context; in snd_usbmidi_out_urb_complete()
266 struct snd_usb_midi_out_endpoint *ep = context->ep; in snd_usbmidi_out_urb_complete()
270 spin_lock_irqsave(&ep->buffer_lock, flags); in snd_usbmidi_out_urb_complete()
271 urb_index = context - ep->urbs; in snd_usbmidi_out_urb_complete()
272 ep->active_urbs &= ~(1 << urb_index); in snd_usbmidi_out_urb_complete()
273 if (unlikely(ep->drain_urbs)) { in snd_usbmidi_out_urb_complete()
274 ep->drain_urbs &= ~(1 << urb_index); in snd_usbmidi_out_urb_complete()
275 wake_up(&ep->drain_wait); in snd_usbmidi_out_urb_complete()
277 spin_unlock_irqrestore(&ep->buffer_lock, flags); in snd_usbmidi_out_urb_complete()
278 if (urb->status < 0) { in snd_usbmidi_out_urb_complete()
281 if (err != -ENODEV) in snd_usbmidi_out_urb_complete()
282 mod_timer(&ep->umidi->error_timer, in snd_usbmidi_out_urb_complete()
300 spin_lock_irqsave(&ep->buffer_lock, flags); in snd_usbmidi_do_output()
301 if (ep->umidi->disconnected) { in snd_usbmidi_do_output()
302 spin_unlock_irqrestore(&ep->buffer_lock, flags); in snd_usbmidi_do_output()
306 urb_index = ep->next_urb; in snd_usbmidi_do_output()
308 if (!(ep->active_urbs & (1 << urb_index))) { in snd_usbmidi_do_output()
309 urb = ep->urbs[urb_index].urb; in snd_usbmidi_do_output()
310 urb->transfer_buffer_length = 0; in snd_usbmidi_do_output()
311 ep->umidi->usb_protocol_ops->output(ep, urb); in snd_usbmidi_do_output()
312 if (urb->transfer_buffer_length == 0) in snd_usbmidi_do_output()
315 dump_urb("sending", urb->transfer_buffer, in snd_usbmidi_do_output()
316 urb->transfer_buffer_length); in snd_usbmidi_do_output()
317 urb->dev = ep->umidi->dev; in snd_usbmidi_do_output()
320 ep->active_urbs |= 1 << urb_index; in snd_usbmidi_do_output()
324 if (urb_index == ep->next_urb) in snd_usbmidi_do_output()
327 ep->next_urb = urb_index; in snd_usbmidi_do_output()
328 spin_unlock_irqrestore(&ep->buffer_lock, flags); in snd_usbmidi_do_output()
345 spin_lock(&umidi->disc_lock); in snd_usbmidi_error_timer()
346 if (umidi->disconnected) { in snd_usbmidi_error_timer()
347 spin_unlock(&umidi->disc_lock); in snd_usbmidi_error_timer()
351 struct snd_usb_midi_in_endpoint *in = umidi->endpoints[i].in; in snd_usbmidi_error_timer()
352 if (in && in->error_resubmit) { in snd_usbmidi_error_timer()
353 in->error_resubmit = 0; in snd_usbmidi_error_timer()
355 if (atomic_read(&in->urbs[j]->use_count)) in snd_usbmidi_error_timer()
357 in->urbs[j]->dev = umidi->dev; in snd_usbmidi_error_timer()
358 snd_usbmidi_submit_urb(in->urbs[j], GFP_ATOMIC); in snd_usbmidi_error_timer()
361 if (umidi->endpoints[i].out) in snd_usbmidi_error_timer()
362 snd_usbmidi_do_output(umidi->endpoints[i].out); in snd_usbmidi_error_timer()
364 spin_unlock(&umidi->disc_lock); in snd_usbmidi_error_timer()
367 /* helper function to send static data that may not DMA-able */
374 return -ENOMEM; in send_bulk_static_data()
376 if (ep->urbs[0].urb) in send_bulk_static_data()
377 err = usb_bulk_msg(ep->umidi->dev, ep->urbs[0].urb->pipe, in send_bulk_static_data()
417 * Buggy M-Audio device: running status on input results in a packet that has
430 struct usbmidi_in_port *port = &ep->ports[cable]; in snd_usbmidi_maudio_broken_running_status_input()
438 port->running_status_length = length - 1; in snd_usbmidi_maudio_broken_running_status_input()
440 port->running_status_length != 0 && in snd_usbmidi_maudio_broken_running_status_input()
443 length = port->running_status_length; in snd_usbmidi_maudio_broken_running_status_input()
451 port->running_status_length = 0; in snd_usbmidi_maudio_broken_running_status_input()
470 if (ep->in_sysex && in ch345_broken_sysex_input()
471 cin == ep->last_cin && in ch345_broken_sysex_input()
477 * Either a corrupted running status or a real note-on in ch345_broken_sysex_input()
484 ep->in_sysex = cin == 0x4; in ch345_broken_sysex_input()
485 if (!ep->in_sysex) in ch345_broken_sysex_input()
486 ep->last_cin = cin; in ch345_broken_sysex_input()
501 &buffer[1], buffer_length - 1); in snd_usbmidi_cme_input()
513 (uint8_t *)urb->transfer_buffer + urb->transfer_buffer_length; in snd_usbmidi_output_standard_packet()
518 urb->transfer_buffer_length += 4; in snd_usbmidi_output_standard_packet()
530 (uint8_t *)urb->transfer_buffer + urb->transfer_buffer_length; in snd_usbmidi_output_midiman_packet()
535 urb->transfer_buffer_length += 4; in snd_usbmidi_output_midiman_packet()
544 uint8_t p0 = port->cable; in snd_usbmidi_transmit_byte()
546 port->ep->umidi->usb_protocol_ops->output_packet; in snd_usbmidi_transmit_byte()
553 port->data[0] = b; in snd_usbmidi_transmit_byte()
554 port->state = STATE_SYSEX_1; in snd_usbmidi_transmit_byte()
558 port->data[0] = b; in snd_usbmidi_transmit_byte()
559 port->state = STATE_1PARAM; in snd_usbmidi_transmit_byte()
562 port->data[0] = b; in snd_usbmidi_transmit_byte()
563 port->state = STATE_2PARAM_1; in snd_usbmidi_transmit_byte()
567 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
571 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
574 switch (port->state) { in snd_usbmidi_transmit_byte()
579 output_packet(urb, p0 | 0x06, port->data[0], in snd_usbmidi_transmit_byte()
583 output_packet(urb, p0 | 0x07, port->data[0], in snd_usbmidi_transmit_byte()
584 port->data[1], 0xf7); in snd_usbmidi_transmit_byte()
587 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
591 port->data[0] = b; in snd_usbmidi_transmit_byte()
593 port->state = STATE_1PARAM; in snd_usbmidi_transmit_byte()
595 port->state = STATE_2PARAM_1; in snd_usbmidi_transmit_byte()
597 switch (port->state) { in snd_usbmidi_transmit_byte()
599 if (port->data[0] < 0xf0) { in snd_usbmidi_transmit_byte()
600 p0 |= port->data[0] >> 4; in snd_usbmidi_transmit_byte()
603 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
605 output_packet(urb, p0, port->data[0], b, 0); in snd_usbmidi_transmit_byte()
608 port->data[1] = b; in snd_usbmidi_transmit_byte()
609 port->state = STATE_2PARAM_2; in snd_usbmidi_transmit_byte()
612 if (port->data[0] < 0xf0) { in snd_usbmidi_transmit_byte()
613 p0 |= port->data[0] >> 4; in snd_usbmidi_transmit_byte()
614 port->state = STATE_2PARAM_1; in snd_usbmidi_transmit_byte()
617 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
619 output_packet(urb, p0, port->data[0], port->data[1], b); in snd_usbmidi_transmit_byte()
622 port->data[0] = b; in snd_usbmidi_transmit_byte()
623 port->state = STATE_SYSEX_1; in snd_usbmidi_transmit_byte()
626 port->data[1] = b; in snd_usbmidi_transmit_byte()
627 port->state = STATE_SYSEX_2; in snd_usbmidi_transmit_byte()
630 output_packet(urb, p0 | 0x04, port->data[0], in snd_usbmidi_transmit_byte()
631 port->data[1], b); in snd_usbmidi_transmit_byte()
632 port->state = STATE_SYSEX_0; in snd_usbmidi_transmit_byte()
643 /* FIXME: lower-numbered ports can starve higher-numbered ports */ in snd_usbmidi_standard_output()
645 struct usbmidi_out_port *port = &ep->ports[p]; in snd_usbmidi_standard_output()
646 if (!port->active) in snd_usbmidi_standard_output()
648 while (urb->transfer_buffer_length + 3 < ep->max_transfer) { in snd_usbmidi_standard_output()
650 if (snd_rawmidi_transmit(port->substream, &b, 1) != 1) { in snd_usbmidi_standard_output()
651 port->active = 0; in snd_usbmidi_standard_output()
711 unsigned int port = (buffer[pos] >> 4) - 1; in snd_usbmidi_akai_input()
728 struct snd_rawmidi_substream *substream = ep->ports[0].substream; in snd_usbmidi_akai_output()
730 if (!ep->ports[0].active) in snd_usbmidi_akai_output()
733 msg = urb->transfer_buffer + urb->transfer_buffer_length; in snd_usbmidi_akai_output()
734 buf_end = ep->max_transfer - MAX_AKAI_SYSEX_LEN - 1; in snd_usbmidi_akai_output()
737 while (urb->transfer_buffer_length < buf_end) { in snd_usbmidi_akai_output()
741 ep->ports[0].active = 0; in snd_usbmidi_akai_output()
744 /* try to skip non-SysEx data */ in snd_usbmidi_akai_output()
759 /* it's incomplete - drop it */ in snd_usbmidi_akai_output()
770 urb->transfer_buffer_length += count + 1; in snd_usbmidi_akai_output()
774 /* less than 9 bytes and no end byte - wait for more */ in snd_usbmidi_akai_output()
776 ep->ports[0].active = 0; in snd_usbmidi_akai_output()
779 /* 9 bytes and no end marker in sight - malformed, skip it */ in snd_usbmidi_akai_output()
800 snd_usbmidi_input_data(ep, 0, &buffer[2], buffer[0] - 1); in snd_usbmidi_novation_input()
809 if (!ep->ports[0].active) in snd_usbmidi_novation_output()
811 transfer_buffer = urb->transfer_buffer; in snd_usbmidi_novation_output()
812 count = snd_rawmidi_transmit(ep->ports[0].substream, in snd_usbmidi_novation_output()
814 ep->max_transfer - 2); in snd_usbmidi_novation_output()
816 ep->ports[0].active = 0; in snd_usbmidi_novation_output()
821 urb->transfer_buffer_length = 2 + count; in snd_usbmidi_novation_output()
844 if (!ep->ports[0].active) in snd_usbmidi_raw_output()
846 count = snd_rawmidi_transmit(ep->ports[0].substream, in snd_usbmidi_raw_output()
847 urb->transfer_buffer, in snd_usbmidi_raw_output()
848 ep->max_transfer); in snd_usbmidi_raw_output()
850 ep->ports[0].active = 0; in snd_usbmidi_raw_output()
853 urb->transfer_buffer_length = count; in snd_usbmidi_raw_output()
869 snd_usbmidi_input_data(ep, 0, buffer + 2, buffer_length - 2); in snd_usbmidi_ftdi_input()
883 while (buffer_length && buffer[buffer_length - 1] == 0xFD) in snd_usbmidi_us122l_input()
884 buffer_length--; in snd_usbmidi_us122l_input()
894 if (!ep->ports[0].active) in snd_usbmidi_us122l_output()
896 switch (snd_usb_get_speed(ep->umidi->dev)) { in snd_usbmidi_us122l_output()
905 count = snd_rawmidi_transmit(ep->ports[0].substream, in snd_usbmidi_us122l_output()
906 urb->transfer_buffer, in snd_usbmidi_us122l_output()
909 ep->ports[0].active = 0; in snd_usbmidi_us122l_output()
913 memset(urb->transfer_buffer + count, 0xFD, ep->max_transfer - count); in snd_usbmidi_us122l_output()
914 urb->transfer_buffer_length = ep->max_transfer; in snd_usbmidi_us122l_output()
972 if (ep->seen_f5) in snd_usbmidi_emagic_input()
980 snd_usbmidi_input_data(ep, ep->current_port, buffer, i); in snd_usbmidi_emagic_input()
982 buffer_length -= i; in snd_usbmidi_emagic_input()
987 ep->seen_f5 = 1; in snd_usbmidi_emagic_input()
989 --buffer_length; in snd_usbmidi_emagic_input()
995 ep->current_port = (buffer[0] - 1) & 15; in snd_usbmidi_emagic_input()
997 --buffer_length; in snd_usbmidi_emagic_input()
999 ep->seen_f5 = 0; in snd_usbmidi_emagic_input()
1006 int port0 = ep->current_port; in snd_usbmidi_emagic_output()
1007 uint8_t *buf = urb->transfer_buffer; in snd_usbmidi_emagic_output()
1008 int buf_free = ep->max_transfer; in snd_usbmidi_emagic_output()
1012 /* round-robin, starting at the last current port */ in snd_usbmidi_emagic_output()
1014 struct usbmidi_out_port *port = &ep->ports[portnum]; in snd_usbmidi_emagic_output()
1016 if (!port->active) in snd_usbmidi_emagic_output()
1018 if (snd_rawmidi_transmit_peek(port->substream, buf, 1) != 1) { in snd_usbmidi_emagic_output()
1019 port->active = 0; in snd_usbmidi_emagic_output()
1023 if (portnum != ep->current_port) { in snd_usbmidi_emagic_output()
1026 ep->current_port = portnum; in snd_usbmidi_emagic_output()
1030 buf_free -= 2; in snd_usbmidi_emagic_output()
1035 length = snd_rawmidi_transmit(port->substream, buf, buf_free); in snd_usbmidi_emagic_output()
1038 buf_free -= length; in snd_usbmidi_emagic_output()
1043 if (buf_free < ep->max_transfer && buf_free > 0) { in snd_usbmidi_emagic_output()
1045 --buf_free; in snd_usbmidi_emagic_output()
1047 urb->transfer_buffer_length = ep->max_transfer - buf_free; in snd_usbmidi_emagic_output()
1065 intf = umidi->iface; in update_roland_altsetting()
1066 is_light_load = intf->cur_altsetting != intf->altsetting; in update_roland_altsetting()
1067 if (umidi->roland_load_ctl->private_value == is_light_load) in update_roland_altsetting()
1069 hostif = &intf->altsetting[umidi->roland_load_ctl->private_value]; in update_roland_altsetting()
1071 snd_usbmidi_input_stop(&umidi->list); in update_roland_altsetting()
1072 usb_set_interface(umidi->dev, intfd->bInterfaceNumber, in update_roland_altsetting()
1073 intfd->bAlternateSetting); in update_roland_altsetting()
1074 snd_usbmidi_input_start(&umidi->list); in update_roland_altsetting()
1080 struct snd_usb_midi *umidi = substream->rmidi->private_data; in substream_open()
1083 down_read(&umidi->disc_rwsem); in substream_open()
1084 if (umidi->disconnected) { in substream_open()
1085 up_read(&umidi->disc_rwsem); in substream_open()
1086 return open ? -ENODEV : 0; in substream_open()
1089 mutex_lock(&umidi->mutex); in substream_open()
1091 if (!umidi->opened[0] && !umidi->opened[1]) { in substream_open()
1092 if (umidi->roland_load_ctl) { in substream_open()
1093 ctl = umidi->roland_load_ctl; in substream_open()
1094 ctl->vd[0].access |= in substream_open()
1096 snd_ctl_notify(umidi->card, in substream_open()
1097 SNDRV_CTL_EVENT_MASK_INFO, &ctl->id); in substream_open()
1101 umidi->opened[dir]++; in substream_open()
1102 if (umidi->opened[1]) in substream_open()
1103 snd_usbmidi_input_start(&umidi->list); in substream_open()
1105 umidi->opened[dir]--; in substream_open()
1106 if (!umidi->opened[1]) in substream_open()
1107 snd_usbmidi_input_stop(&umidi->list); in substream_open()
1108 if (!umidi->opened[0] && !umidi->opened[1]) { in substream_open()
1109 if (umidi->roland_load_ctl) { in substream_open()
1110 ctl = umidi->roland_load_ctl; in substream_open()
1111 ctl->vd[0].access &= in substream_open()
1113 snd_ctl_notify(umidi->card, in substream_open()
1114 SNDRV_CTL_EVENT_MASK_INFO, &ctl->id); in substream_open()
1118 mutex_unlock(&umidi->mutex); in substream_open()
1119 up_read(&umidi->disc_rwsem); in substream_open()
1125 struct snd_usb_midi *umidi = substream->rmidi->private_data; in snd_usbmidi_output_open()
1130 if (umidi->endpoints[i].out) in snd_usbmidi_output_open()
1132 if (umidi->endpoints[i].out->ports[j].substream == substream) { in snd_usbmidi_output_open()
1133 port = &umidi->endpoints[i].out->ports[j]; in snd_usbmidi_output_open()
1138 return -ENXIO; in snd_usbmidi_output_open()
1141 substream->runtime->private_data = port; in snd_usbmidi_output_open()
1142 port->state = STATE_UNKNOWN; in snd_usbmidi_output_open()
1155 (struct usbmidi_out_port *)substream->runtime->private_data; in snd_usbmidi_output_trigger()
1157 port->active = up; in snd_usbmidi_output_trigger()
1159 if (port->ep->umidi->disconnected) { in snd_usbmidi_output_trigger()
1165 queue_work(system_highpri_wq, &port->ep->work); in snd_usbmidi_output_trigger()
1171 struct usbmidi_out_port *port = substream->runtime->private_data; in snd_usbmidi_output_drain()
1172 struct snd_usb_midi_out_endpoint *ep = port->ep; in snd_usbmidi_output_drain()
1177 if (ep->umidi->disconnected) in snd_usbmidi_output_drain()
1183 spin_lock_irq(&ep->buffer_lock); in snd_usbmidi_output_drain()
1184 drain_urbs = ep->active_urbs; in snd_usbmidi_output_drain()
1186 ep->drain_urbs |= drain_urbs; in snd_usbmidi_output_drain()
1188 prepare_to_wait(&ep->drain_wait, &wait, in snd_usbmidi_output_drain()
1190 spin_unlock_irq(&ep->buffer_lock); in snd_usbmidi_output_drain()
1192 spin_lock_irq(&ep->buffer_lock); in snd_usbmidi_output_drain()
1193 drain_urbs &= ep->drain_urbs; in snd_usbmidi_output_drain()
1195 finish_wait(&ep->drain_wait, &wait); in snd_usbmidi_output_drain()
1197 spin_unlock_irq(&ep->buffer_lock); in snd_usbmidi_output_drain()
1213 struct snd_usb_midi *umidi = substream->rmidi->private_data; in snd_usbmidi_input_trigger()
1216 set_bit(substream->number, &umidi->input_triggered); in snd_usbmidi_input_trigger()
1218 clear_bit(substream->number, &umidi->input_triggered); in snd_usbmidi_input_trigger()
1237 usb_free_coherent(umidi->dev, buffer_length, in free_urb_and_buffer()
1238 urb->transfer_buffer, urb->transfer_dma); in free_urb_and_buffer()
1251 if (ep->urbs[i]) in snd_usbmidi_in_endpoint_delete()
1252 free_urb_and_buffer(ep->umidi, ep->urbs[i], in snd_usbmidi_in_endpoint_delete()
1253 ep->urbs[i]->transfer_buffer_length); in snd_usbmidi_in_endpoint_delete()
1271 rep->in = NULL; in snd_usbmidi_in_endpoint_create()
1274 return -ENOMEM; in snd_usbmidi_in_endpoint_create()
1275 ep->umidi = umidi; in snd_usbmidi_in_endpoint_create()
1278 ep->urbs[i] = usb_alloc_urb(0, GFP_KERNEL); in snd_usbmidi_in_endpoint_create()
1279 if (!ep->urbs[i]) { in snd_usbmidi_in_endpoint_create()
1280 err = -ENOMEM; in snd_usbmidi_in_endpoint_create()
1284 if (ep_info->in_interval) in snd_usbmidi_in_endpoint_create()
1285 pipe = usb_rcvintpipe(umidi->dev, ep_info->in_ep); in snd_usbmidi_in_endpoint_create()
1287 pipe = usb_rcvbulkpipe(umidi->dev, ep_info->in_ep); in snd_usbmidi_in_endpoint_create()
1288 length = usb_maxpacket(umidi->dev, pipe, 0); in snd_usbmidi_in_endpoint_create()
1290 buffer = usb_alloc_coherent(umidi->dev, length, GFP_KERNEL, in snd_usbmidi_in_endpoint_create()
1291 &ep->urbs[i]->transfer_dma); in snd_usbmidi_in_endpoint_create()
1293 err = -ENOMEM; in snd_usbmidi_in_endpoint_create()
1296 if (ep_info->in_interval) in snd_usbmidi_in_endpoint_create()
1297 usb_fill_int_urb(ep->urbs[i], umidi->dev, in snd_usbmidi_in_endpoint_create()
1300 ep, ep_info->in_interval); in snd_usbmidi_in_endpoint_create()
1302 usb_fill_bulk_urb(ep->urbs[i], umidi->dev, in snd_usbmidi_in_endpoint_create()
1305 ep->urbs[i]->transfer_flags = URB_NO_TRANSFER_DMA_MAP; in snd_usbmidi_in_endpoint_create()
1306 err = usb_urb_ep_type_check(ep->urbs[i]); in snd_usbmidi_in_endpoint_create()
1308 dev_err(&umidi->dev->dev, "invalid MIDI in EP %x\n", in snd_usbmidi_in_endpoint_create()
1309 ep_info->in_ep); in snd_usbmidi_in_endpoint_create()
1314 rep->in = ep; in snd_usbmidi_in_endpoint_create()
1331 if (ep->urbs[i].urb) { in snd_usbmidi_out_endpoint_clear()
1332 free_urb_and_buffer(ep->umidi, ep->urbs[i].urb, in snd_usbmidi_out_endpoint_clear()
1333 ep->max_transfer); in snd_usbmidi_out_endpoint_clear()
1334 ep->urbs[i].urb = NULL; in snd_usbmidi_out_endpoint_clear()
1345 * Creates an output endpoint, and initializes output ports.
1357 rep->out = NULL; in snd_usbmidi_out_endpoint_create()
1360 return -ENOMEM; in snd_usbmidi_out_endpoint_create()
1361 ep->umidi = umidi; in snd_usbmidi_out_endpoint_create()
1364 ep->urbs[i].urb = usb_alloc_urb(0, GFP_KERNEL); in snd_usbmidi_out_endpoint_create()
1365 if (!ep->urbs[i].urb) { in snd_usbmidi_out_endpoint_create()
1366 err = -ENOMEM; in snd_usbmidi_out_endpoint_create()
1369 ep->urbs[i].ep = ep; in snd_usbmidi_out_endpoint_create()
1371 if (ep_info->out_interval) in snd_usbmidi_out_endpoint_create()
1372 pipe = usb_sndintpipe(umidi->dev, ep_info->out_ep); in snd_usbmidi_out_endpoint_create()
1374 pipe = usb_sndbulkpipe(umidi->dev, ep_info->out_ep); in snd_usbmidi_out_endpoint_create()
1375 switch (umidi->usb_id) { in snd_usbmidi_out_endpoint_create()
1377 ep->max_transfer = usb_maxpacket(umidi->dev, pipe, 1); in snd_usbmidi_out_endpoint_create()
1388 case USB_ID(0x1a86, 0x752d): /* QinHeng CH345 "USB2.0-MIDI" */ in snd_usbmidi_out_endpoint_create()
1390 ep->max_transfer = 4; in snd_usbmidi_out_endpoint_create()
1395 case USB_ID(0x0644, 0x800e): /* Tascam US-122L */ in snd_usbmidi_out_endpoint_create()
1396 case USB_ID(0x0644, 0x800f): /* Tascam US-144 */ in snd_usbmidi_out_endpoint_create()
1397 ep->max_transfer = 9; in snd_usbmidi_out_endpoint_create()
1401 buffer = usb_alloc_coherent(umidi->dev, in snd_usbmidi_out_endpoint_create()
1402 ep->max_transfer, GFP_KERNEL, in snd_usbmidi_out_endpoint_create()
1403 &ep->urbs[i].urb->transfer_dma); in snd_usbmidi_out_endpoint_create()
1405 err = -ENOMEM; in snd_usbmidi_out_endpoint_create()
1408 if (ep_info->out_interval) in snd_usbmidi_out_endpoint_create()
1409 usb_fill_int_urb(ep->urbs[i].urb, umidi->dev, in snd_usbmidi_out_endpoint_create()
1410 pipe, buffer, ep->max_transfer, in snd_usbmidi_out_endpoint_create()
1412 &ep->urbs[i], ep_info->out_interval); in snd_usbmidi_out_endpoint_create()
1414 usb_fill_bulk_urb(ep->urbs[i].urb, umidi->dev, in snd_usbmidi_out_endpoint_create()
1415 pipe, buffer, ep->max_transfer, in snd_usbmidi_out_endpoint_create()
1417 &ep->urbs[i]); in snd_usbmidi_out_endpoint_create()
1418 err = usb_urb_ep_type_check(ep->urbs[i].urb); in snd_usbmidi_out_endpoint_create()
1420 dev_err(&umidi->dev->dev, "invalid MIDI out EP %x\n", in snd_usbmidi_out_endpoint_create()
1421 ep_info->out_ep); in snd_usbmidi_out_endpoint_create()
1424 ep->urbs[i].urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; in snd_usbmidi_out_endpoint_create()
1427 spin_lock_init(&ep->buffer_lock); in snd_usbmidi_out_endpoint_create()
1428 INIT_WORK(&ep->work, snd_usbmidi_out_work); in snd_usbmidi_out_endpoint_create()
1429 init_waitqueue_head(&ep->drain_wait); in snd_usbmidi_out_endpoint_create()
1432 if (ep_info->out_cables & (1 << i)) { in snd_usbmidi_out_endpoint_create()
1433 ep->ports[i].ep = ep; in snd_usbmidi_out_endpoint_create()
1434 ep->ports[i].cable = i << 4; in snd_usbmidi_out_endpoint_create()
1437 if (umidi->usb_protocol_ops->init_out_endpoint) in snd_usbmidi_out_endpoint_create()
1438 umidi->usb_protocol_ops->init_out_endpoint(ep); in snd_usbmidi_out_endpoint_create()
1440 rep->out = ep; in snd_usbmidi_out_endpoint_create()
1456 struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i]; in snd_usbmidi_free()
1457 if (ep->out) in snd_usbmidi_free()
1458 snd_usbmidi_out_endpoint_delete(ep->out); in snd_usbmidi_free()
1459 if (ep->in) in snd_usbmidi_free()
1460 snd_usbmidi_in_endpoint_delete(ep->in); in snd_usbmidi_free()
1462 mutex_destroy(&umidi->mutex); in snd_usbmidi_free()
1480 down_write(&umidi->disc_rwsem); in snd_usbmidi_disconnect()
1481 spin_lock_irq(&umidi->disc_lock); in snd_usbmidi_disconnect()
1482 umidi->disconnected = 1; in snd_usbmidi_disconnect()
1483 spin_unlock_irq(&umidi->disc_lock); in snd_usbmidi_disconnect()
1484 up_write(&umidi->disc_rwsem); in snd_usbmidi_disconnect()
1486 del_timer_sync(&umidi->error_timer); in snd_usbmidi_disconnect()
1489 struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i]; in snd_usbmidi_disconnect()
1490 if (ep->out) in snd_usbmidi_disconnect()
1491 cancel_work_sync(&ep->out->work); in snd_usbmidi_disconnect()
1492 if (ep->out) { in snd_usbmidi_disconnect()
1494 usb_kill_urb(ep->out->urbs[j].urb); in snd_usbmidi_disconnect()
1495 if (umidi->usb_protocol_ops->finish_out_endpoint) in snd_usbmidi_disconnect()
1496 umidi->usb_protocol_ops->finish_out_endpoint(ep->out); in snd_usbmidi_disconnect()
1497 ep->out->active_urbs = 0; in snd_usbmidi_disconnect()
1498 if (ep->out->drain_urbs) { in snd_usbmidi_disconnect()
1499 ep->out->drain_urbs = 0; in snd_usbmidi_disconnect()
1500 wake_up(&ep->out->drain_wait); in snd_usbmidi_disconnect()
1503 if (ep->in) in snd_usbmidi_disconnect()
1505 usb_kill_urb(ep->in->urbs[j]); in snd_usbmidi_disconnect()
1507 if (ep->out) in snd_usbmidi_disconnect()
1508 snd_usbmidi_out_endpoint_clear(ep->out); in snd_usbmidi_disconnect()
1509 if (ep->in) { in snd_usbmidi_disconnect()
1510 snd_usbmidi_in_endpoint_delete(ep->in); in snd_usbmidi_disconnect()
1511 ep->in = NULL; in snd_usbmidi_disconnect()
1519 struct snd_usb_midi *umidi = rmidi->private_data; in snd_usbmidi_rawmidi_free()
1529 list_for_each_entry(substream, &umidi->rmidi->streams[stream].substreams, in snd_usbmidi_find_substream()
1531 if (substream->number == number) in snd_usbmidi_find_substream()
1538 * This list specifies names for ports that do not fit into the standard
1539 * "(product) MIDI (n)" schema because they aren't external MIDI ports,
1540 * such as internal control or synthesizer ports.
1549 #define PORT_INFO(vendor, product, num, name_, voices_, flags) \ argument
1551 .port = num, .voices = voices_, \
1553 #define EXTERNAL_PORT(vendor, product, num, name) \ argument
1554 PORT_INFO(vendor, product, num, name, 0, \
1558 #define CONTROL_PORT(vendor, product, num, name) \ argument
1559 PORT_INFO(vendor, product, num, name, 0, \
1562 #define GM_SYNTH_PORT(vendor, product, num, name, voices) \ argument
1563 PORT_INFO(vendor, product, num, name, voices, \
1568 #define ROLAND_SYNTH_PORT(vendor, product, num, name, voices) \ argument
1569 PORT_INFO(vendor, product, num, name, voices, \
1577 #define SOUNDCANVAS_PORT(vendor, product, num, name, voices) \ argument
1578 PORT_INFO(vendor, product, num, name, voices, \
1592 /* Roland UA-100 */
1594 /* Roland SC-8850 */
1601 /* Roland U-8 */
1604 /* Roland SC-8820 */
1608 /* Roland SK-500 */
1612 /* Roland SC-D70 */
1616 /* Edirol UM-880 */
1618 /* Edirol SD-90 */
1623 /* Edirol UM-550 */
1625 /* Edirol SD-20 */
1629 /* Edirol SD-80 */
1634 /* Edirol UA-700 */
1645 /* BOSS GS-10 */
1648 /* Edirol UA-1000 */
1651 /* Edirol UR-80 */
1655 /* Edirol PCR-A */
1659 /* BOSS GT-PRO */
1661 /* Edirol UM-3EX */
1663 /* Roland VG-99 */
1666 /* Cakewalk Sonar V-Studio 100 */
1669 /* Roland VB-99 */
1672 /* Roland A-PRO */
1676 /* Roland SD-50 */
1680 /* Roland OCTA-CAPTURE */
1685 /* Roland SPD-SX */
1688 /* Roland A-Series */
1691 /* Roland INTEGRA-7 */
1694 /* M-Audio MidiSport 8x8 */
1722 if (snd_usbmidi_port_info[i].id == umidi->usb_id && in find_port_info()
1732 struct snd_usb_midi *umidi = rmidi->private_data; in snd_usbmidi_get_port_info()
1738 seq_port_info->type = port_info->seq_flags; in snd_usbmidi_get_port_info()
1739 seq_port_info->midi_voices = port_info->voices; in snd_usbmidi_get_port_info()
1746 unsigned char *extra = hostif->extra; in find_usb_in_jack_descriptor()
1747 int extralen = hostif->extralen; in find_usb_in_jack_descriptor()
1753 if (injd->bLength >= sizeof(*injd) && in find_usb_in_jack_descriptor()
1754 injd->bDescriptorType == USB_DT_CS_INTERFACE && in find_usb_in_jack_descriptor()
1755 injd->bDescriptorSubtype == UAC_MIDI_IN_JACK && in find_usb_in_jack_descriptor()
1756 injd->bJackID == jack_id) in find_usb_in_jack_descriptor()
1760 extralen -= extra[0]; in find_usb_in_jack_descriptor()
1769 unsigned char *extra = hostif->extra; in find_usb_out_jack_descriptor()
1770 int extralen = hostif->extralen; in find_usb_out_jack_descriptor()
1776 if (outjd->bLength >= sizeof(*outjd) && in find_usb_out_jack_descriptor()
1777 outjd->bDescriptorType == USB_DT_CS_INTERFACE && in find_usb_out_jack_descriptor()
1778 outjd->bDescriptorSubtype == UAC_MIDI_OUT_JACK && in find_usb_out_jack_descriptor()
1779 outjd->bJackID == jack_id) in find_usb_out_jack_descriptor()
1783 extralen -= extra[0]; in find_usb_out_jack_descriptor()
1809 dev_err(&umidi->dev->dev, "substream %d:%d not found\n", stream, in snd_usbmidi_init_substream()
1814 intf = umidi->iface; in snd_usbmidi_init_substream()
1816 hostif = intf->cur_altsetting; in snd_usbmidi_init_substream()
1822 sz = USB_DT_MIDI_OUT_SIZE(outjd->bNrInputPins); in snd_usbmidi_init_substream()
1823 if (outjd->bLength >= sz) in snd_usbmidi_init_substream()
1824 iJack = *(((uint8_t *) outjd) + sz - sizeof(uint8_t)); in snd_usbmidi_init_substream()
1830 iJack = injd->iJack; in snd_usbmidi_init_substream()
1833 res = usb_string(umidi->dev, iJack, jack_name_buf, in snd_usbmidi_init_substream()
1841 name_format = port_info ? port_info->name : in snd_usbmidi_init_substream()
1843 snprintf(substream->name, sizeof(substream->name), in snd_usbmidi_init_substream()
1844 name_format, umidi->card->shortname, jack_name, number + 1); in snd_usbmidi_init_substream()
1850 * Creates the endpoints and their ports.
1862 &umidi->endpoints[i]); in snd_usbmidi_create_endpoints()
1869 &umidi->endpoints[i]); in snd_usbmidi_create_endpoints()
1880 &umidi->endpoints[i].out->ports[j].substream); in snd_usbmidi_create_endpoints()
1888 &umidi->endpoints[i].in->ports[j].substream); in snd_usbmidi_create_endpoints()
1893 dev_dbg(&umidi->dev->dev, "created %d output and %d input ports\n", in snd_usbmidi_create_endpoints()
1901 unsigned char *extra = hostep->extra; in find_usb_ms_endpoint_descriptor()
1902 int extralen = hostep->extralen; in find_usb_ms_endpoint_descriptor()
1908 if (ms_ep->bLength > 3 && in find_usb_ms_endpoint_descriptor()
1909 ms_ep->bDescriptorType == USB_DT_CS_ENDPOINT && in find_usb_ms_endpoint_descriptor()
1910 ms_ep->bDescriptorSubtype == UAC_MS_GENERAL) in find_usb_ms_endpoint_descriptor()
1914 extralen -= extra[0]; in find_usb_ms_endpoint_descriptor()
1935 intf = umidi->iface; in snd_usbmidi_get_ms_info()
1937 return -ENXIO; in snd_usbmidi_get_ms_info()
1938 hostif = &intf->altsetting[0]; in snd_usbmidi_get_ms_info()
1940 ms_header = (struct usb_ms_header_descriptor *)hostif->extra; in snd_usbmidi_get_ms_info()
1941 if (hostif->extralen >= 7 && in snd_usbmidi_get_ms_info()
1942 ms_header->bLength >= 7 && in snd_usbmidi_get_ms_info()
1943 ms_header->bDescriptorType == USB_DT_CS_INTERFACE && in snd_usbmidi_get_ms_info()
1944 ms_header->bDescriptorSubtype == UAC_HEADER) in snd_usbmidi_get_ms_info()
1945 dev_dbg(&umidi->dev->dev, "MIDIStreaming version %02x.%02x\n", in snd_usbmidi_get_ms_info()
1946 ((uint8_t *)&ms_header->bcdMSC)[1], ((uint8_t *)&ms_header->bcdMSC)[0]); in snd_usbmidi_get_ms_info()
1948 dev_warn(&umidi->dev->dev, in snd_usbmidi_get_ms_info()
1952 for (i = 0; i < intfd->bNumEndpoints; ++i) { in snd_usbmidi_get_ms_info()
1953 hostep = &hostif->endpoint[i]; in snd_usbmidi_get_ms_info()
1960 if (ms_ep->bLength <= sizeof(*ms_ep)) in snd_usbmidi_get_ms_info()
1962 if (ms_ep->bNumEmbMIDIJack > 0x10) in snd_usbmidi_get_ms_info()
1964 if (ms_ep->bLength < sizeof(*ms_ep) + ms_ep->bNumEmbMIDIJack) in snd_usbmidi_get_ms_info()
1969 dev_warn(&umidi->dev->dev, in snd_usbmidi_get_ms_info()
1976 endpoints[epidx].out_interval = ep->bInterval; in snd_usbmidi_get_ms_info()
1977 else if (snd_usb_get_speed(umidi->dev) == USB_SPEED_LOW) in snd_usbmidi_get_ms_info()
1985 (1 << ms_ep->bNumEmbMIDIJack) - 1; in snd_usbmidi_get_ms_info()
1986 for (j = 0; j < ms_ep->bNumEmbMIDIJack; ++j) in snd_usbmidi_get_ms_info()
1987 endpoints[epidx].assoc_out_jacks[j] = ms_ep->baAssocJackID[j]; in snd_usbmidi_get_ms_info()
1989 endpoints[epidx].assoc_out_jacks[j] = -1; in snd_usbmidi_get_ms_info()
1990 dev_dbg(&umidi->dev->dev, "EP %02X: %d jack(s)\n", in snd_usbmidi_get_ms_info()
1991 ep->bEndpointAddress, ms_ep->bNumEmbMIDIJack); in snd_usbmidi_get_ms_info()
1995 dev_warn(&umidi->dev->dev, in snd_usbmidi_get_ms_info()
2002 endpoints[epidx].in_interval = ep->bInterval; in snd_usbmidi_get_ms_info()
2003 else if (snd_usb_get_speed(umidi->dev) == USB_SPEED_LOW) in snd_usbmidi_get_ms_info()
2006 (1 << ms_ep->bNumEmbMIDIJack) - 1; in snd_usbmidi_get_ms_info()
2007 for (j = 0; j < ms_ep->bNumEmbMIDIJack; ++j) in snd_usbmidi_get_ms_info()
2008 endpoints[epidx].assoc_in_jacks[j] = ms_ep->baAssocJackID[j]; in snd_usbmidi_get_ms_info()
2010 endpoints[epidx].assoc_in_jacks[j] = -1; in snd_usbmidi_get_ms_info()
2011 dev_dbg(&umidi->dev->dev, "EP %02X: %d jack(s)\n", in snd_usbmidi_get_ms_info()
2012 ep->bEndpointAddress, ms_ep->bNumEmbMIDIJack); in snd_usbmidi_get_ms_info()
2029 value->value.enumerated.item[0] = kcontrol->private_value; in roland_load_get()
2036 struct snd_usb_midi *umidi = kcontrol->private_data; in roland_load_put()
2039 if (value->value.enumerated.item[0] > 1) in roland_load_put()
2040 return -EINVAL; in roland_load_put()
2041 mutex_lock(&umidi->mutex); in roland_load_put()
2042 changed = value->value.enumerated.item[0] != kcontrol->private_value; in roland_load_put()
2044 kcontrol->private_value = value->value.enumerated.item[0]; in roland_load_put()
2045 mutex_unlock(&umidi->mutex); in roland_load_put()
2068 intf = umidi->iface; in snd_usbmidi_switch_roland_altsetting()
2069 if (!intf || intf->num_altsetting != 2) in snd_usbmidi_switch_roland_altsetting()
2072 hostif = &intf->altsetting[1]; in snd_usbmidi_switch_roland_altsetting()
2077 if (intfd->bNumEndpoints != 2 || in snd_usbmidi_switch_roland_altsetting()
2078 !((get_endpoint(hostif, 0)->bmAttributes & in snd_usbmidi_switch_roland_altsetting()
2080 (get_endpoint(hostif, 1)->bmAttributes & in snd_usbmidi_switch_roland_altsetting()
2084 dev_dbg(&umidi->dev->dev, "switching to altsetting %d with int ep\n", in snd_usbmidi_switch_roland_altsetting()
2085 intfd->bAlternateSetting); in snd_usbmidi_switch_roland_altsetting()
2086 usb_set_interface(umidi->dev, intfd->bInterfaceNumber, in snd_usbmidi_switch_roland_altsetting()
2087 intfd->bAlternateSetting); in snd_usbmidi_switch_roland_altsetting()
2089 umidi->roland_load_ctl = snd_ctl_new1(&roland_load_ctl, umidi); in snd_usbmidi_switch_roland_altsetting()
2090 if (snd_ctl_add(umidi->card, umidi->roland_load_ctl) < 0) in snd_usbmidi_switch_roland_altsetting()
2091 umidi->roland_load_ctl = NULL; in snd_usbmidi_switch_roland_altsetting()
2107 if (USB_ID_VENDOR(umidi->usb_id) == 0x0582) in snd_usbmidi_detect_endpoints()
2113 intf = umidi->iface; in snd_usbmidi_detect_endpoints()
2114 if (!intf || intf->num_altsetting < 1) in snd_usbmidi_detect_endpoints()
2115 return -ENOENT; in snd_usbmidi_detect_endpoints()
2116 hostif = intf->cur_altsetting; in snd_usbmidi_detect_endpoints()
2119 for (i = 0; i < intfd->bNumEndpoints; ++i) { in snd_usbmidi_detect_endpoints()
2128 endpoint[out_eps].out_interval = epd->bInterval; in snd_usbmidi_detect_endpoints()
2135 endpoint[in_eps].in_interval = epd->bInterval; in snd_usbmidi_detect_endpoints()
2139 return (out_eps || in_eps) ? 0 : -ENOENT; in snd_usbmidi_detect_endpoints()
2143 * Detects the endpoints for one-port-per-endpoint protocols.
2161 * Detects the endpoints and ports of Yamaha devices.
2171 intf = umidi->iface; in snd_usbmidi_detect_yamaha()
2173 return -ENOENT; in snd_usbmidi_detect_yamaha()
2174 hostif = intf->altsetting; in snd_usbmidi_detect_yamaha()
2176 if (intfd->bNumEndpoints < 1) in snd_usbmidi_detect_yamaha()
2177 return -ENOENT; in snd_usbmidi_detect_yamaha()
2183 for (cs_desc = hostif->extra; in snd_usbmidi_detect_yamaha()
2184 cs_desc < hostif->extra + hostif->extralen && cs_desc[0] >= 2; in snd_usbmidi_detect_yamaha()
2188 endpoint->in_cables = in snd_usbmidi_detect_yamaha()
2189 (endpoint->in_cables << 1) | 1; in snd_usbmidi_detect_yamaha()
2191 endpoint->out_cables = in snd_usbmidi_detect_yamaha()
2192 (endpoint->out_cables << 1) | 1; in snd_usbmidi_detect_yamaha()
2195 if (!endpoint->in_cables && !endpoint->out_cables) in snd_usbmidi_detect_yamaha()
2196 return -ENOENT; in snd_usbmidi_detect_yamaha()
2202 * Detects the endpoints and ports of Roland devices.
2211 intf = umidi->iface; in snd_usbmidi_detect_roland()
2213 return -ENOENT; in snd_usbmidi_detect_roland()
2214 hostif = intf->altsetting; in snd_usbmidi_detect_roland()
2219 for (cs_desc = hostif->extra; in snd_usbmidi_detect_roland()
2220 cs_desc < hostif->extra + hostif->extralen && cs_desc[0] >= 2; in snd_usbmidi_detect_roland()
2228 endpoint->in_cables = (1 << cs_desc[4]) - 1; in snd_usbmidi_detect_roland()
2229 endpoint->out_cables = (1 << cs_desc[5]) - 1; in snd_usbmidi_detect_roland()
2238 return -ENODEV; in snd_usbmidi_detect_roland()
2242 * Creates the endpoints and their ports for Midiman devices.
2254 intf = umidi->iface; in snd_usbmidi_create_endpoints_midiman()
2256 return -ENOENT; in snd_usbmidi_create_endpoints_midiman()
2257 hostif = intf->altsetting; in snd_usbmidi_create_endpoints_midiman()
2264 * There is one interrupt input endpoint for all input ports, one in snd_usbmidi_create_endpoints_midiman()
2265 * bulk output endpoint for even-numbered ports, and one for odd- in snd_usbmidi_create_endpoints_midiman()
2266 * numbered ports. Both bulk output endpoints have corresponding in snd_usbmidi_create_endpoints_midiman()
2269 if (intfd->bNumEndpoints < (endpoint->out_cables > 0x0001 ? 5 : 3)) { in snd_usbmidi_create_endpoints_midiman()
2270 dev_dbg(&umidi->dev->dev, "not enough endpoints\n"); in snd_usbmidi_create_endpoints_midiman()
2271 return -ENOENT; in snd_usbmidi_create_endpoints_midiman()
2276 dev_dbg(&umidi->dev->dev, "endpoint[0] isn't interrupt\n"); in snd_usbmidi_create_endpoints_midiman()
2277 return -ENXIO; in snd_usbmidi_create_endpoints_midiman()
2281 dev_dbg(&umidi->dev->dev, "endpoint[2] isn't bulk output\n"); in snd_usbmidi_create_endpoints_midiman()
2282 return -ENXIO; in snd_usbmidi_create_endpoints_midiman()
2284 if (endpoint->out_cables > 0x0001) { in snd_usbmidi_create_endpoints_midiman()
2288 dev_dbg(&umidi->dev->dev, in snd_usbmidi_create_endpoints_midiman()
2290 return -ENXIO; in snd_usbmidi_create_endpoints_midiman()
2294 ep_info.out_ep = get_endpoint(hostif, 2)->bEndpointAddress & in snd_usbmidi_create_endpoints_midiman()
2297 ep_info.out_cables = endpoint->out_cables & 0x5555; in snd_usbmidi_create_endpoints_midiman()
2299 &umidi->endpoints[0]); in snd_usbmidi_create_endpoints_midiman()
2303 ep_info.in_ep = get_endpoint(hostif, 0)->bEndpointAddress & in snd_usbmidi_create_endpoints_midiman()
2305 ep_info.in_interval = get_endpoint(hostif, 0)->bInterval; in snd_usbmidi_create_endpoints_midiman()
2306 ep_info.in_cables = endpoint->in_cables; in snd_usbmidi_create_endpoints_midiman()
2308 &umidi->endpoints[0]); in snd_usbmidi_create_endpoints_midiman()
2312 if (endpoint->out_cables > 0x0001) { in snd_usbmidi_create_endpoints_midiman()
2313 ep_info.out_ep = get_endpoint(hostif, 4)->bEndpointAddress & in snd_usbmidi_create_endpoints_midiman()
2315 ep_info.out_cables = endpoint->out_cables & 0xaaaa; in snd_usbmidi_create_endpoints_midiman()
2317 &umidi->endpoints[1]); in snd_usbmidi_create_endpoints_midiman()
2323 if (endpoint->out_cables & (1 << cable)) in snd_usbmidi_create_endpoints_midiman()
2327 -1 /* prevent trying to find jack */, in snd_usbmidi_create_endpoints_midiman()
2328 &umidi->endpoints[cable & 1].out->ports[cable].substream); in snd_usbmidi_create_endpoints_midiman()
2329 if (endpoint->in_cables & (1 << cable)) in snd_usbmidi_create_endpoints_midiman()
2333 -1 /* prevent trying to find jack */, in snd_usbmidi_create_endpoints_midiman()
2334 &umidi->endpoints[0].in->ports[cable].substream); in snd_usbmidi_create_endpoints_midiman()
2349 err = snd_rawmidi_new(umidi->card, "USB MIDI", in snd_usbmidi_create_rawmidi()
2350 umidi->next_midi_device++, in snd_usbmidi_create_rawmidi()
2354 strcpy(rmidi->name, umidi->card->shortname); in snd_usbmidi_create_rawmidi()
2355 rmidi->info_flags = SNDRV_RAWMIDI_INFO_OUTPUT | in snd_usbmidi_create_rawmidi()
2358 rmidi->ops = &snd_usbmidi_ops; in snd_usbmidi_create_rawmidi()
2359 rmidi->private_data = umidi; in snd_usbmidi_create_rawmidi()
2360 rmidi->private_free = snd_usbmidi_rawmidi_free; in snd_usbmidi_create_rawmidi()
2366 umidi->rmidi = rmidi; in snd_usbmidi_create_rawmidi()
2379 if (!umidi->input_running) in snd_usbmidi_input_stop()
2382 struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i]; in snd_usbmidi_input_stop()
2383 if (ep->in) in snd_usbmidi_input_stop()
2385 usb_kill_urb(ep->in->urbs[j]); in snd_usbmidi_input_stop()
2387 umidi->input_running = 0; in snd_usbmidi_input_stop()
2400 struct urb *urb = ep->urbs[i]; in snd_usbmidi_input_start_ep()
2401 spin_lock_irqsave(&umidi->disc_lock, flags); in snd_usbmidi_input_start_ep()
2402 if (!atomic_read(&urb->use_count)) { in snd_usbmidi_input_start_ep()
2403 urb->dev = ep->umidi->dev; in snd_usbmidi_input_start_ep()
2406 spin_unlock_irqrestore(&umidi->disc_lock, flags); in snd_usbmidi_input_start_ep()
2419 if (umidi->input_running || !umidi->opened[1]) in snd_usbmidi_input_start()
2422 snd_usbmidi_input_start_ep(umidi, umidi->endpoints[i].in); in snd_usbmidi_input_start()
2423 umidi->input_running = 1; in snd_usbmidi_input_start()
2435 mutex_lock(&umidi->mutex); in snd_usbmidi_suspend()
2437 mutex_unlock(&umidi->mutex); in snd_usbmidi_suspend()
2449 mutex_lock(&umidi->mutex); in snd_usbmidi_resume()
2451 mutex_unlock(&umidi->mutex); in snd_usbmidi_resume()
2471 return -ENOMEM; in __snd_usbmidi_create()
2472 umidi->dev = interface_to_usbdev(iface); in __snd_usbmidi_create()
2473 umidi->card = card; in __snd_usbmidi_create()
2474 umidi->iface = iface; in __snd_usbmidi_create()
2475 umidi->quirk = quirk; in __snd_usbmidi_create()
2476 umidi->usb_protocol_ops = &snd_usbmidi_standard_ops; in __snd_usbmidi_create()
2477 spin_lock_init(&umidi->disc_lock); in __snd_usbmidi_create()
2478 init_rwsem(&umidi->disc_rwsem); in __snd_usbmidi_create()
2479 mutex_init(&umidi->mutex); in __snd_usbmidi_create()
2481 usb_id = USB_ID(le16_to_cpu(umidi->dev->descriptor.idVendor), in __snd_usbmidi_create()
2482 le16_to_cpu(umidi->dev->descriptor.idProduct)); in __snd_usbmidi_create()
2483 umidi->usb_id = usb_id; in __snd_usbmidi_create()
2484 timer_setup(&umidi->error_timer, snd_usbmidi_error_timer, 0); in __snd_usbmidi_create()
2488 switch (quirk ? quirk->type : QUIRK_MIDI_STANDARD_INTERFACE) { in __snd_usbmidi_create()
2491 if (umidi->usb_id == USB_ID(0x0763, 0x0150)) /* M-Audio Uno */ in __snd_usbmidi_create()
2492 umidi->usb_protocol_ops = in __snd_usbmidi_create()
2496 umidi->usb_protocol_ops = &snd_usbmidi_122l_ops; in __snd_usbmidi_create()
2499 memcpy(&endpoints[0], quirk->data, in __snd_usbmidi_create()
2510 umidi->usb_protocol_ops = &snd_usbmidi_midiman_ops; in __snd_usbmidi_create()
2511 memcpy(&endpoints[0], quirk->data, in __snd_usbmidi_create()
2516 umidi->usb_protocol_ops = &snd_usbmidi_novation_ops; in __snd_usbmidi_create()
2520 umidi->usb_protocol_ops = &snd_usbmidi_raw_ops; in __snd_usbmidi_create()
2530 if (umidi->usb_id == USB_ID(0x07fd, 0x0001)) /* MOTU Fastlane */ in __snd_usbmidi_create()
2531 usb_set_interface(umidi->dev, 0, 0); in __snd_usbmidi_create()
2535 umidi->usb_protocol_ops = &snd_usbmidi_emagic_ops; in __snd_usbmidi_create()
2536 memcpy(&endpoints[0], quirk->data, in __snd_usbmidi_create()
2541 umidi->usb_protocol_ops = &snd_usbmidi_cme_ops; in __snd_usbmidi_create()
2545 umidi->usb_protocol_ops = &snd_usbmidi_akai_ops; in __snd_usbmidi_create()
2547 /* endpoint 1 is input-only */ in __snd_usbmidi_create()
2551 umidi->usb_protocol_ops = &snd_usbmidi_ftdi_ops; in __snd_usbmidi_create()
2554 err = usb_control_msg(umidi->dev, usb_sndctrlpipe(umidi->dev, 0), in __snd_usbmidi_create()
2562 umidi->usb_protocol_ops = &snd_usbmidi_ch345_broken_sysex_ops; in __snd_usbmidi_create()
2566 dev_err(&umidi->dev->dev, "invalid quirk type %d\n", in __snd_usbmidi_create()
2567 quirk->type); in __snd_usbmidi_create()
2568 err = -ENXIO; in __snd_usbmidi_create()
2586 if (quirk && quirk->type == QUIRK_MIDI_MIDIMAN) in __snd_usbmidi_create()
2593 usb_autopm_get_interface_no_resume(umidi->iface); in __snd_usbmidi_create()
2595 list_add_tail(&umidi->list, midi_list); in __snd_usbmidi_create()