Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.9.4.
  1/*
  2 * f_midi.c -- USB MIDI class function driver
  3 *
  4 * Copyright (C) 2006 Thumtronics Pty Ltd.
  5 * Developed for Thumtronics by Grey Innovation
  6 * Ben Williamson <ben.williamson@greyinnovation.com>
  7 *
  8 * Rewritten for the composite framework
  9 *   Copyright (C) 2011 Daniel Mack <zonque@gmail.com>
 10 *
 11 * Based on drivers/usb/gadget/f_audio.c,
 12 *   Copyright (C) 2008 Bryan Wu <cooloney@kernel.org>
 13 *   Copyright (C) 2008 Analog Devices, Inc
 14 *
 15 * and drivers/usb/gadget/midi.c,
 16 *   Copyright (C) 2006 Thumtronics Pty Ltd.
 17 *   Ben Williamson <ben.williamson@greyinnovation.com>
 18 *
 19 * Licensed under the GPL-2 or later.
 20 */
 21
 22#include <linux/kernel.h>
 23#include <linux/slab.h>
 24#include <linux/device.h>
 25
 26#include <sound/core.h>
 27#include <sound/initval.h>
 28#include <sound/rawmidi.h>
 29
 30#include <linux/usb/ch9.h>
 31#include <linux/usb/gadget.h>
 32#include <linux/usb/audio.h>
 33#include <linux/usb/midi.h>
 34
 35#include "u_f.h"
 36
 37MODULE_AUTHOR("Ben Williamson");
 38MODULE_LICENSE("GPL v2");
 39
 40static const char f_midi_shortname[] = "f_midi";
 41static const char f_midi_longname[] = "MIDI Gadget";
 42
 43/*
 44 * We can only handle 16 cables on one single endpoint, as cable numbers are
 45 * stored in 4-bit fields. And as the interface currently only holds one
 46 * single endpoint, this is the maximum number of ports we can allow.
 47 */
 48#define MAX_PORTS 16
 49
 50/*
 51 * This is a gadget, and the IN/OUT naming is from the host's perspective.
 52 * USB -> OUT endpoint -> rawmidi
 53 * USB <- IN endpoint  <- rawmidi
 54 */
 55struct gmidi_in_port {
 56	struct f_midi *midi;
 57	int active;
 58	uint8_t cable;
 59	uint8_t state;
 60#define STATE_UNKNOWN	0
 61#define STATE_1PARAM	1
 62#define STATE_2PARAM_1	2
 63#define STATE_2PARAM_2	3
 64#define STATE_SYSEX_0	4
 65#define STATE_SYSEX_1	5
 66#define STATE_SYSEX_2	6
 67	uint8_t data[2];
 68};
 69
 70struct f_midi {
 71	struct usb_function	func;
 72	struct usb_gadget	*gadget;
 73	struct usb_ep		*in_ep, *out_ep;
 74	struct snd_card		*card;
 75	struct snd_rawmidi	*rmidi;
 76
 77	struct snd_rawmidi_substream *in_substream[MAX_PORTS];
 78	struct snd_rawmidi_substream *out_substream[MAX_PORTS];
 79	struct gmidi_in_port	*in_port[MAX_PORTS];
 80
 81	unsigned long		out_triggered;
 82	struct tasklet_struct	tasklet;
 83	unsigned int in_ports;
 84	unsigned int out_ports;
 85	int index;
 86	char *id;
 87	unsigned int buflen, qlen;
 88};
 89
 90static inline struct f_midi *func_to_midi(struct usb_function *f)
 91{
 92	return container_of(f, struct f_midi, func);
 93}
 94
 95static void f_midi_transmit(struct f_midi *midi, struct usb_request *req);
 96
 97DECLARE_UAC_AC_HEADER_DESCRIPTOR(1);
 98DECLARE_USB_MIDI_OUT_JACK_DESCRIPTOR(1);
 99DECLARE_USB_MS_ENDPOINT_DESCRIPTOR(16);
100
101/* B.3.1  Standard AC Interface Descriptor */
102static struct usb_interface_descriptor ac_interface_desc __initdata = {
103	.bLength =		USB_DT_INTERFACE_SIZE,
104	.bDescriptorType =	USB_DT_INTERFACE,
105	/* .bInterfaceNumber =	DYNAMIC */
106	/* .bNumEndpoints =	DYNAMIC */
107	.bInterfaceClass =	USB_CLASS_AUDIO,
108	.bInterfaceSubClass =	USB_SUBCLASS_AUDIOCONTROL,
109	/* .iInterface =	DYNAMIC */
110};
111
112/* B.3.2  Class-Specific AC Interface Descriptor */
113static struct uac1_ac_header_descriptor_1 ac_header_desc __initdata = {
114	.bLength =		UAC_DT_AC_HEADER_SIZE(1),
115	.bDescriptorType =	USB_DT_CS_INTERFACE,
116	.bDescriptorSubtype =	USB_MS_HEADER,
117	.bcdADC =		cpu_to_le16(0x0100),
118	.wTotalLength =		cpu_to_le16(UAC_DT_AC_HEADER_SIZE(1)),
119	.bInCollection =	1,
120	/* .baInterfaceNr =	DYNAMIC */
121};
122
123/* B.4.1  Standard MS Interface Descriptor */
124static struct usb_interface_descriptor ms_interface_desc __initdata = {
125	.bLength =		USB_DT_INTERFACE_SIZE,
126	.bDescriptorType =	USB_DT_INTERFACE,
127	/* .bInterfaceNumber =	DYNAMIC */
128	.bNumEndpoints =	2,
129	.bInterfaceClass =	USB_CLASS_AUDIO,
130	.bInterfaceSubClass =	USB_SUBCLASS_MIDISTREAMING,
131	/* .iInterface =	DYNAMIC */
132};
133
134/* B.4.2  Class-Specific MS Interface Descriptor */
135static struct usb_ms_header_descriptor ms_header_desc __initdata = {
136	.bLength =		USB_DT_MS_HEADER_SIZE,
137	.bDescriptorType =	USB_DT_CS_INTERFACE,
138	.bDescriptorSubtype =	USB_MS_HEADER,
139	.bcdMSC =		cpu_to_le16(0x0100),
140	/* .wTotalLength =	DYNAMIC */
141};
142
143/* B.5.1  Standard Bulk OUT Endpoint Descriptor */
144static struct usb_endpoint_descriptor bulk_out_desc = {
145	.bLength =		USB_DT_ENDPOINT_AUDIO_SIZE,
146	.bDescriptorType =	USB_DT_ENDPOINT,
147	.bEndpointAddress =	USB_DIR_OUT,
148	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
149};
150
151/* B.5.2  Class-specific MS Bulk OUT Endpoint Descriptor */
152static struct usb_ms_endpoint_descriptor_16 ms_out_desc = {
153	/* .bLength =		DYNAMIC */
154	.bDescriptorType =	USB_DT_CS_ENDPOINT,
155	.bDescriptorSubtype =	USB_MS_GENERAL,
156	/* .bNumEmbMIDIJack =	DYNAMIC */
157	/* .baAssocJackID =	DYNAMIC */
158};
159
160/* B.6.1  Standard Bulk IN Endpoint Descriptor */
161static struct usb_endpoint_descriptor bulk_in_desc = {
162	.bLength =		USB_DT_ENDPOINT_AUDIO_SIZE,
163	.bDescriptorType =	USB_DT_ENDPOINT,
164	.bEndpointAddress =	USB_DIR_IN,
165	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
166};
167
168/* B.6.2  Class-specific MS Bulk IN Endpoint Descriptor */
169static struct usb_ms_endpoint_descriptor_16 ms_in_desc = {
170	/* .bLength =		DYNAMIC */
171	.bDescriptorType =	USB_DT_CS_ENDPOINT,
172	.bDescriptorSubtype =	USB_MS_GENERAL,
173	/* .bNumEmbMIDIJack =	DYNAMIC */
174	/* .baAssocJackID =	DYNAMIC */
175};
176
177/* string IDs are assigned dynamically */
178
179#define STRING_FUNC_IDX			0
180
181static struct usb_string midi_string_defs[] = {
182	[STRING_FUNC_IDX].s = "MIDI function",
183	{  } /* end of list */
184};
185
186static struct usb_gadget_strings midi_stringtab = {
187	.language	= 0x0409,	/* en-us */
188	.strings	= midi_string_defs,
189};
190
191static struct usb_gadget_strings *midi_strings[] = {
192	&midi_stringtab,
193	NULL,
194};
195
196static inline struct usb_request *midi_alloc_ep_req(struct usb_ep *ep,
197						    unsigned length)
198{
199	return alloc_ep_req(ep, length, length);
200}
201
202static void free_ep_req(struct usb_ep *ep, struct usb_request *req)
203{
204	kfree(req->buf);
205	usb_ep_free_request(ep, req);
206}
207
208static const uint8_t f_midi_cin_length[] = {
209	0, 0, 2, 3, 3, 1, 2, 3, 3, 3, 3, 3, 2, 2, 3, 1
210};
211
212/*
213 * Receives a chunk of MIDI data.
214 */
215static void f_midi_read_data(struct usb_ep *ep, int cable,
216			     uint8_t *data, int length)
217{
218	struct f_midi *midi = ep->driver_data;
219	struct snd_rawmidi_substream *substream = midi->out_substream[cable];
220
221	if (!substream)
222		/* Nobody is listening - throw it on the floor. */
223		return;
224
225	if (!test_bit(cable, &midi->out_triggered))
226		return;
227
228	snd_rawmidi_receive(substream, data, length);
229}
230
231static void f_midi_handle_out_data(struct usb_ep *ep, struct usb_request *req)
232{
233	unsigned int i;
234	u8 *buf = req->buf;
235
236	for (i = 0; i + 3 < req->actual; i += 4)
237		if (buf[i] != 0) {
238			int cable = buf[i] >> 4;
239			int length = f_midi_cin_length[buf[i] & 0x0f];
240			f_midi_read_data(ep, cable, &buf[i + 1], length);
241		}
242}
243
244static void
245f_midi_complete(struct usb_ep *ep, struct usb_request *req)
246{
247	struct f_midi *midi = ep->driver_data;
248	struct usb_composite_dev *cdev = midi->func.config->cdev;
249	int status = req->status;
250
251	switch (status) {
252	case 0:			 /* normal completion */
253		if (ep == midi->out_ep) {
254			/* We received stuff. req is queued again, below */
255			f_midi_handle_out_data(ep, req);
256		} else if (ep == midi->in_ep) {
257			/* Our transmit completed. See if there's more to go.
258			 * f_midi_transmit eats req, don't queue it again. */
259			f_midi_transmit(midi, req);
260			return;
261		}
262		break;
263
264	/* this endpoint is normally active while we're configured */
265	case -ECONNABORTED:	/* hardware forced ep reset */
266	case -ECONNRESET:	/* request dequeued */
267	case -ESHUTDOWN:	/* disconnect from host */
268		VDBG(cdev, "%s gone (%d), %d/%d\n", ep->name, status,
269				req->actual, req->length);
270		if (ep == midi->out_ep)
271			f_midi_handle_out_data(ep, req);
272
273		free_ep_req(ep, req);
274		return;
275
276	case -EOVERFLOW:	/* buffer overrun on read means that
277				 * we didn't provide a big enough buffer.
278				 */
279	default:
280		DBG(cdev, "%s complete --> %d, %d/%d\n", ep->name,
281				status, req->actual, req->length);
282		break;
283	case -EREMOTEIO:	/* short read */
284		break;
285	}
286
287	status = usb_ep_queue(ep, req, GFP_ATOMIC);
288	if (status) {
289		ERROR(cdev, "kill %s:  resubmit %d bytes --> %d\n",
290				ep->name, req->length, status);
291		usb_ep_set_halt(ep);
292		/* FIXME recover later ... somehow */
293	}
294}
295
296static int f_midi_start_ep(struct f_midi *midi,
297			   struct usb_function *f,
298			   struct usb_ep *ep)
299{
300	int err;
301	struct usb_composite_dev *cdev = f->config->cdev;
302
303	if (ep->driver_data)
304		usb_ep_disable(ep);
305
306	err = config_ep_by_speed(midi->gadget, f, ep);
307	if (err) {
308		ERROR(cdev, "can't configure %s: %d\n", ep->name, err);
309		return err;
310	}
311
312	err = usb_ep_enable(ep);
313	if (err) {
314		ERROR(cdev, "can't start %s: %d\n", ep->name, err);
315		return err;
316	}
317
318	ep->driver_data = midi;
319
320	return 0;
321}
322
323static int f_midi_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
324{
325	struct f_midi *midi = func_to_midi(f);
326	struct usb_composite_dev *cdev = f->config->cdev;
327	unsigned i;
328	int err;
329
330	err = f_midi_start_ep(midi, f, midi->in_ep);
331	if (err)
332		return err;
333
334	err = f_midi_start_ep(midi, f, midi->out_ep);
335	if (err)
336		return err;
337
338	if (midi->out_ep->driver_data)
339		usb_ep_disable(midi->out_ep);
340
341	err = config_ep_by_speed(midi->gadget, f, midi->out_ep);
342	if (err) {
343		ERROR(cdev, "can't configure %s: %d\n",
344		      midi->out_ep->name, err);
345		return err;
346	}
347
348	err = usb_ep_enable(midi->out_ep);
349	if (err) {
350		ERROR(cdev, "can't start %s: %d\n",
351		      midi->out_ep->name, err);
352		return err;
353	}
354
355	midi->out_ep->driver_data = midi;
356
357	/* allocate a bunch of read buffers and queue them all at once. */
358	for (i = 0; i < midi->qlen && err == 0; i++) {
359		struct usb_request *req =
360			midi_alloc_ep_req(midi->out_ep, midi->buflen);
361		if (req == NULL)
362			return -ENOMEM;
363
364		req->complete = f_midi_complete;
365		err = usb_ep_queue(midi->out_ep, req, GFP_ATOMIC);
366		if (err) {
367			ERROR(midi, "%s queue req: %d\n",
368				    midi->out_ep->name, err);
369		}
370	}
371
372	return 0;
373}
374
375static void f_midi_disable(struct usb_function *f)
376{
377	struct f_midi *midi = func_to_midi(f);
378	struct usb_composite_dev *cdev = f->config->cdev;
379
380	DBG(cdev, "disable\n");
381
382	/*
383	 * just disable endpoints, forcing completion of pending i/o.
384	 * all our completion handlers free their requests in this case.
385	 */
386	usb_ep_disable(midi->in_ep);
387	usb_ep_disable(midi->out_ep);
388}
389
390static void f_midi_unbind(struct usb_configuration *c, struct usb_function *f)
391{
392	struct usb_composite_dev *cdev = f->config->cdev;
393	struct f_midi *midi = func_to_midi(f);
394	struct snd_card *card;
395
396	DBG(cdev, "unbind\n");
397
398	/* just to be sure */
399	f_midi_disable(f);
400
401	card = midi->card;
402	midi->card = NULL;
403	if (card)
404		snd_card_free(card);
405
406	kfree(midi->id);
407	midi->id = NULL;
408
409	usb_free_all_descriptors(f);
410	kfree(midi);
411}
412
413static int f_midi_snd_free(struct snd_device *device)
414{
415	return 0;
416}
417
418static void f_midi_transmit_packet(struct usb_request *req, uint8_t p0,
419					uint8_t p1, uint8_t p2, uint8_t p3)
420{
421	unsigned length = req->length;
422	u8 *buf = (u8 *)req->buf + length;
423
424	buf[0] = p0;
425	buf[1] = p1;
426	buf[2] = p2;
427	buf[3] = p3;
428	req->length = length + 4;
429}
430
431/*
432 * Converts MIDI commands to USB MIDI packets.
433 */
434static void f_midi_transmit_byte(struct usb_request *req,
435				 struct gmidi_in_port *port, uint8_t b)
436{
437	uint8_t p0 = port->cable << 4;
438
439	if (b >= 0xf8) {
440		f_midi_transmit_packet(req, p0 | 0x0f, b, 0, 0);
441	} else if (b >= 0xf0) {
442		switch (b) {
443		case 0xf0:
444			port->data[0] = b;
445			port->state = STATE_SYSEX_1;
446			break;
447		case 0xf1:
448		case 0xf3:
449			port->data[0] = b;
450			port->state = STATE_1PARAM;
451			break;
452		case 0xf2:
453			port->data[0] = b;
454			port->state = STATE_2PARAM_1;
455			break;
456		case 0xf4:
457		case 0xf5:
458			port->state = STATE_UNKNOWN;
459			break;
460		case 0xf6:
461			f_midi_transmit_packet(req, p0 | 0x05, 0xf6, 0, 0);
462			port->state = STATE_UNKNOWN;
463			break;
464		case 0xf7:
465			switch (port->state) {
466			case STATE_SYSEX_0:
467				f_midi_transmit_packet(req,
468					p0 | 0x05, 0xf7, 0, 0);
469				break;
470			case STATE_SYSEX_1:
471				f_midi_transmit_packet(req,
472					p0 | 0x06, port->data[0], 0xf7, 0);
473				break;
474			case STATE_SYSEX_2:
475				f_midi_transmit_packet(req,
476					p0 | 0x07, port->data[0],
477					port->data[1], 0xf7);
478				break;
479			}
480			port->state = STATE_UNKNOWN;
481			break;
482		}
483	} else if (b >= 0x80) {
484		port->data[0] = b;
485		if (b >= 0xc0 && b <= 0xdf)
486			port->state = STATE_1PARAM;
487		else
488			port->state = STATE_2PARAM_1;
489	} else { /* b < 0x80 */
490		switch (port->state) {
491		case STATE_1PARAM:
492			if (port->data[0] < 0xf0) {
493				p0 |= port->data[0] >> 4;
494			} else {
495				p0 |= 0x02;
496				port->state = STATE_UNKNOWN;
497			}
498			f_midi_transmit_packet(req, p0, port->data[0], b, 0);
499			break;
500		case STATE_2PARAM_1:
501			port->data[1] = b;
502			port->state = STATE_2PARAM_2;
503			break;
504		case STATE_2PARAM_2:
505			if (port->data[0] < 0xf0) {
506				p0 |= port->data[0] >> 4;
507				port->state = STATE_2PARAM_1;
508			} else {
509				p0 |= 0x03;
510				port->state = STATE_UNKNOWN;
511			}
512			f_midi_transmit_packet(req,
513				p0, port->data[0], port->data[1], b);
514			break;
515		case STATE_SYSEX_0:
516			port->data[0] = b;
517			port->state = STATE_SYSEX_1;
518			break;
519		case STATE_SYSEX_1:
520			port->data[1] = b;
521			port->state = STATE_SYSEX_2;
522			break;
523		case STATE_SYSEX_2:
524			f_midi_transmit_packet(req,
525				p0 | 0x04, port->data[0], port->data[1], b);
526			port->state = STATE_SYSEX_0;
527			break;
528		}
529	}
530}
531
532static void f_midi_transmit(struct f_midi *midi, struct usb_request *req)
533{
534	struct usb_ep *ep = midi->in_ep;
535	int i;
536
537	if (!ep)
538		return;
539
540	if (!req)
541		req = midi_alloc_ep_req(ep, midi->buflen);
542
543	if (!req) {
544		ERROR(midi, "gmidi_transmit: alloc_ep_request failed\n");
545		return;
546	}
547	req->length = 0;
548	req->complete = f_midi_complete;
549
550	for (i = 0; i < MAX_PORTS; i++) {
551		struct gmidi_in_port *port = midi->in_port[i];
552		struct snd_rawmidi_substream *substream = midi->in_substream[i];
553
554		if (!port || !port->active || !substream)
555			continue;
556
557		while (req->length + 3 < midi->buflen) {
558			uint8_t b;
559			if (snd_rawmidi_transmit(substream, &b, 1) != 1) {
560				port->active = 0;
561				break;
562			}
563			f_midi_transmit_byte(req, port, b);
564		}
565	}
566
567	if (req->length > 0)
568		usb_ep_queue(ep, req, GFP_ATOMIC);
569	else
570		free_ep_req(ep, req);
571}
572
573static void f_midi_in_tasklet(unsigned long data)
574{
575	struct f_midi *midi = (struct f_midi *) data;
576	f_midi_transmit(midi, NULL);
577}
578
579static int f_midi_in_open(struct snd_rawmidi_substream *substream)
580{
581	struct f_midi *midi = substream->rmidi->private_data;
582
583	if (!midi->in_port[substream->number])
584		return -EINVAL;
585
586	VDBG(midi, "%s()\n", __func__);
587	midi->in_substream[substream->number] = substream;
588	midi->in_port[substream->number]->state = STATE_UNKNOWN;
589	return 0;
590}
591
592static int f_midi_in_close(struct snd_rawmidi_substream *substream)
593{
594	struct f_midi *midi = substream->rmidi->private_data;
595
596	VDBG(midi, "%s()\n", __func__);
597	return 0;
598}
599
600static void f_midi_in_trigger(struct snd_rawmidi_substream *substream, int up)
601{
602	struct f_midi *midi = substream->rmidi->private_data;
603
604	if (!midi->in_port[substream->number])
605		return;
606
607	VDBG(midi, "%s() %d\n", __func__, up);
608	midi->in_port[substream->number]->active = up;
609	if (up)
610		tasklet_hi_schedule(&midi->tasklet);
611}
612
613static int f_midi_out_open(struct snd_rawmidi_substream *substream)
614{
615	struct f_midi *midi = substream->rmidi->private_data;
616
617	if (substream->number >= MAX_PORTS)
618		return -EINVAL;
619
620	VDBG(midi, "%s()\n", __func__);
621	midi->out_substream[substream->number] = substream;
622	return 0;
623}
624
625static int f_midi_out_close(struct snd_rawmidi_substream *substream)
626{
627	struct f_midi *midi = substream->rmidi->private_data;
628
629	VDBG(midi, "%s()\n", __func__);
630	return 0;
631}
632
633static void f_midi_out_trigger(struct snd_rawmidi_substream *substream, int up)
634{
635	struct f_midi *midi = substream->rmidi->private_data;
636
637	VDBG(midi, "%s()\n", __func__);
638
639	if (up)
640		set_bit(substream->number, &midi->out_triggered);
641	else
642		clear_bit(substream->number, &midi->out_triggered);
643}
644
645static struct snd_rawmidi_ops gmidi_in_ops = {
646	.open = f_midi_in_open,
647	.close = f_midi_in_close,
648	.trigger = f_midi_in_trigger,
649};
650
651static struct snd_rawmidi_ops gmidi_out_ops = {
652	.open = f_midi_out_open,
653	.close = f_midi_out_close,
654	.trigger = f_midi_out_trigger
655};
656
657/* register as a sound "card" */
658static int f_midi_register_card(struct f_midi *midi)
659{
660	struct snd_card *card;
661	struct snd_rawmidi *rmidi;
662	int err;
663	static struct snd_device_ops ops = {
664		.dev_free = f_midi_snd_free,
665	};
666
667	err = snd_card_new(&midi->gadget->dev, midi->index, midi->id,
668			   THIS_MODULE, 0, &card);
669	if (err < 0) {
670		ERROR(midi, "snd_card_new() failed\n");
671		goto fail;
672	}
673	midi->card = card;
674
675	err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, midi, &ops);
676	if (err < 0) {
677		ERROR(midi, "snd_device_new() failed: error %d\n", err);
678		goto fail;
679	}
680
681	strcpy(card->driver, f_midi_longname);
682	strcpy(card->longname, f_midi_longname);
683	strcpy(card->shortname, f_midi_shortname);
684
685	/* Set up rawmidi */
686	snd_component_add(card, "MIDI");
687	err = snd_rawmidi_new(card, card->longname, 0,
688			      midi->out_ports, midi->in_ports, &rmidi);
689	if (err < 0) {
690		ERROR(midi, "snd_rawmidi_new() failed: error %d\n", err);
691		goto fail;
692	}
693	midi->rmidi = rmidi;
694	strcpy(rmidi->name, card->shortname);
695	rmidi->info_flags = SNDRV_RAWMIDI_INFO_OUTPUT |
696			    SNDRV_RAWMIDI_INFO_INPUT |
697			    SNDRV_RAWMIDI_INFO_DUPLEX;
698	rmidi->private_data = midi;
699
700	/*
701	 * Yes, rawmidi OUTPUT = USB IN, and rawmidi INPUT = USB OUT.
702	 * It's an upside-down world being a gadget.
703	 */
704	snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT, &gmidi_in_ops);
705	snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_INPUT, &gmidi_out_ops);
706
707	/* register it - we're ready to go */
708	err = snd_card_register(card);
709	if (err < 0) {
710		ERROR(midi, "snd_card_register() failed\n");
711		goto fail;
712	}
713
714	VDBG(midi, "%s() finished ok\n", __func__);
715	return 0;
716
717fail:
718	if (midi->card) {
719		snd_card_free(midi->card);
720		midi->card = NULL;
721	}
722	return err;
723}
724
725/* MIDI function driver setup/binding */
726
727static int __init
728f_midi_bind(struct usb_configuration *c, struct usb_function *f)
729{
730	struct usb_descriptor_header **midi_function;
731	struct usb_midi_in_jack_descriptor jack_in_ext_desc[MAX_PORTS];
732	struct usb_midi_in_jack_descriptor jack_in_emb_desc[MAX_PORTS];
733	struct usb_midi_out_jack_descriptor_1 jack_out_ext_desc[MAX_PORTS];
734	struct usb_midi_out_jack_descriptor_1 jack_out_emb_desc[MAX_PORTS];
735	struct usb_composite_dev *cdev = c->cdev;
736	struct f_midi *midi = func_to_midi(f);
737	int status, n, jack = 1, i = 0;
738
739	/* maybe allocate device-global string ID */
740	if (midi_string_defs[0].id == 0) {
741		status = usb_string_id(c->cdev);
742		if (status < 0)
743			goto fail;
744		midi_string_defs[0].id = status;
745	}
746
747	/* We have two interfaces, AudioControl and MIDIStreaming */
748	status = usb_interface_id(c, f);
749	if (status < 0)
750		goto fail;
751	ac_interface_desc.bInterfaceNumber = status;
752
753	status = usb_interface_id(c, f);
754	if (status < 0)
755		goto fail;
756	ms_interface_desc.bInterfaceNumber = status;
757	ac_header_desc.baInterfaceNr[0] = status;
758
759	status = -ENODEV;
760
761	/* allocate instance-specific endpoints */
762	midi->in_ep = usb_ep_autoconfig(cdev->gadget, &bulk_in_desc);
763	if (!midi->in_ep)
764		goto fail;
765	midi->in_ep->driver_data = cdev;	/* claim */
766
767	midi->out_ep = usb_ep_autoconfig(cdev->gadget, &bulk_out_desc);
768	if (!midi->out_ep)
769		goto fail;
770	midi->out_ep->driver_data = cdev;	/* claim */
771
772	/* allocate temporary function list */
773	midi_function = kcalloc((MAX_PORTS * 4) + 9, sizeof(*midi_function),
774				GFP_KERNEL);
775	if (!midi_function) {
776		status = -ENOMEM;
777		goto fail;
778	}
779
780	/*
781	 * construct the function's descriptor set. As the number of
782	 * input and output MIDI ports is configurable, we have to do
783	 * it that way.
784	 */
785
786	/* add the headers - these are always the same */
787	midi_function[i++] = (struct usb_descriptor_header *) &ac_interface_desc;
788	midi_function[i++] = (struct usb_descriptor_header *) &ac_header_desc;
789	midi_function[i++] = (struct usb_descriptor_header *) &ms_interface_desc;
790
791	/* calculate the header's wTotalLength */
792	n = USB_DT_MS_HEADER_SIZE
793		+ (midi->in_ports + midi->out_ports) *
794			(USB_DT_MIDI_IN_SIZE + USB_DT_MIDI_OUT_SIZE(1));
795	ms_header_desc.wTotalLength = cpu_to_le16(n);
796
797	midi_function[i++] = (struct usb_descriptor_header *) &ms_header_desc;
798
799	/* configure the external IN jacks, each linked to an embedded OUT jack */
800	for (n = 0; n < midi->in_ports; n++) {
801		struct usb_midi_in_jack_descriptor *in_ext = &jack_in_ext_desc[n];
802		struct usb_midi_out_jack_descriptor_1 *out_emb = &jack_out_emb_desc[n];
803
804		in_ext->bLength			= USB_DT_MIDI_IN_SIZE;
805		in_ext->bDescriptorType		= USB_DT_CS_INTERFACE;
806		in_ext->bDescriptorSubtype	= USB_MS_MIDI_IN_JACK;
807		in_ext->bJackType		= USB_MS_EXTERNAL;
808		in_ext->bJackID			= jack++;
809		in_ext->iJack			= 0;
810		midi_function[i++] = (struct usb_descriptor_header *) in_ext;
811
812		out_emb->bLength		= USB_DT_MIDI_OUT_SIZE(1);
813		out_emb->bDescriptorType	= USB_DT_CS_INTERFACE;
814		out_emb->bDescriptorSubtype	= USB_MS_MIDI_OUT_JACK;
815		out_emb->bJackType		= USB_MS_EMBEDDED;
816		out_emb->bJackID		= jack++;
817		out_emb->bNrInputPins		= 1;
818		out_emb->pins[0].baSourcePin	= 1;
819		out_emb->pins[0].baSourceID	= in_ext->bJackID;
820		out_emb->iJack			= 0;
821		midi_function[i++] = (struct usb_descriptor_header *) out_emb;
822
823		/* link it to the endpoint */
824		ms_in_desc.baAssocJackID[n] = out_emb->bJackID;
825	}
826
827	/* configure the external OUT jacks, each linked to an embedded IN jack */
828	for (n = 0; n < midi->out_ports; n++) {
829		struct usb_midi_in_jack_descriptor *in_emb = &jack_in_emb_desc[n];
830		struct usb_midi_out_jack_descriptor_1 *out_ext = &jack_out_ext_desc[n];
831
832		in_emb->bLength			= USB_DT_MIDI_IN_SIZE;
833		in_emb->bDescriptorType		= USB_DT_CS_INTERFACE;
834		in_emb->bDescriptorSubtype	= USB_MS_MIDI_IN_JACK;
835		in_emb->bJackType		= USB_MS_EMBEDDED;
836		in_emb->bJackID			= jack++;
837		in_emb->iJack			= 0;
838		midi_function[i++] = (struct usb_descriptor_header *) in_emb;
839
840		out_ext->bLength =		USB_DT_MIDI_OUT_SIZE(1);
841		out_ext->bDescriptorType =	USB_DT_CS_INTERFACE;
842		out_ext->bDescriptorSubtype =	USB_MS_MIDI_OUT_JACK;
843		out_ext->bJackType =		USB_MS_EXTERNAL;
844		out_ext->bJackID =		jack++;
845		out_ext->bNrInputPins =		1;
846		out_ext->iJack =		0;
847		out_ext->pins[0].baSourceID =	in_emb->bJackID;
848		out_ext->pins[0].baSourcePin =	1;
849		midi_function[i++] = (struct usb_descriptor_header *) out_ext;
850
851		/* link it to the endpoint */
852		ms_out_desc.baAssocJackID[n] = in_emb->bJackID;
853	}
854
855	/* configure the endpoint descriptors ... */
856	ms_out_desc.bLength = USB_DT_MS_ENDPOINT_SIZE(midi->in_ports);
857	ms_out_desc.bNumEmbMIDIJack = midi->in_ports;
858
859	ms_in_desc.bLength = USB_DT_MS_ENDPOINT_SIZE(midi->out_ports);
860	ms_in_desc.bNumEmbMIDIJack = midi->out_ports;
861
862	/* ... and add them to the list */
863	midi_function[i++] = (struct usb_descriptor_header *) &bulk_out_desc;
864	midi_function[i++] = (struct usb_descriptor_header *) &ms_out_desc;
865	midi_function[i++] = (struct usb_descriptor_header *) &bulk_in_desc;
866	midi_function[i++] = (struct usb_descriptor_header *) &ms_in_desc;
867	midi_function[i++] = NULL;
868
869	/*
870	 * support all relevant hardware speeds... we expect that when
871	 * hardware is dual speed, all bulk-capable endpoints work at
872	 * both speeds
873	 */
874	/* copy descriptors, and track endpoint copies */
875	f->fs_descriptors = usb_copy_descriptors(midi_function);
876	if (!f->fs_descriptors)
877		goto fail_f_midi;
878
879	if (gadget_is_dualspeed(c->cdev->gadget)) {
880		bulk_in_desc.wMaxPacketSize = cpu_to_le16(512);
881		bulk_out_desc.wMaxPacketSize = cpu_to_le16(512);
882		f->hs_descriptors = usb_copy_descriptors(midi_function);
883		if (!f->hs_descriptors)
884			goto fail_f_midi;
885	}
886
887	kfree(midi_function);
888
889	return 0;
890
891fail_f_midi:
892	kfree(midi_function);
893	usb_free_descriptors(f->hs_descriptors);
894fail:
895	/* we might as well release our claims on endpoints */
896	if (midi->out_ep)
897		midi->out_ep->driver_data = NULL;
898	if (midi->in_ep)
899		midi->in_ep->driver_data = NULL;
900
901	ERROR(cdev, "%s: can't bind, err %d\n", f->name, status);
902
903	return status;
904}
905
906/**
907 * f_midi_bind_config - add USB MIDI function to a configuration
908 * @c: the configuration to supcard the USB audio function
909 * @index: the soundcard index to use for the ALSA device creation
910 * @id: the soundcard id to use for the ALSA device creation
911 * @buflen: the buffer length to use
912 * @qlen the number of read requests to pre-allocate
913 * Context: single threaded during gadget setup
914 *
915 * Returns zero on success, else negative errno.
916 */
917int __init f_midi_bind_config(struct usb_configuration *c,
918			      int index, char *id,
919			      unsigned int in_ports,
920			      unsigned int out_ports,
921			      unsigned int buflen,
922			      unsigned int qlen)
923{
924	struct f_midi *midi;
925	int status, i;
926
927	/* sanity check */
928	if (in_ports > MAX_PORTS || out_ports > MAX_PORTS)
929		return -EINVAL;
930
931	/* allocate and initialize one new instance */
932	midi = kzalloc(sizeof *midi, GFP_KERNEL);
933	if (!midi) {
934		status = -ENOMEM;
935		goto fail;
936	}
937
938	for (i = 0; i < in_ports; i++) {
939		struct gmidi_in_port *port = kzalloc(sizeof(*port), GFP_KERNEL);
940		if (!port) {
941			status = -ENOMEM;
942			goto setup_fail;
943		}
944
945		port->midi = midi;
946		port->active = 0;
947		port->cable = i;
948		midi->in_port[i] = port;
949	}
950
951	midi->gadget = c->cdev->gadget;
952	tasklet_init(&midi->tasklet, f_midi_in_tasklet, (unsigned long) midi);
953
954	/* set up ALSA midi devices */
955	midi->in_ports = in_ports;
956	midi->out_ports = out_ports;
957	status = f_midi_register_card(midi);
958	if (status < 0)
959		goto setup_fail;
960
961	midi->func.name        = "gmidi function";
962	midi->func.strings     = midi_strings;
963	midi->func.bind        = f_midi_bind;
964	midi->func.unbind      = f_midi_unbind;
965	midi->func.set_alt     = f_midi_set_alt;
966	midi->func.disable     = f_midi_disable;
967
968	midi->id = kstrdup(id, GFP_KERNEL);
969	midi->index = index;
970	midi->buflen = buflen;
971	midi->qlen = qlen;
972
973	status = usb_add_function(c, &midi->func);
974	if (status)
975		goto setup_fail;
976
977	return 0;
978
979setup_fail:
980	for (--i; i >= 0; i--)
981		kfree(midi->in_port[i]);
982	kfree(midi);
983fail:
984	return status;
985}
986