]> rtime.felk.cvut.cz Git - linux-imx.git/blobdiff - sound/usb/midi.c
ALSA: usb-audio: add MIDI port names for some Roland devices
[linux-imx.git] / sound / usb / midi.c
index 8e01fa4991c519a07b9f7c8dda22acac1d38cb77..b901f468b67ada579739828b382e165713de324e 100644 (file)
@@ -1575,8 +1575,41 @@ static struct port_info {
        EXTERNAL_PORT(0x0582, 0x004d, 0, "%s MIDI"),
        EXTERNAL_PORT(0x0582, 0x004d, 1, "%s 1"),
        EXTERNAL_PORT(0x0582, 0x004d, 2, "%s 2"),
+       /* BOSS GT-PRO */
+       CONTROL_PORT(0x0582, 0x0089, 0, "%s Control"),
        /* Edirol UM-3EX */
        CONTROL_PORT(0x0582, 0x009a, 3, "%s Control"),
+       /* Roland VG-99 */
+       CONTROL_PORT(0x0582, 0x00b2, 0, "%s Control"),
+       EXTERNAL_PORT(0x0582, 0x00b2, 1, "%s MIDI"),
+       /* Cakewalk Sonar V-Studio 100 */
+       EXTERNAL_PORT(0x0582, 0x00eb, 0, "%s MIDI"),
+       CONTROL_PORT(0x0582, 0x00eb, 1, "%s Control"),
+       /* Roland VB-99 */
+       CONTROL_PORT(0x0582, 0x0102, 0, "%s Control"),
+       EXTERNAL_PORT(0x0582, 0x0102, 1, "%s MIDI"),
+       /* Roland A-PRO */
+       EXTERNAL_PORT(0x0582, 0x010f, 0, "%s MIDI"),
+       CONTROL_PORT(0x0582, 0x010f, 1, "%s 1"),
+       CONTROL_PORT(0x0582, 0x010f, 2, "%s 2"),
+       /* Roland SD-50 */
+       ROLAND_SYNTH_PORT(0x0582, 0x0114, 0, "%s Synth", 128),
+       EXTERNAL_PORT(0x0582, 0x0114, 1, "%s MIDI"),
+       CONTROL_PORT(0x0582, 0x0114, 2, "%s Control"),
+       /* Roland OCTA-CAPTURE */
+       EXTERNAL_PORT(0x0582, 0x0120, 0, "%s MIDI"),
+       CONTROL_PORT(0x0582, 0x0120, 1, "%s Control"),
+       EXTERNAL_PORT(0x0582, 0x0121, 0, "%s MIDI"),
+       CONTROL_PORT(0x0582, 0x0121, 1, "%s Control"),
+       /* Roland SPD-SX */
+       CONTROL_PORT(0x0582, 0x0145, 0, "%s Control"),
+       EXTERNAL_PORT(0x0582, 0x0145, 1, "%s MIDI"),
+       /* Roland A-Series */
+       CONTROL_PORT(0x0582, 0x0156, 0, "%s Keyboard"),
+       EXTERNAL_PORT(0x0582, 0x0156, 1, "%s MIDI"),
+       /* Roland INTEGRA-7 */
+       ROLAND_SYNTH_PORT(0x0582, 0x015b, 0, "%s Synth", 128),
+       CONTROL_PORT(0x0582, 0x015b, 1, "%s Control"),
        /* M-Audio MidiSport 8x8 */
        CONTROL_PORT(0x0763, 0x1031, 8, "%s Control"),
        CONTROL_PORT(0x0763, 0x1033, 8, "%s Control"),
@@ -1947,6 +1980,44 @@ static int snd_usbmidi_detect_yamaha(struct snd_usb_midi* umidi,
        return snd_usbmidi_detect_endpoints(umidi, endpoint, 1);
 }
 
+/*
+ * Detects the endpoints and ports of Roland devices.
+ */
+static int snd_usbmidi_detect_roland(struct snd_usb_midi* umidi,
+                                    struct snd_usb_midi_endpoint_info* endpoint)
+{
+       struct usb_interface* intf;
+       struct usb_host_interface *hostif;
+       u8* cs_desc;
+
+       intf = umidi->iface;
+       if (!intf)
+               return -ENOENT;
+       hostif = intf->altsetting;
+       /*
+        * Some devices have a descriptor <06 24 F1 02 <inputs> <outputs>>,
+        * some have standard class descriptors, or both kinds, or neither.
+        */
+       for (cs_desc = hostif->extra;
+            cs_desc < hostif->extra + hostif->extralen && cs_desc[0] >= 2;
+            cs_desc += cs_desc[0]) {
+               if (cs_desc[0] >= 6 &&
+                   cs_desc[1] == USB_DT_CS_INTERFACE &&
+                   cs_desc[2] == 0xf1 &&
+                   cs_desc[3] == 0x02) {
+                       endpoint->in_cables  = (1 << cs_desc[4]) - 1;
+                       endpoint->out_cables = (1 << cs_desc[5]) - 1;
+                       return snd_usbmidi_detect_endpoints(umidi, endpoint, 1);
+               } else if (cs_desc[0] >= 7 &&
+                          cs_desc[1] == USB_DT_CS_INTERFACE &&
+                          cs_desc[2] == UAC_HEADER) {
+                       return snd_usbmidi_get_ms_info(umidi, endpoint);
+               }
+       }
+
+       return -ENODEV;
+}
+
 /*
  * Creates the endpoints and their ports for Midiman devices.
  */
@@ -2162,6 +2233,9 @@ int snd_usbmidi_create(struct snd_card *card,
        case QUIRK_MIDI_YAMAHA:
                err = snd_usbmidi_detect_yamaha(umidi, &endpoints[0]);
                break;
+       case QUIRK_MIDI_ROLAND:
+               err = snd_usbmidi_detect_roland(umidi, &endpoints[0]);
+               break;
        case QUIRK_MIDI_MIDIMAN:
                umidi->usb_protocol_ops = &snd_usbmidi_midiman_ops;
                memcpy(&endpoints[0], quirk->data,