Linux Audio

Check our new training course

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