diff options
Diffstat (limited to 'sound/usb/midi.c')
-rw-r--r-- | sound/usb/midi.c | 28 |
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 | |||
824 | static 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 | |||
831 | static struct usb_protocol_ops snd_usbmidi_ftdi_ops = { | ||
832 | .input = snd_usbmidi_ftdi_input, | ||
833 | .output = snd_usbmidi_raw_output, | ||
834 | }; | ||
835 | |||
819 | static void snd_usbmidi_us122l_input(struct snd_usb_midi_in_endpoint *ep, | 836 | static 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; |