Lines Matching +full:usb +full:- +full:port +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0+
3 * f_midi.c -- USB MIDI class function driver
12 * Based on drivers/usb/gadget/f_audio.c,
16 * and drivers/usb/gadget/midi.c,
32 #include <linux/usb/ch9.h>
33 #include <linux/usb/gadget.h>
34 #include <linux/usb/audio.h>
35 #include <linux/usb/midi.h>
48 * stored in 4-bit fields. And as the interface currently only holds one
68 * USB -> OUT endpoint -> rawmidi
69 * USB <- IN endpoint <- rawmidi
94 char *id; member
96 /* This fifo is used as a buffer ring for pre-allocated IN usb_requests */
129 /* B.3.2 Class-Specific AC Interface Descriptor */
151 /* B.4.2 Class-Specific MS Interface Descriptor */
175 /* B.5.2 Class-specific MS Bulk OUT Endpoint Descriptor */
199 /* B.6.2 Class-specific MS Bulk IN Endpoint Descriptor */
218 .language = 0x0409, /* en-us */
243 struct f_midi *midi = ep->driver_data; in f_midi_read_data()
244 struct snd_rawmidi_substream *substream = midi->out_substream[cable]; in f_midi_read_data()
247 /* Nobody is listening - throw it on the floor. */ in f_midi_read_data()
250 if (!test_bit(cable, &midi->out_triggered)) in f_midi_read_data()
259 u8 *buf = req->buf; in f_midi_handle_out_data()
261 for (i = 0; i + 3 < req->actual; i += 4) in f_midi_handle_out_data()
272 struct f_midi *midi = ep->driver_data; in f_midi_complete()
273 struct usb_composite_dev *cdev = midi->func.config->cdev; in f_midi_complete()
274 int status = req->status; in f_midi_complete()
278 if (ep == midi->out_ep) { in f_midi_complete()
281 } else if (ep == midi->in_ep) { in f_midi_complete()
284 req->length = 0; in f_midi_complete()
291 case -ECONNABORTED: /* hardware forced ep reset */ in f_midi_complete()
292 case -ECONNRESET: /* request dequeued */ in f_midi_complete()
293 case -ESHUTDOWN: /* disconnect from host */ in f_midi_complete()
294 VDBG(cdev, "%s gone (%d), %d/%d\n", ep->name, status, in f_midi_complete()
295 req->actual, req->length); in f_midi_complete()
296 if (ep == midi->out_ep) { in f_midi_complete()
299 * by the midi->in_req_fifo. */ in f_midi_complete()
304 case -EOVERFLOW: /* buffer overrun on read means that in f_midi_complete()
308 DBG(cdev, "%s complete --> %d, %d/%d\n", ep->name, in f_midi_complete()
309 status, req->actual, req->length); in f_midi_complete()
311 case -EREMOTEIO: /* short read */ in f_midi_complete()
317 ERROR(cdev, "kill %s: resubmit %d bytes --> %d\n", in f_midi_complete()
318 ep->name, req->length, status); in f_midi_complete()
328 for (i = 0; i < midi->in_ports; i++) { in f_midi_drop_out_substreams()
329 struct gmidi_in_port *port = midi->in_ports_array + i; in f_midi_drop_out_substreams() local
330 struct snd_rawmidi_substream *substream = port->substream; in f_midi_drop_out_substreams()
332 if (port->active && substream) in f_midi_drop_out_substreams()
342 struct usb_composite_dev *cdev = f->config->cdev; in f_midi_start_ep()
346 err = config_ep_by_speed(midi->gadget, f, ep); in f_midi_start_ep()
348 ERROR(cdev, "can't configure %s: %d\n", ep->name, err); in f_midi_start_ep()
354 ERROR(cdev, "can't start %s: %d\n", ep->name, err); in f_midi_start_ep()
358 ep->driver_data = midi; in f_midi_start_ep()
370 if (intf != midi->ms_id) in f_midi_set_alt()
373 err = f_midi_start_ep(midi, f, midi->in_ep); in f_midi_set_alt()
377 err = f_midi_start_ep(midi, f, midi->out_ep); in f_midi_set_alt()
381 /* pre-allocate write usb requests to use on f_midi_transmit. */ in f_midi_set_alt()
382 while (kfifo_avail(&midi->in_req_fifo)) { in f_midi_set_alt()
384 midi_alloc_ep_req(midi->in_ep, midi->buflen); in f_midi_set_alt()
387 return -ENOMEM; in f_midi_set_alt()
389 req->length = 0; in f_midi_set_alt()
390 req->complete = f_midi_complete; in f_midi_set_alt()
392 kfifo_put(&midi->in_req_fifo, req); in f_midi_set_alt()
396 for (i = 0; i < midi->qlen && err == 0; i++) { in f_midi_set_alt()
398 midi_alloc_ep_req(midi->out_ep, midi->buflen); in f_midi_set_alt()
401 return -ENOMEM; in f_midi_set_alt()
403 req->complete = f_midi_complete; in f_midi_set_alt()
404 err = usb_ep_queue(midi->out_ep, req, GFP_ATOMIC); in f_midi_set_alt()
407 midi->out_ep->name, err); in f_midi_set_alt()
408 if (req->buf != NULL) in f_midi_set_alt()
409 free_ep_req(midi->out_ep, req); in f_midi_set_alt()
420 struct usb_composite_dev *cdev = f->config->cdev; in f_midi_disable()
429 usb_ep_disable(midi->in_ep); in f_midi_disable()
430 usb_ep_disable(midi->out_ep); in f_midi_disable()
433 while (kfifo_get(&midi->in_req_fifo, &req)) in f_midi_disable()
434 free_ep_req(midi->in_ep, req); in f_midi_disable()
445 * Converts MIDI commands to USB MIDI packets.
448 struct gmidi_in_port *port, uint8_t b) in f_midi_transmit_byte() argument
450 uint8_t p[4] = { port->cable << 4, 0, 0, 0 }; in f_midi_transmit_byte()
455 /* System Real-Time Messages */ in f_midi_transmit_byte()
458 next_state = port->state; in f_midi_transmit_byte()
459 port->state = STATE_REAL_TIME; in f_midi_transmit_byte()
464 switch (port->state) { in f_midi_transmit_byte()
472 p[1] = port->data[0]; in f_midi_transmit_byte()
478 p[1] = port->data[0]; in f_midi_transmit_byte()
479 p[2] = port->data[1]; in f_midi_transmit_byte()
485 next_state = port->state; in f_midi_transmit_byte()
486 port->state = STATE_INITIAL; in f_midi_transmit_byte()
492 port->data[0] = port->data[1] = 0; in f_midi_transmit_byte()
493 port->state = STATE_INITIAL; in f_midi_transmit_byte()
496 port->data[0] = b; in f_midi_transmit_byte()
497 port->data[1] = 0; in f_midi_transmit_byte()
502 port->data[0] = b; in f_midi_transmit_byte()
506 port->data[0] = b; in f_midi_transmit_byte()
526 port->data[0] = b; in f_midi_transmit_byte()
527 port->data[1] = 0; in f_midi_transmit_byte()
528 port->state = STATE_INITIAL; in f_midi_transmit_byte()
537 switch (port->state) { in f_midi_transmit_byte()
539 if (port->data[0] < 0xf0) in f_midi_transmit_byte()
540 p[0] |= port->data[0] >> 4; in f_midi_transmit_byte()
544 p[1] = port->data[0]; in f_midi_transmit_byte()
550 port->data[1] = b; in f_midi_transmit_byte()
554 if (port->data[0] < 0xf0) in f_midi_transmit_byte()
555 p[0] |= port->data[0] >> 4; in f_midi_transmit_byte()
559 p[1] = port->data[0]; in f_midi_transmit_byte()
560 p[2] = port->data[1]; in f_midi_transmit_byte()
566 port->data[0] = b; in f_midi_transmit_byte()
570 port->data[1] = b; in f_midi_transmit_byte()
575 p[1] = port->data[0]; in f_midi_transmit_byte()
576 p[2] = port->data[1]; in f_midi_transmit_byte()
584 /* States where we have to write into the USB request */ in f_midi_transmit_byte()
586 port->state == STATE_SYSEX_2 || in f_midi_transmit_byte()
587 port->state == STATE_1PARAM || in f_midi_transmit_byte()
588 port->state == STATE_2PARAM_2 || in f_midi_transmit_byte()
589 port->state == STATE_REAL_TIME) { in f_midi_transmit_byte()
591 unsigned int length = req->length; in f_midi_transmit_byte()
592 u8 *buf = (u8 *)req->buf + length; in f_midi_transmit_byte()
595 req->length = length + sizeof(p); in f_midi_transmit_byte()
599 port->data[0] = port->data[1] = 0; in f_midi_transmit_byte()
603 port->state = next_state; in f_midi_transmit_byte()
617 len = kfifo_peek(&midi->in_req_fifo, &req); in f_midi_do_transmit()
619 ERROR(midi, "%s: Couldn't get usb request\n", __func__); in f_midi_do_transmit()
620 return -1; in f_midi_do_transmit()
625 * IMPORTANT: This will cause the user-space rawmidi device to block in f_midi_do_transmit()
626 * until a) usb requests have been completed or b) snd_rawmidi_write() in f_midi_do_transmit()
629 if (req->length > 0) in f_midi_do_transmit()
632 for (i = midi->in_last_port; i < midi->in_ports; ++i) { in f_midi_do_transmit()
633 struct gmidi_in_port *port = midi->in_ports_array + i; in f_midi_do_transmit() local
634 struct snd_rawmidi_substream *substream = port->substream; in f_midi_do_transmit()
636 if (!port->active || !substream) in f_midi_do_transmit()
639 while (req->length + 3 < midi->buflen) { in f_midi_do_transmit()
643 port->active = 0; in f_midi_do_transmit()
646 f_midi_transmit_byte(req, port, b); in f_midi_do_transmit()
649 active = !!port->active; in f_midi_do_transmit()
653 midi->in_last_port = active ? i : 0; in f_midi_do_transmit()
655 if (req->length <= 0) in f_midi_do_transmit()
661 midi->in_ep->name, err); in f_midi_do_transmit()
662 req->length = 0; /* Re-use request next time. */ in f_midi_do_transmit()
665 kfifo_skip(&midi->in_req_fifo); in f_midi_do_transmit()
666 kfifo_put(&midi->in_req_fifo, req); in f_midi_do_transmit()
675 struct usb_ep *ep = midi->in_ep; in f_midi_transmit()
679 /* We only care about USB requests if IN endpoint is enabled */ in f_midi_transmit()
680 if (!ep || !ep->enabled) in f_midi_transmit()
683 spin_lock_irqsave(&midi->transmit_lock, flags); in f_midi_transmit()
688 spin_unlock_irqrestore(&midi->transmit_lock, flags); in f_midi_transmit()
693 spin_unlock_irqrestore(&midi->transmit_lock, flags); in f_midi_transmit()
709 struct f_midi *midi = substream->rmidi->private_data; in f_midi_in_open()
710 struct gmidi_in_port *port; in f_midi_in_open() local
712 if (substream->number >= midi->in_ports) in f_midi_in_open()
713 return -EINVAL; in f_midi_in_open()
716 port = midi->in_ports_array + substream->number; in f_midi_in_open()
717 port->substream = substream; in f_midi_in_open()
718 port->state = STATE_INITIAL; in f_midi_in_open()
724 struct f_midi *midi = substream->rmidi->private_data; in f_midi_in_close()
732 struct f_midi *midi = substream->rmidi->private_data; in f_midi_in_trigger()
734 if (substream->number >= midi->in_ports) in f_midi_in_trigger()
738 midi->in_ports_array[substream->number].active = up; in f_midi_in_trigger()
740 tasklet_hi_schedule(&midi->tasklet); in f_midi_in_trigger()
745 struct f_midi *midi = substream->rmidi->private_data; in f_midi_out_open()
747 if (substream->number >= MAX_PORTS) in f_midi_out_open()
748 return -EINVAL; in f_midi_out_open()
751 midi->out_substream[substream->number] = substream; in f_midi_out_open()
757 struct f_midi *midi = substream->rmidi->private_data; in f_midi_out_close()
765 struct f_midi *midi = substream->rmidi->private_data; in f_midi_out_trigger()
770 set_bit(substream->number, &midi->out_triggered); in f_midi_out_trigger()
772 clear_bit(substream->number, &midi->out_triggered); in f_midi_out_trigger()
789 if (midi->card) { in f_midi_unregister_card()
790 snd_card_free(midi->card); in f_midi_unregister_card()
791 midi->card = NULL; in f_midi_unregister_card()
805 err = snd_card_new(&midi->gadget->dev, midi->index, midi->id, in f_midi_register_card()
811 midi->card = card; in f_midi_register_card()
819 strcpy(card->driver, f_midi_longname); in f_midi_register_card()
820 strcpy(card->longname, f_midi_longname); in f_midi_register_card()
821 strcpy(card->shortname, f_midi_shortname); in f_midi_register_card()
825 err = snd_rawmidi_new(card, card->longname, 0, in f_midi_register_card()
826 midi->out_ports, midi->in_ports, &rmidi); in f_midi_register_card()
831 midi->rmidi = rmidi; in f_midi_register_card()
832 midi->in_last_port = 0; in f_midi_register_card()
833 strcpy(rmidi->name, card->shortname); in f_midi_register_card()
834 rmidi->info_flags = SNDRV_RAWMIDI_INFO_OUTPUT | in f_midi_register_card()
837 rmidi->private_data = midi; in f_midi_register_card()
838 rmidi->private_free = f_midi_rmidi_free; in f_midi_register_card()
839 midi->free_ref++; in f_midi_register_card()
842 * Yes, rawmidi OUTPUT = USB IN, and rawmidi INPUT = USB OUT. in f_midi_register_card()
843 * It's an upside-down world being a gadget. in f_midi_register_card()
848 /* register it - we're ready to go */ in f_midi_register_card()
872 struct usb_composite_dev *cdev = c->cdev; in f_midi_bind()
877 midi->gadget = cdev->gadget; in f_midi_bind()
878 tasklet_setup(&midi->tasklet, f_midi_in_tasklet); in f_midi_bind()
883 /* maybe allocate device-global string ID */ in f_midi_bind()
884 us = usb_gstrings_attach(c->cdev, midi_strings, in f_midi_bind()
890 ac_interface_desc.iInterface = us[STRING_FUNC_IDX].id; in f_midi_bind()
903 midi->ms_id = status; in f_midi_bind()
905 status = -ENODEV; in f_midi_bind()
907 /* allocate instance-specific endpoints */ in f_midi_bind()
908 midi->in_ep = usb_ep_autoconfig(cdev->gadget, &bulk_in_desc); in f_midi_bind()
909 if (!midi->in_ep) in f_midi_bind()
912 midi->out_ep = usb_ep_autoconfig(cdev->gadget, &bulk_out_desc); in f_midi_bind()
913 if (!midi->out_ep) in f_midi_bind()
920 status = -ENOMEM; in f_midi_bind()
930 /* add the headers - these are always the same */ in f_midi_bind()
937 + (midi->in_ports + midi->out_ports) * in f_midi_bind()
944 for (n = 0; n < midi->in_ports; n++) { in f_midi_bind()
948 in_ext->bLength = USB_DT_MIDI_IN_SIZE; in f_midi_bind()
949 in_ext->bDescriptorType = USB_DT_CS_INTERFACE; in f_midi_bind()
950 in_ext->bDescriptorSubtype = USB_MS_MIDI_IN_JACK; in f_midi_bind()
951 in_ext->bJackType = USB_MS_EXTERNAL; in f_midi_bind()
952 in_ext->bJackID = jack++; in f_midi_bind()
953 in_ext->iJack = 0; in f_midi_bind()
956 out_emb->bLength = USB_DT_MIDI_OUT_SIZE(1); in f_midi_bind()
957 out_emb->bDescriptorType = USB_DT_CS_INTERFACE; in f_midi_bind()
958 out_emb->bDescriptorSubtype = USB_MS_MIDI_OUT_JACK; in f_midi_bind()
959 out_emb->bJackType = USB_MS_EMBEDDED; in f_midi_bind()
960 out_emb->bJackID = jack++; in f_midi_bind()
961 out_emb->bNrInputPins = 1; in f_midi_bind()
962 out_emb->pins[0].baSourcePin = 1; in f_midi_bind()
963 out_emb->pins[0].baSourceID = in_ext->bJackID; in f_midi_bind()
964 out_emb->iJack = 0; in f_midi_bind()
968 ms_in_desc.baAssocJackID[n] = out_emb->bJackID; in f_midi_bind()
972 for (n = 0; n < midi->out_ports; n++) { in f_midi_bind()
976 in_emb->bLength = USB_DT_MIDI_IN_SIZE; in f_midi_bind()
977 in_emb->bDescriptorType = USB_DT_CS_INTERFACE; in f_midi_bind()
978 in_emb->bDescriptorSubtype = USB_MS_MIDI_IN_JACK; in f_midi_bind()
979 in_emb->bJackType = USB_MS_EMBEDDED; in f_midi_bind()
980 in_emb->bJackID = jack++; in f_midi_bind()
981 in_emb->iJack = 0; in f_midi_bind()
984 out_ext->bLength = USB_DT_MIDI_OUT_SIZE(1); in f_midi_bind()
985 out_ext->bDescriptorType = USB_DT_CS_INTERFACE; in f_midi_bind()
986 out_ext->bDescriptorSubtype = USB_MS_MIDI_OUT_JACK; in f_midi_bind()
987 out_ext->bJackType = USB_MS_EXTERNAL; in f_midi_bind()
988 out_ext->bJackID = jack++; in f_midi_bind()
989 out_ext->bNrInputPins = 1; in f_midi_bind()
990 out_ext->iJack = 0; in f_midi_bind()
991 out_ext->pins[0].baSourceID = in_emb->bJackID; in f_midi_bind()
992 out_ext->pins[0].baSourcePin = 1; in f_midi_bind()
996 ms_out_desc.baAssocJackID[n] = in_emb->bJackID; in f_midi_bind()
1000 ms_out_desc.bLength = USB_DT_MS_ENDPOINT_SIZE(midi->in_ports); in f_midi_bind()
1001 ms_out_desc.bNumEmbMIDIJack = midi->in_ports; in f_midi_bind()
1003 ms_in_desc.bLength = USB_DT_MS_ENDPOINT_SIZE(midi->out_ports); in f_midi_bind()
1004 ms_in_desc.bNumEmbMIDIJack = midi->out_ports; in f_midi_bind()
1016 * hardware is dual speed, all bulk-capable endpoints work at in f_midi_bind()
1020 f->fs_descriptors = usb_copy_descriptors(midi_function); in f_midi_bind()
1021 if (!f->fs_descriptors) in f_midi_bind()
1024 if (gadget_is_dualspeed(c->cdev->gadget)) { in f_midi_bind()
1027 f->hs_descriptors = usb_copy_descriptors(midi_function); in f_midi_bind()
1028 if (!f->hs_descriptors) in f_midi_bind()
1032 if (gadget_is_superspeed(c->cdev->gadget)) { in f_midi_bind()
1048 f->ss_descriptors = usb_copy_descriptors(midi_function); in f_midi_bind()
1049 if (!f->ss_descriptors) in f_midi_bind()
1063 ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); in f_midi_bind()
1078 usb_put_function_instance(&opts->func_inst); in midi_attr_release()
1091 mutex_lock(&opts->lock); \
1092 result = sprintf(page, "%d\n", opts->name); \
1093 mutex_unlock(&opts->lock); \
1105 mutex_lock(&opts->lock); \
1106 if (opts->refcnt > 1) { \
1107 ret = -EBUSY; \
1116 ret = -EINVAL; \
1119 opts->name = num; \
1123 mutex_unlock(&opts->lock); \
1140 mutex_lock(&opts->lock); in f_midi_opts_id_show()
1141 if (opts->id) { in f_midi_opts_id_show()
1142 result = strlcpy(page, opts->id, PAGE_SIZE); in f_midi_opts_id_show()
1148 mutex_unlock(&opts->lock); in f_midi_opts_id_show()
1160 mutex_lock(&opts->lock); in f_midi_opts_id_store()
1161 if (opts->refcnt > 1) { in f_midi_opts_id_store()
1162 ret = -EBUSY; in f_midi_opts_id_store()
1168 ret = -ENOMEM; in f_midi_opts_id_store()
1171 if (opts->id_allocated) in f_midi_opts_id_store()
1172 kfree(opts->id); in f_midi_opts_id_store()
1173 opts->id = c; in f_midi_opts_id_store()
1174 opts->id_allocated = true; in f_midi_opts_id_store()
1177 mutex_unlock(&opts->lock); in f_midi_opts_id_store()
1181 CONFIGFS_ATTR(f_midi_opts_, id);
1206 mutex_lock(&opts->lock); in f_midi_free_inst()
1207 if (!--opts->refcnt) { in f_midi_free_inst()
1210 mutex_unlock(&opts->lock); in f_midi_free_inst()
1213 if (opts->id_allocated) in f_midi_free_inst()
1214 kfree(opts->id); in f_midi_free_inst()
1225 return ERR_PTR(-ENOMEM); in f_midi_alloc_inst()
1227 mutex_init(&opts->lock); in f_midi_alloc_inst()
1228 opts->func_inst.free_func_inst = f_midi_free_inst; in f_midi_alloc_inst()
1229 opts->index = SNDRV_DEFAULT_IDX1; in f_midi_alloc_inst()
1230 opts->id = SNDRV_DEFAULT_STR1; in f_midi_alloc_inst()
1231 opts->buflen = 512; in f_midi_alloc_inst()
1232 opts->qlen = 32; in f_midi_alloc_inst()
1233 opts->in_ports = 1; in f_midi_alloc_inst()
1234 opts->out_ports = 1; in f_midi_alloc_inst()
1235 opts->refcnt = 1; in f_midi_alloc_inst()
1237 config_group_init_type_name(&opts->func_inst.group, "", in f_midi_alloc_inst()
1240 return &opts->func_inst; in f_midi_alloc_inst()
1250 opts = container_of(f->fi, struct f_midi_opts, func_inst); in f_midi_free()
1251 mutex_lock(&opts->lock); in f_midi_free()
1252 if (!--midi->free_ref) { in f_midi_free()
1253 kfree(midi->id); in f_midi_free()
1254 kfifo_free(&midi->in_req_fifo); in f_midi_free()
1258 mutex_unlock(&opts->lock); in f_midi_free()
1261 f_midi_free_inst(&opts->func_inst); in f_midi_free()
1266 f_midi_free(rmidi->private_data); in f_midi_rmidi_free()
1271 struct usb_composite_dev *cdev = f->config->cdev; in f_midi_unbind()
1280 card = midi->card; in f_midi_unbind()
1281 midi->card = NULL; in f_midi_unbind()
1296 mutex_lock(&opts->lock); in f_midi_alloc()
1298 if (opts->in_ports > MAX_PORTS || opts->out_ports > MAX_PORTS) { in f_midi_alloc()
1299 status = -EINVAL; in f_midi_alloc()
1304 midi = kzalloc(struct_size(midi, in_ports_array, opts->in_ports), in f_midi_alloc()
1307 status = -ENOMEM; in f_midi_alloc()
1311 for (i = 0; i < opts->in_ports; i++) in f_midi_alloc()
1312 midi->in_ports_array[i].cable = i; in f_midi_alloc()
1315 midi->id = kstrdup(opts->id, GFP_KERNEL); in f_midi_alloc()
1316 if (opts->id && !midi->id) { in f_midi_alloc()
1317 status = -ENOMEM; in f_midi_alloc()
1320 midi->in_ports = opts->in_ports; in f_midi_alloc()
1321 midi->out_ports = opts->out_ports; in f_midi_alloc()
1322 midi->index = opts->index; in f_midi_alloc()
1323 midi->buflen = opts->buflen; in f_midi_alloc()
1324 midi->qlen = opts->qlen; in f_midi_alloc()
1325 midi->in_last_port = 0; in f_midi_alloc()
1326 midi->free_ref = 1; in f_midi_alloc()
1328 status = kfifo_alloc(&midi->in_req_fifo, midi->qlen, GFP_KERNEL); in f_midi_alloc()
1332 spin_lock_init(&midi->transmit_lock); in f_midi_alloc()
1334 ++opts->refcnt; in f_midi_alloc()
1335 mutex_unlock(&opts->lock); in f_midi_alloc()
1337 midi->func.name = "gmidi function"; in f_midi_alloc()
1338 midi->func.bind = f_midi_bind; in f_midi_alloc()
1339 midi->func.unbind = f_midi_unbind; in f_midi_alloc()
1340 midi->func.set_alt = f_midi_set_alt; in f_midi_alloc()
1341 midi->func.disable = f_midi_disable; in f_midi_alloc()
1342 midi->func.free_func = f_midi_free; in f_midi_alloc()
1344 return &midi->func; in f_midi_alloc()
1348 kfree(midi->id); in f_midi_alloc()
1351 mutex_unlock(&opts->lock); in f_midi_alloc()