Lines Matching +full:blk +full:- +full:ctrl

1 // SPDX-License-Identifier: GPL-2.0+
3 * f_midi2.c -- USB MIDI 2.0 class function driver
21 #include <linux/usb/midi-v2.h>
32 unsigned int index; /* array index: 0-31 */
85 struct f_midi2_usb_ep ep_in; /* USB MIDI EP-in */
86 struct f_midi2_usb_ep ep_out; /* USB MIDI EP-out */
88 u8 in_group_to_cable[SNDRV_UMP_MAX_GROUPS]; /* map to cable; 1-based! */
97 /* 1-based GTB id to string id */
98 #define gtb_to_str_id(id) (STR_GTB1 + (id) - 1)
128 /* conversion for MIDI 1.0 EP-in */
130 /* conversion for MIDI 1.0 EP-out */
159 return ep->info.ep_name ? ep->info.ep_name : "MIDI 2.0 Gadget"; in ump_ep_name()
165 return ep->info.product_id ? ep->info.product_id : "Unique Product ID"; in ump_product_id()
171 return info->name ? info->name : "MIDI 2.0 Gadget I/O"; in ump_fb_name()
389 spin_lock_irqsave(&usb_ep->card->queue_lock, flags); in get_empty_request()
390 if (!usb_ep->free_reqs) in get_empty_request()
392 index = find_first_bit(&usb_ep->free_reqs, usb_ep->num_reqs); in get_empty_request()
393 if (index >= usb_ep->num_reqs) in get_empty_request()
395 req = usb_ep->reqs[index].req; in get_empty_request()
398 clear_bit(index, &usb_ep->free_reqs); in get_empty_request()
399 req->length = 0; in get_empty_request()
401 spin_unlock_irqrestore(&usb_ep->card->queue_lock, flags); in get_empty_request()
408 struct f_midi2_req_ctx *ctx = req->context; in put_empty_request()
411 spin_lock_irqsave(&ctx->usb_ep->card->queue_lock, flags); in put_empty_request()
412 set_bit(ctx->index, &ctx->usb_ep->free_reqs); in put_empty_request()
413 spin_unlock_irqrestore(&ctx->usb_ep->card->queue_lock, flags); in put_empty_request()
423 struct f_midi2_req_ctx *ctx = req->context; in queue_request_ep_raw()
426 req->complete = ctx->usb_ep->complete; in queue_request_ep_raw()
427 err = usb_ep_queue(ctx->usb_ep->usb_ep, req, GFP_ATOMIC); in queue_request_ep_raw()
438 /* UMP packets have to be converted to little-endian */ in queue_request_ep_in()
439 cpu_to_le32_array((u32 *)req->buf, req->length >> 2); in queue_request_ep_in()
443 /* reply a UMP packet via EP-in */
446 struct f_midi2_usb_ep *usb_ep = &ep->ep_in; in reply_ep_in()
451 return -ENOSPC; in reply_ep_in()
453 req->length = len; in reply_ep_in()
454 memcpy(req->buf, buf, len); in reply_ep_in()
466 .num_function_blocks = ep->num_blks, in reply_ump_stream_ep_info()
467 .static_function_block = !!ep->card->info.static_block, in reply_ump_stream_ep_info()
481 .manufacture_id = ep->info.manufacturer, in reply_ump_stream_ep_device()
482 .family_lsb = ep->info.family & 0xff, in reply_ump_stream_ep_device()
483 .family_msb = (ep->info.family >> 8) & 0xff, in reply_ump_stream_ep_device()
484 .model_lsb = ep->info.model & 0xff, in reply_ump_stream_ep_device()
485 .model_msb = (ep->info.model >> 8) & 0xff, in reply_ump_stream_ep_device()
486 .sw_revision = ep->info.sw_revision, in reply_ump_stream_ep_device()
501 struct f_midi2_usb_ep *usb_ep = &ep->ep_in; in reply_ump_stream_string()
502 struct f_midi2 *midi2 = ep->card; in reply_ump_stream_string()
513 buf = (u32 *)req->buf; in reply_ump_stream_string()
520 buf[pos / 4] |= *name++ << ((3 - (pos % 4)) * 8); in reply_ump_stream_string()
522 if (req->length) in reply_ump_stream_string()
524 req->length += UMP_STREAM_PKT_BYTES; in reply_ump_stream_string()
528 if (!req->length) in reply_ump_stream_string()
532 req->length += UMP_STREAM_PKT_BYTES; in reply_ump_stream_string()
533 if (midi2->info.req_buf_size - req->length < UMP_STREAM_PKT_BYTES) in reply_ump_stream_string()
540 if (req->length) in reply_ump_stream_string()
570 if (ep->info.protocol == 2) in reply_ump_stream_ep_config()
579 static void reply_ump_stream_fb_info(struct f_midi2_ep *ep, int blk) in reply_ump_stream_fb_info() argument
581 struct f_midi2_block_info *b = &ep->blks[blk].info; in reply_ump_stream_fb_info()
585 .active = !!b->active, in reply_ump_stream_fb_info()
586 .function_block_id = blk, in reply_ump_stream_fb_info()
587 .ui_hint = b->ui_hint, in reply_ump_stream_fb_info()
588 .midi_10 = b->is_midi1, in reply_ump_stream_fb_info()
589 .direction = b->direction, in reply_ump_stream_fb_info()
590 .first_group = b->first_group, in reply_ump_stream_fb_info()
591 .num_groups = b->num_groups, in reply_ump_stream_fb_info()
592 .midi_ci_version = b->midi_ci_version, in reply_ump_stream_fb_info()
593 .sysex8_streams = b->sysex8_streams, in reply_ump_stream_fb_info()
600 static void reply_ump_stream_fb_name(struct f_midi2_ep *ep, unsigned int blk) in reply_ump_stream_fb_name() argument
602 reply_ump_stream_string(ep, ump_fb_name(&ep->blks[blk].info), in reply_ump_stream_fb_name()
603 UMP_STREAM_MSG_STATUS_FB_NAME, blk << 8, in reply_ump_stream_fb_name()
610 struct f_midi2 *midi2 = ep->card; in process_ump_stream_msg()
611 unsigned int format, status, blk; in process_ump_stream_msg() local
632 ep->info.protocol = 2; in process_ump_stream_msg()
635 ep->info.protocol = 1; in process_ump_stream_msg()
638 snd_ump_switch_protocol(ep->ump, to_ump_protocol(ep->info.protocol)); in process_ump_stream_msg()
644 blk = (*data >> 8) & 0xff; in process_ump_stream_msg()
645 if (blk == 0xff) { in process_ump_stream_msg()
647 for (blk = 0; blk < ep->num_blks; blk++) { in process_ump_stream_msg()
649 reply_ump_stream_fb_info(ep, blk); in process_ump_stream_msg()
651 reply_ump_stream_fb_name(ep, blk); in process_ump_stream_msg()
653 } else if (blk < ep->num_blks) { in process_ump_stream_msg()
656 reply_ump_stream_fb_info(ep, blk); in process_ump_stream_msg()
658 reply_ump_stream_fb_name(ep, blk); in process_ump_stream_msg()
667 const u32 *data = (u32 *)req->buf; in process_ump()
668 int len = req->actual >> 2; in process_ump()
669 const u32 *in_buf = ep->ump->input_buf; in process_ump()
671 for (; len > 0; len--, data++) { in process_ump()
672 if (snd_ump_receive_ump_val(ep->ump, *data) <= 0) in process_ump()
683 /* complete handler for UMP EP-out requests */
687 struct f_midi2_req_ctx *ctx = req->context; in f_midi2_ep_out_complete()
688 struct f_midi2_ep *ep = ctx->usb_ep->ep; in f_midi2_ep_out_complete()
689 struct f_midi2 *midi2 = ep->card; in f_midi2_ep_out_complete()
690 int status = req->status; in f_midi2_ep_out_complete()
694 usb_ep->name, status, req->actual, req->length); in f_midi2_ep_out_complete()
699 le32_to_cpu_array((u32 *)req->buf, req->actual >> 2); in f_midi2_ep_out_complete()
701 if (midi2->info.process_ump) in f_midi2_ep_out_complete()
704 snd_ump_receive(ep->ump, req->buf, req->actual & ~3); in f_midi2_ep_out_complete()
706 if (midi2->operation_mode != MIDI_OP_MODE_MIDI2) in f_midi2_ep_out_complete()
717 /* Transmit UMP packets received from user-space to the gadget */
720 struct f_midi2_usb_ep *usb_ep = &ep->ep_in; in process_ump_transmit()
721 struct f_midi2 *midi2 = ep->card; in process_ump_transmit()
725 if (!usb_ep->usb_ep->enabled) in process_ump_transmit()
732 len = snd_ump_transmit(ep->ump, (u32 *)req->buf, in process_ump_transmit()
733 midi2->info.req_buf_size); in process_ump_transmit()
739 req->length = len; in process_ump_transmit()
745 /* Complete handler for UMP EP-in requests */
749 struct f_midi2_req_ctx *ctx = req->context; in f_midi2_ep_in_complete()
750 struct f_midi2_ep *ep = ctx->usb_ep->ep; in f_midi2_ep_in_complete()
751 struct f_midi2 *midi2 = ep->card; in f_midi2_ep_in_complete()
752 int status = req->status; in f_midi2_ep_in_complete()
758 usb_ep->name, status, req->actual, req->length); in f_midi2_ep_in_complete()
769 /* process one MIDI byte -- copied from f_midi.c
777 struct f_midi2_midi1_port *port = &midi2->midi1_port[cable]; in process_midi1_byte()
784 /* System Real-Time Messages */ in process_midi1_byte()
787 next_state = port->state; in process_midi1_byte()
788 port->state = STATE_REAL_TIME; in process_midi1_byte()
793 switch (port->state) { in process_midi1_byte()
801 p[1] = port->data[0]; in process_midi1_byte()
807 p[1] = port->data[0]; in process_midi1_byte()
808 p[2] = port->data[1]; in process_midi1_byte()
814 next_state = port->state; in process_midi1_byte()
815 port->state = STATE_INITIAL; in process_midi1_byte()
821 port->data[0] = port->data[1] = 0; in process_midi1_byte()
822 port->state = STATE_INITIAL; in process_midi1_byte()
825 port->data[0] = b; in process_midi1_byte()
826 port->data[1] = 0; in process_midi1_byte()
831 port->data[0] = b; in process_midi1_byte()
835 port->data[0] = b; in process_midi1_byte()
855 port->data[0] = b; in process_midi1_byte()
856 port->data[1] = 0; in process_midi1_byte()
857 port->state = STATE_INITIAL; in process_midi1_byte()
866 switch (port->state) { in process_midi1_byte()
868 if (port->data[0] < 0xf0) in process_midi1_byte()
869 p[0] |= port->data[0] >> 4; in process_midi1_byte()
873 p[1] = port->data[0]; in process_midi1_byte()
879 port->data[1] = b; in process_midi1_byte()
883 if (port->data[0] < 0xf0) in process_midi1_byte()
884 p[0] |= port->data[0] >> 4; in process_midi1_byte()
888 p[1] = port->data[0]; in process_midi1_byte()
889 p[2] = port->data[1]; in process_midi1_byte()
895 port->data[0] = b; in process_midi1_byte()
899 port->data[1] = b; in process_midi1_byte()
904 p[1] = port->data[0]; in process_midi1_byte()
905 p[2] = port->data[1]; in process_midi1_byte()
915 port->state == STATE_SYSEX_2 || in process_midi1_byte()
916 port->state == STATE_1PARAM || in process_midi1_byte()
917 port->state == STATE_2PARAM_2 || in process_midi1_byte()
918 port->state == STATE_REAL_TIME) { in process_midi1_byte()
919 memcpy(req->buf + req->length, p, sizeof(p)); in process_midi1_byte()
920 req->length += sizeof(p); in process_midi1_byte()
924 port->data[0] = port->data[1] = 0; in process_midi1_byte()
927 if (midi2->info.req_buf_size - req->length <= 4) { in process_midi1_byte()
934 port->state = next_state; in process_midi1_byte()
947 for (cable = 0; cable < midi2->num_midi1_in; cable++) { in process_midi1_pending_buf()
948 struct f_midi2_midi1_port *port = &midi2->midi1_port[cable]; in process_midi1_pending_buf()
950 if (!port->pending) in process_midi1_pending_buf()
952 for (c = 0; c < port->pending; c++) { in process_midi1_pending_buf()
953 if (process_midi1_byte(midi2, cable, port->buf[c], in process_midi1_pending_buf()
955 port->pending -= c; in process_midi1_pending_buf()
956 if (port->pending) in process_midi1_pending_buf()
957 memmove(port->buf, port->buf + c, in process_midi1_pending_buf()
958 port->pending); in process_midi1_pending_buf()
962 port->pending = 0; in process_midi1_pending_buf()
973 struct f_midi2_midi1_port *port = &midi2->midi1_port[cable]; in fill_midi1_pending_buf()
975 if (port->pending + size > sizeof(port->buf)) in fill_midi1_pending_buf()
977 memcpy(port->buf + port->pending, buf, size); in fill_midi1_pending_buf()
978 port->pending += size; in fill_midi1_pending_buf()
984 struct f_midi2_usb_ep *usb_ep = &midi2->midi1_ep_in; in process_midi1_transmit()
985 struct f_midi2_ep *ep = &midi2->midi2_eps[0]; in process_midi1_transmit()
993 if (!usb_ep->usb_ep || !usb_ep->usb_ep->enabled) in process_midi1_transmit()
1006 len = snd_ump_transmit(ep->ump, &ump, 4); in process_midi1_transmit()
1009 if (snd_ump_receive_ump_val(ep->ump, ump) <= 0) in process_midi1_transmit()
1011 size = snd_ump_convert_from_ump(ep->ump->input_buf, outbuf, in process_midi1_transmit()
1015 cable = ep->in_group_to_cable[group]; in process_midi1_transmit()
1018 cable--; /* to 0-base */ in process_midi1_transmit()
1023 if (req->length) in process_midi1_transmit()
1030 /* complete handler for MIDI1 EP-in requests */
1034 struct f_midi2_req_ctx *ctx = req->context; in f_midi2_midi1_ep_in_complete()
1035 struct f_midi2 *midi2 = ctx->usb_ep->card; in f_midi2_midi1_ep_in_complete()
1036 int status = req->status; in f_midi2_midi1_ep_in_complete()
1042 usb_ep->name, status, req->actual, req->length); in f_midi2_midi1_ep_in_complete()
1049 /* complete handler for MIDI1 EP-out requests */
1053 struct f_midi2_req_ctx *ctx = req->context; in f_midi2_midi1_ep_out_complete()
1054 struct f_midi2 *midi2 = ctx->usb_ep->card; in f_midi2_midi1_ep_out_complete()
1056 struct ump_cvt_to_ump *cvt = &midi2->midi1_ump_cvt; in f_midi2_midi1_ep_out_complete()
1061 int status = req->status; in f_midi2_midi1_ep_out_complete()
1062 const u8 *buf = req->buf; in f_midi2_midi1_ep_out_complete()
1066 usb_ep->name, status, req->actual, req->length); in f_midi2_midi1_ep_out_complete()
1070 len = req->actual >> 2; in f_midi2_midi1_ep_out_complete()
1071 for (; len; len--, buf += 4) { in f_midi2_midi1_ep_out_complete()
1073 ep = midi2->out_cable_mapping[cable].ep; in f_midi2_midi1_ep_out_complete()
1076 group = midi2->out_cable_mapping[cable].group; in f_midi2_midi1_ep_out_complete()
1080 to_ump_protocol(ep->info.protocol), in f_midi2_midi1_ep_out_complete()
1082 if (cvt->ump_bytes) { in f_midi2_midi1_ep_out_complete()
1083 snd_ump_receive(ep->ump, cvt->ump, in f_midi2_midi1_ep_out_complete()
1084 cvt->ump_bytes); in f_midi2_midi1_ep_out_complete()
1085 cvt->ump_bytes = 0; in f_midi2_midi1_ep_out_complete()
1090 if (midi2->operation_mode != MIDI_OP_MODE_MIDI1) in f_midi2_midi1_ep_out_complete()
1111 if (!usb_ep->usb_ep) in f_midi2_start_ep()
1114 usb_ep_disable(usb_ep->usb_ep); in f_midi2_start_ep()
1115 err = config_ep_by_speed(usb_ep->card->gadget, fn, usb_ep->usb_ep); in f_midi2_start_ep()
1118 return usb_ep_enable(usb_ep->usb_ep); in f_midi2_start_ep()
1126 if (!usb_ep->usb_ep || !usb_ep->num_reqs) in f_midi2_drop_reqs()
1129 for (i = 0; i < usb_ep->num_reqs; i++) { in f_midi2_drop_reqs()
1130 if (!test_bit(i, &usb_ep->free_reqs) && usb_ep->reqs[i].req) { in f_midi2_drop_reqs()
1131 usb_ep_dequeue(usb_ep->usb_ep, usb_ep->reqs[i].req); in f_midi2_drop_reqs()
1132 set_bit(i, &usb_ep->free_reqs); in f_midi2_drop_reqs()
1140 struct f_midi2 *midi2 = usb_ep->card; in f_midi2_alloc_ep_reqs()
1143 if (!usb_ep->usb_ep) in f_midi2_alloc_ep_reqs()
1145 if (!usb_ep->reqs) in f_midi2_alloc_ep_reqs()
1146 return -EINVAL; in f_midi2_alloc_ep_reqs()
1148 for (i = 0; i < midi2->info.num_reqs; i++) { in f_midi2_alloc_ep_reqs()
1149 if (usb_ep->reqs[i].req) in f_midi2_alloc_ep_reqs()
1151 usb_ep->reqs[i].req = alloc_ep_req(usb_ep->usb_ep, in f_midi2_alloc_ep_reqs()
1152 midi2->info.req_buf_size); in f_midi2_alloc_ep_reqs()
1153 if (!usb_ep->reqs[i].req) in f_midi2_alloc_ep_reqs()
1154 return -ENOMEM; in f_midi2_alloc_ep_reqs()
1155 usb_ep->reqs[i].req->context = &usb_ep->reqs[i]; in f_midi2_alloc_ep_reqs()
1163 struct f_midi2 *midi2 = usb_ep->card; in f_midi2_free_ep_reqs()
1166 for (i = 0; i < midi2->info.num_reqs; i++) { in f_midi2_free_ep_reqs()
1167 if (!usb_ep->reqs[i].req) in f_midi2_free_ep_reqs()
1169 free_ep_req(usb_ep->usb_ep, usb_ep->reqs[i].req); in f_midi2_free_ep_reqs()
1170 usb_ep->reqs[i].req = NULL; in f_midi2_free_ep_reqs()
1183 usb_ep->card = midi2; in f_midi2_init_ep()
1184 usb_ep->ep = ep; in f_midi2_init_ep()
1185 usb_ep->usb_ep = usb_ep_autoconfig(midi2->gadget, desc); in f_midi2_init_ep()
1186 if (!usb_ep->usb_ep) in f_midi2_init_ep()
1187 return -ENODEV; in f_midi2_init_ep()
1188 usb_ep->complete = complete; in f_midi2_init_ep()
1190 usb_ep->reqs = kcalloc(midi2->info.num_reqs, sizeof(*usb_ep->reqs), in f_midi2_init_ep()
1192 if (!usb_ep->reqs) in f_midi2_init_ep()
1193 return -ENOMEM; in f_midi2_init_ep()
1194 for (i = 0; i < midi2->info.num_reqs; i++) { in f_midi2_init_ep()
1195 usb_ep->reqs[i].index = i; in f_midi2_init_ep()
1196 usb_ep->reqs[i].usb_ep = usb_ep; in f_midi2_init_ep()
1197 set_bit(i, &usb_ep->free_reqs); in f_midi2_init_ep()
1198 usb_ep->num_reqs++; in f_midi2_init_ep()
1211 kfree(usb_ep->reqs); in f_midi2_free_ep()
1212 usb_ep->num_reqs = 0; in f_midi2_free_ep()
1213 usb_ep->free_reqs = 0; in f_midi2_free_ep()
1214 usb_ep->reqs = NULL; in f_midi2_free_ep()
1217 /* Queue requests for EP-out at start */
1222 if (!usb_ep->usb_ep) in f_midi2_queue_out_reqs()
1225 for (i = 0; i < usb_ep->num_reqs; i++) { in f_midi2_queue_out_reqs()
1226 if (!test_bit(i, &usb_ep->free_reqs) || !usb_ep->reqs[i].req) in f_midi2_queue_out_reqs()
1228 usb_ep->reqs[i].req->complete = usb_ep->complete; in f_midi2_queue_out_reqs()
1229 err = usb_ep_queue(usb_ep->usb_ep, usb_ep->reqs[i].req, in f_midi2_queue_out_reqs()
1232 clear_bit(i, &usb_ep->free_reqs); in f_midi2_queue_out_reqs()
1283 if (intf != midi2->midi_if || alt > 1) in f_midi2_set_alt()
1291 if (midi2->operation_mode == op_mode) in f_midi2_set_alt()
1294 midi2->operation_mode = op_mode; in f_midi2_set_alt()
1297 f_midi2_stop_eps(&midi2->midi1_ep_in, &midi2->midi1_ep_out); in f_midi2_set_alt()
1300 for (i = 0; i < midi2->num_eps; i++) { in f_midi2_set_alt()
1301 ep = &midi2->midi2_eps[i]; in f_midi2_set_alt()
1302 f_midi2_stop_eps(&ep->ep_in, &ep->ep_out); in f_midi2_set_alt()
1307 return f_midi2_start_eps(&midi2->midi1_ep_in, in f_midi2_set_alt()
1308 &midi2->midi1_ep_out, fn); in f_midi2_set_alt()
1311 for (i = 0; i < midi2->num_eps; i++) { in f_midi2_set_alt()
1312 ep = &midi2->midi2_eps[i]; in f_midi2_set_alt()
1314 err = f_midi2_start_eps(&ep->ep_in, &ep->ep_out, fn); in f_midi2_set_alt()
1328 if (intf == midi2->midi_if && in f_midi2_get_alt()
1329 midi2->operation_mode == MIDI_OP_MODE_MIDI2) in f_midi2_get_alt()
1356 int i, blk, len; in assign_block_descriptors() local
1359 len = sizeof(gtb_header_desc) + sizeof(gtb_desc) * midi2->total_blocks; in assign_block_descriptors()
1360 if (WARN_ON(len > midi2->info.req_buf_size)) in assign_block_descriptors()
1367 memcpy(req->buf, &header, len); in assign_block_descriptors()
1368 req->length = len; in assign_block_descriptors()
1369 req->zero = len < max_len; in assign_block_descriptors()
1373 memcpy(req->buf, &header, sizeof(header)); in assign_block_descriptors()
1374 data = req->buf + sizeof(header); in assign_block_descriptors()
1375 for (i = 0; i < midi2->num_eps; i++) { in assign_block_descriptors()
1376 ep = &midi2->midi2_eps[i]; in assign_block_descriptors()
1377 for (blk = 0; blk < ep->num_blks; blk++) { in assign_block_descriptors()
1378 b = &ep->blks[blk].info; in assign_block_descriptors()
1382 desc->bGrpTrmBlkID = ep->blks[blk].gtb_id; in assign_block_descriptors()
1383 desc->bGrpTrmBlkType = ump_to_usb_dir(b->direction); in assign_block_descriptors()
1384 desc->nGroupTrm = b->first_group; in assign_block_descriptors()
1385 desc->nNumGroupTrm = b->num_groups; in assign_block_descriptors()
1386 desc->iBlockItem = ep->blks[blk].string_id; in assign_block_descriptors()
1388 if (ep->info.protocol == 2) in assign_block_descriptors()
1389 desc->bMIDIProtocol = USB_MS_MIDI_PROTO_2_0; in assign_block_descriptors()
1391 desc->bMIDIProtocol = USB_MS_MIDI_PROTO_1_0_128; in assign_block_descriptors()
1393 if (b->is_midi1 == 2) { in assign_block_descriptors()
1394 desc->wMaxInputBandwidth = cpu_to_le16(1); in assign_block_descriptors()
1395 desc->wMaxOutputBandwidth = cpu_to_le16(1); in assign_block_descriptors()
1402 req->length = len; in assign_block_descriptors()
1403 req->zero = len < max_len; in assign_block_descriptors()
1408 const struct usb_ctrlrequest *ctrl) in f_midi2_setup() argument
1411 struct usb_composite_dev *cdev = fn->config->cdev; in f_midi2_setup()
1412 struct usb_request *req = cdev->req; in f_midi2_setup()
1415 if ((ctrl->bRequestType & USB_TYPE_MASK) != USB_TYPE_STANDARD || in f_midi2_setup()
1416 ctrl->bRequest != USB_REQ_GET_DESCRIPTOR) in f_midi2_setup()
1417 return -EOPNOTSUPP; in f_midi2_setup()
1419 value = le16_to_cpu(ctrl->wValue); in f_midi2_setup()
1420 length = le16_to_cpu(ctrl->wLength); in f_midi2_setup()
1423 return -EOPNOTSUPP; in f_midi2_setup()
1427 return -EOPNOTSUPP; in f_midi2_setup()
1430 return usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC); in f_midi2_setup()
1438 midi2->operation_mode = MIDI_OP_MODE_UNSET; in f_midi2_disable()
1455 struct f_midi2_ep *ep = ump->private_data; in f_midi2_ump_trigger()
1456 struct f_midi2 *midi2 = ep->card; in f_midi2_ump_trigger()
1459 switch (midi2->operation_mode) { in f_midi2_ump_trigger()
1487 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in f_midi2_operation_mode_info()
1488 uinfo->count = 1; in f_midi2_operation_mode_info()
1489 uinfo->value.integer.min = MIDI_OP_MODE_UNSET; in f_midi2_operation_mode_info()
1490 uinfo->value.integer.max = MIDI_OP_MODE_MIDI2; in f_midi2_operation_mode_info()
1499 ucontrol->value.integer.value[0] = midi2->operation_mode; in f_midi2_operation_mode_get()
1516 if (midi2->card) { in f_midi2_free_card()
1517 snd_card_free_when_closed(midi2->card); in f_midi2_free_card()
1518 midi2->card = NULL; in f_midi2_free_card()
1536 int i, id, blk, err; in f_midi2_create_card() local
1539 err = snd_card_new(&midi2->gadget->dev, -1, NULL, THIS_MODULE, 0, in f_midi2_create_card()
1543 midi2->card = card; in f_midi2_create_card()
1545 strcpy(card->driver, "f_midi2"); in f_midi2_create_card()
1546 strcpy(card->shortname, "MIDI 2.0 Gadget"); in f_midi2_create_card()
1547 strcpy(card->longname, "MIDI 2.0 Gadget"); in f_midi2_create_card()
1550 for (i = 0; i < midi2->num_eps; i++) { in f_midi2_create_card()
1551 ep = &midi2->midi2_eps[i]; in f_midi2_create_card()
1558 ep->ump = ump; in f_midi2_create_card()
1559 ump->no_process_stream = true; in f_midi2_create_card()
1560 ump->private_data = ep; in f_midi2_create_card()
1561 ump->ops = &f_midi2_ump_ops; in f_midi2_create_card()
1562 if (midi2->info.static_block) in f_midi2_create_card()
1563 ump->info.flags |= SNDRV_UMP_EP_INFO_STATIC_BLOCKS; in f_midi2_create_card()
1564 ump->info.protocol_caps = (ep->info.protocol_caps & 3) << 8; in f_midi2_create_card()
1565 ump->info.protocol = to_ump_protocol(ep->info.protocol); in f_midi2_create_card()
1566 ump->info.version = 0x0101; in f_midi2_create_card()
1567 ump->info.family_id = ep->info.family; in f_midi2_create_card()
1568 ump->info.model_id = ep->info.model; in f_midi2_create_card()
1569 ump->info.manufacturer_id = ep->info.manufacturer & 0xffffff; in f_midi2_create_card()
1570 sw = cpu_to_be32(ep->info.sw_revision); in f_midi2_create_card()
1571 memcpy(ump->info.sw_revision, &sw, 4); in f_midi2_create_card()
1573 strscpy(ump->info.name, ump_ep_name(ep), in f_midi2_create_card()
1574 sizeof(ump->info.name)); in f_midi2_create_card()
1575 strscpy(ump->info.product_id, ump_product_id(ep), in f_midi2_create_card()
1576 sizeof(ump->info.product_id)); in f_midi2_create_card()
1577 strscpy(ump->core.name, ump->info.name, sizeof(ump->core.name)); in f_midi2_create_card()
1579 for (blk = 0; blk < ep->num_blks; blk++) { in f_midi2_create_card()
1580 const struct f_midi2_block_info *b = &ep->blks[blk].info; in f_midi2_create_card()
1583 err = snd_ump_block_new(ump, blk, in f_midi2_create_card()
1584 reverse_dir(b->direction), in f_midi2_create_card()
1585 b->first_group, b->num_groups, in f_midi2_create_card()
1586 &ep->blks[blk].fb); in f_midi2_create_card()
1589 fb = ep->blks[blk].fb; in f_midi2_create_card()
1590 fb->info.active = !!b->active; in f_midi2_create_card()
1591 fb->info.midi_ci_version = b->midi_ci_version; in f_midi2_create_card()
1592 fb->info.ui_hint = reverse_dir(b->ui_hint); in f_midi2_create_card()
1593 fb->info.sysex8_streams = b->sysex8_streams; in f_midi2_create_card()
1594 if (b->is_midi1 < 2) in f_midi2_create_card()
1595 fb->info.flags |= b->is_midi1; in f_midi2_create_card()
1597 fb->info.flags |= SNDRV_UMP_BLOCK_IS_MIDI1 | in f_midi2_create_card()
1599 strscpy(fb->info.name, ump_fb_name(b), in f_midi2_create_card()
1600 sizeof(fb->info.name)); in f_midi2_create_card()
1604 for (i = 0; i < midi2->num_eps; i++) { in f_midi2_create_card()
1605 err = snd_ump_attach_legacy_rawmidi(midi2->midi2_eps[i].ump, in f_midi2_create_card()
1646 if (config->size + 2 >= config->alloc) { in append_config()
1647 size = config->size + 16; in append_config()
1648 buf = krealloc(config->list, size * sizeof(void *), GFP_KERNEL); in append_config()
1650 return -ENOMEM; in append_config()
1651 config->list = buf; in append_config()
1652 config->alloc = size; in append_config()
1655 config->list[config->size] = d; in append_config()
1656 config->size++; in append_config()
1657 config->list[config->size] = NULL; in append_config()
1679 &config->jack_ins[config->jack_in++]; in append_midi1_in_jack()
1680 int id = ++config->jack_id; in append_midi1_in_jack()
1683 jack->bLength = 0x06; in append_midi1_in_jack()
1684 jack->bDescriptorType = USB_DT_CS_INTERFACE; in append_midi1_in_jack()
1685 jack->bDescriptorSubtype = USB_MS_MIDI_IN_JACK; in append_midi1_in_jack()
1686 jack->bJackType = type; in append_midi1_in_jack()
1687 jack->bJackID = id; in append_midi1_in_jack()
1689 if (map->ep) in append_midi1_in_jack()
1690 jack->iJack = map->ep->blks[map->block].string_id; in append_midi1_in_jack()
1704 &config->jack_outs[config->jack_out++]; in append_midi1_out_jack()
1705 int id = ++config->jack_id; in append_midi1_out_jack()
1708 jack->bLength = 0x09; in append_midi1_out_jack()
1709 jack->bDescriptorType = USB_DT_CS_INTERFACE; in append_midi1_out_jack()
1710 jack->bDescriptorSubtype = USB_MS_MIDI_OUT_JACK; in append_midi1_out_jack()
1711 jack->bJackType = type; in append_midi1_out_jack()
1712 jack->bJackID = id; in append_midi1_out_jack()
1713 jack->bNrInputPins = 1; in append_midi1_out_jack()
1714 jack->pins[0].baSourceID = source; in append_midi1_out_jack()
1715 jack->pins[0].baSourcePin = 0x01; in append_midi1_out_jack()
1717 if (map->ep) in append_midi1_out_jack()
1718 jack->iJack = map->ep->blks[map->block].string_id; in append_midi1_out_jack()
1739 for (i = 0; i < midi2->num_eps; i++) in f_midi2_create_usb_configs()
1750 for (i = 0; i < midi2->num_eps; i++) in f_midi2_create_usb_configs()
1762 if (midi2->num_midi1_in && midi2->num_midi1_out) in f_midi2_create_usb_configs()
1772 if (midi2->num_midi1_out) { in f_midi2_create_usb_configs()
1774 USB_DT_MS_ENDPOINT_SIZE(midi2->num_midi1_out); in f_midi2_create_usb_configs()
1777 midi2->num_midi1_out; in f_midi2_create_usb_configs()
1778 total += midi2->num_midi1_out * in f_midi2_create_usb_configs()
1780 for (i = 0; i < midi2->num_midi1_out; i++) { in f_midi2_create_usb_configs()
1782 &midi2->in_cable_mapping[i], in f_midi2_create_usb_configs()
1788 &midi2->in_cable_mapping[i], in f_midi2_create_usb_configs()
1795 if (midi2->num_midi1_in) { in f_midi2_create_usb_configs()
1797 USB_DT_MS_ENDPOINT_SIZE(midi2->num_midi1_in); in f_midi2_create_usb_configs()
1800 midi2->num_midi1_in; in f_midi2_create_usb_configs()
1801 total += midi2->num_midi1_in * in f_midi2_create_usb_configs()
1803 for (i = 0; i < midi2->num_midi1_in; i++) { in f_midi2_create_usb_configs()
1805 &midi2->out_cable_mapping[i], in f_midi2_create_usb_configs()
1810 &midi2->out_cable_mapping[i], in f_midi2_create_usb_configs()
1820 if (midi2->num_midi1_out) { in f_midi2_create_usb_configs()
1825 if (midi2->num_midi1_in) { in f_midi2_create_usb_configs()
1835 for (i = 0; i < midi2->num_eps; i++) { in f_midi2_create_usb_configs()
1865 kfree(config->list); in f_midi2_free_usb_configs()
1872 /* fill MIDI2 EP class-specific descriptor */
1876 int blk; in fill_midi2_class_desc() local
1878 cdesc->bLength = USB_DT_MS20_ENDPOINT_SIZE(ep->num_blks); in fill_midi2_class_desc()
1879 cdesc->bDescriptorType = USB_DT_CS_ENDPOINT; in fill_midi2_class_desc()
1880 cdesc->bDescriptorSubtype = USB_MS_GENERAL_2_0; in fill_midi2_class_desc()
1881 cdesc->bNumGrpTrmBlock = ep->num_blks; in fill_midi2_class_desc()
1882 for (blk = 0; blk < ep->num_blks; blk++) in fill_midi2_class_desc()
1883 cdesc->baAssoGrpTrmBlkID[blk] = ep->blks[blk].gtb_id; in fill_midi2_class_desc()
1886 /* initialize MIDI2 EP-in */
1889 struct f_midi2_ep *ep = &midi2->midi2_eps[index]; in f_midi2_init_midi2_ep_in()
1892 desc->bLength = USB_DT_ENDPOINT_SIZE; in f_midi2_init_midi2_ep_in()
1893 desc->bDescriptorType = USB_DT_ENDPOINT; in f_midi2_init_midi2_ep_in()
1894 desc->bEndpointAddress = USB_DIR_IN; in f_midi2_init_midi2_ep_in()
1895 desc->bmAttributes = USB_ENDPOINT_XFER_INT; in f_midi2_init_midi2_ep_in()
1896 desc->wMaxPacketSize = cpu_to_le16(EP_MAX_PACKET_INT); in f_midi2_init_midi2_ep_in()
1897 desc->bInterval = 1; in f_midi2_init_midi2_ep_in()
1901 return f_midi2_init_ep(midi2, ep, &ep->ep_in, desc, in f_midi2_init_midi2_ep_in()
1905 /* initialize MIDI2 EP-out */
1908 struct f_midi2_ep *ep = &midi2->midi2_eps[index]; in f_midi2_init_midi2_ep_out()
1911 desc->bLength = USB_DT_ENDPOINT_SIZE; in f_midi2_init_midi2_ep_out()
1912 desc->bDescriptorType = USB_DT_ENDPOINT; in f_midi2_init_midi2_ep_out()
1913 desc->bEndpointAddress = USB_DIR_OUT; in f_midi2_init_midi2_ep_out()
1914 desc->bmAttributes = USB_ENDPOINT_XFER_BULK; in f_midi2_init_midi2_ep_out()
1918 return f_midi2_init_ep(midi2, ep, &ep->ep_out, desc, in f_midi2_init_midi2_ep_out()
1925 struct usb_composite_dev *cdev = c->cdev; in f_midi2_bind()
1930 .language = 0x0409, /* en-us */ in f_midi2_bind()
1931 .strings = midi2->string_defs, in f_midi2_bind()
1937 int i, blk, status; in f_midi2_bind() local
1939 midi2->gadget = cdev->gadget; in f_midi2_bind()
1940 midi2->operation_mode = MIDI_OP_MODE_UNSET; in f_midi2_bind()
1946 /* maybe allocate device-global string ID */ in f_midi2_bind()
1947 midi2->strings = usb_gstrings_attach(c->cdev, strings, in f_midi2_bind()
1948 midi2->total_blocks + 1); in f_midi2_bind()
1949 if (IS_ERR(midi2->strings)) { in f_midi2_bind()
1950 status = PTR_ERR(midi2->strings); in f_midi2_bind()
1955 midi2_midi1_if_desc.iInterface = midi2->strings[STR_IFACE].id; in f_midi2_bind()
1956 midi2_midi2_if_desc.iInterface = midi2->strings[STR_IFACE].id; in f_midi2_bind()
1957 for (i = 0; i < midi2->num_eps; i++) { in f_midi2_bind()
1958 ep = &midi2->midi2_eps[i]; in f_midi2_bind()
1959 for (blk = 0; blk < ep->num_blks; blk++) in f_midi2_bind()
1960 ep->blks[blk].string_id = in f_midi2_bind()
1961 midi2->strings[gtb_to_str_id(ep->blks[blk].gtb_id)].id; in f_midi2_bind()
1964 midi2_midi2_if_desc.bNumEndpoints = midi2->num_eps * 2; in f_midi2_bind()
1976 midi2->midi_if = status; in f_midi2_bind()
1981 /* allocate instance-specific endpoints */ in f_midi2_bind()
1982 if (midi2->midi2_eps[0].blks[0].info.direction != SNDRV_UMP_DIR_OUTPUT) { in f_midi2_bind()
1983 status = f_midi2_init_ep(midi2, NULL, &midi2->midi1_ep_in, in f_midi2_bind()
1990 if (midi2->midi2_eps[0].blks[0].info.direction != SNDRV_UMP_DIR_INPUT) { in f_midi2_bind()
1991 status = f_midi2_init_ep(midi2, NULL, &midi2->midi1_ep_out, in f_midi2_bind()
1998 for (i = 0; i < midi2->num_eps; i++) { in f_midi2_bind()
2010 f->fs_descriptors = usb_copy_descriptors(config.list); in f_midi2_bind()
2011 if (!f->fs_descriptors) { in f_midi2_bind()
2012 status = -ENOMEM; in f_midi2_bind()
2020 f->hs_descriptors = usb_copy_descriptors(config.list); in f_midi2_bind()
2021 if (!f->hs_descriptors) { in f_midi2_bind()
2022 status = -ENOMEM; in f_midi2_bind()
2030 f->ss_descriptors = usb_copy_descriptors(config.list); in f_midi2_bind()
2031 if (!f->ss_descriptors) { in f_midi2_bind()
2032 status = -ENOMEM; in f_midi2_bind()
2047 ERROR(midi2, "%s: can't bind, err %d\n", f->name, status); in f_midi2_bind()
2059 f_midi2_free_ep(&midi2->midi1_ep_in); in f_midi2_unbind()
2060 f_midi2_free_ep(&midi2->midi1_ep_out); in f_midi2_unbind()
2061 for (i = 0; i < midi2->num_eps; i++) { in f_midi2_unbind()
2062 f_midi2_free_ep(&midi2->midi2_eps[i].ep_in); in f_midi2_unbind()
2063 f_midi2_free_ep(&midi2->midi2_eps[i].ep_out); in f_midi2_unbind()
2104 for (; p > s && isspace(*p); p--) in make_name_string()
2114 mutex_lock(&opts->lock); in f_midi2_opts_uint_show()
2116 mutex_unlock(&opts->lock); in f_midi2_opts_uint_show()
2127 mutex_lock(&opts->lock); in f_midi2_opts_uint_store()
2128 if (opts->refcnt) { in f_midi2_opts_uint_store()
2129 ret = -EBUSY; in f_midi2_opts_uint_store()
2137 ret = -EINVAL; in f_midi2_opts_uint_store()
2145 mutex_unlock(&opts->lock); in f_midi2_opts_uint_store()
2156 mutex_lock(&opts->lock); in f_midi2_opts_bool_store()
2157 if (opts->refcnt) { in f_midi2_opts_bool_store()
2158 ret = -EBUSY; in f_midi2_opts_bool_store()
2169 mutex_unlock(&opts->lock); in f_midi2_opts_bool_store()
2179 mutex_lock(&opts->lock); in f_midi2_opts_str_show()
2182 mutex_unlock(&opts->lock); in f_midi2_opts_str_show()
2193 mutex_lock(&opts->lock); in f_midi2_opts_str_store()
2194 if (opts->refcnt) { in f_midi2_opts_str_store()
2195 ret = -EBUSY; in f_midi2_opts_str_store()
2201 ret = -ENOMEM; in f_midi2_opts_str_store()
2211 mutex_unlock(&opts->lock); in f_midi2_opts_str_store()
2225 return f_midi2_opts_uint_show(opts->ep->opts, opts->info.name, \
2233 return f_midi2_opts_uint_store(opts->ep->opts, &opts->info.name,\
2245 return f_midi2_opts_uint_show(opts->ep->opts, opts->info.name, \
2253 return f_midi2_opts_bool_store(opts->ep->opts, &opts->info.name,\
2275 return f_midi2_opts_str_show(opts->ep->opts, opts->info.name, page); in f_midi2_block_opts_name_show()
2283 return f_midi2_opts_str_store(opts->ep->opts, &opts->info.name, 128, in f_midi2_block_opts_name_store()
2308 kfree(opts->info.name); in f_midi2_block_opts_release()
2324 unsigned int blk, in f_midi2_block_opts_create() argument
2330 mutex_lock(&ep_opts->opts->lock); in f_midi2_block_opts_create()
2331 if (ep_opts->opts->refcnt || ep_opts->blks[blk]) { in f_midi2_block_opts_create()
2332 ret = -EBUSY; in f_midi2_block_opts_create()
2338 ret = -ENOMEM; in f_midi2_block_opts_create()
2342 block_opts->ep = ep_opts; in f_midi2_block_opts_create()
2343 block_opts->id = blk; in f_midi2_block_opts_create()
2346 block_opts->info.direction = SNDRV_UMP_DIR_BIDIRECTION; in f_midi2_block_opts_create()
2347 block_opts->info.first_group = 0; in f_midi2_block_opts_create()
2348 block_opts->info.num_groups = 1; in f_midi2_block_opts_create()
2349 block_opts->info.ui_hint = SNDRV_UMP_BLOCK_UI_HINT_BOTH; in f_midi2_block_opts_create()
2350 block_opts->info.active = 1; in f_midi2_block_opts_create()
2352 ep_opts->blks[blk] = block_opts; in f_midi2_block_opts_create()
2356 mutex_unlock(&ep_opts->opts->lock); in f_midi2_block_opts_create()
2366 unsigned int blk; in f_midi2_opts_block_make() local
2370 return ERR_PTR(-EINVAL); in f_midi2_opts_block_make()
2371 ret = kstrtouint(name + 6, 10, &blk); in f_midi2_opts_block_make()
2375 ep_opts = to_f_midi2_ep_opts(&group->cg_item); in f_midi2_opts_block_make()
2377 if (blk >= SNDRV_UMP_MAX_BLOCKS) in f_midi2_opts_block_make()
2378 return ERR_PTR(-EINVAL); in f_midi2_opts_block_make()
2379 if (ep_opts->blks[blk]) in f_midi2_opts_block_make()
2380 return ERR_PTR(-EBUSY); in f_midi2_opts_block_make()
2381 ret = f_midi2_block_opts_create(ep_opts, blk, &block_opts); in f_midi2_opts_block_make()
2385 config_group_init_type_name(&block_opts->group, name, in f_midi2_opts_block_make()
2387 return &block_opts->group; in f_midi2_opts_block_make()
2396 mutex_lock(&block_opts->ep->opts->lock); in f_midi2_opts_block_drop()
2397 block_opts->ep->blks[block_opts->id] = NULL; in f_midi2_opts_block_drop()
2398 mutex_unlock(&block_opts->ep->opts->lock); in f_midi2_opts_block_drop()
2412 return f_midi2_opts_uint_show(opts->opts, opts->info.name, \
2420 return f_midi2_opts_uint_store(opts->opts, &opts->info.name, \
2432 return f_midi2_opts_str_show(opts->opts, opts->info.name, page);\
2439 return f_midi2_opts_str_store(opts->opts, &opts->info.name, maxlen,\
2470 kfree(opts->info.ep_name); in f_midi2_ep_opts_release()
2471 kfree(opts->info.product_id); in f_midi2_ep_opts_release()
2500 return -ENOMEM; in f_midi2_ep_opts_create()
2502 ep_opts->opts = opts; in f_midi2_ep_opts_create()
2503 ep_opts->index = index; in f_midi2_ep_opts_create()
2506 ep_opts->info.protocol = 2; in f_midi2_ep_opts_create()
2507 ep_opts->info.protocol_caps = 3; in f_midi2_ep_opts_create()
2509 opts->eps[index] = ep_opts; in f_midi2_ep_opts_create()
2524 return ERR_PTR(-EINVAL); in f_midi2_opts_ep_make()
2529 opts = to_f_midi2_opts(&group->cg_item); in f_midi2_opts_ep_make()
2531 return ERR_PTR(-EINVAL); in f_midi2_opts_ep_make()
2532 if (opts->eps[index]) in f_midi2_opts_ep_make()
2533 return ERR_PTR(-EBUSY); in f_midi2_opts_ep_make()
2538 config_group_init_type_name(&ep_opts->group, name, &f_midi2_ep_type); in f_midi2_opts_ep_make()
2539 return &ep_opts->group; in f_midi2_opts_ep_make()
2548 mutex_lock(&ep_opts->opts->lock); in f_midi2_opts_ep_drop()
2549 ep_opts->opts->eps[ep_opts->index] = NULL; in f_midi2_opts_ep_drop()
2550 mutex_unlock(&ep_opts->opts->lock); in f_midi2_opts_ep_drop()
2564 return f_midi2_opts_uint_show(opts, opts->info.name, \
2572 return f_midi2_opts_bool_store(opts, &opts->info.name, \
2586 return f_midi2_opts_str_show(opts, opts->info.iface_name, page); in f_midi2_opts_iface_name_show()
2594 return f_midi2_opts_str_store(opts, &opts->info.iface_name, 128, in f_midi2_opts_iface_name_store()
2611 usb_put_function_instance(&opts->func_inst); in f_midi2_opts_release()
2636 kfree(opts->info.iface_name); in f_midi2_free_inst()
2650 return ERR_PTR(-ENOMEM); in f_midi2_alloc_inst()
2652 mutex_init(&opts->lock); in f_midi2_alloc_inst()
2653 opts->func_inst.free_func_inst = f_midi2_free_inst; in f_midi2_alloc_inst()
2654 opts->info.process_ump = true; in f_midi2_alloc_inst()
2655 opts->info.static_block = true; in f_midi2_alloc_inst()
2656 opts->info.num_reqs = 32; in f_midi2_alloc_inst()
2657 opts->info.req_buf_size = 512; in f_midi2_alloc_inst()
2675 block_opts->info.midi1_num_groups = 1; in f_midi2_alloc_inst()
2677 config_group_init_type_name(&opts->func_inst.group, "", in f_midi2_alloc_inst()
2680 config_group_init_type_name(&ep_opts->group, "ep.0", in f_midi2_alloc_inst()
2682 configfs_add_default_group(&ep_opts->group, &opts->func_inst.group); in f_midi2_alloc_inst()
2684 config_group_init_type_name(&block_opts->group, "block.0", in f_midi2_alloc_inst()
2686 configfs_add_default_group(&block_opts->group, &ep_opts->group); in f_midi2_alloc_inst()
2688 return &opts->func_inst; in f_midi2_alloc_inst()
2693 mutex_lock(&opts->lock); in do_f_midi2_free()
2694 --opts->refcnt; in do_f_midi2_free()
2695 mutex_unlock(&opts->lock); in do_f_midi2_free()
2696 kfree(midi2->string_defs); in do_f_midi2_free()
2703 container_of(f->fi, struct f_midi2_opts, func_inst)); in f_midi2_free()
2715 for (num_eps = 0; num_eps < MAX_UMP_EPS && opts->eps[num_eps]; in verify_parameters()
2720 return -EINVAL; in verify_parameters()
2725 ep = &opts->eps[i]->info; in verify_parameters()
2726 if (!(ep->protocol_caps & ep->protocol)) { in verify_parameters()
2728 ep->protocol, ep->protocol_caps, i); in verify_parameters()
2729 return -EINVAL; in verify_parameters()
2732 for (j = 0; j < SNDRV_UMP_MAX_BLOCKS && opts->eps[i]->blks[j]; in verify_parameters()
2734 bp = &opts->eps[i]->blks[j]->info; in verify_parameters()
2735 if (bp->first_group + bp->num_groups > SNDRV_UMP_MAX_GROUPS) { in verify_parameters()
2738 return -EINVAL; in verify_parameters()
2741 if (bp->midi1_num_groups) { in verify_parameters()
2742 if (bp->midi1_first_group < bp->first_group || in verify_parameters()
2743 bp->midi1_first_group + bp->midi1_num_groups > in verify_parameters()
2744 bp->first_group + bp->num_groups) { in verify_parameters()
2747 return -EINVAL; in verify_parameters()
2754 return -EINVAL; in verify_parameters()
2763 int blk) in fill_midi1_cable_mapping() argument
2765 const struct f_midi2_block_info *binfo = &ep->blks[blk].info; in fill_midi1_cable_mapping()
2769 if (!binfo->midi1_num_groups) in fill_midi1_cable_mapping()
2771 if (binfo->direction != SNDRV_UMP_DIR_OUTPUT) { in fill_midi1_cable_mapping()
2772 group = binfo->midi1_first_group; in fill_midi1_cable_mapping()
2773 map = midi2->in_cable_mapping + midi2->num_midi1_in; in fill_midi1_cable_mapping()
2774 for (i = 0; i < binfo->midi1_num_groups; i++, group++, map++) { in fill_midi1_cable_mapping()
2775 if (midi2->num_midi1_in >= MAX_CABLES) in fill_midi1_cable_mapping()
2777 map->ep = ep; in fill_midi1_cable_mapping()
2778 map->block = blk; in fill_midi1_cable_mapping()
2779 map->group = group; in fill_midi1_cable_mapping()
2780 midi2->num_midi1_in++; in fill_midi1_cable_mapping()
2781 /* store 1-based cable number */ in fill_midi1_cable_mapping()
2782 ep->in_group_to_cable[group] = midi2->num_midi1_in; in fill_midi1_cable_mapping()
2786 if (binfo->direction != SNDRV_UMP_DIR_INPUT) { in fill_midi1_cable_mapping()
2787 group = binfo->midi1_first_group; in fill_midi1_cable_mapping()
2788 map = midi2->out_cable_mapping + midi2->num_midi1_out; in fill_midi1_cable_mapping()
2789 for (i = 0; i < binfo->midi1_num_groups; i++, group++, map++) { in fill_midi1_cable_mapping()
2790 if (midi2->num_midi1_out >= MAX_CABLES) in fill_midi1_cable_mapping()
2792 map->ep = ep; in fill_midi1_cable_mapping()
2793 map->block = blk; in fill_midi1_cable_mapping()
2794 map->group = group; in fill_midi1_cable_mapping()
2795 midi2->num_midi1_out++; in fill_midi1_cable_mapping()
2807 int i, num_eps, blk; in f_midi2_alloc() local
2811 return ERR_PTR(-ENOMEM); in f_midi2_alloc()
2814 mutex_lock(&opts->lock); in f_midi2_alloc()
2817 mutex_unlock(&opts->lock); in f_midi2_alloc()
2821 ++opts->refcnt; in f_midi2_alloc()
2822 mutex_unlock(&opts->lock); in f_midi2_alloc()
2824 spin_lock_init(&midi2->queue_lock); in f_midi2_alloc()
2826 midi2->func.name = "midi2_func"; in f_midi2_alloc()
2827 midi2->func.bind = f_midi2_bind; in f_midi2_alloc()
2828 midi2->func.unbind = f_midi2_unbind; in f_midi2_alloc()
2829 midi2->func.get_alt = f_midi2_get_alt; in f_midi2_alloc()
2830 midi2->func.set_alt = f_midi2_set_alt; in f_midi2_alloc()
2831 midi2->func.setup = f_midi2_setup; in f_midi2_alloc()
2832 midi2->func.disable = f_midi2_disable; in f_midi2_alloc()
2833 midi2->func.free_func = f_midi2_free; in f_midi2_alloc()
2835 midi2->info = opts->info; in f_midi2_alloc()
2836 midi2->num_eps = num_eps; in f_midi2_alloc()
2839 ep = &midi2->midi2_eps[i]; in f_midi2_alloc()
2840 ep->info = opts->eps[i]->info; in f_midi2_alloc()
2841 ep->card = midi2; in f_midi2_alloc()
2842 for (blk = 0; blk < SNDRV_UMP_MAX_BLOCKS && in f_midi2_alloc()
2843 opts->eps[i]->blks[blk]; blk++) { in f_midi2_alloc()
2844 bp = &ep->blks[blk]; in f_midi2_alloc()
2845 ep->num_blks++; in f_midi2_alloc()
2846 bp->info = opts->eps[i]->blks[blk]->info; in f_midi2_alloc()
2847 bp->gtb_id = ++midi2->total_blocks; in f_midi2_alloc()
2851 midi2->string_defs = kcalloc(midi2->total_blocks + 1, in f_midi2_alloc()
2852 sizeof(*midi2->string_defs), GFP_KERNEL); in f_midi2_alloc()
2853 if (!midi2->string_defs) { in f_midi2_alloc()
2855 return ERR_PTR(-ENOMEM); in f_midi2_alloc()
2858 if (opts->info.iface_name && *opts->info.iface_name) in f_midi2_alloc()
2859 midi2->string_defs[STR_IFACE].s = opts->info.iface_name; in f_midi2_alloc()
2861 midi2->string_defs[STR_IFACE].s = ump_ep_name(&midi2->midi2_eps[0]); in f_midi2_alloc()
2863 for (i = 0; i < midi2->num_eps; i++) { in f_midi2_alloc()
2864 ep = &midi2->midi2_eps[i]; in f_midi2_alloc()
2865 for (blk = 0; blk < ep->num_blks; blk++) { in f_midi2_alloc()
2866 bp = &ep->blks[blk]; in f_midi2_alloc()
2867 midi2->string_defs[gtb_to_str_id(bp->gtb_id)].s = in f_midi2_alloc()
2868 ump_fb_name(&bp->info); in f_midi2_alloc()
2870 fill_midi1_cable_mapping(midi2, ep, blk); in f_midi2_alloc()
2874 if (!midi2->num_midi1_in && !midi2->num_midi1_out) { in f_midi2_alloc()
2877 return ERR_PTR(-EINVAL); in f_midi2_alloc()
2880 return &midi2->func; in f_midi2_alloc()