aboutsummaryrefslogtreecommitdiffstats
path: root/sound/usb/midi.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/usb/midi.c')
-rw-r--r--sound/usb/midi.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/sound/usb/midi.c b/sound/usb/midi.c
index f9289102886a..c83f6143c0eb 100644
--- a/sound/usb/midi.c
+++ b/sound/usb/midi.c
@@ -47,6 +47,7 @@
47#include <linux/usb.h> 47#include <linux/usb.h>
48#include <linux/wait.h> 48#include <linux/wait.h>
49#include <linux/usb/audio.h> 49#include <linux/usb/audio.h>
50#include <linux/module.h>
50 51
51#include <sound/core.h> 52#include <sound/core.h>
52#include <sound/control.h> 53#include <sound/control.h>
@@ -816,6 +817,22 @@ static struct usb_protocol_ops snd_usbmidi_raw_ops = {
816 .output = snd_usbmidi_raw_output, 817 .output = snd_usbmidi_raw_output,
817}; 818};
818 819
820/*
821 * FTDI protocol: raw MIDI bytes, but input packets have two modem status bytes.
822 */
823
824static void snd_usbmidi_ftdi_input(struct snd_usb_midi_in_endpoint* ep,
825 uint8_t* buffer, int buffer_length)
826{
827 if (buffer_length > 2)
828 snd_usbmidi_input_data(ep, 0, buffer + 2, buffer_length - 2);
829}
830
831static struct usb_protocol_ops snd_usbmidi_ftdi_ops = {
832 .input = snd_usbmidi_ftdi_input,
833 .output = snd_usbmidi_raw_output,
834};
835
819static void snd_usbmidi_us122l_input(struct snd_usb_midi_in_endpoint *ep, 836static void snd_usbmidi_us122l_input(struct snd_usb_midi_in_endpoint *ep,
820 uint8_t *buffer, int buffer_length) 837 uint8_t *buffer, int buffer_length)
821{ 838{
@@ -2163,6 +2180,17 @@ int snd_usbmidi_create(struct snd_card *card,
2163 /* endpoint 1 is input-only */ 2180 /* endpoint 1 is input-only */
2164 endpoints[1].out_cables = 0; 2181 endpoints[1].out_cables = 0;
2165 break; 2182 break;
2183 case QUIRK_MIDI_FTDI:
2184 umidi->usb_protocol_ops = &snd_usbmidi_ftdi_ops;
2185
2186 /* set baud rate to 31250 (48 MHz / 16 / 96) */
2187 err = usb_control_msg(umidi->dev, usb_sndctrlpipe(umidi->dev, 0),
2188 3, 0x40, 0x60, 0, NULL, 0, 1000);
2189 if (err < 0)
2190 break;
2191
2192 err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
2193 break;
2166 default: 2194 default:
2167 snd_printd(KERN_ERR "invalid quirk type %d\n", quirk->type); 2195 snd_printd(KERN_ERR "invalid quirk type %d\n", quirk->type);
2168 err = -ENXIO; 2196 err = -ENXIO;