1*61864d84STakashi Iwai /* 2*61864d84STakashi Iwai * Line6 Linux USB driver - 0.9.1beta 3*61864d84STakashi Iwai * 4*61864d84STakashi Iwai * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at) 5*61864d84STakashi Iwai * 6*61864d84STakashi Iwai * This program is free software; you can redistribute it and/or 7*61864d84STakashi Iwai * modify it under the terms of the GNU General Public License as 8*61864d84STakashi Iwai * published by the Free Software Foundation, version 2. 9*61864d84STakashi Iwai * 10*61864d84STakashi Iwai */ 11*61864d84STakashi Iwai 12*61864d84STakashi Iwai #include <linux/slab.h> 13*61864d84STakashi Iwai #include <linux/usb.h> 14*61864d84STakashi Iwai #include <sound/core.h> 15*61864d84STakashi Iwai #include <sound/rawmidi.h> 16*61864d84STakashi Iwai 17*61864d84STakashi Iwai #include "audio.h" 18*61864d84STakashi Iwai #include "driver.h" 19*61864d84STakashi Iwai #include "midi.h" 20*61864d84STakashi Iwai #include "pod.h" 21*61864d84STakashi Iwai #include "usbdefs.h" 22*61864d84STakashi Iwai 23*61864d84STakashi Iwai #define line6_rawmidi_substream_midi(substream) \ 24*61864d84STakashi Iwai ((struct snd_line6_midi *)((substream)->rmidi->private_data)) 25*61864d84STakashi Iwai 26*61864d84STakashi Iwai static int send_midi_async(struct usb_line6 *line6, unsigned char *data, 27*61864d84STakashi Iwai int length); 28*61864d84STakashi Iwai 29*61864d84STakashi Iwai /* 30*61864d84STakashi Iwai Pass data received via USB to MIDI. 31*61864d84STakashi Iwai */ 32*61864d84STakashi Iwai void line6_midi_receive(struct usb_line6 *line6, unsigned char *data, 33*61864d84STakashi Iwai int length) 34*61864d84STakashi Iwai { 35*61864d84STakashi Iwai if (line6->line6midi->substream_receive) 36*61864d84STakashi Iwai snd_rawmidi_receive(line6->line6midi->substream_receive, 37*61864d84STakashi Iwai data, length); 38*61864d84STakashi Iwai } 39*61864d84STakashi Iwai 40*61864d84STakashi Iwai /* 41*61864d84STakashi Iwai Read data from MIDI buffer and transmit them via USB. 42*61864d84STakashi Iwai */ 43*61864d84STakashi Iwai static void line6_midi_transmit(struct snd_rawmidi_substream *substream) 44*61864d84STakashi Iwai { 45*61864d84STakashi Iwai struct usb_line6 *line6 = 46*61864d84STakashi Iwai line6_rawmidi_substream_midi(substream)->line6; 47*61864d84STakashi Iwai struct snd_line6_midi *line6midi = line6->line6midi; 48*61864d84STakashi Iwai struct midi_buffer *mb = &line6midi->midibuf_out; 49*61864d84STakashi Iwai unsigned long flags; 50*61864d84STakashi Iwai unsigned char chunk[LINE6_FALLBACK_MAXPACKETSIZE]; 51*61864d84STakashi Iwai int req, done; 52*61864d84STakashi Iwai 53*61864d84STakashi Iwai spin_lock_irqsave(&line6->line6midi->midi_transmit_lock, flags); 54*61864d84STakashi Iwai 55*61864d84STakashi Iwai for (;;) { 56*61864d84STakashi Iwai req = min(line6_midibuf_bytes_free(mb), line6->max_packet_size); 57*61864d84STakashi Iwai done = snd_rawmidi_transmit_peek(substream, chunk, req); 58*61864d84STakashi Iwai 59*61864d84STakashi Iwai if (done == 0) 60*61864d84STakashi Iwai break; 61*61864d84STakashi Iwai 62*61864d84STakashi Iwai line6_midibuf_write(mb, chunk, done); 63*61864d84STakashi Iwai snd_rawmidi_transmit_ack(substream, done); 64*61864d84STakashi Iwai } 65*61864d84STakashi Iwai 66*61864d84STakashi Iwai for (;;) { 67*61864d84STakashi Iwai done = line6_midibuf_read(mb, chunk, 68*61864d84STakashi Iwai LINE6_FALLBACK_MAXPACKETSIZE); 69*61864d84STakashi Iwai 70*61864d84STakashi Iwai if (done == 0) 71*61864d84STakashi Iwai break; 72*61864d84STakashi Iwai 73*61864d84STakashi Iwai send_midi_async(line6, chunk, done); 74*61864d84STakashi Iwai } 75*61864d84STakashi Iwai 76*61864d84STakashi Iwai spin_unlock_irqrestore(&line6->line6midi->midi_transmit_lock, flags); 77*61864d84STakashi Iwai } 78*61864d84STakashi Iwai 79*61864d84STakashi Iwai /* 80*61864d84STakashi Iwai Notification of completion of MIDI transmission. 81*61864d84STakashi Iwai */ 82*61864d84STakashi Iwai static void midi_sent(struct urb *urb) 83*61864d84STakashi Iwai { 84*61864d84STakashi Iwai unsigned long flags; 85*61864d84STakashi Iwai int status; 86*61864d84STakashi Iwai int num; 87*61864d84STakashi Iwai struct usb_line6 *line6 = (struct usb_line6 *)urb->context; 88*61864d84STakashi Iwai 89*61864d84STakashi Iwai status = urb->status; 90*61864d84STakashi Iwai kfree(urb->transfer_buffer); 91*61864d84STakashi Iwai usb_free_urb(urb); 92*61864d84STakashi Iwai 93*61864d84STakashi Iwai if (status == -ESHUTDOWN) 94*61864d84STakashi Iwai return; 95*61864d84STakashi Iwai 96*61864d84STakashi Iwai spin_lock_irqsave(&line6->line6midi->send_urb_lock, flags); 97*61864d84STakashi Iwai num = --line6->line6midi->num_active_send_urbs; 98*61864d84STakashi Iwai 99*61864d84STakashi Iwai if (num == 0) { 100*61864d84STakashi Iwai line6_midi_transmit(line6->line6midi->substream_transmit); 101*61864d84STakashi Iwai num = line6->line6midi->num_active_send_urbs; 102*61864d84STakashi Iwai } 103*61864d84STakashi Iwai 104*61864d84STakashi Iwai if (num == 0) 105*61864d84STakashi Iwai wake_up(&line6->line6midi->send_wait); 106*61864d84STakashi Iwai 107*61864d84STakashi Iwai spin_unlock_irqrestore(&line6->line6midi->send_urb_lock, flags); 108*61864d84STakashi Iwai } 109*61864d84STakashi Iwai 110*61864d84STakashi Iwai /* 111*61864d84STakashi Iwai Send an asynchronous MIDI message. 112*61864d84STakashi Iwai Assumes that line6->line6midi->send_urb_lock is held 113*61864d84STakashi Iwai (i.e., this function is serialized). 114*61864d84STakashi Iwai */ 115*61864d84STakashi Iwai static int send_midi_async(struct usb_line6 *line6, unsigned char *data, 116*61864d84STakashi Iwai int length) 117*61864d84STakashi Iwai { 118*61864d84STakashi Iwai struct urb *urb; 119*61864d84STakashi Iwai int retval; 120*61864d84STakashi Iwai unsigned char *transfer_buffer; 121*61864d84STakashi Iwai 122*61864d84STakashi Iwai urb = usb_alloc_urb(0, GFP_ATOMIC); 123*61864d84STakashi Iwai 124*61864d84STakashi Iwai if (urb == NULL) { 125*61864d84STakashi Iwai dev_err(line6->ifcdev, "Out of memory\n"); 126*61864d84STakashi Iwai return -ENOMEM; 127*61864d84STakashi Iwai } 128*61864d84STakashi Iwai 129*61864d84STakashi Iwai transfer_buffer = kmemdup(data, length, GFP_ATOMIC); 130*61864d84STakashi Iwai 131*61864d84STakashi Iwai if (transfer_buffer == NULL) { 132*61864d84STakashi Iwai usb_free_urb(urb); 133*61864d84STakashi Iwai dev_err(line6->ifcdev, "Out of memory\n"); 134*61864d84STakashi Iwai return -ENOMEM; 135*61864d84STakashi Iwai } 136*61864d84STakashi Iwai 137*61864d84STakashi Iwai usb_fill_int_urb(urb, line6->usbdev, 138*61864d84STakashi Iwai usb_sndbulkpipe(line6->usbdev, 139*61864d84STakashi Iwai line6->properties->ep_ctrl_w), 140*61864d84STakashi Iwai transfer_buffer, length, midi_sent, line6, 141*61864d84STakashi Iwai line6->interval); 142*61864d84STakashi Iwai urb->actual_length = 0; 143*61864d84STakashi Iwai retval = usb_submit_urb(urb, GFP_ATOMIC); 144*61864d84STakashi Iwai 145*61864d84STakashi Iwai if (retval < 0) { 146*61864d84STakashi Iwai dev_err(line6->ifcdev, "usb_submit_urb failed\n"); 147*61864d84STakashi Iwai usb_free_urb(urb); 148*61864d84STakashi Iwai return retval; 149*61864d84STakashi Iwai } 150*61864d84STakashi Iwai 151*61864d84STakashi Iwai ++line6->line6midi->num_active_send_urbs; 152*61864d84STakashi Iwai return 0; 153*61864d84STakashi Iwai } 154*61864d84STakashi Iwai 155*61864d84STakashi Iwai static int line6_midi_output_open(struct snd_rawmidi_substream *substream) 156*61864d84STakashi Iwai { 157*61864d84STakashi Iwai return 0; 158*61864d84STakashi Iwai } 159*61864d84STakashi Iwai 160*61864d84STakashi Iwai static int line6_midi_output_close(struct snd_rawmidi_substream *substream) 161*61864d84STakashi Iwai { 162*61864d84STakashi Iwai return 0; 163*61864d84STakashi Iwai } 164*61864d84STakashi Iwai 165*61864d84STakashi Iwai static void line6_midi_output_trigger(struct snd_rawmidi_substream *substream, 166*61864d84STakashi Iwai int up) 167*61864d84STakashi Iwai { 168*61864d84STakashi Iwai unsigned long flags; 169*61864d84STakashi Iwai struct usb_line6 *line6 = 170*61864d84STakashi Iwai line6_rawmidi_substream_midi(substream)->line6; 171*61864d84STakashi Iwai 172*61864d84STakashi Iwai line6->line6midi->substream_transmit = substream; 173*61864d84STakashi Iwai spin_lock_irqsave(&line6->line6midi->send_urb_lock, flags); 174*61864d84STakashi Iwai 175*61864d84STakashi Iwai if (line6->line6midi->num_active_send_urbs == 0) 176*61864d84STakashi Iwai line6_midi_transmit(substream); 177*61864d84STakashi Iwai 178*61864d84STakashi Iwai spin_unlock_irqrestore(&line6->line6midi->send_urb_lock, flags); 179*61864d84STakashi Iwai } 180*61864d84STakashi Iwai 181*61864d84STakashi Iwai static void line6_midi_output_drain(struct snd_rawmidi_substream *substream) 182*61864d84STakashi Iwai { 183*61864d84STakashi Iwai struct usb_line6 *line6 = 184*61864d84STakashi Iwai line6_rawmidi_substream_midi(substream)->line6; 185*61864d84STakashi Iwai struct snd_line6_midi *midi = line6->line6midi; 186*61864d84STakashi Iwai 187*61864d84STakashi Iwai wait_event_interruptible(midi->send_wait, 188*61864d84STakashi Iwai midi->num_active_send_urbs == 0); 189*61864d84STakashi Iwai } 190*61864d84STakashi Iwai 191*61864d84STakashi Iwai static int line6_midi_input_open(struct snd_rawmidi_substream *substream) 192*61864d84STakashi Iwai { 193*61864d84STakashi Iwai return 0; 194*61864d84STakashi Iwai } 195*61864d84STakashi Iwai 196*61864d84STakashi Iwai static int line6_midi_input_close(struct snd_rawmidi_substream *substream) 197*61864d84STakashi Iwai { 198*61864d84STakashi Iwai return 0; 199*61864d84STakashi Iwai } 200*61864d84STakashi Iwai 201*61864d84STakashi Iwai static void line6_midi_input_trigger(struct snd_rawmidi_substream *substream, 202*61864d84STakashi Iwai int up) 203*61864d84STakashi Iwai { 204*61864d84STakashi Iwai struct usb_line6 *line6 = 205*61864d84STakashi Iwai line6_rawmidi_substream_midi(substream)->line6; 206*61864d84STakashi Iwai 207*61864d84STakashi Iwai if (up) 208*61864d84STakashi Iwai line6->line6midi->substream_receive = substream; 209*61864d84STakashi Iwai else 210*61864d84STakashi Iwai line6->line6midi->substream_receive = NULL; 211*61864d84STakashi Iwai } 212*61864d84STakashi Iwai 213*61864d84STakashi Iwai static struct snd_rawmidi_ops line6_midi_output_ops = { 214*61864d84STakashi Iwai .open = line6_midi_output_open, 215*61864d84STakashi Iwai .close = line6_midi_output_close, 216*61864d84STakashi Iwai .trigger = line6_midi_output_trigger, 217*61864d84STakashi Iwai .drain = line6_midi_output_drain, 218*61864d84STakashi Iwai }; 219*61864d84STakashi Iwai 220*61864d84STakashi Iwai static struct snd_rawmidi_ops line6_midi_input_ops = { 221*61864d84STakashi Iwai .open = line6_midi_input_open, 222*61864d84STakashi Iwai .close = line6_midi_input_close, 223*61864d84STakashi Iwai .trigger = line6_midi_input_trigger, 224*61864d84STakashi Iwai }; 225*61864d84STakashi Iwai 226*61864d84STakashi Iwai /* 227*61864d84STakashi Iwai Cleanup the Line6 MIDI device. 228*61864d84STakashi Iwai */ 229*61864d84STakashi Iwai static void line6_cleanup_midi(struct snd_rawmidi *rmidi) 230*61864d84STakashi Iwai { 231*61864d84STakashi Iwai } 232*61864d84STakashi Iwai 233*61864d84STakashi Iwai /* Create a MIDI device */ 234*61864d84STakashi Iwai static int snd_line6_new_midi(struct snd_line6_midi *line6midi) 235*61864d84STakashi Iwai { 236*61864d84STakashi Iwai struct snd_rawmidi *rmidi; 237*61864d84STakashi Iwai int err; 238*61864d84STakashi Iwai 239*61864d84STakashi Iwai err = snd_rawmidi_new(line6midi->line6->card, "Line6 MIDI", 0, 1, 1, 240*61864d84STakashi Iwai &rmidi); 241*61864d84STakashi Iwai if (err < 0) 242*61864d84STakashi Iwai return err; 243*61864d84STakashi Iwai 244*61864d84STakashi Iwai rmidi->private_data = line6midi; 245*61864d84STakashi Iwai rmidi->private_free = line6_cleanup_midi; 246*61864d84STakashi Iwai strcpy(rmidi->id, line6midi->line6->properties->id); 247*61864d84STakashi Iwai strcpy(rmidi->name, line6midi->line6->properties->name); 248*61864d84STakashi Iwai 249*61864d84STakashi Iwai rmidi->info_flags = 250*61864d84STakashi Iwai SNDRV_RAWMIDI_INFO_OUTPUT | 251*61864d84STakashi Iwai SNDRV_RAWMIDI_INFO_INPUT | SNDRV_RAWMIDI_INFO_DUPLEX; 252*61864d84STakashi Iwai 253*61864d84STakashi Iwai snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT, 254*61864d84STakashi Iwai &line6_midi_output_ops); 255*61864d84STakashi Iwai snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_INPUT, 256*61864d84STakashi Iwai &line6_midi_input_ops); 257*61864d84STakashi Iwai return 0; 258*61864d84STakashi Iwai } 259*61864d84STakashi Iwai 260*61864d84STakashi Iwai /* MIDI device destructor */ 261*61864d84STakashi Iwai static int snd_line6_midi_free(struct snd_device *device) 262*61864d84STakashi Iwai { 263*61864d84STakashi Iwai struct snd_line6_midi *line6midi = device->device_data; 264*61864d84STakashi Iwai 265*61864d84STakashi Iwai line6_midibuf_destroy(&line6midi->midibuf_in); 266*61864d84STakashi Iwai line6_midibuf_destroy(&line6midi->midibuf_out); 267*61864d84STakashi Iwai return 0; 268*61864d84STakashi Iwai } 269*61864d84STakashi Iwai 270*61864d84STakashi Iwai /* 271*61864d84STakashi Iwai Initialize the Line6 MIDI subsystem. 272*61864d84STakashi Iwai */ 273*61864d84STakashi Iwai int line6_init_midi(struct usb_line6 *line6) 274*61864d84STakashi Iwai { 275*61864d84STakashi Iwai static struct snd_device_ops midi_ops = { 276*61864d84STakashi Iwai .dev_free = snd_line6_midi_free, 277*61864d84STakashi Iwai }; 278*61864d84STakashi Iwai 279*61864d84STakashi Iwai int err; 280*61864d84STakashi Iwai struct snd_line6_midi *line6midi; 281*61864d84STakashi Iwai 282*61864d84STakashi Iwai if (!(line6->properties->capabilities & LINE6_CAP_CONTROL)) { 283*61864d84STakashi Iwai /* skip MIDI initialization and report success */ 284*61864d84STakashi Iwai return 0; 285*61864d84STakashi Iwai } 286*61864d84STakashi Iwai 287*61864d84STakashi Iwai line6midi = kzalloc(sizeof(struct snd_line6_midi), GFP_KERNEL); 288*61864d84STakashi Iwai 289*61864d84STakashi Iwai if (line6midi == NULL) 290*61864d84STakashi Iwai return -ENOMEM; 291*61864d84STakashi Iwai 292*61864d84STakashi Iwai err = line6_midibuf_init(&line6midi->midibuf_in, MIDI_BUFFER_SIZE, 0); 293*61864d84STakashi Iwai if (err < 0) { 294*61864d84STakashi Iwai kfree(line6midi); 295*61864d84STakashi Iwai return err; 296*61864d84STakashi Iwai } 297*61864d84STakashi Iwai 298*61864d84STakashi Iwai err = line6_midibuf_init(&line6midi->midibuf_out, MIDI_BUFFER_SIZE, 1); 299*61864d84STakashi Iwai if (err < 0) { 300*61864d84STakashi Iwai kfree(line6midi->midibuf_in.buf); 301*61864d84STakashi Iwai kfree(line6midi); 302*61864d84STakashi Iwai return err; 303*61864d84STakashi Iwai } 304*61864d84STakashi Iwai 305*61864d84STakashi Iwai line6midi->line6 = line6; 306*61864d84STakashi Iwai line6->line6midi = line6midi; 307*61864d84STakashi Iwai 308*61864d84STakashi Iwai err = snd_device_new(line6->card, SNDRV_DEV_RAWMIDI, line6midi, 309*61864d84STakashi Iwai &midi_ops); 310*61864d84STakashi Iwai if (err < 0) 311*61864d84STakashi Iwai return err; 312*61864d84STakashi Iwai 313*61864d84STakashi Iwai err = snd_line6_new_midi(line6midi); 314*61864d84STakashi Iwai if (err < 0) 315*61864d84STakashi Iwai return err; 316*61864d84STakashi Iwai 317*61864d84STakashi Iwai init_waitqueue_head(&line6midi->send_wait); 318*61864d84STakashi Iwai spin_lock_init(&line6midi->send_urb_lock); 319*61864d84STakashi Iwai spin_lock_init(&line6midi->midi_transmit_lock); 320*61864d84STakashi Iwai return 0; 321*61864d84STakashi Iwai } 322