Lines Matching defs:umidi
8 * NetBSD's umidi driver by Takuya SHIOZAKI,
121 struct snd_usb_midi *umidi;
154 struct snd_usb_midi *umidi;
216 dev_dbg(&ep->umidi->dev->dev, "unexpected port %d!\n", portidx);
219 if (!test_bit(port->substream->number, &ep->umidi->input_triggered))
245 ep->umidi->usb_protocol_ops->input(ep, urb->transfer_buffer,
252 mod_timer(&ep->umidi->error_timer,
259 urb->dev = ep->umidi->dev;
281 mod_timer(&ep->umidi->error_timer,
299 if (ep->umidi->disconnected)
307 ep->umidi->usb_protocol_ops->output(ep, urb);
313 urb->dev = ep->umidi->dev;
337 struct snd_usb_midi *umidi = timer_container_of(umidi, t, error_timer);
340 guard(spinlock)(&umidi->disc_lock);
341 if (umidi->disconnected) {
345 struct snd_usb_midi_in_endpoint *in = umidi->endpoints[i].in;
351 in->urbs[j]->dev = umidi->dev;
355 if (umidi->endpoints[i].out)
356 snd_usbmidi_do_output(umidi->endpoints[i].out);
370 err = usb_bulk_msg(ep->umidi->dev, ep->urbs[0].urb->pipe,
607 port->ep->umidi->usb_protocol_ops->output_packet;
957 switch (snd_usb_get_speed(ep->umidi->dev)) {
1119 static void update_roland_altsetting(struct snd_usb_midi *umidi)
1126 intf = umidi->iface;
1128 if (umidi->roland_load_ctl->private_value == is_light_load)
1130 hostif = &intf->altsetting[umidi->roland_load_ctl->private_value];
1132 snd_usbmidi_input_stop(&umidi->list);
1133 usb_set_interface(umidi->dev, intfd->bInterfaceNumber,
1135 snd_usbmidi_input_start(&umidi->list);
1141 struct snd_usb_midi *umidi = substream->rmidi->private_data;
1144 guard(rwsem_read)(&umidi->disc_rwsem);
1145 if (umidi->disconnected)
1148 guard(mutex)(&umidi->mutex);
1150 if (!umidi->opened[0] && !umidi->opened[1]) {
1151 if (umidi->roland_load_ctl) {
1152 ctl = umidi->roland_load_ctl;
1155 snd_ctl_notify(umidi->card,
1157 update_roland_altsetting(umidi);
1160 umidi->opened[dir]++;
1161 if (umidi->opened[1])
1162 snd_usbmidi_input_start(&umidi->list);
1164 umidi->opened[dir]--;
1165 if (!umidi->opened[1])
1166 snd_usbmidi_input_stop(&umidi->list);
1167 if (!umidi->opened[0] && !umidi->opened[1]) {
1168 if (umidi->roland_load_ctl) {
1169 ctl = umidi->roland_load_ctl;
1172 snd_ctl_notify(umidi->card,
1182 struct snd_usb_midi *umidi = substream->rmidi->private_data;
1187 if (umidi->endpoints[i].out)
1189 if (umidi->endpoints[i].out->ports[j].substream == substream) {
1190 port = &umidi->endpoints[i].out->ports[j];
1217 if (port->ep->umidi->disconnected) {
1235 if (ep->umidi->disconnected)
1272 struct snd_usb_midi *umidi = substream->rmidi->private_data;
1275 set_bit(substream->number, &umidi->input_triggered);
1277 clear_bit(substream->number, &umidi->input_triggered);
1293 static void free_urb_and_buffer(struct snd_usb_midi *umidi, struct urb *urb,
1296 usb_free_coherent(umidi->dev, buffer_length,
1311 free_urb_and_buffer(ep->umidi, ep->urbs[i],
1319 static int snd_usbmidi_in_endpoint_create(struct snd_usb_midi *umidi,
1334 ep->umidi = umidi;
1344 pipe = usb_rcvintpipe(umidi->dev, ep_info->in_ep);
1346 pipe = usb_rcvbulkpipe(umidi->dev, ep_info->in_ep);
1347 length = usb_maxpacket(umidi->dev, pipe);
1349 buffer = usb_alloc_coherent(umidi->dev, length, GFP_KERNEL,
1356 usb_fill_int_urb(ep->urbs[i], umidi->dev,
1361 usb_fill_bulk_urb(ep->urbs[i], umidi->dev,
1367 dev_err(&umidi->dev->dev, "invalid MIDI in EP %x\n",
1391 free_urb_and_buffer(ep->umidi, ep->urbs[i].urb,
1406 static int snd_usbmidi_out_endpoint_create(struct snd_usb_midi *umidi,
1420 ep->umidi = umidi;
1431 pipe = usb_sndintpipe(umidi->dev, ep_info->out_ep);
1433 pipe = usb_sndbulkpipe(umidi->dev, ep_info->out_ep);
1434 switch (umidi->usb_id) {
1436 ep->max_transfer = usb_maxpacket(umidi->dev, pipe);
1460 buffer = usb_alloc_coherent(umidi->dev,
1468 usb_fill_int_urb(ep->urbs[i].urb, umidi->dev,
1473 usb_fill_bulk_urb(ep->urbs[i].urb, umidi->dev,
1479 dev_err(&umidi->dev->dev, "invalid MIDI out EP %x\n",
1496 if (umidi->usb_protocol_ops->init_out_endpoint)
1497 umidi->usb_protocol_ops->init_out_endpoint(ep);
1510 static void snd_usbmidi_free(struct snd_usb_midi *umidi)
1514 if (!umidi->disconnected)
1515 snd_usbmidi_disconnect(&umidi->list);
1518 struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i];
1521 mutex_destroy(&umidi->mutex);
1522 kfree(umidi);
1530 struct snd_usb_midi *umidi;
1533 umidi = list_entry(p, struct snd_usb_midi, list);
1539 scoped_guard(rwsem_write, &umidi->disc_rwsem) {
1540 guard(spinlock_irq)(&umidi->disc_lock);
1541 umidi->disconnected = 1;
1544 timer_shutdown_sync(&umidi->error_timer);
1547 struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i];
1553 if (umidi->usb_protocol_ops->finish_out_endpoint)
1554 umidi->usb_protocol_ops->finish_out_endpoint(ep->out);
1577 struct snd_usb_midi *umidi = rmidi->private_data;
1578 snd_usbmidi_free(umidi);
1581 static struct snd_rawmidi_substream *snd_usbmidi_find_substream(struct snd_usb_midi *umidi,
1587 list_for_each_entry(substream, &umidi->rmidi->streams[stream].substreams,
1775 static struct port_info *find_port_info(struct snd_usb_midi *umidi, int number)
1780 if (snd_usbmidi_port_info[i].id == umidi->usb_id &&
1790 struct snd_usb_midi *umidi = rmidi->private_data;
1794 port_info = find_port_info(umidi, number);
1841 static void snd_usbmidi_init_substream(struct snd_usb_midi *umidi,
1856 snd_usbmidi_find_substream(umidi, stream, number);
1858 dev_err(&umidi->dev->dev, "substream %d:%d not found\n", stream,
1863 intf = umidi->iface;
1868 res = usb_string(umidi->dev, iJack, jack_name_buf,
1875 port_info = find_port_info(umidi, number);
1877 strncmp(umidi->card->shortname, jack_name, strlen(umidi->card->shortname)) != 0) {
1881 name_format, umidi->card->shortname, jack_name, number + 1);
1895 static int snd_usbmidi_create_endpoints(struct snd_usb_midi *umidi,
1903 err = snd_usbmidi_out_endpoint_create(umidi,
1905 &umidi->endpoints[i]);
1910 err = snd_usbmidi_in_endpoint_create(umidi,
1912 &umidi->endpoints[i]);
1919 snd_usbmidi_init_substream(umidi,
1923 &umidi->endpoints[i].out->ports[j].substream);
1927 snd_usbmidi_init_substream(umidi,
1931 &umidi->endpoints[i].in->ports[j].substream);
1936 dev_dbg(&umidi->dev->dev, "created %d output and %d input ports\n",
1966 static int snd_usbmidi_get_ms_info(struct snd_usb_midi *umidi,
1978 intf = umidi->iface;
1988 dev_dbg(&umidi->dev->dev, "MIDIStreaming version %02x.%02x\n",
1991 dev_warn(&umidi->dev->dev,
2012 dev_warn(&umidi->dev->dev,
2020 else if (snd_usb_get_speed(umidi->dev) == USB_SPEED_LOW)
2033 dev_dbg(&umidi->dev->dev, "EP %02X: %d jack(s)\n",
2038 dev_warn(&umidi->dev->dev,
2046 else if (snd_usb_get_speed(umidi->dev) == USB_SPEED_LOW)
2054 dev_dbg(&umidi->dev->dev, "EP %02X: %d jack(s)\n",
2079 struct snd_usb_midi *umidi = snd_kcontrol_chip(kcontrol);
2084 guard(mutex)(&umidi->mutex);
2104 static void snd_usbmidi_switch_roland_altsetting(struct snd_usb_midi *umidi)
2110 intf = umidi->iface;
2126 dev_dbg(&umidi->dev->dev, "switching to altsetting %d with int ep\n",
2128 usb_set_interface(umidi->dev, intfd->bInterfaceNumber,
2131 umidi->roland_load_ctl = snd_ctl_new1(&roland_load_ctl, umidi);
2132 if (snd_ctl_add(umidi->card, umidi->roland_load_ctl) < 0)
2133 umidi->roland_load_ctl = NULL;
2139 static int snd_usbmidi_detect_endpoints(struct snd_usb_midi *umidi,
2149 if (USB_ID_VENDOR(umidi->usb_id) == 0x0582)
2150 snd_usbmidi_switch_roland_altsetting(umidi);
2155 intf = umidi->iface;
2187 static int snd_usbmidi_detect_per_port_endpoints(struct snd_usb_midi *umidi,
2192 err = snd_usbmidi_detect_endpoints(umidi, endpoints, MIDI_MAX_ENDPOINTS);
2205 static int snd_usbmidi_detect_yamaha(struct snd_usb_midi *umidi,
2213 intf = umidi->iface;
2240 return snd_usbmidi_detect_endpoints(umidi, endpoint, 1);
2246 static int snd_usbmidi_detect_roland(struct snd_usb_midi *umidi,
2253 intf = umidi->iface;
2272 return snd_usbmidi_detect_endpoints(umidi, endpoint, 1);
2276 return snd_usbmidi_get_ms_info(umidi, endpoint);
2286 static int snd_usbmidi_create_endpoints_midiman(struct snd_usb_midi *umidi,
2296 intf = umidi->iface;
2312 dev_dbg(&umidi->dev->dev, "not enough endpoints\n");
2318 dev_dbg(&umidi->dev->dev, "endpoint[0] isn't interrupt\n");
2323 dev_dbg(&umidi->dev->dev, "endpoint[2] isn't bulk output\n");
2330 dev_dbg(&umidi->dev->dev,
2340 err = snd_usbmidi_out_endpoint_create(umidi, &ep_info,
2341 &umidi->endpoints[0]);
2349 err = snd_usbmidi_in_endpoint_create(umidi, &ep_info,
2350 &umidi->endpoints[0]);
2358 err = snd_usbmidi_out_endpoint_create(umidi, &ep_info,
2359 &umidi->endpoints[1]);
2366 snd_usbmidi_init_substream(umidi,
2370 &umidi->endpoints[cable & 1].out->ports[cable].substream);
2372 snd_usbmidi_init_substream(umidi,
2376 &umidi->endpoints[0].in->ports[cable].substream);
2385 static int snd_usbmidi_create_rawmidi(struct snd_usb_midi *umidi,
2391 err = snd_rawmidi_new(umidi->card, "USB MIDI",
2392 umidi->next_midi_device++,
2396 strscpy(rmidi->name, umidi->card->shortname);
2401 rmidi->private_data = umidi;
2408 umidi->rmidi = rmidi;
2417 struct snd_usb_midi *umidi;
2420 umidi = list_entry(p, struct snd_usb_midi, list);
2421 if (!umidi->input_running)
2424 struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i];
2429 umidi->input_running = 0;
2433 static void snd_usbmidi_input_start_ep(struct snd_usb_midi *umidi,
2442 scoped_guard(spinlock_irqsave, &umidi->disc_lock) {
2444 urb->dev = ep->umidi->dev;
2456 struct snd_usb_midi *umidi;
2459 umidi = list_entry(p, struct snd_usb_midi, list);
2460 if (umidi->input_running || !umidi->opened[1])
2463 snd_usbmidi_input_start_ep(umidi, umidi->endpoints[i].in);
2464 umidi->input_running = 1;
2473 struct snd_usb_midi *umidi;
2475 umidi = list_entry(p, struct snd_usb_midi, list);
2476 guard(mutex)(&umidi->mutex);
2486 struct snd_usb_midi *umidi;
2488 umidi = list_entry(p, struct snd_usb_midi, list);
2489 guard(mutex)(&umidi->mutex);
2504 struct snd_usb_midi *umidi;
2509 umidi = kzalloc(sizeof(*umidi), GFP_KERNEL);
2510 if (!umidi)
2512 umidi->dev = interface_to_usbdev(iface);
2513 umidi->card = card;
2514 umidi->iface = iface;
2515 umidi->quirk = quirk;
2516 umidi->usb_protocol_ops = &snd_usbmidi_standard_ops;
2518 umidi->next_midi_device = *num_rawmidis;
2519 spin_lock_init(&umidi->disc_lock);
2520 init_rwsem(&umidi->disc_rwsem);
2521 mutex_init(&umidi->mutex);
2523 usb_id = USB_ID(le16_to_cpu(umidi->dev->descriptor.idVendor),
2524 le16_to_cpu(umidi->dev->descriptor.idProduct));
2525 umidi->usb_id = usb_id;
2526 timer_setup(&umidi->error_timer, snd_usbmidi_error_timer, 0);
2532 err = snd_usbmidi_get_ms_info(umidi, endpoints);
2533 if (umidi->usb_id == USB_ID(0x0763, 0x0150)) /* M-Audio Uno */
2534 umidi->usb_protocol_ops =
2538 umidi->usb_protocol_ops = &snd_usbmidi_122l_ops;
2543 err = snd_usbmidi_detect_endpoints(umidi, &endpoints[0], 1);
2546 err = snd_usbmidi_detect_yamaha(umidi, &endpoints[0]);
2549 err = snd_usbmidi_detect_roland(umidi, &endpoints[0]);
2552 umidi->usb_protocol_ops = &snd_usbmidi_midiman_ops;
2558 umidi->usb_protocol_ops = &snd_usbmidi_novation_ops;
2559 err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
2562 umidi->usb_protocol_ops = &snd_usbmidi_raw_ops;
2572 if (umidi->usb_id == USB_ID(0x07fd, 0x0001)) /* MOTU Fastlane */
2573 usb_set_interface(umidi->dev, 0, 0);
2574 err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
2577 umidi->usb_protocol_ops = &snd_usbmidi_emagic_ops;
2580 err = snd_usbmidi_detect_endpoints(umidi, &endpoints[0], 1);
2583 umidi->usb_protocol_ops = &snd_usbmidi_cme_ops;
2584 err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
2587 umidi->usb_protocol_ops = &snd_usbmidi_akai_ops;
2588 err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
2593 umidi->usb_protocol_ops = &snd_usbmidi_ftdi_ops;
2596 err = usb_control_msg(umidi->dev, usb_sndctrlpipe(umidi->dev, 0),
2601 err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
2604 umidi->usb_protocol_ops = &snd_usbmidi_ch345_broken_sysex_ops;
2605 err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
2608 dev_err(&umidi->dev->dev, "invalid quirk type %d\n",
2623 err = snd_usbmidi_create_rawmidi(umidi, out_ports, in_ports);
2629 err = snd_usbmidi_create_endpoints_midiman(umidi, &endpoints[0]);
2631 err = snd_usbmidi_create_endpoints(umidi, endpoints);
2635 usb_autopm_get_interface_no_resume(umidi->iface);
2637 list_add_tail(&umidi->list, midi_list);
2639 *num_rawmidis = umidi->next_midi_device;
2643 kfree(umidi);