Lines Matching refs:midi

16  * and drivers/usb/gadget/midi.c,
35 #include <linux/usb/midi.h>
110 static void f_midi_transmit(struct f_midi *midi);
243 struct f_midi *midi = ep->driver_data;
244 struct snd_rawmidi_substream *substream = midi->out_substream[cable];
250 if (!test_bit(cable, &midi->out_triggered))
272 struct f_midi *midi = ep->driver_data;
273 struct usb_composite_dev *cdev = midi->func.config->cdev;
278 if (ep == midi->out_ep) {
281 } else if (ep == midi->in_ep) {
285 f_midi_transmit(midi);
296 if (ep == midi->out_ep) {
299 * by the midi->in_req_fifo. */
324 static void f_midi_drop_out_substreams(struct f_midi *midi)
328 for (i = 0; i < midi->in_ports; i++) {
329 struct gmidi_in_port *port = midi->in_ports_array + i;
337 static int f_midi_start_ep(struct f_midi *midi,
346 err = config_ep_by_speed(midi->gadget, f, ep);
358 ep->driver_data = midi;
365 struct f_midi *midi = func_to_midi(f);
370 if (intf != midi->ms_id)
373 err = f_midi_start_ep(midi, f, midi->in_ep);
377 err = f_midi_start_ep(midi, f, midi->out_ep);
382 while (kfifo_avail(&midi->in_req_fifo)) {
384 midi_alloc_ep_req(midi->in_ep, midi->buflen);
392 kfifo_put(&midi->in_req_fifo, req);
396 for (i = 0; i < midi->qlen && err == 0; i++) {
398 midi_alloc_ep_req(midi->out_ep, midi->buflen);
404 err = usb_ep_queue(midi->out_ep, req, GFP_ATOMIC);
406 ERROR(midi, "%s: couldn't enqueue request: %d\n",
407 midi->out_ep->name, err);
409 free_ep_req(midi->out_ep, req);
419 struct f_midi *midi = func_to_midi(f);
429 usb_ep_disable(midi->in_ep);
430 usb_ep_disable(midi->out_ep);
433 while (kfifo_get(&midi->in_req_fifo, &req))
434 free_ep_req(midi->in_ep, req);
436 f_midi_drop_out_substreams(midi);
606 static int f_midi_do_transmit(struct f_midi *midi, struct usb_ep *ep)
617 len = kfifo_peek(&midi->in_req_fifo, &req);
619 ERROR(midi, "%s: Couldn't get usb request\n", __func__);
632 for (i = midi->in_last_port; i < midi->in_ports; ++i) {
633 struct gmidi_in_port *port = midi->in_ports_array + i;
639 while (req->length + 3 < midi->buflen) {
653 midi->in_last_port = active ? i : 0;
660 ERROR(midi, "%s failed to queue req: %d\n",
661 midi->in_ep->name, err);
665 kfifo_skip(&midi->in_req_fifo);
666 kfifo_put(&midi->in_req_fifo, req);
673 static void f_midi_transmit(struct f_midi *midi)
675 struct usb_ep *ep = midi->in_ep;
683 spin_lock_irqsave(&midi->transmit_lock, flags);
686 ret = f_midi_do_transmit(midi, ep);
688 spin_unlock_irqrestore(&midi->transmit_lock, flags);
693 spin_unlock_irqrestore(&midi->transmit_lock, flags);
698 f_midi_drop_out_substreams(midi);
703 struct f_midi *midi;
705 midi = container_of(work, struct f_midi, work);
706 f_midi_transmit(midi);
711 struct f_midi *midi = substream->rmidi->private_data;
714 if (substream->number >= midi->in_ports)
717 VDBG(midi, "%s()\n", __func__);
718 port = midi->in_ports_array + substream->number;
726 struct f_midi *midi = substream->rmidi->private_data;
728 VDBG(midi, "%s()\n", __func__);
734 struct f_midi *midi = substream->rmidi->private_data;
736 if (substream->number >= midi->in_ports)
739 VDBG(midi, "%s() %d\n", __func__, up);
740 midi->in_ports_array[substream->number].active = up;
742 queue_work(system_highpri_wq, &midi->work);
747 struct f_midi *midi = substream->rmidi->private_data;
752 VDBG(midi, "%s()\n", __func__);
753 midi->out_substream[substream->number] = substream;
759 struct f_midi *midi = substream->rmidi->private_data;
761 VDBG(midi, "%s()\n", __func__);
767 struct f_midi *midi = substream->rmidi->private_data;
769 VDBG(midi, "%s()\n", __func__);
772 set_bit(substream->number, &midi->out_triggered);
774 clear_bit(substream->number, &midi->out_triggered);
789 static inline void f_midi_unregister_card(struct f_midi *midi)
791 if (midi->card) {
792 snd_card_free(midi->card);
793 midi->card = NULL;
798 static int f_midi_register_card(struct f_midi *midi)
807 err = snd_card_new(&midi->gadget->dev, midi->index, midi->id,
810 ERROR(midi, "snd_card_new() failed\n");
813 midi->card = card;
815 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, midi, &ops);
817 ERROR(midi, "snd_device_new() failed: error %d\n", err);
828 midi->out_ports, midi->in_ports, &rmidi);
830 ERROR(midi, "snd_rawmidi_new() failed: error %d\n", err);
833 midi->rmidi = rmidi;
834 midi->in_last_port = 0;
839 rmidi->private_data = midi;
841 midi->free_ref++;
853 ERROR(midi, "snd_card_register() failed\n");
857 VDBG(midi, "%s() finished ok\n", __func__);
861 f_midi_unregister_card(midi);
875 struct f_midi *midi = func_to_midi(f);
879 midi->gadget = cdev->gadget;
880 INIT_WORK(&midi->work, f_midi_in_work);
881 status = f_midi_register_card(midi);
905 midi->ms_id = status;
910 midi->in_ep = usb_ep_autoconfig(cdev->gadget, &bulk_in_desc);
911 if (!midi->in_ep)
914 midi->out_ep = usb_ep_autoconfig(cdev->gadget, &bulk_out_desc);
915 if (!midi->out_ep)
939 + (midi->in_ports + midi->out_ports) *
946 for (n = 0; n < midi->in_ports; n++) {
974 for (n = 0; n < midi->out_ports; n++) {
1002 ms_out_desc.bLength = USB_DT_MS_ENDPOINT_SIZE(midi->in_ports);
1003 ms_out_desc.bNumEmbMIDIJack = midi->in_ports;
1005 ms_in_desc.bLength = USB_DT_MS_ENDPOINT_SIZE(midi->out_ports);
1006 ms_in_desc.bNumEmbMIDIJack = midi->out_ports;
1059 f_midi_unregister_card(midi);
1287 struct f_midi *midi;
1291 midi = func_to_midi(f);
1294 if (!--midi->free_ref) {
1295 kfree(midi->id);
1296 kfifo_free(&midi->in_req_fifo);
1297 kfree(midi);
1314 struct f_midi *midi = func_to_midi(f);
1322 card = midi->card;
1323 midi->card = NULL;
1332 struct f_midi *midi = NULL;
1346 midi = kzalloc(struct_size(midi, in_ports_array, opts->in_ports),
1348 if (!midi) {
1354 midi->in_ports_array[i].cable = i;
1356 /* set up ALSA midi devices */
1357 midi->id = kstrdup(opts->id, GFP_KERNEL);
1358 if (opts->id && !midi->id) {
1362 midi->in_ports = opts->in_ports;
1363 midi->out_ports = opts->out_ports;
1364 midi->index = opts->index;
1365 midi->buflen = opts->buflen;
1366 midi->qlen = opts->qlen;
1367 midi->in_last_port = 0;
1368 midi->free_ref = 1;
1370 status = kfifo_alloc(&midi->in_req_fifo, midi->qlen, GFP_KERNEL);
1374 spin_lock_init(&midi->transmit_lock);
1379 midi->func.name = "gmidi function";
1380 midi->func.bind = f_midi_bind;
1381 midi->func.unbind = f_midi_unbind;
1382 midi->func.set_alt = f_midi_set_alt;
1383 midi->func.disable = f_midi_disable;
1384 midi->func.free_func = f_midi_free;
1386 return &midi->func;
1389 if (midi)
1390 kfree(midi->id);
1391 kfree(midi);
1398 DECLARE_USB_FUNCTION_INIT(midi, f_midi_alloc_inst, f_midi_alloc);