]> err.no Git - linux-2.6/blobdiff - sound/usb/usbmidi.c
[ALSA] hda-intel - Fix ULI M5461 support
[linux-2.6] / sound / usb / usbmidi.c
index bee70068dce083726a13a4c18481fe7abec11726..d0d895df537572cd346b8362850bfd69ff1702b9 100644 (file)
@@ -524,16 +524,16 @@ static struct usb_protocol_ops snd_usbmidi_novation_ops = {
 };
 
 /*
- * Mark of the Unicorn USB MIDI protocol: raw MIDI.
+ * "raw" protocol: used by the MOTU FastLane.
  */
 
-static void snd_usbmidi_motu_input(snd_usb_midi_in_endpoint_t* ep,
-                                  uint8_t* buffer, int buffer_length)
+static void snd_usbmidi_raw_input(snd_usb_midi_in_endpoint_t* ep,
+                                 uint8_t* buffer, int buffer_length)
 {
        snd_usbmidi_input_data(ep, 0, buffer, buffer_length);
 }
 
-static void snd_usbmidi_motu_output(snd_usb_midi_out_endpoint_t* ep)
+static void snd_usbmidi_raw_output(snd_usb_midi_out_endpoint_t* ep)
 {
        int count;
 
@@ -549,9 +549,9 @@ static void snd_usbmidi_motu_output(snd_usb_midi_out_endpoint_t* ep)
        ep->urb->transfer_buffer_length = count;
 }
 
-static struct usb_protocol_ops snd_usbmidi_motu_ops = {
-       .input = snd_usbmidi_motu_input,
-       .output = snd_usbmidi_motu_output,
+static struct usb_protocol_ops snd_usbmidi_raw_ops = {
+       .input = snd_usbmidi_raw_input,
+       .output = snd_usbmidi_raw_output,
 };
 
 /*
@@ -765,7 +765,10 @@ static snd_rawmidi_ops_t snd_usbmidi_input_ops = {
 static void snd_usbmidi_in_endpoint_delete(snd_usb_midi_in_endpoint_t* ep)
 {
        if (ep->urb) {
-               kfree(ep->urb->transfer_buffer);
+               usb_buffer_free(ep->umidi->chip->dev,
+                               ep->urb->transfer_buffer_length,
+                               ep->urb->transfer_buffer,
+                               ep->urb->transfer_dma);
                usb_free_urb(ep->urb);
        }
        kfree(ep);
@@ -799,7 +802,8 @@ static int snd_usbmidi_in_endpoint_create(snd_usb_midi_t* umidi,
        else
                pipe = usb_rcvbulkpipe(umidi->chip->dev, ep_info->in_ep);
        length = usb_maxpacket(umidi->chip->dev, pipe, 0);
-       buffer = kmalloc(length, GFP_KERNEL);
+       buffer = usb_buffer_alloc(umidi->chip->dev, length, GFP_KERNEL,
+                                 &ep->urb->transfer_dma);
        if (!buffer) {
                snd_usbmidi_in_endpoint_delete(ep);
                return -ENOMEM;
@@ -812,6 +816,7 @@ static int snd_usbmidi_in_endpoint_create(snd_usb_midi_t* umidi,
                usb_fill_bulk_urb(ep->urb, umidi->chip->dev, pipe, buffer, length,
                                  snd_usb_complete_callback(snd_usbmidi_in_urb_complete),
                                  ep);
+       ep->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
 
        rep->in = ep;
        return 0;
@@ -835,7 +840,9 @@ static void snd_usbmidi_out_endpoint_delete(snd_usb_midi_out_endpoint_t* ep)
        if (ep->tasklet.func)
                tasklet_kill(&ep->tasklet);
        if (ep->urb) {
-               kfree(ep->urb->transfer_buffer);
+               usb_buffer_free(ep->umidi->chip->dev, ep->max_transfer,
+                               ep->urb->transfer_buffer,
+                               ep->urb->transfer_dma);
                usb_free_urb(ep->urb);
        }
        kfree(ep);
@@ -867,7 +874,8 @@ static int snd_usbmidi_out_endpoint_create(snd_usb_midi_t* umidi,
        /* we never use interrupt output pipes */
        pipe = usb_sndbulkpipe(umidi->chip->dev, ep_info->out_ep);
        ep->max_transfer = usb_maxpacket(umidi->chip->dev, pipe, 1);
-       buffer = kmalloc(ep->max_transfer, GFP_KERNEL);
+       buffer = usb_buffer_alloc(umidi->chip->dev, ep->max_transfer,
+                                 GFP_KERNEL, &ep->urb->transfer_dma);
        if (!buffer) {
                snd_usbmidi_out_endpoint_delete(ep);
                return -ENOMEM;
@@ -875,6 +883,7 @@ static int snd_usbmidi_out_endpoint_create(snd_usb_midi_t* umidi,
        usb_fill_bulk_urb(ep->urb, umidi->chip->dev, pipe, buffer,
                          ep->max_transfer,
                          snd_usb_complete_callback(snd_usbmidi_out_urb_complete), ep);
+       ep->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
 
        spin_lock_init(&ep->buffer_lock);
        tasklet_init(&ep->tasklet, snd_usbmidi_out_tasklet, (unsigned long)ep);
@@ -1505,8 +1514,8 @@ int snd_usb_create_midi_interface(snd_usb_audio_t* chip,
                        umidi->usb_protocol_ops = &snd_usbmidi_novation_ops;
                        err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
                        break;
-               case QUIRK_MIDI_MOTU:
-                       umidi->usb_protocol_ops = &snd_usbmidi_motu_ops;
+               case QUIRK_MIDI_RAW:
+                       umidi->usb_protocol_ops = &snd_usbmidi_raw_ops;
                        err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
                        break;
                case QUIRK_MIDI_EMAGIC:
@@ -1515,6 +1524,9 @@ int snd_usb_create_midi_interface(snd_usb_audio_t* chip,
                               sizeof(snd_usb_midi_endpoint_info_t));
                        err = snd_usbmidi_detect_endpoints(umidi, &endpoints[0], 1);
                        break;
+               case QUIRK_MIDI_MIDITECH:
+                       err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
+                       break;
                default:
                        snd_printd(KERN_ERR "invalid quirk type %d\n", quirk->type);
                        err = -ENXIO;