xref: /openbmc/linux/drivers/usb/gadget/function/f_midi2.c (revision 16f6ccde74a6f8538c62f127f17207c75f4dba7a)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * f_midi2.c -- USB MIDI 2.0 class function driver
4  */
5 
6 #include <linux/device.h>
7 #include <linux/kernel.h>
8 #include <linux/module.h>
9 #include <linux/slab.h>
10 
11 #include <sound/core.h>
12 #include <sound/control.h>
13 #include <sound/ump.h>
14 #include <sound/ump_msg.h>
15 #include <sound/ump_convert.h>
16 
17 #include <linux/usb/ch9.h>
18 #include <linux/usb/gadget.h>
19 #include <linux/usb/audio.h>
20 #include <linux/usb/midi-v2.h>
21 
22 #include "u_f.h"
23 #include "u_midi2.h"
24 
25 struct f_midi2;
26 struct f_midi2_ep;
27 struct f_midi2_usb_ep;
28 
29 /* Context for each USB request */
30 struct f_midi2_req_ctx {
31 	struct f_midi2_usb_ep *usb_ep;	/* belonging USB EP */
32 	unsigned int index;		/* array index: 0-31 */
33 	struct usb_request *req;	/* assigned request */
34 };
35 
36 /* Resources for a USB Endpoint */
37 struct f_midi2_usb_ep {
38 	struct f_midi2 *card;		/* belonging card */
39 	struct f_midi2_ep *ep;		/* belonging UMP EP (optional) */
40 	struct usb_ep *usb_ep;		/* assigned USB EP */
41 	void (*complete)(struct usb_ep *usb_ep, struct usb_request *req);
42 	unsigned long free_reqs;	/* bitmap for unused requests */
43 	unsigned int num_reqs;		/* number of allocated requests */
44 	struct f_midi2_req_ctx *reqs;	/* request context array */
45 };
46 
47 /* Resources for UMP Function Block (and USB Group Terminal Block) */
48 struct f_midi2_block {
49 	struct f_midi2_block_info info;	/* FB info, copied from configfs */
50 	struct snd_ump_block *fb;	/* assigned FB */
51 	unsigned int gtb_id;		/* assigned GTB id */
52 	unsigned int string_id;		/* assigned string id */
53 };
54 
55 /* Temporary buffer for altset 0 MIDI 1.0 handling */
56 struct f_midi2_midi1_port {
57 	unsigned int pending; /* pending bytes on the input buffer */
58 	u8 buf[32];	/* raw MIDI 1.0 byte input */
59 	u8 state;	/* running status */
60 	u8 data[2];	/* rendered USB MIDI 1.0 packet data */
61 };
62 
63 /* MIDI 1.0 message states */
64 enum {
65 	STATE_INITIAL = 0,	/* pseudo state */
66 	STATE_1PARAM,
67 	STATE_2PARAM_1,
68 	STATE_2PARAM_2,
69 	STATE_SYSEX_0,
70 	STATE_SYSEX_1,
71 	STATE_SYSEX_2,
72 	STATE_REAL_TIME,
73 	STATE_FINISHED,		/* pseudo state */
74 };
75 
76 /* Resources for UMP Endpoint */
77 struct f_midi2_ep {
78 	struct snd_ump_endpoint *ump;	/* assigned UMP EP */
79 	struct f_midi2 *card;		/* belonging MIDI 2.0 device */
80 
81 	struct f_midi2_ep_info info;	/* UMP EP info, copied from configfs */
82 	unsigned int num_blks;		/* number of FBs */
83 	struct f_midi2_block blks[SNDRV_UMP_MAX_BLOCKS];	/* UMP FBs */
84 
85 	struct f_midi2_usb_ep ep_in;	/* USB MIDI EP-in */
86 	struct f_midi2_usb_ep ep_out;	/* USB MIDI EP-out */
87 
88 	u8 in_group_to_cable[SNDRV_UMP_MAX_GROUPS]; /* map to cable; 1-based! */
89 };
90 
91 /* indices for USB strings */
92 enum {
93 	STR_IFACE = 0,
94 	STR_GTB1 = 1,
95 };
96 
97 /* 1-based GTB id to string id */
98 #define gtb_to_str_id(id)	(STR_GTB1 + (id) - 1)
99 
100 /* mapping from MIDI 1.0 cable to UMP group */
101 struct midi1_cable_mapping {
102 	struct f_midi2_ep *ep;
103 	unsigned char block;
104 	unsigned char group;
105 };
106 
107 /* operation mode */
108 enum {
109 	MIDI_OP_MODE_UNSET,	/* no altset set yet */
110 	MIDI_OP_MODE_MIDI1,	/* MIDI 1.0 (altset 0) is used */
111 	MIDI_OP_MODE_MIDI2,	/* MIDI 2.0 (altset 1) is used */
112 };
113 
114 /* Resources for MIDI 2.0 Device */
115 struct f_midi2 {
116 	struct usb_function func;
117 	struct usb_gadget *gadget;
118 	struct snd_card *card;
119 
120 	/* MIDI 1.0 in/out USB EPs */
121 	struct f_midi2_usb_ep midi1_ep_in;
122 	struct f_midi2_usb_ep midi1_ep_out;
123 
124 	/* number of MIDI 1.0 I/O cables */
125 	unsigned int num_midi1_in;
126 	unsigned int num_midi1_out;
127 
128 	/* conversion for MIDI 1.0 EP-in */
129 	struct f_midi2_midi1_port midi1_port[MAX_CABLES];
130 	/* conversion for MIDI 1.0 EP-out */
131 	struct ump_cvt_to_ump midi1_ump_cvt;
132 	/* mapping between cables and UMP groups */
133 	struct midi1_cable_mapping in_cable_mapping[MAX_CABLES];
134 	struct midi1_cable_mapping out_cable_mapping[MAX_CABLES];
135 
136 	int midi_if;			/* USB MIDI interface number */
137 	int operation_mode;		/* current operation mode */
138 
139 	spinlock_t queue_lock;
140 
141 	struct f_midi2_card_info info;	/* card info, copied from configfs */
142 
143 	unsigned int num_eps;
144 	struct f_midi2_ep midi2_eps[MAX_UMP_EPS];
145 
146 	unsigned int total_blocks;	/* total number of blocks of all EPs */
147 	struct usb_string *string_defs;
148 	struct usb_string *strings;
149 };
150 
151 #define func_to_midi2(f)	container_of(f, struct f_midi2, func)
152 
153 /* convert from MIDI protocol number (1 or 2) to SNDRV_UMP_EP_INFO_PROTO_* */
154 #define to_ump_protocol(v)	(((v) & 3) << 8)
155 
156 /* get EP name string */
ump_ep_name(const struct f_midi2_ep * ep)157 static const char *ump_ep_name(const struct f_midi2_ep *ep)
158 {
159 	return ep->info.ep_name ? ep->info.ep_name : "MIDI 2.0 Gadget";
160 }
161 
162 /* get EP product ID string */
ump_product_id(const struct f_midi2_ep * ep)163 static const char *ump_product_id(const struct f_midi2_ep *ep)
164 {
165 	return ep->info.product_id ? ep->info.product_id : "Unique Product ID";
166 }
167 
168 /* get FB name string */
ump_fb_name(const struct f_midi2_block_info * info)169 static const char *ump_fb_name(const struct f_midi2_block_info *info)
170 {
171 	return info->name ? info->name : "MIDI 2.0 Gadget I/O";
172 }
173 
174 /*
175  * USB Descriptor Definitions
176  */
177 /* GTB header descriptor */
178 static struct usb_ms20_gr_trm_block_header_descriptor gtb_header_desc = {
179 	.bLength =		sizeof(gtb_header_desc),
180 	.bDescriptorType =	USB_DT_CS_GR_TRM_BLOCK,
181 	.bDescriptorSubtype =	USB_MS_GR_TRM_BLOCK_HEADER,
182 	.wTotalLength =		__cpu_to_le16(0x12), // to be filled
183 };
184 
185 /* GTB descriptor template: most items are replaced dynamically */
186 static struct usb_ms20_gr_trm_block_descriptor gtb_desc = {
187 	.bLength =		sizeof(gtb_desc),
188 	.bDescriptorType =	USB_DT_CS_GR_TRM_BLOCK,
189 	.bDescriptorSubtype =	USB_MS_GR_TRM_BLOCK,
190 	.bGrpTrmBlkID =		0x01,
191 	.bGrpTrmBlkType =	USB_MS_GR_TRM_BLOCK_TYPE_BIDIRECTIONAL,
192 	.nGroupTrm =		0x00,
193 	.nNumGroupTrm =		1,
194 	.iBlockItem =		0,
195 	.bMIDIProtocol =	USB_MS_MIDI_PROTO_1_0_64,
196 	.wMaxInputBandwidth =	0,
197 	.wMaxOutputBandwidth =	0,
198 };
199 
200 DECLARE_USB_MIDI_OUT_JACK_DESCRIPTOR(1);
201 DECLARE_USB_MS_ENDPOINT_DESCRIPTOR(16);
202 DECLARE_UAC_AC_HEADER_DESCRIPTOR(1);
203 DECLARE_USB_MS20_ENDPOINT_DESCRIPTOR(32);
204 
205 #define EP_MAX_PACKET_INT	8
206 
207 /* Audio Control Interface */
208 static struct usb_interface_descriptor midi2_audio_if_desc = {
209 	.bLength =		USB_DT_INTERFACE_SIZE,
210 	.bDescriptorType =	USB_DT_INTERFACE,
211 	.bInterfaceNumber =	0, // to be filled
212 	.bNumEndpoints =	0,
213 	.bInterfaceClass =	USB_CLASS_AUDIO,
214 	.bInterfaceSubClass =	USB_SUBCLASS_AUDIOCONTROL,
215 	.bInterfaceProtocol =	0,
216 	.iInterface =		0,
217 };
218 
219 static struct uac1_ac_header_descriptor_1 midi2_audio_class_desc = {
220 	.bLength =		0x09,
221 	.bDescriptorType =	USB_DT_CS_INTERFACE,
222 	.bDescriptorSubtype =	0x01,
223 	.bcdADC =		__cpu_to_le16(0x0100),
224 	.wTotalLength =		__cpu_to_le16(0x0009),
225 	.bInCollection =	0x01,
226 	.baInterfaceNr =	{ 0x01 }, // to be filled
227 };
228 
229 /* MIDI 1.0 Streaming Interface (altset 0) */
230 static struct usb_interface_descriptor midi2_midi1_if_desc = {
231 	.bLength =		USB_DT_INTERFACE_SIZE,
232 	.bDescriptorType =	USB_DT_INTERFACE,
233 	.bInterfaceNumber =	0, // to be filled
234 	.bAlternateSetting =	0,
235 	.bNumEndpoints =	2, // to be filled
236 	.bInterfaceClass =	USB_CLASS_AUDIO,
237 	.bInterfaceSubClass =	USB_SUBCLASS_MIDISTREAMING,
238 	.bInterfaceProtocol =	0,
239 	.iInterface =		0, // to be filled
240 };
241 
242 static struct usb_ms_header_descriptor midi2_midi1_class_desc = {
243 	.bLength =		0x07,
244 	.bDescriptorType =	USB_DT_CS_INTERFACE,
245 	.bDescriptorSubtype =	USB_MS_HEADER,
246 	.bcdMSC =		__cpu_to_le16(0x0100),
247 	.wTotalLength =		__cpu_to_le16(0x41), // to be calculated
248 };
249 
250 /* MIDI 1.0 EP OUT */
251 static struct usb_endpoint_descriptor midi2_midi1_ep_out_desc = {
252 	.bLength =		USB_DT_ENDPOINT_AUDIO_SIZE,
253 	.bDescriptorType =	USB_DT_ENDPOINT,
254 	.bEndpointAddress =	USB_DIR_OUT | 0, // set up dynamically
255 	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
256 };
257 
258 static struct usb_ss_ep_comp_descriptor midi2_midi1_ep_out_ss_comp_desc = {
259 	.bLength                = sizeof(midi2_midi1_ep_out_ss_comp_desc),
260 	.bDescriptorType        = USB_DT_SS_ENDPOINT_COMP,
261 };
262 
263 static struct usb_ms_endpoint_descriptor_16 midi2_midi1_ep_out_class_desc = {
264 	.bLength =		0x05, // to be filled
265 	.bDescriptorType =	USB_DT_CS_ENDPOINT,
266 	.bDescriptorSubtype =	USB_MS_GENERAL,
267 	.bNumEmbMIDIJack =	1,
268 	.baAssocJackID =	{ 0x01 },
269 };
270 
271 /* MIDI 1.0 EP IN */
272 static struct usb_endpoint_descriptor midi2_midi1_ep_in_desc = {
273 	.bLength =		USB_DT_ENDPOINT_AUDIO_SIZE,
274 	.bDescriptorType =	USB_DT_ENDPOINT,
275 	.bEndpointAddress =	USB_DIR_IN | 0, // set up dynamically
276 	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
277 };
278 
279 static struct usb_ss_ep_comp_descriptor midi2_midi1_ep_in_ss_comp_desc = {
280 	.bLength                = sizeof(midi2_midi1_ep_in_ss_comp_desc),
281 	.bDescriptorType        = USB_DT_SS_ENDPOINT_COMP,
282 };
283 
284 static struct usb_ms_endpoint_descriptor_16 midi2_midi1_ep_in_class_desc = {
285 	.bLength =		0x05, // to be filled
286 	.bDescriptorType =	USB_DT_CS_ENDPOINT,
287 	.bDescriptorSubtype =	USB_MS_GENERAL,
288 	.bNumEmbMIDIJack =	1,
289 	.baAssocJackID =	{ 0x03 },
290 };
291 
292 /* MIDI 2.0 Streaming Interface (altset 1) */
293 static struct usb_interface_descriptor midi2_midi2_if_desc = {
294 	.bLength =		USB_DT_INTERFACE_SIZE,
295 	.bDescriptorType =	USB_DT_INTERFACE,
296 	.bInterfaceNumber =	0, // to be filled
297 	.bAlternateSetting =	1,
298 	.bNumEndpoints =	2, // to be filled
299 	.bInterfaceClass =	USB_CLASS_AUDIO,
300 	.bInterfaceSubClass =	USB_SUBCLASS_MIDISTREAMING,
301 	.bInterfaceProtocol =	0,
302 	.iInterface =		0, // to be filled
303 };
304 
305 static struct usb_ms_header_descriptor midi2_midi2_class_desc = {
306 	.bLength =		0x07,
307 	.bDescriptorType =	USB_DT_CS_INTERFACE,
308 	.bDescriptorSubtype =	USB_MS_HEADER,
309 	.bcdMSC =		__cpu_to_le16(0x0200),
310 	.wTotalLength =		__cpu_to_le16(0x07),
311 };
312 
313 /* MIDI 2.0 EP OUT */
314 static struct usb_endpoint_descriptor midi2_midi2_ep_out_desc[MAX_UMP_EPS];
315 
316 static struct usb_ss_ep_comp_descriptor midi2_midi2_ep_out_ss_comp_desc = {
317 	.bLength                = sizeof(midi2_midi1_ep_out_ss_comp_desc),
318 	.bDescriptorType        = USB_DT_SS_ENDPOINT_COMP,
319 };
320 
321 static struct usb_ms20_endpoint_descriptor_32 midi2_midi2_ep_out_class_desc[MAX_UMP_EPS];
322 
323 /* MIDI 2.0 EP IN */
324 static struct usb_endpoint_descriptor midi2_midi2_ep_in_desc[MAX_UMP_EPS];
325 
326 static struct usb_ss_ep_comp_descriptor midi2_midi2_ep_in_ss_comp_desc = {
327 	.bLength                = sizeof(midi2_midi2_ep_in_ss_comp_desc),
328 	.bDescriptorType        = USB_DT_SS_ENDPOINT_COMP,
329 };
330 
331 static struct usb_ms20_endpoint_descriptor_32 midi2_midi2_ep_in_class_desc[MAX_UMP_EPS];
332 
333 /* Arrays of descriptors to be created */
334 static void *midi2_audio_descs[] = {
335 	&midi2_audio_if_desc,
336 	&midi2_audio_class_desc,
337 	NULL
338 };
339 
340 static void *midi2_midi1_descs[] = {
341 	&midi2_midi1_if_desc,
342 	&midi2_midi1_class_desc,
343 	NULL
344 };
345 
346 static void *midi2_midi1_ep_out_descs[] = {
347 	&midi2_midi1_ep_out_desc,
348 	&midi2_midi1_ep_out_class_desc,
349 	NULL
350 };
351 
352 static void *midi2_midi1_ep_in_descs[] = {
353 	&midi2_midi1_ep_in_desc,
354 	&midi2_midi1_ep_in_class_desc,
355 	NULL
356 };
357 
358 static void *midi2_midi1_ep_out_ss_descs[] = {
359 	&midi2_midi1_ep_out_desc,
360 	&midi2_midi1_ep_out_ss_comp_desc,
361 	&midi2_midi1_ep_out_class_desc,
362 	NULL
363 };
364 
365 static void *midi2_midi1_ep_in_ss_descs[] = {
366 	&midi2_midi1_ep_in_desc,
367 	&midi2_midi1_ep_in_ss_comp_desc,
368 	&midi2_midi1_ep_in_class_desc,
369 	NULL
370 };
371 
372 static void *midi2_midi2_descs[] = {
373 	&midi2_midi2_if_desc,
374 	&midi2_midi2_class_desc,
375 	NULL
376 };
377 
378 /*
379  * USB request handling
380  */
381 
382 /* get an empty request for the given EP */
get_empty_request(struct f_midi2_usb_ep * usb_ep)383 static struct usb_request *get_empty_request(struct f_midi2_usb_ep *usb_ep)
384 {
385 	struct usb_request *req = NULL;
386 	unsigned long flags;
387 	int index;
388 
389 	spin_lock_irqsave(&usb_ep->card->queue_lock, flags);
390 	if (!usb_ep->free_reqs)
391 		goto unlock;
392 	index = find_first_bit(&usb_ep->free_reqs, usb_ep->num_reqs);
393 	if (index >= usb_ep->num_reqs)
394 		goto unlock;
395 	req = usb_ep->reqs[index].req;
396 	if (!req)
397 		goto unlock;
398 	clear_bit(index, &usb_ep->free_reqs);
399 	req->length = 0;
400  unlock:
401 	spin_unlock_irqrestore(&usb_ep->card->queue_lock, flags);
402 	return req;
403 }
404 
405 /* put the empty request back */
put_empty_request(struct usb_request * req)406 static void put_empty_request(struct usb_request *req)
407 {
408 	struct f_midi2_req_ctx *ctx = req->context;
409 	unsigned long flags;
410 
411 	spin_lock_irqsave(&ctx->usb_ep->card->queue_lock, flags);
412 	set_bit(ctx->index, &ctx->usb_ep->free_reqs);
413 	spin_unlock_irqrestore(&ctx->usb_ep->card->queue_lock, flags);
414 }
415 
416 /*
417  * UMP v1.1 Stream message handling
418  */
419 
420 /* queue a request to UMP EP; request is either queued or freed after this */
queue_request_ep_raw(struct usb_request * req)421 static int queue_request_ep_raw(struct usb_request *req)
422 {
423 	struct f_midi2_req_ctx *ctx = req->context;
424 	int err;
425 
426 	req->complete = ctx->usb_ep->complete;
427 	err = usb_ep_queue(ctx->usb_ep->usb_ep, req, GFP_ATOMIC);
428 	if (err) {
429 		put_empty_request(req);
430 		return err;
431 	}
432 	return 0;
433 }
434 
435 /* queue a request with endianness conversion */
queue_request_ep_in(struct usb_request * req)436 static int queue_request_ep_in(struct usb_request *req)
437 {
438 	/* UMP packets have to be converted to little-endian */
439 	cpu_to_le32_array((u32 *)req->buf, req->length >> 2);
440 	return queue_request_ep_raw(req);
441 }
442 
443 /* reply a UMP packet via EP-in */
reply_ep_in(struct f_midi2_ep * ep,const void * buf,int len)444 static int reply_ep_in(struct f_midi2_ep *ep, const void *buf, int len)
445 {
446 	struct f_midi2_usb_ep *usb_ep = &ep->ep_in;
447 	struct usb_request *req;
448 
449 	req = get_empty_request(usb_ep);
450 	if (!req)
451 		return -ENOSPC;
452 
453 	req->length = len;
454 	memcpy(req->buf, buf, len);
455 	return queue_request_ep_in(req);
456 }
457 
458 /* reply a UMP stream EP info */
reply_ump_stream_ep_info(struct f_midi2_ep * ep)459 static void reply_ump_stream_ep_info(struct f_midi2_ep *ep)
460 {
461 	struct snd_ump_stream_msg_ep_info rep = {
462 		.type = UMP_MSG_TYPE_STREAM,
463 		.status = UMP_STREAM_MSG_STATUS_EP_INFO,
464 		.ump_version_major = 0x01,
465 		.ump_version_minor = 0x01,
466 		.num_function_blocks = ep->num_blks,
467 		.static_function_block = !!ep->card->info.static_block,
468 		.protocol = (UMP_STREAM_MSG_EP_INFO_CAP_MIDI1 |
469 			     UMP_STREAM_MSG_EP_INFO_CAP_MIDI2) >> 8,
470 	};
471 
472 	reply_ep_in(ep, &rep, sizeof(rep));
473 }
474 
475 /* reply a UMP EP device info */
reply_ump_stream_ep_device(struct f_midi2_ep * ep)476 static void reply_ump_stream_ep_device(struct f_midi2_ep *ep)
477 {
478 	struct snd_ump_stream_msg_devince_info rep = {
479 		.type = UMP_MSG_TYPE_STREAM,
480 		.status = UMP_STREAM_MSG_STATUS_DEVICE_INFO,
481 		.manufacture_id = ep->info.manufacturer,
482 		.family_lsb = ep->info.family & 0xff,
483 		.family_msb = (ep->info.family >> 8) & 0xff,
484 		.model_lsb = ep->info.model & 0xff,
485 		.model_msb = (ep->info.model >> 8) & 0xff,
486 		.sw_revision = ep->info.sw_revision,
487 	};
488 
489 	reply_ep_in(ep, &rep, sizeof(rep));
490 }
491 
492 #define UMP_STREAM_PKT_BYTES	16	/* UMP stream packet size = 16 bytes*/
493 #define UMP_STREAM_EP_STR_OFF	2	/* offset of name string for EP info */
494 #define UMP_STREAM_FB_STR_OFF	3	/* offset of name string for FB info */
495 
496 /* Helper to replay a string */
reply_ump_stream_string(struct f_midi2_ep * ep,const u8 * name,unsigned int type,unsigned int extra,unsigned int start_ofs)497 static void reply_ump_stream_string(struct f_midi2_ep *ep, const u8 *name,
498 				    unsigned int type, unsigned int extra,
499 				    unsigned int start_ofs)
500 {
501 	struct f_midi2_usb_ep *usb_ep = &ep->ep_in;
502 	struct f_midi2 *midi2 = ep->card;
503 	struct usb_request *req;
504 	unsigned int pos;
505 	u32 *buf;
506 
507 	if (!*name)
508 		return;
509 	req = get_empty_request(usb_ep);
510 	if (!req)
511 		return;
512 
513 	buf = (u32 *)req->buf;
514 	pos = start_ofs;
515 	for (;;) {
516 		if (pos == start_ofs) {
517 			memset(buf, 0, UMP_STREAM_PKT_BYTES);
518 			buf[0] = ump_stream_compose(type, 0) | extra;
519 		}
520 		buf[pos / 4] |= *name++ << ((3 - (pos % 4)) * 8);
521 		if (!*name) {
522 			if (req->length)
523 				buf[0] |= UMP_STREAM_MSG_FORMAT_END << 26;
524 			req->length += UMP_STREAM_PKT_BYTES;
525 			break;
526 		}
527 		if (++pos == UMP_STREAM_PKT_BYTES) {
528 			if (!req->length)
529 				buf[0] |= UMP_STREAM_MSG_FORMAT_START << 26;
530 			else
531 				buf[0] |= UMP_STREAM_MSG_FORMAT_CONTINUE << 26;
532 			req->length += UMP_STREAM_PKT_BYTES;
533 			if (midi2->info.req_buf_size - req->length < UMP_STREAM_PKT_BYTES)
534 				break;
535 			buf += 4;
536 			pos = start_ofs;
537 		}
538 	}
539 
540 	if (req->length)
541 		queue_request_ep_in(req);
542 	else
543 		put_empty_request(req);
544 }
545 
546 /* Reply a UMP EP name string */
reply_ump_stream_ep_name(struct f_midi2_ep * ep)547 static void reply_ump_stream_ep_name(struct f_midi2_ep *ep)
548 {
549 	reply_ump_stream_string(ep, ump_ep_name(ep),
550 				UMP_STREAM_MSG_STATUS_EP_NAME, 0,
551 				UMP_STREAM_EP_STR_OFF);
552 }
553 
554 /* Reply a UMP EP product ID string */
reply_ump_stream_ep_pid(struct f_midi2_ep * ep)555 static void reply_ump_stream_ep_pid(struct f_midi2_ep *ep)
556 {
557 	reply_ump_stream_string(ep, ump_product_id(ep),
558 				UMP_STREAM_MSG_STATUS_PRODUCT_ID, 0,
559 				UMP_STREAM_EP_STR_OFF);
560 }
561 
562 /* Reply a UMP EP stream config */
reply_ump_stream_ep_config(struct f_midi2_ep * ep)563 static void reply_ump_stream_ep_config(struct f_midi2_ep *ep)
564 {
565 	struct snd_ump_stream_msg_stream_cfg rep = {
566 		.type = UMP_MSG_TYPE_STREAM,
567 		.status = UMP_STREAM_MSG_STATUS_STREAM_CFG,
568 	};
569 
570 	if (ep->info.protocol == 2)
571 		rep.protocol = UMP_STREAM_MSG_EP_INFO_CAP_MIDI2 >> 8;
572 	else
573 		rep.protocol = UMP_STREAM_MSG_EP_INFO_CAP_MIDI1 >> 8;
574 
575 	reply_ep_in(ep, &rep, sizeof(rep));
576 }
577 
578 /* Reply a UMP FB info */
reply_ump_stream_fb_info(struct f_midi2_ep * ep,int blk)579 static void reply_ump_stream_fb_info(struct f_midi2_ep *ep, int blk)
580 {
581 	struct f_midi2_block_info *b = &ep->blks[blk].info;
582 	struct snd_ump_stream_msg_fb_info rep = {
583 		.type = UMP_MSG_TYPE_STREAM,
584 		.status = UMP_STREAM_MSG_STATUS_FB_INFO,
585 		.active = !!b->active,
586 		.function_block_id = blk,
587 		.ui_hint = b->ui_hint,
588 		.midi_10 = b->is_midi1,
589 		.direction = b->direction,
590 		.first_group = b->first_group,
591 		.num_groups = b->num_groups,
592 		.midi_ci_version = b->midi_ci_version,
593 		.sysex8_streams = b->sysex8_streams,
594 	};
595 
596 	reply_ep_in(ep, &rep, sizeof(rep));
597 }
598 
599 /* Reply a FB name string */
reply_ump_stream_fb_name(struct f_midi2_ep * ep,unsigned int blk)600 static void reply_ump_stream_fb_name(struct f_midi2_ep *ep, unsigned int blk)
601 {
602 	reply_ump_stream_string(ep, ump_fb_name(&ep->blks[blk].info),
603 				UMP_STREAM_MSG_STATUS_FB_NAME, blk << 8,
604 				UMP_STREAM_FB_STR_OFF);
605 }
606 
607 /* Process a UMP Stream message */
process_ump_stream_msg(struct f_midi2_ep * ep,const u32 * data)608 static void process_ump_stream_msg(struct f_midi2_ep *ep, const u32 *data)
609 {
610 	struct f_midi2 *midi2 = ep->card;
611 	unsigned int format, status, blk;
612 
613 	format = ump_stream_message_format(*data);
614 	status = ump_stream_message_status(*data);
615 	switch (status) {
616 	case UMP_STREAM_MSG_STATUS_EP_DISCOVERY:
617 		if (format)
618 			return; // invalid
619 		if (data[1] & UMP_STREAM_MSG_REQUEST_EP_INFO)
620 			reply_ump_stream_ep_info(ep);
621 		if (data[1] & UMP_STREAM_MSG_REQUEST_DEVICE_INFO)
622 			reply_ump_stream_ep_device(ep);
623 		if (data[1] & UMP_STREAM_MSG_REQUEST_EP_NAME)
624 			reply_ump_stream_ep_name(ep);
625 		if (data[1] & UMP_STREAM_MSG_REQUEST_PRODUCT_ID)
626 			reply_ump_stream_ep_pid(ep);
627 		if (data[1] & UMP_STREAM_MSG_REQUEST_STREAM_CFG)
628 			reply_ump_stream_ep_config(ep);
629 		return;
630 	case UMP_STREAM_MSG_STATUS_STREAM_CFG_REQUEST:
631 		if (*data & UMP_STREAM_MSG_EP_INFO_CAP_MIDI2) {
632 			ep->info.protocol = 2;
633 			DBG(midi2, "Switching Protocol to MIDI2\n");
634 		} else {
635 			ep->info.protocol = 1;
636 			DBG(midi2, "Switching Protocol to MIDI1\n");
637 		}
638 		snd_ump_switch_protocol(ep->ump, to_ump_protocol(ep->info.protocol));
639 		reply_ump_stream_ep_config(ep);
640 		return;
641 	case UMP_STREAM_MSG_STATUS_FB_DISCOVERY:
642 		if (format)
643 			return; // invalid
644 		blk = (*data >> 8) & 0xff;
645 		if (blk == 0xff) {
646 			/* inquiry for all blocks */
647 			for (blk = 0; blk < ep->num_blks; blk++) {
648 				if (*data & UMP_STREAM_MSG_REQUEST_FB_INFO)
649 					reply_ump_stream_fb_info(ep, blk);
650 				if (*data & UMP_STREAM_MSG_REQUEST_FB_NAME)
651 					reply_ump_stream_fb_name(ep, blk);
652 			}
653 		} else if (blk < ep->num_blks) {
654 			/* only the specified block */
655 			if (*data & UMP_STREAM_MSG_REQUEST_FB_INFO)
656 				reply_ump_stream_fb_info(ep, blk);
657 			if (*data & UMP_STREAM_MSG_REQUEST_FB_NAME)
658 				reply_ump_stream_fb_name(ep, blk);
659 		}
660 		return;
661 	}
662 }
663 
664 /* Process UMP messages included in a USB request */
process_ump(struct f_midi2_ep * ep,const struct usb_request * req)665 static void process_ump(struct f_midi2_ep *ep, const struct usb_request *req)
666 {
667 	const u32 *data = (u32 *)req->buf;
668 	int len = req->actual >> 2;
669 	const u32 *in_buf = ep->ump->input_buf;
670 
671 	for (; len > 0; len--, data++) {
672 		if (snd_ump_receive_ump_val(ep->ump, *data) <= 0)
673 			continue;
674 		if (ump_message_type(*in_buf) == UMP_MSG_TYPE_STREAM)
675 			process_ump_stream_msg(ep, in_buf);
676 	}
677 }
678 
679 /*
680  * MIDI 2.0 UMP USB request handling
681  */
682 
683 /* complete handler for UMP EP-out requests */
f_midi2_ep_out_complete(struct usb_ep * usb_ep,struct usb_request * req)684 static void f_midi2_ep_out_complete(struct usb_ep *usb_ep,
685 				    struct usb_request *req)
686 {
687 	struct f_midi2_req_ctx *ctx = req->context;
688 	struct f_midi2_ep *ep = ctx->usb_ep->ep;
689 	struct f_midi2 *midi2 = ep->card;
690 	int status = req->status;
691 
692 	if (status) {
693 		DBG(midi2, "%s complete error %d: %d/%d\n",
694 		    usb_ep->name, status, req->actual, req->length);
695 		goto error;
696 	}
697 
698 	/* convert to UMP packet in native endianness */
699 	le32_to_cpu_array((u32 *)req->buf, req->actual >> 2);
700 
701 	if (midi2->info.process_ump)
702 		process_ump(ep, req);
703 
704 	snd_ump_receive(ep->ump, req->buf, req->actual & ~3);
705 
706 	if (midi2->operation_mode != MIDI_OP_MODE_MIDI2)
707 		goto error;
708 
709 	if (queue_request_ep_raw(req))
710 		goto error;
711 	return;
712 
713  error:
714 	put_empty_request(req);
715 }
716 
717 /* Transmit UMP packets received from user-space to the gadget */
process_ump_transmit(struct f_midi2_ep * ep)718 static void process_ump_transmit(struct f_midi2_ep *ep)
719 {
720 	struct f_midi2_usb_ep *usb_ep = &ep->ep_in;
721 	struct f_midi2 *midi2 = ep->card;
722 	struct usb_request *req;
723 	int len;
724 
725 	if (!usb_ep->usb_ep->enabled)
726 		return;
727 
728 	for (;;) {
729 		req = get_empty_request(usb_ep);
730 		if (!req)
731 			break;
732 		len = snd_ump_transmit(ep->ump, (u32 *)req->buf,
733 				       midi2->info.req_buf_size);
734 		if (len <= 0) {
735 			put_empty_request(req);
736 			break;
737 		}
738 
739 		req->length = len;
740 		if (queue_request_ep_in(req) < 0)
741 			break;
742 	}
743 }
744 
745 /* Complete handler for UMP EP-in requests */
f_midi2_ep_in_complete(struct usb_ep * usb_ep,struct usb_request * req)746 static void f_midi2_ep_in_complete(struct usb_ep *usb_ep,
747 				   struct usb_request *req)
748 {
749 	struct f_midi2_req_ctx *ctx = req->context;
750 	struct f_midi2_ep *ep = ctx->usb_ep->ep;
751 	struct f_midi2 *midi2 = ep->card;
752 	int status = req->status;
753 
754 	put_empty_request(req);
755 
756 	if (status) {
757 		DBG(midi2, "%s complete error %d: %d/%d\n",
758 		    usb_ep->name, status, req->actual, req->length);
759 		return;
760 	}
761 
762 	process_ump_transmit(ep);
763 }
764 
765 /*
766  * MIDI1 (altset 0) USB request handling
767  */
768 
769 /* process one MIDI byte -- copied from f_midi.c
770  *
771  * fill the packet or request if needed
772  * returns true if the request became empty (queued)
773  */
process_midi1_byte(struct f_midi2 * midi2,u8 cable,u8 b,struct usb_request ** req_p)774 static bool process_midi1_byte(struct f_midi2 *midi2, u8 cable, u8 b,
775 			       struct usb_request **req_p)
776 {
777 	struct f_midi2_midi1_port *port = &midi2->midi1_port[cable];
778 	u8 p[4] = { cable << 4, 0, 0, 0 };
779 	int next_state = STATE_INITIAL;
780 	struct usb_request *req = *req_p;
781 
782 	switch (b) {
783 	case 0xf8 ... 0xff:
784 		/* System Real-Time Messages */
785 		p[0] |= 0x0f;
786 		p[1] = b;
787 		next_state = port->state;
788 		port->state = STATE_REAL_TIME;
789 		break;
790 
791 	case 0xf7:
792 		/* End of SysEx */
793 		switch (port->state) {
794 		case STATE_SYSEX_0:
795 			p[0] |= 0x05;
796 			p[1] = 0xf7;
797 			next_state = STATE_FINISHED;
798 			break;
799 		case STATE_SYSEX_1:
800 			p[0] |= 0x06;
801 			p[1] = port->data[0];
802 			p[2] = 0xf7;
803 			next_state = STATE_FINISHED;
804 			break;
805 		case STATE_SYSEX_2:
806 			p[0] |= 0x07;
807 			p[1] = port->data[0];
808 			p[2] = port->data[1];
809 			p[3] = 0xf7;
810 			next_state = STATE_FINISHED;
811 			break;
812 		default:
813 			/* Ignore byte */
814 			next_state = port->state;
815 			port->state = STATE_INITIAL;
816 		}
817 		break;
818 
819 	case 0xf0 ... 0xf6:
820 		/* System Common Messages */
821 		port->data[0] = port->data[1] = 0;
822 		port->state = STATE_INITIAL;
823 		switch (b) {
824 		case 0xf0:
825 			port->data[0] = b;
826 			port->data[1] = 0;
827 			next_state = STATE_SYSEX_1;
828 			break;
829 		case 0xf1:
830 		case 0xf3:
831 			port->data[0] = b;
832 			next_state = STATE_1PARAM;
833 			break;
834 		case 0xf2:
835 			port->data[0] = b;
836 			next_state = STATE_2PARAM_1;
837 			break;
838 		case 0xf4:
839 		case 0xf5:
840 			next_state = STATE_INITIAL;
841 			break;
842 		case 0xf6:
843 			p[0] |= 0x05;
844 			p[1] = 0xf6;
845 			next_state = STATE_FINISHED;
846 			break;
847 		}
848 		break;
849 
850 	case 0x80 ... 0xef:
851 		/*
852 		 * Channel Voice Messages, Channel Mode Messages
853 		 * and Control Change Messages.
854 		 */
855 		port->data[0] = b;
856 		port->data[1] = 0;
857 		port->state = STATE_INITIAL;
858 		if (b >= 0xc0 && b <= 0xdf)
859 			next_state = STATE_1PARAM;
860 		else
861 			next_state = STATE_2PARAM_1;
862 		break;
863 
864 	case 0x00 ... 0x7f:
865 		/* Message parameters */
866 		switch (port->state) {
867 		case STATE_1PARAM:
868 			if (port->data[0] < 0xf0)
869 				p[0] |= port->data[0] >> 4;
870 			else
871 				p[0] |= 0x02;
872 
873 			p[1] = port->data[0];
874 			p[2] = b;
875 			/* This is to allow Running State Messages */
876 			next_state = STATE_1PARAM;
877 			break;
878 		case STATE_2PARAM_1:
879 			port->data[1] = b;
880 			next_state = STATE_2PARAM_2;
881 			break;
882 		case STATE_2PARAM_2:
883 			if (port->data[0] < 0xf0)
884 				p[0] |= port->data[0] >> 4;
885 			else
886 				p[0] |= 0x03;
887 
888 			p[1] = port->data[0];
889 			p[2] = port->data[1];
890 			p[3] = b;
891 			/* This is to allow Running State Messages */
892 			next_state = STATE_2PARAM_1;
893 			break;
894 		case STATE_SYSEX_0:
895 			port->data[0] = b;
896 			next_state = STATE_SYSEX_1;
897 			break;
898 		case STATE_SYSEX_1:
899 			port->data[1] = b;
900 			next_state = STATE_SYSEX_2;
901 			break;
902 		case STATE_SYSEX_2:
903 			p[0] |= 0x04;
904 			p[1] = port->data[0];
905 			p[2] = port->data[1];
906 			p[3] = b;
907 			next_state = STATE_SYSEX_0;
908 			break;
909 		}
910 		break;
911 	}
912 
913 	/* States where we have to write into the USB request */
914 	if (next_state == STATE_FINISHED ||
915 	    port->state == STATE_SYSEX_2 ||
916 	    port->state == STATE_1PARAM ||
917 	    port->state == STATE_2PARAM_2 ||
918 	    port->state == STATE_REAL_TIME) {
919 		memcpy(req->buf + req->length, p, sizeof(p));
920 		req->length += sizeof(p);
921 
922 		if (next_state == STATE_FINISHED) {
923 			next_state = STATE_INITIAL;
924 			port->data[0] = port->data[1] = 0;
925 		}
926 
927 		if (midi2->info.req_buf_size - req->length <= 4) {
928 			queue_request_ep_raw(req);
929 			*req_p = NULL;
930 			return true;
931 		}
932 	}
933 
934 	port->state = next_state;
935 	return false;
936 }
937 
938 /* process all pending MIDI bytes in the internal buffer;
939  * returns true if the request gets empty
940  * returns false if all have been processed
941  */
process_midi1_pending_buf(struct f_midi2 * midi2,struct usb_request ** req_p)942 static bool process_midi1_pending_buf(struct f_midi2 *midi2,
943 				      struct usb_request **req_p)
944 {
945 	unsigned int cable, c;
946 
947 	for (cable = 0; cable < midi2->num_midi1_in; cable++) {
948 		struct f_midi2_midi1_port *port = &midi2->midi1_port[cable];
949 
950 		if (!port->pending)
951 			continue;
952 		for (c = 0; c < port->pending; c++) {
953 			if (process_midi1_byte(midi2, cable, port->buf[c],
954 					       req_p)) {
955 				port->pending -= c;
956 				if (port->pending)
957 					memmove(port->buf, port->buf + c,
958 						port->pending);
959 				return true;
960 			}
961 		}
962 		port->pending = 0;
963 	}
964 
965 	return false;
966 }
967 
968 /* fill the MIDI bytes onto the temporary buffer
969  */
fill_midi1_pending_buf(struct f_midi2 * midi2,u8 cable,u8 * buf,unsigned int size)970 static void fill_midi1_pending_buf(struct f_midi2 *midi2, u8 cable, u8 *buf,
971 				   unsigned int size)
972 {
973 	struct f_midi2_midi1_port *port = &midi2->midi1_port[cable];
974 
975 	if (port->pending + size > sizeof(port->buf))
976 		return;
977 	memcpy(port->buf + port->pending, buf, size);
978 	port->pending += size;
979 }
980 
981 /* try to process data given from the associated UMP stream */
process_midi1_transmit(struct f_midi2 * midi2)982 static void process_midi1_transmit(struct f_midi2 *midi2)
983 {
984 	struct f_midi2_usb_ep *usb_ep = &midi2->midi1_ep_in;
985 	struct f_midi2_ep *ep = &midi2->midi2_eps[0];
986 	struct usb_request *req = NULL;
987 	/* 12 is the largest outcome (4 MIDI1 cmds) for a single UMP packet */
988 	unsigned char outbuf[12];
989 	unsigned char group, cable;
990 	int len, size;
991 	u32 ump;
992 
993 	if (!usb_ep->usb_ep || !usb_ep->usb_ep->enabled)
994 		return;
995 
996 	for (;;) {
997 		if (!req) {
998 			req = get_empty_request(usb_ep);
999 			if (!req)
1000 				break;
1001 		}
1002 
1003 		if (process_midi1_pending_buf(midi2, &req))
1004 			continue;
1005 
1006 		len = snd_ump_transmit(ep->ump, &ump, 4);
1007 		if (len <= 0)
1008 			break;
1009 		if (snd_ump_receive_ump_val(ep->ump, ump) <= 0)
1010 			continue;
1011 		size = snd_ump_convert_from_ump(ep->ump->input_buf, outbuf,
1012 						&group);
1013 		if (size <= 0)
1014 			continue;
1015 		cable = ep->in_group_to_cable[group];
1016 		if (!cable)
1017 			continue;
1018 		cable--; /* to 0-base */
1019 		fill_midi1_pending_buf(midi2, cable, outbuf, size);
1020 	}
1021 
1022 	if (req) {
1023 		if (req->length)
1024 			queue_request_ep_raw(req);
1025 		else
1026 			put_empty_request(req);
1027 	}
1028 }
1029 
1030 /* complete handler for MIDI1 EP-in requests */
f_midi2_midi1_ep_in_complete(struct usb_ep * usb_ep,struct usb_request * req)1031 static void f_midi2_midi1_ep_in_complete(struct usb_ep *usb_ep,
1032 					 struct usb_request *req)
1033 {
1034 	struct f_midi2_req_ctx *ctx = req->context;
1035 	struct f_midi2 *midi2 = ctx->usb_ep->card;
1036 	int status = req->status;
1037 
1038 	put_empty_request(req);
1039 
1040 	if (status) {
1041 		DBG(midi2, "%s complete error %d: %d/%d\n",
1042 		    usb_ep->name, status, req->actual, req->length);
1043 		return;
1044 	}
1045 
1046 	process_midi1_transmit(midi2);
1047 }
1048 
1049 /* complete handler for MIDI1 EP-out requests */
f_midi2_midi1_ep_out_complete(struct usb_ep * usb_ep,struct usb_request * req)1050 static void f_midi2_midi1_ep_out_complete(struct usb_ep *usb_ep,
1051 					  struct usb_request *req)
1052 {
1053 	struct f_midi2_req_ctx *ctx = req->context;
1054 	struct f_midi2 *midi2 = ctx->usb_ep->card;
1055 	struct f_midi2_ep *ep;
1056 	struct ump_cvt_to_ump *cvt = &midi2->midi1_ump_cvt;
1057 	static const u8 midi1_packet_bytes[16] = {
1058 		0, 0, 2, 3, 3, 1, 2, 3, 3, 3, 3, 3, 2, 2, 3, 1
1059 	};
1060 	unsigned int group, cable, bytes, c, len;
1061 	int status = req->status;
1062 	const u8 *buf = req->buf;
1063 
1064 	if (status) {
1065 		DBG(midi2, "%s complete error %d: %d/%d\n",
1066 		    usb_ep->name, status, req->actual, req->length);
1067 		goto error;
1068 	}
1069 
1070 	len = req->actual >> 2;
1071 	for (; len; len--, buf += 4) {
1072 		cable = *buf >> 4;
1073 		ep = midi2->out_cable_mapping[cable].ep;
1074 		if (!ep)
1075 			continue;
1076 		group = midi2->out_cable_mapping[cable].group;
1077 		bytes = midi1_packet_bytes[*buf & 0x0f];
1078 		for (c = 0; c < bytes; c++) {
1079 			snd_ump_convert_to_ump(cvt, group,
1080 					       to_ump_protocol(ep->info.protocol),
1081 					       buf[c + 1]);
1082 			if (cvt->ump_bytes) {
1083 				snd_ump_receive(ep->ump, cvt->ump,
1084 						cvt->ump_bytes);
1085 				cvt->ump_bytes = 0;
1086 			}
1087 		}
1088 	}
1089 
1090 	if (midi2->operation_mode != MIDI_OP_MODE_MIDI1)
1091 		goto error;
1092 
1093 	if (queue_request_ep_raw(req))
1094 		goto error;
1095 	return;
1096 
1097  error:
1098 	put_empty_request(req);
1099 }
1100 
1101 /*
1102  * Common EP handling helpers
1103  */
1104 
1105 /* Start MIDI EP */
f_midi2_start_ep(struct f_midi2_usb_ep * usb_ep,struct usb_function * fn)1106 static int f_midi2_start_ep(struct f_midi2_usb_ep *usb_ep,
1107 			    struct usb_function *fn)
1108 {
1109 	int err;
1110 
1111 	if (!usb_ep->usb_ep)
1112 		return 0;
1113 
1114 	usb_ep_disable(usb_ep->usb_ep);
1115 	err = config_ep_by_speed(usb_ep->card->gadget, fn, usb_ep->usb_ep);
1116 	if (err)
1117 		return err;
1118 	return usb_ep_enable(usb_ep->usb_ep);
1119 }
1120 
1121 /* Drop pending requests */
f_midi2_drop_reqs(struct f_midi2_usb_ep * usb_ep)1122 static void f_midi2_drop_reqs(struct f_midi2_usb_ep *usb_ep)
1123 {
1124 	int i;
1125 
1126 	if (!usb_ep->usb_ep || !usb_ep->num_reqs)
1127 		return;
1128 
1129 	for (i = 0; i < usb_ep->num_reqs; i++) {
1130 		if (!test_bit(i, &usb_ep->free_reqs) && usb_ep->reqs[i].req) {
1131 			usb_ep_dequeue(usb_ep->usb_ep, usb_ep->reqs[i].req);
1132 			set_bit(i, &usb_ep->free_reqs);
1133 		}
1134 	}
1135 }
1136 
1137 /* Allocate requests for the given EP */
f_midi2_alloc_ep_reqs(struct f_midi2_usb_ep * usb_ep)1138 static int f_midi2_alloc_ep_reqs(struct f_midi2_usb_ep *usb_ep)
1139 {
1140 	struct f_midi2 *midi2 = usb_ep->card;
1141 	int i;
1142 
1143 	if (!usb_ep->usb_ep)
1144 		return 0;
1145 	if (!usb_ep->reqs)
1146 		return -EINVAL;
1147 
1148 	for (i = 0; i < midi2->info.num_reqs; i++) {
1149 		if (usb_ep->reqs[i].req)
1150 			continue;
1151 		usb_ep->reqs[i].req = alloc_ep_req(usb_ep->usb_ep,
1152 						   midi2->info.req_buf_size);
1153 		if (!usb_ep->reqs[i].req)
1154 			return -ENOMEM;
1155 		usb_ep->reqs[i].req->context = &usb_ep->reqs[i];
1156 	}
1157 	return 0;
1158 }
1159 
1160 /* Free allocated requests */
f_midi2_free_ep_reqs(struct f_midi2_usb_ep * usb_ep)1161 static void f_midi2_free_ep_reqs(struct f_midi2_usb_ep *usb_ep)
1162 {
1163 	struct f_midi2 *midi2 = usb_ep->card;
1164 	int i;
1165 
1166 	for (i = 0; i < midi2->info.num_reqs; i++) {
1167 		if (!usb_ep->reqs[i].req)
1168 			continue;
1169 		free_ep_req(usb_ep->usb_ep, usb_ep->reqs[i].req);
1170 		usb_ep->reqs[i].req = NULL;
1171 	}
1172 }
1173 
1174 /* Initialize EP */
f_midi2_init_ep(struct f_midi2 * midi2,struct f_midi2_ep * ep,struct f_midi2_usb_ep * usb_ep,void * desc,void (* complete)(struct usb_ep * usb_ep,struct usb_request * req))1175 static int f_midi2_init_ep(struct f_midi2 *midi2, struct f_midi2_ep *ep,
1176 			   struct f_midi2_usb_ep *usb_ep,
1177 			   void *desc,
1178 			   void (*complete)(struct usb_ep *usb_ep,
1179 					    struct usb_request *req))
1180 {
1181 	int i;
1182 
1183 	usb_ep->card = midi2;
1184 	usb_ep->ep = ep;
1185 	usb_ep->usb_ep = usb_ep_autoconfig(midi2->gadget, desc);
1186 	if (!usb_ep->usb_ep)
1187 		return -ENODEV;
1188 	usb_ep->complete = complete;
1189 
1190 	usb_ep->reqs = kcalloc(midi2->info.num_reqs, sizeof(*usb_ep->reqs),
1191 			       GFP_KERNEL);
1192 	if (!usb_ep->reqs)
1193 		return -ENOMEM;
1194 	for (i = 0; i < midi2->info.num_reqs; i++) {
1195 		usb_ep->reqs[i].index = i;
1196 		usb_ep->reqs[i].usb_ep = usb_ep;
1197 		set_bit(i, &usb_ep->free_reqs);
1198 		usb_ep->num_reqs++;
1199 	}
1200 
1201 	return 0;
1202 }
1203 
1204 /* Free EP */
f_midi2_free_ep(struct f_midi2_usb_ep * usb_ep)1205 static void f_midi2_free_ep(struct f_midi2_usb_ep *usb_ep)
1206 {
1207 	f_midi2_drop_reqs(usb_ep);
1208 
1209 	f_midi2_free_ep_reqs(usb_ep);
1210 
1211 	kfree(usb_ep->reqs);
1212 	usb_ep->num_reqs = 0;
1213 	usb_ep->free_reqs = 0;
1214 	usb_ep->reqs = NULL;
1215 }
1216 
1217 /* Queue requests for EP-out at start */
f_midi2_queue_out_reqs(struct f_midi2_usb_ep * usb_ep)1218 static void f_midi2_queue_out_reqs(struct f_midi2_usb_ep *usb_ep)
1219 {
1220 	int i, err;
1221 
1222 	if (!usb_ep->usb_ep)
1223 		return;
1224 
1225 	for (i = 0; i < usb_ep->num_reqs; i++) {
1226 		if (!test_bit(i, &usb_ep->free_reqs) || !usb_ep->reqs[i].req)
1227 			continue;
1228 		usb_ep->reqs[i].req->complete = usb_ep->complete;
1229 		err = usb_ep_queue(usb_ep->usb_ep, usb_ep->reqs[i].req,
1230 				   GFP_ATOMIC);
1231 		if (!err)
1232 			clear_bit(i, &usb_ep->free_reqs);
1233 	}
1234 }
1235 
1236 /*
1237  * Gadget Function callbacks
1238  */
1239 
1240 /* stop both IN and OUT EPs */
f_midi2_stop_eps(struct f_midi2_usb_ep * ep_in,struct f_midi2_usb_ep * ep_out)1241 static void f_midi2_stop_eps(struct f_midi2_usb_ep *ep_in,
1242 			     struct f_midi2_usb_ep *ep_out)
1243 {
1244 	f_midi2_drop_reqs(ep_in);
1245 	f_midi2_drop_reqs(ep_out);
1246 	f_midi2_free_ep_reqs(ep_in);
1247 	f_midi2_free_ep_reqs(ep_out);
1248 }
1249 
1250 /* start/queue both IN and OUT EPs */
f_midi2_start_eps(struct f_midi2_usb_ep * ep_in,struct f_midi2_usb_ep * ep_out,struct usb_function * fn)1251 static int f_midi2_start_eps(struct f_midi2_usb_ep *ep_in,
1252 			     struct f_midi2_usb_ep *ep_out,
1253 			     struct usb_function *fn)
1254 {
1255 	int err;
1256 
1257 	err = f_midi2_start_ep(ep_in, fn);
1258 	if (err)
1259 		return err;
1260 	err = f_midi2_start_ep(ep_out, fn);
1261 	if (err)
1262 		return err;
1263 
1264 	err = f_midi2_alloc_ep_reqs(ep_in);
1265 	if (err)
1266 		return err;
1267 	err = f_midi2_alloc_ep_reqs(ep_out);
1268 	if (err)
1269 		return err;
1270 
1271 	f_midi2_queue_out_reqs(ep_out);
1272 	return 0;
1273 }
1274 
1275 /* gadget function set_alt callback */
f_midi2_set_alt(struct usb_function * fn,unsigned int intf,unsigned int alt)1276 static int f_midi2_set_alt(struct usb_function *fn, unsigned int intf,
1277 			   unsigned int alt)
1278 {
1279 	struct f_midi2 *midi2 = func_to_midi2(fn);
1280 	struct f_midi2_ep *ep;
1281 	int i, op_mode, err;
1282 
1283 	if (intf != midi2->midi_if || alt > 1)
1284 		return 0;
1285 
1286 	if (alt == 0)
1287 		op_mode = MIDI_OP_MODE_MIDI1;
1288 	else if (alt == 1)
1289 		op_mode = MIDI_OP_MODE_MIDI2;
1290 	else
1291 		op_mode = MIDI_OP_MODE_UNSET;
1292 
1293 	if (midi2->operation_mode == op_mode)
1294 		return 0;
1295 
1296 	midi2->operation_mode = op_mode;
1297 
1298 	if (op_mode != MIDI_OP_MODE_MIDI1)
1299 		f_midi2_stop_eps(&midi2->midi1_ep_in, &midi2->midi1_ep_out);
1300 
1301 	if (op_mode != MIDI_OP_MODE_MIDI2) {
1302 		for (i = 0; i < midi2->num_eps; i++) {
1303 			ep = &midi2->midi2_eps[i];
1304 			f_midi2_stop_eps(&ep->ep_in, &ep->ep_out);
1305 		}
1306 	}
1307 
1308 	if (op_mode == MIDI_OP_MODE_MIDI1)
1309 		return f_midi2_start_eps(&midi2->midi1_ep_in,
1310 					 &midi2->midi1_ep_out, fn);
1311 
1312 	if (op_mode == MIDI_OP_MODE_MIDI2) {
1313 		for (i = 0; i < midi2->num_eps; i++) {
1314 			ep = &midi2->midi2_eps[i];
1315 
1316 			err = f_midi2_start_eps(&ep->ep_in, &ep->ep_out, fn);
1317 			if (err)
1318 				return err;
1319 		}
1320 	}
1321 
1322 	return 0;
1323 }
1324 
1325 /* gadget function get_alt callback */
f_midi2_get_alt(struct usb_function * fn,unsigned int intf)1326 static int f_midi2_get_alt(struct usb_function *fn, unsigned int intf)
1327 {
1328 	struct f_midi2 *midi2 = func_to_midi2(fn);
1329 
1330 	if (intf == midi2->midi_if &&
1331 	    midi2->operation_mode == MIDI_OP_MODE_MIDI2)
1332 		return 1;
1333 	return 0;
1334 }
1335 
1336 /* convert UMP direction to USB MIDI 2.0 direction */
ump_to_usb_dir(unsigned int ump_dir)1337 static unsigned int ump_to_usb_dir(unsigned int ump_dir)
1338 {
1339 	switch (ump_dir) {
1340 	case SNDRV_UMP_DIR_INPUT:
1341 		return USB_MS_GR_TRM_BLOCK_TYPE_INPUT_ONLY;
1342 	case SNDRV_UMP_DIR_OUTPUT:
1343 		return USB_MS_GR_TRM_BLOCK_TYPE_OUTPUT_ONLY;
1344 	default:
1345 		return USB_MS_GR_TRM_BLOCK_TYPE_BIDIRECTIONAL;
1346 	}
1347 }
1348 
1349 /* assign GTB descriptors (for the given request) */
assign_block_descriptors(struct f_midi2 * midi2,struct usb_request * req,int max_len)1350 static void assign_block_descriptors(struct f_midi2 *midi2,
1351 				     struct usb_request *req,
1352 				     int max_len)
1353 {
1354 	struct usb_ms20_gr_trm_block_header_descriptor header;
1355 	struct usb_ms20_gr_trm_block_descriptor *desc;
1356 	struct f_midi2_block_info *b;
1357 	struct f_midi2_ep *ep;
1358 	int i, blk, len;
1359 	char *data;
1360 
1361 	len = sizeof(gtb_header_desc) + sizeof(gtb_desc) * midi2->total_blocks;
1362 	if (WARN_ON(len > midi2->info.req_buf_size))
1363 		return;
1364 
1365 	header = gtb_header_desc;
1366 	header.wTotalLength = cpu_to_le16(len);
1367 	if (max_len < len) {
1368 		len = min_t(int, len, sizeof(header));
1369 		memcpy(req->buf, &header, len);
1370 		req->length = len;
1371 		req->zero = len < max_len;
1372 		return;
1373 	}
1374 
1375 	memcpy(req->buf, &header, sizeof(header));
1376 	data = req->buf + sizeof(header);
1377 	for (i = 0; i < midi2->num_eps; i++) {
1378 		ep = &midi2->midi2_eps[i];
1379 		for (blk = 0; blk < ep->num_blks; blk++) {
1380 			b = &ep->blks[blk].info;
1381 			desc = (struct usb_ms20_gr_trm_block_descriptor *)data;
1382 
1383 			*desc = gtb_desc;
1384 			desc->bGrpTrmBlkID = ep->blks[blk].gtb_id;
1385 			desc->bGrpTrmBlkType = ump_to_usb_dir(b->direction);
1386 			desc->nGroupTrm = b->first_group;
1387 			desc->nNumGroupTrm = b->num_groups;
1388 			desc->iBlockItem = ep->blks[blk].string_id;
1389 
1390 			if (ep->info.protocol == 2)
1391 				desc->bMIDIProtocol = USB_MS_MIDI_PROTO_2_0;
1392 			else
1393 				desc->bMIDIProtocol = USB_MS_MIDI_PROTO_1_0_128;
1394 
1395 			if (b->is_midi1 == 2) {
1396 				desc->wMaxInputBandwidth = cpu_to_le16(1);
1397 				desc->wMaxOutputBandwidth = cpu_to_le16(1);
1398 			}
1399 
1400 			data += sizeof(*desc);
1401 		}
1402 	}
1403 
1404 	req->length = len;
1405 	req->zero = len < max_len;
1406 }
1407 
1408 /* gadget function setup callback: handle GTB requests */
f_midi2_setup(struct usb_function * fn,const struct usb_ctrlrequest * ctrl)1409 static int f_midi2_setup(struct usb_function *fn,
1410 			 const struct usb_ctrlrequest *ctrl)
1411 {
1412 	struct f_midi2 *midi2 = func_to_midi2(fn);
1413 	struct usb_composite_dev *cdev = fn->config->cdev;
1414 	struct usb_request *req = cdev->req;
1415 	u16 value, length;
1416 
1417 	if ((ctrl->bRequestType & USB_TYPE_MASK) != USB_TYPE_STANDARD ||
1418 	    ctrl->bRequest != USB_REQ_GET_DESCRIPTOR)
1419 		return -EOPNOTSUPP;
1420 
1421 	value = le16_to_cpu(ctrl->wValue);
1422 	length = le16_to_cpu(ctrl->wLength);
1423 
1424 	if ((value >> 8) != USB_DT_CS_GR_TRM_BLOCK)
1425 		return -EOPNOTSUPP;
1426 
1427 	/* handle only altset 1 */
1428 	if ((value & 0xff) != 1)
1429 		return -EOPNOTSUPP;
1430 
1431 	assign_block_descriptors(midi2, req, length);
1432 	return usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
1433 }
1434 
1435 /* gadget function disable callback */
f_midi2_disable(struct usb_function * fn)1436 static void f_midi2_disable(struct usb_function *fn)
1437 {
1438 	struct f_midi2 *midi2 = func_to_midi2(fn);
1439 
1440 	midi2->operation_mode = MIDI_OP_MODE_UNSET;
1441 }
1442 
1443 /*
1444  * ALSA UMP ops: most of them are NOPs, only trigger for write is needed
1445  */
f_midi2_ump_open(struct snd_ump_endpoint * ump,int dir)1446 static int f_midi2_ump_open(struct snd_ump_endpoint *ump, int dir)
1447 {
1448 	return 0;
1449 }
1450 
f_midi2_ump_close(struct snd_ump_endpoint * ump,int dir)1451 static void f_midi2_ump_close(struct snd_ump_endpoint *ump, int dir)
1452 {
1453 }
1454 
f_midi2_ump_trigger(struct snd_ump_endpoint * ump,int dir,int up)1455 static void f_midi2_ump_trigger(struct snd_ump_endpoint *ump, int dir, int up)
1456 {
1457 	struct f_midi2_ep *ep = ump->private_data;
1458 	struct f_midi2 *midi2 = ep->card;
1459 
1460 	if (up && dir == SNDRV_RAWMIDI_STREAM_OUTPUT) {
1461 		switch (midi2->operation_mode) {
1462 		case MIDI_OP_MODE_MIDI1:
1463 			process_midi1_transmit(midi2);
1464 			break;
1465 		case MIDI_OP_MODE_MIDI2:
1466 			process_ump_transmit(ep);
1467 			break;
1468 		}
1469 	}
1470 }
1471 
f_midi2_ump_drain(struct snd_ump_endpoint * ump,int dir)1472 static void f_midi2_ump_drain(struct snd_ump_endpoint *ump, int dir)
1473 {
1474 }
1475 
1476 static const struct snd_ump_ops f_midi2_ump_ops = {
1477 	.open = f_midi2_ump_open,
1478 	.close = f_midi2_ump_close,
1479 	.trigger = f_midi2_ump_trigger,
1480 	.drain = f_midi2_ump_drain,
1481 };
1482 
1483 /*
1484  * "Operation Mode" control element
1485  */
f_midi2_operation_mode_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)1486 static int f_midi2_operation_mode_info(struct snd_kcontrol *kcontrol,
1487 				       struct snd_ctl_elem_info *uinfo)
1488 {
1489 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1490 	uinfo->count = 1;
1491 	uinfo->value.integer.min = MIDI_OP_MODE_UNSET;
1492 	uinfo->value.integer.max = MIDI_OP_MODE_MIDI2;
1493 	return 0;
1494 }
1495 
f_midi2_operation_mode_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1496 static int f_midi2_operation_mode_get(struct snd_kcontrol *kcontrol,
1497 				      struct snd_ctl_elem_value *ucontrol)
1498 {
1499 	struct f_midi2 *midi2 = snd_kcontrol_chip(kcontrol);
1500 
1501 	ucontrol->value.integer.value[0] = midi2->operation_mode;
1502 	return 0;
1503 }
1504 
1505 static const struct snd_kcontrol_new operation_mode_ctl = {
1506 	.iface = SNDRV_CTL_ELEM_IFACE_RAWMIDI,
1507 	.name = "Operation Mode",
1508 	.access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE,
1509 	.info = f_midi2_operation_mode_info,
1510 	.get = f_midi2_operation_mode_get,
1511 };
1512 
1513 /*
1514  * ALSA UMP instance creation / deletion
1515  */
f_midi2_free_card(struct f_midi2 * midi2)1516 static void f_midi2_free_card(struct f_midi2 *midi2)
1517 {
1518 	if (midi2->card) {
1519 		snd_card_free_when_closed(midi2->card);
1520 		midi2->card = NULL;
1521 	}
1522 }
1523 
1524 /* use a reverse direction for the gadget host */
reverse_dir(int dir)1525 static int reverse_dir(int dir)
1526 {
1527 	if (!dir || dir == SNDRV_UMP_DIR_BIDIRECTION)
1528 		return dir;
1529 	return (dir == SNDRV_UMP_DIR_OUTPUT) ?
1530 		SNDRV_UMP_DIR_INPUT : SNDRV_UMP_DIR_OUTPUT;
1531 }
1532 
f_midi2_create_card(struct f_midi2 * midi2)1533 static int f_midi2_create_card(struct f_midi2 *midi2)
1534 {
1535 	struct snd_card *card;
1536 	struct snd_ump_endpoint *ump;
1537 	struct f_midi2_ep *ep;
1538 	int i, id, blk, err;
1539 	__be32 sw;
1540 
1541 	err = snd_card_new(&midi2->gadget->dev, -1, NULL, THIS_MODULE, 0,
1542 			   &card);
1543 	if (err < 0)
1544 		return err;
1545 	midi2->card = card;
1546 
1547 	strcpy(card->driver, "f_midi2");
1548 	strcpy(card->shortname, "MIDI 2.0 Gadget");
1549 	strcpy(card->longname, "MIDI 2.0 Gadget");
1550 
1551 	id = 0;
1552 	for (i = 0; i < midi2->num_eps; i++) {
1553 		ep = &midi2->midi2_eps[i];
1554 		err = snd_ump_endpoint_new(card, "MIDI 2.0 Gadget", id,
1555 					   1, 1, &ump);
1556 		if (err < 0)
1557 			goto error;
1558 		id++;
1559 
1560 		ep->ump = ump;
1561 		ump->no_process_stream = true;
1562 		ump->private_data = ep;
1563 		ump->ops = &f_midi2_ump_ops;
1564 		if (midi2->info.static_block)
1565 			ump->info.flags |= SNDRV_UMP_EP_INFO_STATIC_BLOCKS;
1566 		ump->info.protocol_caps = (ep->info.protocol_caps & 3) << 8;
1567 		ump->info.protocol = to_ump_protocol(ep->info.protocol);
1568 		ump->info.version = 0x0101;
1569 		ump->info.family_id = ep->info.family;
1570 		ump->info.model_id = ep->info.model;
1571 		ump->info.manufacturer_id = ep->info.manufacturer & 0xffffff;
1572 		sw = cpu_to_be32(ep->info.sw_revision);
1573 		memcpy(ump->info.sw_revision, &sw, 4);
1574 
1575 		strscpy(ump->info.name, ump_ep_name(ep),
1576 			sizeof(ump->info.name));
1577 		strscpy(ump->info.product_id, ump_product_id(ep),
1578 			sizeof(ump->info.product_id));
1579 		strscpy(ump->core.name, ump->info.name, sizeof(ump->core.name));
1580 
1581 		for (blk = 0; blk < ep->num_blks; blk++) {
1582 			const struct f_midi2_block_info *b = &ep->blks[blk].info;
1583 			struct snd_ump_block *fb;
1584 
1585 			err = snd_ump_block_new(ump, blk,
1586 						reverse_dir(b->direction),
1587 						b->first_group, b->num_groups,
1588 						&ep->blks[blk].fb);
1589 			if (err < 0)
1590 				goto error;
1591 			fb = ep->blks[blk].fb;
1592 			fb->info.active = !!b->active;
1593 			fb->info.midi_ci_version = b->midi_ci_version;
1594 			fb->info.ui_hint = reverse_dir(b->ui_hint);
1595 			fb->info.sysex8_streams = b->sysex8_streams;
1596 			if (b->is_midi1 < 2)
1597 				fb->info.flags |= b->is_midi1;
1598 			else
1599 				fb->info.flags |= SNDRV_UMP_BLOCK_IS_MIDI1 |
1600 					SNDRV_UMP_BLOCK_IS_LOWSPEED;
1601 			strscpy(fb->info.name, ump_fb_name(b),
1602 				sizeof(fb->info.name));
1603 		}
1604 	}
1605 
1606 	for (i = 0; i < midi2->num_eps; i++) {
1607 		err = snd_ump_attach_legacy_rawmidi(midi2->midi2_eps[i].ump,
1608 						    "Legacy MIDI", id);
1609 		if (err < 0)
1610 			goto error;
1611 		id++;
1612 	}
1613 
1614 	err = snd_ctl_add(card, snd_ctl_new1(&operation_mode_ctl, midi2));
1615 	if (err < 0)
1616 		goto error;
1617 
1618 	err = snd_card_register(card);
1619 	if (err < 0)
1620 		goto error;
1621 
1622 	return 0;
1623 
1624  error:
1625 	f_midi2_free_card(midi2);
1626 	return err;
1627 }
1628 
1629 /*
1630  * Creation of USB descriptors
1631  */
1632 struct f_midi2_usb_config {
1633 	struct usb_descriptor_header **list;
1634 	unsigned int size;
1635 	unsigned int alloc;
1636 
1637 	/* MIDI 1.0 jacks */
1638 	unsigned char jack_in, jack_out, jack_id;
1639 	struct usb_midi_in_jack_descriptor jack_ins[MAX_CABLES];
1640 	struct usb_midi_out_jack_descriptor_1 jack_outs[MAX_CABLES];
1641 };
1642 
append_config(struct f_midi2_usb_config * config,void * d)1643 static int append_config(struct f_midi2_usb_config *config, void *d)
1644 {
1645 	unsigned int size;
1646 	void *buf;
1647 
1648 	if (config->size + 2 >= config->alloc) {
1649 		size = config->size + 16;
1650 		buf = krealloc(config->list, size * sizeof(void *), GFP_KERNEL);
1651 		if (!buf)
1652 			return -ENOMEM;
1653 		config->list = buf;
1654 		config->alloc = size;
1655 	}
1656 
1657 	config->list[config->size] = d;
1658 	config->size++;
1659 	config->list[config->size] = NULL;
1660 	return 0;
1661 }
1662 
append_configs(struct f_midi2_usb_config * config,void ** d)1663 static int append_configs(struct f_midi2_usb_config *config, void **d)
1664 {
1665 	int err;
1666 
1667 	for (; *d; d++) {
1668 		err = append_config(config, *d);
1669 		if (err)
1670 			return err;
1671 	}
1672 	return 0;
1673 }
1674 
append_midi1_in_jack(struct f_midi2 * midi2,struct f_midi2_usb_config * config,struct midi1_cable_mapping * map,unsigned int type)1675 static int append_midi1_in_jack(struct f_midi2 *midi2,
1676 				struct f_midi2_usb_config *config,
1677 				struct midi1_cable_mapping *map,
1678 				unsigned int type)
1679 {
1680 	struct usb_midi_in_jack_descriptor *jack =
1681 		&config->jack_ins[config->jack_in++];
1682 	int id = ++config->jack_id;
1683 	int err;
1684 
1685 	jack->bLength = 0x06;
1686 	jack->bDescriptorType = USB_DT_CS_INTERFACE;
1687 	jack->bDescriptorSubtype = USB_MS_MIDI_IN_JACK;
1688 	jack->bJackType = type;
1689 	jack->bJackID = id;
1690 	/* use the corresponding block name as jack name */
1691 	if (map->ep)
1692 		jack->iJack = map->ep->blks[map->block].string_id;
1693 
1694 	err = append_config(config, jack);
1695 	if (err < 0)
1696 		return err;
1697 	return id;
1698 }
1699 
append_midi1_out_jack(struct f_midi2 * midi2,struct f_midi2_usb_config * config,struct midi1_cable_mapping * map,unsigned int type,unsigned int source)1700 static int append_midi1_out_jack(struct f_midi2 *midi2,
1701 				 struct f_midi2_usb_config *config,
1702 				 struct midi1_cable_mapping *map,
1703 				 unsigned int type, unsigned int source)
1704 {
1705 	struct usb_midi_out_jack_descriptor_1 *jack =
1706 		&config->jack_outs[config->jack_out++];
1707 	int id = ++config->jack_id;
1708 	int err;
1709 
1710 	jack->bLength = 0x09;
1711 	jack->bDescriptorType = USB_DT_CS_INTERFACE;
1712 	jack->bDescriptorSubtype = USB_MS_MIDI_OUT_JACK;
1713 	jack->bJackType = type;
1714 	jack->bJackID = id;
1715 	jack->bNrInputPins = 1;
1716 	jack->pins[0].baSourceID = source;
1717 	jack->pins[0].baSourcePin = 0x01;
1718 	/* use the corresponding block name as jack name */
1719 	if (map->ep)
1720 		jack->iJack = map->ep->blks[map->block].string_id;
1721 
1722 	err = append_config(config, jack);
1723 	if (err < 0)
1724 		return err;
1725 	return id;
1726 }
1727 
f_midi2_create_usb_configs(struct f_midi2 * midi2,struct f_midi2_usb_config * config,int speed)1728 static int f_midi2_create_usb_configs(struct f_midi2 *midi2,
1729 				      struct f_midi2_usb_config *config,
1730 				      int speed)
1731 {
1732 	void **midi1_in_eps, **midi1_out_eps;
1733 	int i, jack, total;
1734 	int err;
1735 
1736 	switch (speed) {
1737 	default:
1738 	case USB_SPEED_HIGH:
1739 		midi2_midi1_ep_out_desc.wMaxPacketSize = cpu_to_le16(512);
1740 		midi2_midi1_ep_in_desc.wMaxPacketSize = cpu_to_le16(512);
1741 		for (i = 0; i < midi2->num_eps; i++)
1742 			midi2_midi2_ep_out_desc[i].wMaxPacketSize =
1743 				cpu_to_le16(512);
1744 		fallthrough;
1745 	case USB_SPEED_FULL:
1746 		midi1_in_eps = midi2_midi1_ep_in_descs;
1747 		midi1_out_eps = midi2_midi1_ep_out_descs;
1748 		break;
1749 	case USB_SPEED_SUPER:
1750 		midi2_midi1_ep_out_desc.wMaxPacketSize = cpu_to_le16(1024);
1751 		midi2_midi1_ep_in_desc.wMaxPacketSize = cpu_to_le16(1024);
1752 		for (i = 0; i < midi2->num_eps; i++)
1753 			midi2_midi2_ep_out_desc[i].wMaxPacketSize =
1754 				cpu_to_le16(1024);
1755 		midi1_in_eps = midi2_midi1_ep_in_ss_descs;
1756 		midi1_out_eps = midi2_midi1_ep_out_ss_descs;
1757 		break;
1758 	}
1759 
1760 	err = append_configs(config, midi2_audio_descs);
1761 	if (err < 0)
1762 		return err;
1763 
1764 	if (midi2->num_midi1_in && midi2->num_midi1_out)
1765 		midi2_midi1_if_desc.bNumEndpoints = 2;
1766 	else
1767 		midi2_midi1_if_desc.bNumEndpoints = 1;
1768 
1769 	err = append_configs(config, midi2_midi1_descs);
1770 	if (err < 0)
1771 		return err;
1772 
1773 	total = USB_DT_MS_HEADER_SIZE;
1774 	if (midi2->num_midi1_out) {
1775 		midi2_midi1_ep_out_class_desc.bLength =
1776 			USB_DT_MS_ENDPOINT_SIZE(midi2->num_midi1_out);
1777 		total += midi2_midi1_ep_out_class_desc.bLength;
1778 		midi2_midi1_ep_out_class_desc.bNumEmbMIDIJack =
1779 			midi2->num_midi1_out;
1780 		total += midi2->num_midi1_out *
1781 			(USB_DT_MIDI_IN_SIZE + USB_DT_MIDI_OUT_SIZE(1));
1782 		for (i = 0; i < midi2->num_midi1_out; i++) {
1783 			jack = append_midi1_in_jack(midi2, config,
1784 						    &midi2->in_cable_mapping[i],
1785 						    USB_MS_EMBEDDED);
1786 			if (jack < 0)
1787 				return jack;
1788 			midi2_midi1_ep_out_class_desc.baAssocJackID[i] = jack;
1789 			jack = append_midi1_out_jack(midi2, config,
1790 						     &midi2->in_cable_mapping[i],
1791 						     USB_MS_EXTERNAL, jack);
1792 			if (jack < 0)
1793 				return jack;
1794 		}
1795 	}
1796 
1797 	if (midi2->num_midi1_in) {
1798 		midi2_midi1_ep_in_class_desc.bLength =
1799 			USB_DT_MS_ENDPOINT_SIZE(midi2->num_midi1_in);
1800 		total += midi2_midi1_ep_in_class_desc.bLength;
1801 		midi2_midi1_ep_in_class_desc.bNumEmbMIDIJack =
1802 			midi2->num_midi1_in;
1803 		total += midi2->num_midi1_in *
1804 			(USB_DT_MIDI_IN_SIZE + USB_DT_MIDI_OUT_SIZE(1));
1805 		for (i = 0; i < midi2->num_midi1_in; i++) {
1806 			jack = append_midi1_in_jack(midi2, config,
1807 						    &midi2->out_cable_mapping[i],
1808 						    USB_MS_EXTERNAL);
1809 			if (jack < 0)
1810 				return jack;
1811 			jack = append_midi1_out_jack(midi2, config,
1812 						     &midi2->out_cable_mapping[i],
1813 						     USB_MS_EMBEDDED, jack);
1814 			if (jack < 0)
1815 				return jack;
1816 			midi2_midi1_ep_in_class_desc.baAssocJackID[i] = jack;
1817 		}
1818 	}
1819 
1820 	midi2_midi1_class_desc.wTotalLength = cpu_to_le16(total);
1821 
1822 	if (midi2->num_midi1_out) {
1823 		err = append_configs(config, midi1_out_eps);
1824 		if (err < 0)
1825 			return err;
1826 	}
1827 	if (midi2->num_midi1_in) {
1828 		err = append_configs(config, midi1_in_eps);
1829 		if (err < 0)
1830 			return err;
1831 	}
1832 
1833 	err = append_configs(config, midi2_midi2_descs);
1834 	if (err < 0)
1835 		return err;
1836 
1837 	for (i = 0; i < midi2->num_eps; i++) {
1838 		err = append_config(config, &midi2_midi2_ep_out_desc[i]);
1839 		if (err < 0)
1840 			return err;
1841 		if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS) {
1842 			err = append_config(config, &midi2_midi2_ep_out_ss_comp_desc);
1843 			if (err < 0)
1844 				return err;
1845 		}
1846 		err = append_config(config, &midi2_midi2_ep_out_class_desc[i]);
1847 		if (err < 0)
1848 			return err;
1849 		err = append_config(config, &midi2_midi2_ep_in_desc[i]);
1850 		if (err < 0)
1851 			return err;
1852 		if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS) {
1853 			err = append_config(config, &midi2_midi2_ep_in_ss_comp_desc);
1854 			if (err < 0)
1855 				return err;
1856 		}
1857 		err = append_config(config, &midi2_midi2_ep_in_class_desc[i]);
1858 		if (err < 0)
1859 			return err;
1860 	}
1861 
1862 	return 0;
1863 }
1864 
f_midi2_free_usb_configs(struct f_midi2_usb_config * config)1865 static void f_midi2_free_usb_configs(struct f_midi2_usb_config *config)
1866 {
1867 	kfree(config->list);
1868 	memset(config, 0, sizeof(*config));
1869 }
1870 
1871 /* as we use the static descriptors for simplicity, serialize bind call */
1872 static DEFINE_MUTEX(f_midi2_desc_mutex);
1873 
1874 /* fill MIDI2 EP class-specific descriptor */
fill_midi2_class_desc(struct f_midi2_ep * ep,struct usb_ms20_endpoint_descriptor_32 * cdesc)1875 static void fill_midi2_class_desc(struct f_midi2_ep *ep,
1876 				  struct usb_ms20_endpoint_descriptor_32 *cdesc)
1877 {
1878 	int blk;
1879 
1880 	cdesc->bLength = USB_DT_MS20_ENDPOINT_SIZE(ep->num_blks);
1881 	cdesc->bDescriptorType = USB_DT_CS_ENDPOINT;
1882 	cdesc->bDescriptorSubtype = USB_MS_GENERAL_2_0;
1883 	cdesc->bNumGrpTrmBlock = ep->num_blks;
1884 	for (blk = 0; blk < ep->num_blks; blk++)
1885 		cdesc->baAssoGrpTrmBlkID[blk] = ep->blks[blk].gtb_id;
1886 }
1887 
1888 /* initialize MIDI2 EP-in */
f_midi2_init_midi2_ep_in(struct f_midi2 * midi2,int index)1889 static int f_midi2_init_midi2_ep_in(struct f_midi2 *midi2, int index)
1890 {
1891 	struct f_midi2_ep *ep = &midi2->midi2_eps[index];
1892 	struct usb_endpoint_descriptor *desc = &midi2_midi2_ep_in_desc[index];
1893 
1894 	desc->bLength = USB_DT_ENDPOINT_SIZE;
1895 	desc->bDescriptorType = USB_DT_ENDPOINT;
1896 	desc->bEndpointAddress = USB_DIR_IN;
1897 	desc->bmAttributes = USB_ENDPOINT_XFER_INT;
1898 	desc->wMaxPacketSize = cpu_to_le16(EP_MAX_PACKET_INT);
1899 	desc->bInterval = 1;
1900 
1901 	fill_midi2_class_desc(ep, &midi2_midi2_ep_in_class_desc[index]);
1902 
1903 	return f_midi2_init_ep(midi2, ep, &ep->ep_in, desc,
1904 			       f_midi2_ep_in_complete);
1905 }
1906 
1907 /* initialize MIDI2 EP-out */
f_midi2_init_midi2_ep_out(struct f_midi2 * midi2,int index)1908 static int f_midi2_init_midi2_ep_out(struct f_midi2 *midi2, int index)
1909 {
1910 	struct f_midi2_ep *ep = &midi2->midi2_eps[index];
1911 	struct usb_endpoint_descriptor *desc = &midi2_midi2_ep_out_desc[index];
1912 
1913 	desc->bLength = USB_DT_ENDPOINT_SIZE;
1914 	desc->bDescriptorType = USB_DT_ENDPOINT;
1915 	desc->bEndpointAddress = USB_DIR_OUT;
1916 	desc->bmAttributes = USB_ENDPOINT_XFER_BULK;
1917 
1918 	fill_midi2_class_desc(ep, &midi2_midi2_ep_out_class_desc[index]);
1919 
1920 	return f_midi2_init_ep(midi2, ep, &ep->ep_out, desc,
1921 			       f_midi2_ep_out_complete);
1922 }
1923 
1924 /* gadget function bind callback */
f_midi2_bind(struct usb_configuration * c,struct usb_function * f)1925 static int f_midi2_bind(struct usb_configuration *c, struct usb_function *f)
1926 {
1927 	struct usb_composite_dev *cdev = c->cdev;
1928 	struct f_midi2 *midi2 = func_to_midi2(f);
1929 	struct f_midi2_ep *ep;
1930 	struct f_midi2_usb_config config = {};
1931 	struct usb_gadget_strings string_fn = {
1932 		.language = 0x0409,	/* en-us */
1933 		.strings = midi2->string_defs,
1934 	};
1935 	struct usb_gadget_strings *strings[] = {
1936 		&string_fn,
1937 		NULL,
1938 	};
1939 	int i, blk, status;
1940 
1941 	midi2->gadget = cdev->gadget;
1942 	midi2->operation_mode = MIDI_OP_MODE_UNSET;
1943 
1944 	status = f_midi2_create_card(midi2);
1945 	if (status < 0)
1946 		goto fail_register;
1947 
1948 	/* maybe allocate device-global string ID */
1949 	midi2->strings = usb_gstrings_attach(c->cdev, strings,
1950 					     midi2->total_blocks + 1);
1951 	if (IS_ERR(midi2->strings)) {
1952 		status = PTR_ERR(midi2->strings);
1953 		goto fail_string;
1954 	}
1955 
1956 	mutex_lock(&f_midi2_desc_mutex);
1957 	midi2_midi1_if_desc.iInterface = midi2->strings[STR_IFACE].id;
1958 	midi2_midi2_if_desc.iInterface = midi2->strings[STR_IFACE].id;
1959 	for (i = 0; i < midi2->num_eps; i++) {
1960 		ep = &midi2->midi2_eps[i];
1961 		for (blk = 0; blk < ep->num_blks; blk++)
1962 			ep->blks[blk].string_id =
1963 				midi2->strings[gtb_to_str_id(ep->blks[blk].gtb_id)].id;
1964 	}
1965 
1966 	midi2_midi2_if_desc.bNumEndpoints = midi2->num_eps * 2;
1967 
1968 	/* audio interface */
1969 	status = usb_interface_id(c, f);
1970 	if (status < 0)
1971 		goto fail;
1972 	midi2_audio_if_desc.bInterfaceNumber = status;
1973 
1974 	/* MIDI streaming */
1975 	status = usb_interface_id(c, f);
1976 	if (status < 0)
1977 		goto fail;
1978 	midi2->midi_if = status;
1979 	midi2_midi1_if_desc.bInterfaceNumber = status;
1980 	midi2_midi2_if_desc.bInterfaceNumber = status;
1981 	midi2_audio_class_desc.baInterfaceNr[0] = status;
1982 
1983 	/* allocate instance-specific endpoints */
1984 	if (midi2->midi2_eps[0].blks[0].info.direction != SNDRV_UMP_DIR_OUTPUT) {
1985 		status = f_midi2_init_ep(midi2, NULL, &midi2->midi1_ep_in,
1986 					 &midi2_midi1_ep_in_desc,
1987 					 f_midi2_midi1_ep_in_complete);
1988 		if (status)
1989 			goto fail;
1990 	}
1991 
1992 	if (midi2->midi2_eps[0].blks[0].info.direction != SNDRV_UMP_DIR_INPUT) {
1993 		status = f_midi2_init_ep(midi2, NULL, &midi2->midi1_ep_out,
1994 					 &midi2_midi1_ep_out_desc,
1995 					 f_midi2_midi1_ep_out_complete);
1996 		if (status)
1997 			goto fail;
1998 	}
1999 
2000 	for (i = 0; i < midi2->num_eps; i++) {
2001 		status = f_midi2_init_midi2_ep_in(midi2, i);
2002 		if (status)
2003 			goto fail;
2004 		status = f_midi2_init_midi2_ep_out(midi2, i);
2005 		if (status)
2006 			goto fail;
2007 	}
2008 
2009 	status = f_midi2_create_usb_configs(midi2, &config, USB_SPEED_FULL);
2010 	if (status < 0)
2011 		goto fail;
2012 	f->fs_descriptors = usb_copy_descriptors(config.list);
2013 	if (!f->fs_descriptors) {
2014 		status = -ENOMEM;
2015 		goto fail;
2016 	}
2017 	f_midi2_free_usb_configs(&config);
2018 
2019 	status = f_midi2_create_usb_configs(midi2, &config, USB_SPEED_HIGH);
2020 	if (status < 0)
2021 		goto fail;
2022 	f->hs_descriptors = usb_copy_descriptors(config.list);
2023 	if (!f->hs_descriptors) {
2024 		status = -ENOMEM;
2025 		goto fail;
2026 	}
2027 	f_midi2_free_usb_configs(&config);
2028 
2029 	status = f_midi2_create_usb_configs(midi2, &config, USB_SPEED_SUPER);
2030 	if (status < 0)
2031 		goto fail;
2032 	f->ss_descriptors = usb_copy_descriptors(config.list);
2033 	if (!f->ss_descriptors) {
2034 		status = -ENOMEM;
2035 		goto fail;
2036 	}
2037 	f_midi2_free_usb_configs(&config);
2038 
2039 	mutex_unlock(&f_midi2_desc_mutex);
2040 	return 0;
2041 
2042 fail:
2043 	f_midi2_free_usb_configs(&config);
2044 	mutex_unlock(&f_midi2_desc_mutex);
2045 	usb_free_all_descriptors(f);
2046 fail_string:
2047 	f_midi2_free_card(midi2);
2048 fail_register:
2049 	ERROR(midi2, "%s: can't bind, err %d\n", f->name, status);
2050 	return status;
2051 }
2052 
2053 /* gadget function unbind callback */
f_midi2_unbind(struct usb_configuration * c,struct usb_function * f)2054 static void f_midi2_unbind(struct usb_configuration *c, struct usb_function *f)
2055 {
2056 	struct f_midi2 *midi2 = func_to_midi2(f);
2057 	int i;
2058 
2059 	f_midi2_free_card(midi2);
2060 
2061 	f_midi2_free_ep(&midi2->midi1_ep_in);
2062 	f_midi2_free_ep(&midi2->midi1_ep_out);
2063 	for (i = 0; i < midi2->num_eps; i++) {
2064 		f_midi2_free_ep(&midi2->midi2_eps[i].ep_in);
2065 		f_midi2_free_ep(&midi2->midi2_eps[i].ep_out);
2066 	}
2067 
2068 	usb_free_all_descriptors(f);
2069 }
2070 
2071 /*
2072  * ConfigFS interface
2073  */
2074 
2075 /* type conversion helpers */
to_f_midi2_opts(struct config_item * item)2076 static inline struct f_midi2_opts *to_f_midi2_opts(struct config_item *item)
2077 {
2078 	return container_of(to_config_group(item), struct f_midi2_opts,
2079 			    func_inst.group);
2080 }
2081 
2082 static inline struct f_midi2_ep_opts *
to_f_midi2_ep_opts(struct config_item * item)2083 to_f_midi2_ep_opts(struct config_item *item)
2084 {
2085 	return container_of(to_config_group(item), struct f_midi2_ep_opts,
2086 			    group);
2087 }
2088 
2089 static inline struct f_midi2_block_opts *
to_f_midi2_block_opts(struct config_item * item)2090 to_f_midi2_block_opts(struct config_item *item)
2091 {
2092 	return container_of(to_config_group(item), struct f_midi2_block_opts,
2093 			    group);
2094 }
2095 
2096 /* trim the string to be usable for EP and FB name strings */
make_name_string(char * s)2097 static void make_name_string(char *s)
2098 {
2099 	char *p;
2100 
2101 	p = strchr(s, '\n');
2102 	if (p)
2103 		*p = 0;
2104 
2105 	p = s + strlen(s);
2106 	for (; p > s && isspace(*p); p--)
2107 		*p = 0;
2108 }
2109 
2110 /* configfs helpers: generic show/store for unisnged int */
f_midi2_opts_uint_show(struct f_midi2_opts * opts,u32 val,const char * format,char * page)2111 static ssize_t f_midi2_opts_uint_show(struct f_midi2_opts *opts,
2112 				      u32 val, const char *format, char *page)
2113 {
2114 	int result;
2115 
2116 	mutex_lock(&opts->lock);
2117 	result = sprintf(page, format, val);
2118 	mutex_unlock(&opts->lock);
2119 	return result;
2120 }
2121 
f_midi2_opts_uint_store(struct f_midi2_opts * opts,u32 * valp,u32 minval,u32 maxval,const char * page,size_t len)2122 static ssize_t f_midi2_opts_uint_store(struct f_midi2_opts *opts,
2123 				       u32 *valp, u32 minval, u32 maxval,
2124 				       const char *page, size_t len)
2125 {
2126 	int ret;
2127 	u32 val;
2128 
2129 	mutex_lock(&opts->lock);
2130 	if (opts->refcnt) {
2131 		ret = -EBUSY;
2132 		goto end;
2133 	}
2134 
2135 	ret = kstrtou32(page, 0, &val);
2136 	if (ret)
2137 		goto end;
2138 	if (val < minval || val > maxval) {
2139 		ret = -EINVAL;
2140 		goto end;
2141 	}
2142 
2143 	*valp = val;
2144 	ret = len;
2145 
2146 end:
2147 	mutex_unlock(&opts->lock);
2148 	return ret;
2149 }
2150 
2151 /* generic store for bool */
f_midi2_opts_bool_store(struct f_midi2_opts * opts,bool * valp,const char * page,size_t len)2152 static ssize_t f_midi2_opts_bool_store(struct f_midi2_opts *opts,
2153 				       bool *valp, const char *page, size_t len)
2154 {
2155 	int ret;
2156 	bool val;
2157 
2158 	mutex_lock(&opts->lock);
2159 	if (opts->refcnt) {
2160 		ret = -EBUSY;
2161 		goto end;
2162 	}
2163 
2164 	ret = kstrtobool(page, &val);
2165 	if (ret)
2166 		goto end;
2167 	*valp = val;
2168 	ret = len;
2169 
2170 end:
2171 	mutex_unlock(&opts->lock);
2172 	return ret;
2173 }
2174 
2175 /* generic show/store for string */
f_midi2_opts_str_show(struct f_midi2_opts * opts,const char * str,char * page)2176 static ssize_t f_midi2_opts_str_show(struct f_midi2_opts *opts,
2177 				     const char *str, char *page)
2178 {
2179 	int result = 0;
2180 
2181 	mutex_lock(&opts->lock);
2182 	if (str)
2183 		result = scnprintf(page, PAGE_SIZE, "%s\n", str);
2184 	mutex_unlock(&opts->lock);
2185 	return result;
2186 }
2187 
f_midi2_opts_str_store(struct f_midi2_opts * opts,const char ** strp,size_t maxlen,const char * page,size_t len)2188 static ssize_t f_midi2_opts_str_store(struct f_midi2_opts *opts,
2189 				      const char **strp, size_t maxlen,
2190 				      const char *page, size_t len)
2191 {
2192 	char *c;
2193 	int ret;
2194 
2195 	mutex_lock(&opts->lock);
2196 	if (opts->refcnt) {
2197 		ret = -EBUSY;
2198 		goto end;
2199 	}
2200 
2201 	c = kstrndup(page, min(len, maxlen), GFP_KERNEL);
2202 	if (!c) {
2203 		ret = -ENOMEM;
2204 		goto end;
2205 	}
2206 
2207 	kfree(*strp);
2208 	make_name_string(c);
2209 	*strp = c;
2210 	ret = len;
2211 
2212 end:
2213 	mutex_unlock(&opts->lock);
2214 	return ret;
2215 }
2216 
2217 /*
2218  * Definitions for UMP Block config
2219  */
2220 
2221 /* define an uint option for block */
2222 #define F_MIDI2_BLOCK_OPT(name, format, minval, maxval)			\
2223 static ssize_t f_midi2_block_opts_##name##_show(struct config_item *item,\
2224 					  char *page)			\
2225 {									\
2226 	struct f_midi2_block_opts *opts = to_f_midi2_block_opts(item);	\
2227 	return f_midi2_opts_uint_show(opts->ep->opts, opts->info.name,	\
2228 				      format "\n", page);		\
2229 }									\
2230 									\
2231 static ssize_t f_midi2_block_opts_##name##_store(struct config_item *item,\
2232 					 const char *page, size_t len)	\
2233 {									\
2234 	struct f_midi2_block_opts *opts = to_f_midi2_block_opts(item);	\
2235 	return f_midi2_opts_uint_store(opts->ep->opts, &opts->info.name,\
2236 				       minval, maxval, page, len);	\
2237 }									\
2238 									\
2239 CONFIGFS_ATTR(f_midi2_block_opts_, name)
2240 
2241 /* define a boolean option for block */
2242 #define F_MIDI2_BLOCK_BOOL_OPT(name)					\
2243 static ssize_t f_midi2_block_opts_##name##_show(struct config_item *item,\
2244 					  char *page)			\
2245 {									\
2246 	struct f_midi2_block_opts *opts = to_f_midi2_block_opts(item);	\
2247 	return f_midi2_opts_uint_show(opts->ep->opts, opts->info.name,	\
2248 				      "%u\n", page);			\
2249 }									\
2250 									\
2251 static ssize_t f_midi2_block_opts_##name##_store(struct config_item *item,\
2252 					 const char *page, size_t len)	\
2253 {									\
2254 	struct f_midi2_block_opts *opts = to_f_midi2_block_opts(item);	\
2255 	return f_midi2_opts_bool_store(opts->ep->opts, &opts->info.name,\
2256 				       page, len);			\
2257 }									\
2258 									\
2259 CONFIGFS_ATTR(f_midi2_block_opts_, name)
2260 
2261 F_MIDI2_BLOCK_OPT(direction, "0x%x", 1, 3);
2262 F_MIDI2_BLOCK_OPT(first_group, "0x%x", 0, 15);
2263 F_MIDI2_BLOCK_OPT(num_groups, "0x%x", 1, 16);
2264 F_MIDI2_BLOCK_OPT(midi1_first_group, "0x%x", 0, 15);
2265 F_MIDI2_BLOCK_OPT(midi1_num_groups, "0x%x", 0, 16);
2266 F_MIDI2_BLOCK_OPT(ui_hint, "0x%x", 0, 3);
2267 F_MIDI2_BLOCK_OPT(midi_ci_version, "%u", 0, 1);
2268 F_MIDI2_BLOCK_OPT(sysex8_streams, "%u", 0, 255);
2269 F_MIDI2_BLOCK_OPT(is_midi1, "%u", 0, 2);
2270 F_MIDI2_BLOCK_BOOL_OPT(active);
2271 
f_midi2_block_opts_name_show(struct config_item * item,char * page)2272 static ssize_t f_midi2_block_opts_name_show(struct config_item *item,
2273 					    char *page)
2274 {
2275 	struct f_midi2_block_opts *opts = to_f_midi2_block_opts(item);
2276 
2277 	return f_midi2_opts_str_show(opts->ep->opts, opts->info.name, page);
2278 }
2279 
f_midi2_block_opts_name_store(struct config_item * item,const char * page,size_t len)2280 static ssize_t f_midi2_block_opts_name_store(struct config_item *item,
2281 					     const char *page, size_t len)
2282 {
2283 	struct f_midi2_block_opts *opts = to_f_midi2_block_opts(item);
2284 
2285 	return f_midi2_opts_str_store(opts->ep->opts, &opts->info.name, 128,
2286 				      page, len);
2287 }
2288 
2289 CONFIGFS_ATTR(f_midi2_block_opts_, name);
2290 
2291 static struct configfs_attribute *f_midi2_block_attrs[] = {
2292 	&f_midi2_block_opts_attr_direction,
2293 	&f_midi2_block_opts_attr_first_group,
2294 	&f_midi2_block_opts_attr_num_groups,
2295 	&f_midi2_block_opts_attr_midi1_first_group,
2296 	&f_midi2_block_opts_attr_midi1_num_groups,
2297 	&f_midi2_block_opts_attr_ui_hint,
2298 	&f_midi2_block_opts_attr_midi_ci_version,
2299 	&f_midi2_block_opts_attr_sysex8_streams,
2300 	&f_midi2_block_opts_attr_is_midi1,
2301 	&f_midi2_block_opts_attr_active,
2302 	&f_midi2_block_opts_attr_name,
2303 	NULL,
2304 };
2305 
f_midi2_block_opts_release(struct config_item * item)2306 static void f_midi2_block_opts_release(struct config_item *item)
2307 {
2308 	struct f_midi2_block_opts *opts = to_f_midi2_block_opts(item);
2309 
2310 	kfree(opts->info.name);
2311 	kfree(opts);
2312 }
2313 
2314 static struct configfs_item_operations f_midi2_block_item_ops = {
2315 	.release	= f_midi2_block_opts_release,
2316 };
2317 
2318 static const struct config_item_type f_midi2_block_type = {
2319 	.ct_item_ops	= &f_midi2_block_item_ops,
2320 	.ct_attrs	= f_midi2_block_attrs,
2321 	.ct_owner	= THIS_MODULE,
2322 };
2323 
2324 /* create a f_midi2_block_opts instance for the given block number */
f_midi2_block_opts_create(struct f_midi2_ep_opts * ep_opts,unsigned int blk,struct f_midi2_block_opts ** block_p)2325 static int f_midi2_block_opts_create(struct f_midi2_ep_opts *ep_opts,
2326 				     unsigned int blk,
2327 				     struct f_midi2_block_opts **block_p)
2328 {
2329 	struct f_midi2_block_opts *block_opts;
2330 	int ret = 0;
2331 
2332 	mutex_lock(&ep_opts->opts->lock);
2333 	if (ep_opts->opts->refcnt || ep_opts->blks[blk]) {
2334 		ret = -EBUSY;
2335 		goto out;
2336 	}
2337 
2338 	block_opts = kzalloc(sizeof(*block_opts), GFP_KERNEL);
2339 	if (!block_opts) {
2340 		ret = -ENOMEM;
2341 		goto out;
2342 	}
2343 
2344 	block_opts->ep = ep_opts;
2345 	block_opts->id = blk;
2346 
2347 	/* set up the default values */
2348 	block_opts->info.direction = SNDRV_UMP_DIR_BIDIRECTION;
2349 	block_opts->info.first_group = 0;
2350 	block_opts->info.num_groups = 1;
2351 	block_opts->info.ui_hint = SNDRV_UMP_BLOCK_UI_HINT_BOTH;
2352 	block_opts->info.active = 1;
2353 
2354 	ep_opts->blks[blk] = block_opts;
2355 	*block_p = block_opts;
2356 
2357  out:
2358 	mutex_unlock(&ep_opts->opts->lock);
2359 	return ret;
2360 }
2361 
2362 /* make_group callback for a block */
2363 static struct config_group *
f_midi2_opts_block_make(struct config_group * group,const char * name)2364 f_midi2_opts_block_make(struct config_group *group, const char *name)
2365 {
2366 	struct f_midi2_ep_opts *ep_opts;
2367 	struct f_midi2_block_opts *block_opts;
2368 	unsigned int blk;
2369 	int ret;
2370 
2371 	if (strncmp(name, "block.", 6))
2372 		return ERR_PTR(-EINVAL);
2373 	ret = kstrtouint(name + 6, 10, &blk);
2374 	if (ret)
2375 		return ERR_PTR(ret);
2376 
2377 	ep_opts = to_f_midi2_ep_opts(&group->cg_item);
2378 
2379 	if (blk >= SNDRV_UMP_MAX_BLOCKS)
2380 		return ERR_PTR(-EINVAL);
2381 	if (ep_opts->blks[blk])
2382 		return ERR_PTR(-EBUSY);
2383 	ret = f_midi2_block_opts_create(ep_opts, blk, &block_opts);
2384 	if (ret)
2385 		return ERR_PTR(ret);
2386 
2387 	config_group_init_type_name(&block_opts->group, name,
2388 				    &f_midi2_block_type);
2389 	return &block_opts->group;
2390 }
2391 
2392 /* drop_item callback for a block */
2393 static void
f_midi2_opts_block_drop(struct config_group * group,struct config_item * item)2394 f_midi2_opts_block_drop(struct config_group *group, struct config_item *item)
2395 {
2396 	struct f_midi2_block_opts *block_opts = to_f_midi2_block_opts(item);
2397 
2398 	mutex_lock(&block_opts->ep->opts->lock);
2399 	block_opts->ep->blks[block_opts->id] = NULL;
2400 	mutex_unlock(&block_opts->ep->opts->lock);
2401 	config_item_put(item);
2402 }
2403 
2404 /*
2405  * Definitions for UMP Endpoint config
2406  */
2407 
2408 /* define an uint option for EP */
2409 #define F_MIDI2_EP_OPT(name, format, minval, maxval)			\
2410 static ssize_t f_midi2_ep_opts_##name##_show(struct config_item *item,	\
2411 					     char *page)		\
2412 {									\
2413 	struct f_midi2_ep_opts *opts = to_f_midi2_ep_opts(item);	\
2414 	return f_midi2_opts_uint_show(opts->opts, opts->info.name,	\
2415 				      format "\n", page);		\
2416 }									\
2417 									\
2418 static ssize_t f_midi2_ep_opts_##name##_store(struct config_item *item,	\
2419 					   const char *page, size_t len)\
2420 {									\
2421 	struct f_midi2_ep_opts *opts = to_f_midi2_ep_opts(item);	\
2422 	return f_midi2_opts_uint_store(opts->opts, &opts->info.name,	\
2423 				       minval, maxval, page, len);	\
2424 }									\
2425 									\
2426 CONFIGFS_ATTR(f_midi2_ep_opts_, name)
2427 
2428 /* define a string option for EP */
2429 #define F_MIDI2_EP_STR_OPT(name, maxlen)				\
2430 static ssize_t f_midi2_ep_opts_##name##_show(struct config_item *item,	\
2431 					     char *page)		\
2432 {									\
2433 	struct f_midi2_ep_opts *opts = to_f_midi2_ep_opts(item);	\
2434 	return f_midi2_opts_str_show(opts->opts, opts->info.name, page);\
2435 }									\
2436 									\
2437 static ssize_t f_midi2_ep_opts_##name##_store(struct config_item *item,	\
2438 					 const char *page, size_t len)	\
2439 {									\
2440 	struct f_midi2_ep_opts *opts = to_f_midi2_ep_opts(item);	\
2441 	return f_midi2_opts_str_store(opts->opts, &opts->info.name, maxlen,\
2442 				      page, len);			\
2443 }									\
2444 									\
2445 CONFIGFS_ATTR(f_midi2_ep_opts_, name)
2446 
2447 F_MIDI2_EP_OPT(protocol, "0x%x", 1, 2);
2448 F_MIDI2_EP_OPT(protocol_caps, "0x%x", 1, 3);
2449 F_MIDI2_EP_OPT(manufacturer, "0x%x", 0, 0xffffff);
2450 F_MIDI2_EP_OPT(family, "0x%x", 0, 0xffff);
2451 F_MIDI2_EP_OPT(model, "0x%x", 0, 0xffff);
2452 F_MIDI2_EP_OPT(sw_revision, "0x%x", 0, 0xffffffff);
2453 F_MIDI2_EP_STR_OPT(ep_name, 128);
2454 F_MIDI2_EP_STR_OPT(product_id, 128);
2455 
2456 static struct configfs_attribute *f_midi2_ep_attrs[] = {
2457 	&f_midi2_ep_opts_attr_protocol,
2458 	&f_midi2_ep_opts_attr_protocol_caps,
2459 	&f_midi2_ep_opts_attr_ep_name,
2460 	&f_midi2_ep_opts_attr_product_id,
2461 	&f_midi2_ep_opts_attr_manufacturer,
2462 	&f_midi2_ep_opts_attr_family,
2463 	&f_midi2_ep_opts_attr_model,
2464 	&f_midi2_ep_opts_attr_sw_revision,
2465 	NULL,
2466 };
2467 
f_midi2_ep_opts_release(struct config_item * item)2468 static void f_midi2_ep_opts_release(struct config_item *item)
2469 {
2470 	struct f_midi2_ep_opts *opts = to_f_midi2_ep_opts(item);
2471 
2472 	kfree(opts->info.ep_name);
2473 	kfree(opts->info.product_id);
2474 	kfree(opts);
2475 }
2476 
2477 static struct configfs_item_operations f_midi2_ep_item_ops = {
2478 	.release	= f_midi2_ep_opts_release,
2479 };
2480 
2481 static struct configfs_group_operations f_midi2_ep_group_ops = {
2482 	.make_group	= f_midi2_opts_block_make,
2483 	.drop_item	= f_midi2_opts_block_drop,
2484 };
2485 
2486 static const struct config_item_type f_midi2_ep_type = {
2487 	.ct_item_ops	= &f_midi2_ep_item_ops,
2488 	.ct_group_ops	= &f_midi2_ep_group_ops,
2489 	.ct_attrs	= f_midi2_ep_attrs,
2490 	.ct_owner	= THIS_MODULE,
2491 };
2492 
2493 /* create a f_midi2_ep_opts instance */
f_midi2_ep_opts_create(struct f_midi2_opts * opts,unsigned int index,struct f_midi2_ep_opts ** ep_p)2494 static int f_midi2_ep_opts_create(struct f_midi2_opts *opts,
2495 				  unsigned int index,
2496 				  struct f_midi2_ep_opts **ep_p)
2497 {
2498 	struct f_midi2_ep_opts *ep_opts;
2499 
2500 	ep_opts = kzalloc(sizeof(*ep_opts), GFP_KERNEL);
2501 	if (!ep_opts)
2502 		return -ENOMEM;
2503 
2504 	ep_opts->opts = opts;
2505 	ep_opts->index = index;
2506 
2507 	/* set up the default values */
2508 	ep_opts->info.protocol = 2;
2509 	ep_opts->info.protocol_caps = 3;
2510 
2511 	opts->eps[index] = ep_opts;
2512 	*ep_p = ep_opts;
2513 	return 0;
2514 }
2515 
2516 /* make_group callback for an EP */
2517 static struct config_group *
f_midi2_opts_ep_make(struct config_group * group,const char * name)2518 f_midi2_opts_ep_make(struct config_group *group, const char *name)
2519 {
2520 	struct f_midi2_opts *opts;
2521 	struct f_midi2_ep_opts *ep_opts;
2522 	unsigned int index;
2523 	int ret;
2524 
2525 	if (strncmp(name, "ep.", 3))
2526 		return ERR_PTR(-EINVAL);
2527 	ret = kstrtouint(name + 3, 10, &index);
2528 	if (ret)
2529 		return ERR_PTR(ret);
2530 
2531 	opts = to_f_midi2_opts(&group->cg_item);
2532 	if (index >= MAX_UMP_EPS)
2533 		return ERR_PTR(-EINVAL);
2534 	if (opts->eps[index])
2535 		return ERR_PTR(-EBUSY);
2536 	ret = f_midi2_ep_opts_create(opts, index, &ep_opts);
2537 	if (ret)
2538 		return ERR_PTR(ret);
2539 
2540 	config_group_init_type_name(&ep_opts->group, name, &f_midi2_ep_type);
2541 	return &ep_opts->group;
2542 }
2543 
2544 /* drop_item callback for an EP */
2545 static void
f_midi2_opts_ep_drop(struct config_group * group,struct config_item * item)2546 f_midi2_opts_ep_drop(struct config_group *group, struct config_item *item)
2547 {
2548 	struct f_midi2_ep_opts *ep_opts = to_f_midi2_ep_opts(item);
2549 
2550 	mutex_lock(&ep_opts->opts->lock);
2551 	ep_opts->opts->eps[ep_opts->index] = NULL;
2552 	mutex_unlock(&ep_opts->opts->lock);
2553 	config_item_put(item);
2554 }
2555 
2556 /*
2557  * Definitions for card config
2558  */
2559 
2560 /* define a bool option for card */
2561 #define F_MIDI2_BOOL_OPT(name)						\
2562 static ssize_t f_midi2_opts_##name##_show(struct config_item *item,	\
2563 					  char *page)			\
2564 {									\
2565 	struct f_midi2_opts *opts = to_f_midi2_opts(item);		\
2566 	return f_midi2_opts_uint_show(opts, opts->info.name,		\
2567 				      "%u\n", page);			\
2568 }									\
2569 									\
2570 static ssize_t f_midi2_opts_##name##_store(struct config_item *item,	\
2571 					 const char *page, size_t len)	\
2572 {									\
2573 	struct f_midi2_opts *opts = to_f_midi2_opts(item);		\
2574 	return f_midi2_opts_bool_store(opts, &opts->info.name,		\
2575 				       page, len);			\
2576 }									\
2577 									\
2578 CONFIGFS_ATTR(f_midi2_opts_, name)
2579 
2580 F_MIDI2_BOOL_OPT(process_ump);
2581 F_MIDI2_BOOL_OPT(static_block);
2582 
f_midi2_opts_iface_name_show(struct config_item * item,char * page)2583 static ssize_t f_midi2_opts_iface_name_show(struct config_item *item,
2584 					    char *page)
2585 {
2586 	struct f_midi2_opts *opts = to_f_midi2_opts(item);
2587 
2588 	return f_midi2_opts_str_show(opts, opts->info.iface_name, page);
2589 }
2590 
f_midi2_opts_iface_name_store(struct config_item * item,const char * page,size_t len)2591 static ssize_t f_midi2_opts_iface_name_store(struct config_item *item,
2592 					     const char *page, size_t len)
2593 {
2594 	struct f_midi2_opts *opts = to_f_midi2_opts(item);
2595 
2596 	return f_midi2_opts_str_store(opts, &opts->info.iface_name, 128,
2597 				      page, len);
2598 }
2599 
2600 CONFIGFS_ATTR(f_midi2_opts_, iface_name);
2601 
2602 static struct configfs_attribute *f_midi2_attrs[] = {
2603 	&f_midi2_opts_attr_process_ump,
2604 	&f_midi2_opts_attr_static_block,
2605 	&f_midi2_opts_attr_iface_name,
2606 	NULL
2607 };
2608 
f_midi2_opts_release(struct config_item * item)2609 static void f_midi2_opts_release(struct config_item *item)
2610 {
2611 	struct f_midi2_opts *opts = to_f_midi2_opts(item);
2612 
2613 	usb_put_function_instance(&opts->func_inst);
2614 }
2615 
2616 static struct configfs_item_operations f_midi2_item_ops = {
2617 	.release	= f_midi2_opts_release,
2618 };
2619 
2620 static struct configfs_group_operations f_midi2_group_ops = {
2621 	.make_group	= f_midi2_opts_ep_make,
2622 	.drop_item	= f_midi2_opts_ep_drop,
2623 };
2624 
2625 static const struct config_item_type f_midi2_func_type = {
2626 	.ct_item_ops	= &f_midi2_item_ops,
2627 	.ct_group_ops	= &f_midi2_group_ops,
2628 	.ct_attrs	= f_midi2_attrs,
2629 	.ct_owner	= THIS_MODULE,
2630 };
2631 
f_midi2_free_inst(struct usb_function_instance * f)2632 static void f_midi2_free_inst(struct usb_function_instance *f)
2633 {
2634 	struct f_midi2_opts *opts;
2635 
2636 	opts = container_of(f, struct f_midi2_opts, func_inst);
2637 
2638 	kfree(opts->info.iface_name);
2639 	kfree(opts);
2640 }
2641 
2642 /* gadget alloc_inst */
f_midi2_alloc_inst(void)2643 static struct usb_function_instance *f_midi2_alloc_inst(void)
2644 {
2645 	struct f_midi2_opts *opts;
2646 	struct f_midi2_ep_opts *ep_opts;
2647 	struct f_midi2_block_opts *block_opts;
2648 	int ret;
2649 
2650 	opts = kzalloc(sizeof(*opts), GFP_KERNEL);
2651 	if (!opts)
2652 		return ERR_PTR(-ENOMEM);
2653 
2654 	mutex_init(&opts->lock);
2655 	opts->func_inst.free_func_inst = f_midi2_free_inst;
2656 	opts->info.process_ump = true;
2657 	opts->info.static_block = true;
2658 	opts->info.num_reqs = 32;
2659 	opts->info.req_buf_size = 512;
2660 
2661 	/* create the default ep */
2662 	ret = f_midi2_ep_opts_create(opts, 0, &ep_opts);
2663 	if (ret) {
2664 		kfree(opts);
2665 		return ERR_PTR(ret);
2666 	}
2667 
2668 	/* create the default block */
2669 	ret = f_midi2_block_opts_create(ep_opts, 0, &block_opts);
2670 	if (ret) {
2671 		kfree(ep_opts);
2672 		kfree(opts);
2673 		return ERR_PTR(ret);
2674 	}
2675 
2676 	/* set up the default MIDI1 (that is mandatory) */
2677 	block_opts->info.midi1_num_groups = 1;
2678 
2679 	config_group_init_type_name(&opts->func_inst.group, "",
2680 				    &f_midi2_func_type);
2681 
2682 	config_group_init_type_name(&ep_opts->group, "ep.0",
2683 				    &f_midi2_ep_type);
2684 	configfs_add_default_group(&ep_opts->group, &opts->func_inst.group);
2685 
2686 	config_group_init_type_name(&block_opts->group, "block.0",
2687 				    &f_midi2_block_type);
2688 	configfs_add_default_group(&block_opts->group, &ep_opts->group);
2689 
2690 	return &opts->func_inst;
2691 }
2692 
do_f_midi2_free(struct f_midi2 * midi2,struct f_midi2_opts * opts)2693 static void do_f_midi2_free(struct f_midi2 *midi2, struct f_midi2_opts *opts)
2694 {
2695 	mutex_lock(&opts->lock);
2696 	--opts->refcnt;
2697 	mutex_unlock(&opts->lock);
2698 	kfree(midi2->string_defs);
2699 	kfree(midi2);
2700 }
2701 
f_midi2_free(struct usb_function * f)2702 static void f_midi2_free(struct usb_function *f)
2703 {
2704 	do_f_midi2_free(func_to_midi2(f),
2705 			container_of(f->fi, struct f_midi2_opts, func_inst));
2706 }
2707 
2708 /* verify the parameters set up via configfs;
2709  * return the number of EPs or a negative error
2710  */
verify_parameters(struct f_midi2_opts * opts)2711 static int verify_parameters(struct f_midi2_opts *opts)
2712 {
2713 	int i, j, num_eps, num_blks;
2714 	struct f_midi2_ep_info *ep;
2715 	struct f_midi2_block_info *bp;
2716 
2717 	for (num_eps = 0; num_eps < MAX_UMP_EPS && opts->eps[num_eps];
2718 	     num_eps++)
2719 		;
2720 	if (!num_eps) {
2721 		pr_err("f_midi2: No EP is defined\n");
2722 		return -EINVAL;
2723 	}
2724 
2725 	num_blks = 0;
2726 	for (i = 0; i < num_eps; i++) {
2727 		ep = &opts->eps[i]->info;
2728 		if (!(ep->protocol_caps & ep->protocol)) {
2729 			pr_err("f_midi2: Invalid protocol 0x%x (caps 0x%x) for EP %d\n",
2730 			       ep->protocol, ep->protocol_caps, i);
2731 			return -EINVAL;
2732 		}
2733 
2734 		for (j = 0; j < SNDRV_UMP_MAX_BLOCKS && opts->eps[i]->blks[j];
2735 		     j++, num_blks++) {
2736 			bp = &opts->eps[i]->blks[j]->info;
2737 			if (bp->first_group + bp->num_groups > SNDRV_UMP_MAX_GROUPS) {
2738 				pr_err("f_midi2: Invalid group definitions for block %d:%d\n",
2739 				       i, j);
2740 				return -EINVAL;
2741 			}
2742 
2743 			if (bp->midi1_num_groups) {
2744 				if (bp->midi1_first_group < bp->first_group ||
2745 				    bp->midi1_first_group + bp->midi1_num_groups >
2746 				    bp->first_group + bp->num_groups) {
2747 					pr_err("f_midi2: Invalid MIDI1 group definitions for block %d:%d\n",
2748 					       i, j);
2749 					return -EINVAL;
2750 				}
2751 			}
2752 		}
2753 	}
2754 	if (!num_blks) {
2755 		pr_err("f_midi2: No block is defined\n");
2756 		return -EINVAL;
2757 	}
2758 
2759 	return num_eps;
2760 }
2761 
2762 /* fill mapping between MIDI 1.0 cable and UMP EP/group */
fill_midi1_cable_mapping(struct f_midi2 * midi2,struct f_midi2_ep * ep,int blk)2763 static void fill_midi1_cable_mapping(struct f_midi2 *midi2,
2764 				     struct f_midi2_ep *ep,
2765 				     int blk)
2766 {
2767 	const struct f_midi2_block_info *binfo = &ep->blks[blk].info;
2768 	struct midi1_cable_mapping *map;
2769 	int i, group;
2770 
2771 	if (!binfo->midi1_num_groups)
2772 		return;
2773 	if (binfo->direction != SNDRV_UMP_DIR_OUTPUT) {
2774 		group = binfo->midi1_first_group;
2775 		map = midi2->in_cable_mapping + midi2->num_midi1_in;
2776 		for (i = 0; i < binfo->midi1_num_groups; i++, group++, map++) {
2777 			if (midi2->num_midi1_in >= MAX_CABLES)
2778 				break;
2779 			map->ep = ep;
2780 			map->block = blk;
2781 			map->group = group;
2782 			midi2->num_midi1_in++;
2783 			/* store 1-based cable number */
2784 			ep->in_group_to_cable[group] = midi2->num_midi1_in;
2785 		}
2786 	}
2787 
2788 	if (binfo->direction != SNDRV_UMP_DIR_INPUT) {
2789 		group = binfo->midi1_first_group;
2790 		map = midi2->out_cable_mapping + midi2->num_midi1_out;
2791 		for (i = 0; i < binfo->midi1_num_groups; i++, group++, map++) {
2792 			if (midi2->num_midi1_out >= MAX_CABLES)
2793 				break;
2794 			map->ep = ep;
2795 			map->block = blk;
2796 			map->group = group;
2797 			midi2->num_midi1_out++;
2798 		}
2799 	}
2800 }
2801 
2802 /* gadget alloc callback */
f_midi2_alloc(struct usb_function_instance * fi)2803 static struct usb_function *f_midi2_alloc(struct usb_function_instance *fi)
2804 {
2805 	struct f_midi2 *midi2;
2806 	struct f_midi2_opts *opts;
2807 	struct f_midi2_ep *ep;
2808 	struct f_midi2_block *bp;
2809 	int i, num_eps, blk;
2810 
2811 	midi2 = kzalloc(sizeof(*midi2), GFP_KERNEL);
2812 	if (!midi2)
2813 		return ERR_PTR(-ENOMEM);
2814 
2815 	opts = container_of(fi, struct f_midi2_opts, func_inst);
2816 	mutex_lock(&opts->lock);
2817 	num_eps = verify_parameters(opts);
2818 	if (num_eps < 0) {
2819 		mutex_unlock(&opts->lock);
2820 		kfree(midi2);
2821 		return ERR_PTR(num_eps);
2822 	}
2823 	++opts->refcnt;
2824 	mutex_unlock(&opts->lock);
2825 
2826 	spin_lock_init(&midi2->queue_lock);
2827 
2828 	midi2->func.name = "midi2_func";
2829 	midi2->func.bind = f_midi2_bind;
2830 	midi2->func.unbind = f_midi2_unbind;
2831 	midi2->func.get_alt = f_midi2_get_alt;
2832 	midi2->func.set_alt = f_midi2_set_alt;
2833 	midi2->func.setup = f_midi2_setup;
2834 	midi2->func.disable = f_midi2_disable;
2835 	midi2->func.free_func = f_midi2_free;
2836 
2837 	midi2->info = opts->info;
2838 	midi2->num_eps = num_eps;
2839 
2840 	for (i = 0; i < num_eps; i++) {
2841 		ep = &midi2->midi2_eps[i];
2842 		ep->info = opts->eps[i]->info;
2843 		ep->card = midi2;
2844 		for (blk = 0; blk < SNDRV_UMP_MAX_BLOCKS &&
2845 			     opts->eps[i]->blks[blk]; blk++) {
2846 			bp = &ep->blks[blk];
2847 			ep->num_blks++;
2848 			bp->info = opts->eps[i]->blks[blk]->info;
2849 			bp->gtb_id = ++midi2->total_blocks;
2850 		}
2851 	}
2852 
2853 	midi2->string_defs = kcalloc(midi2->total_blocks + 1,
2854 				     sizeof(*midi2->string_defs), GFP_KERNEL);
2855 	if (!midi2->string_defs) {
2856 		do_f_midi2_free(midi2, opts);
2857 		return ERR_PTR(-ENOMEM);
2858 	}
2859 
2860 	if (opts->info.iface_name && *opts->info.iface_name)
2861 		midi2->string_defs[STR_IFACE].s = opts->info.iface_name;
2862 	else
2863 		midi2->string_defs[STR_IFACE].s = ump_ep_name(&midi2->midi2_eps[0]);
2864 
2865 	for (i = 0; i < midi2->num_eps; i++) {
2866 		ep = &midi2->midi2_eps[i];
2867 		for (blk = 0; blk < ep->num_blks; blk++) {
2868 			bp = &ep->blks[blk];
2869 			midi2->string_defs[gtb_to_str_id(bp->gtb_id)].s =
2870 				ump_fb_name(&bp->info);
2871 
2872 			fill_midi1_cable_mapping(midi2, ep, blk);
2873 		}
2874 	}
2875 
2876 	if (!midi2->num_midi1_in && !midi2->num_midi1_out) {
2877 		pr_err("f_midi2: MIDI1 definition is missing\n");
2878 		do_f_midi2_free(midi2, opts);
2879 		return ERR_PTR(-EINVAL);
2880 	}
2881 
2882 	return &midi2->func;
2883 }
2884 
2885 DECLARE_USB_FUNCTION_INIT(midi2, f_midi2_alloc_inst, f_midi2_alloc);
2886 
2887 MODULE_LICENSE("GPL");
2888