.ifnum = QUIRK_NO_INTERFACE
        }
 },
+/* MOTU Microbook II */
+{
+       USB_DEVICE(0x07fd, 0x0004),
+       .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
+               .vendor_name = "MOTU",
+               .product_name = "MicroBookII",
+               .ifnum = QUIRK_ANY_INTERFACE,
+               .type = QUIRK_COMPOSITE,
+               .data = (const struct snd_usb_audio_quirk[]) {
+                       {
+                               .ifnum = 0,
+                               .type = QUIRK_AUDIO_STANDARD_MIXER,
+                       },
+                       {
+                               .ifnum = 0,
+                               .type = QUIRK_AUDIO_FIXED_ENDPOINT,
+                               .data = &(const struct audioformat) {
+                                       .formats = SNDRV_PCM_FMTBIT_S24_3BE,
+                                       .channels = 6,
+                                       .iface = 0,
+                                       .altsetting = 1,
+                                       .altset_idx = 1,
+                                       .attributes = 0,
+                                       .endpoint = 0x84,
+                                       .rates = SNDRV_PCM_RATE_96000,
+                                       .ep_attr = USB_ENDPOINT_XFER_ISOC |
+                                                  USB_ENDPOINT_SYNC_ASYNC,
+                                       .rate_min = 96000,
+                                       .rate_max = 96000,
+                                       .nr_rates = 1,
+                                       .maxpacksize = 0x00d8,
+                                       .rate_table = (unsigned int[]) {
+                                               96000
+                                       }
+                               }
+                       },
+                       {
+                               .ifnum = 0,
+                               .type = QUIRK_AUDIO_FIXED_ENDPOINT,
+                               .data = &(const struct audioformat) {
+                                       .formats = SNDRV_PCM_FMTBIT_S24_3BE,
+                                       .channels = 8,
+                                       .iface = 0,
+                                       .altsetting = 1,
+                                       .altset_idx = 1,
+                                       .attributes = 0,
+                                       .endpoint = 0x03,
+                                       .rates = SNDRV_PCM_RATE_96000,
+                                       .ep_attr = USB_ENDPOINT_XFER_ISOC |
+                                                  USB_ENDPOINT_SYNC_ASYNC,
+                                       .rate_min = 96000,
+                                       .rate_max = 96000,
+                                       .nr_rates = 1,
+                                       .maxpacksize = 0x0120,
+                                       .rate_table = (unsigned int[]) {
+                                               96000
+                                       }
+                               }
+                       },
+                       {
+                               .ifnum = -1
+                       }
+               }
+       }
+},
 
 #undef USB_DEVICE_VENDOR_SPEC
 
        return 0;
 }
 
+
+#define MICROBOOK_BUF_SIZE 128
+
+static int snd_usb_motu_microbookii_communicate(struct usb_device *dev, u8 *buf,
+                                               int buf_size, int *length)
+{
+       int err, actual_length;
+
+       err = usb_interrupt_msg(dev, usb_sndintpipe(dev, 0x01), buf, *length,
+                               &actual_length, 1000);
+       if (err < 0)
+               return err;
+
+       print_hex_dump(KERN_DEBUG, "MicroBookII snd: ", DUMP_PREFIX_NONE, 16, 1,
+                      buf, actual_length, false);
+
+       memset(buf, 0, buf_size);
+
+       err = usb_interrupt_msg(dev, usb_rcvintpipe(dev, 0x82), buf, buf_size,
+                               &actual_length, 1000);
+       if (err < 0)
+               return err;
+
+       print_hex_dump(KERN_DEBUG, "MicroBookII rcv: ", DUMP_PREFIX_NONE, 16, 1,
+                      buf, actual_length, false);
+
+       *length = actual_length;
+       return 0;
+}
+
+static int snd_usb_motu_microbookii_boot_quirk(struct usb_device *dev)
+{
+       int err, actual_length, poll_attempts = 0;
+       static const u8 set_samplerate_seq[] = { 0x00, 0x00, 0x00, 0x00,
+                                                0x00, 0x00, 0x0b, 0x14,
+                                                0x00, 0x00, 0x00, 0x01 };
+       static const u8 poll_ready_seq[] = { 0x00, 0x04, 0x00, 0x00,
+                                            0x00, 0x00, 0x0b, 0x18 };
+       u8 *buf = kzalloc(MICROBOOK_BUF_SIZE, GFP_KERNEL);
+
+       if (!buf)
+               return -ENOMEM;
+
+       dev_info(&dev->dev, "Waiting for MOTU Microbook II to boot up...\n");
+
+       /* First we tell the device which sample rate to use. */
+       memcpy(buf, set_samplerate_seq, sizeof(set_samplerate_seq));
+       actual_length = sizeof(set_samplerate_seq);
+       err = snd_usb_motu_microbookii_communicate(dev, buf, MICROBOOK_BUF_SIZE,
+                                                  &actual_length);
+
+       if (err < 0) {
+               dev_err(&dev->dev,
+                       "failed setting the sample rate for Motu MicroBook II: %d\n",
+                       err);
+               goto free_buf;
+       }
+
+       /* Then we poll every 100 ms until the device informs of its readiness. */
+       while (true) {
+               if (++poll_attempts > 100) {
+                       dev_err(&dev->dev,
+                               "failed booting Motu MicroBook II: timeout\n");
+                       err = -ENODEV;
+                       goto free_buf;
+               }
+
+               memset(buf, 0, MICROBOOK_BUF_SIZE);
+               memcpy(buf, poll_ready_seq, sizeof(poll_ready_seq));
+
+               actual_length = sizeof(poll_ready_seq);
+               err = snd_usb_motu_microbookii_communicate(
+                       dev, buf, MICROBOOK_BUF_SIZE, &actual_length);
+               if (err < 0) {
+                       dev_err(&dev->dev,
+                               "failed booting Motu MicroBook II: communication error %d\n",
+                               err);
+                       goto free_buf;
+               }
+
+               /* the device signals its readiness through a message of the
+                * form
+                *           XX 06 00 00 00 00 0b 18  00 00 00 01
+                * If the device is not yet ready to accept audio data, the
+                * last byte of that sequence is 00.
+                */
+               if (actual_length == 12 && buf[actual_length - 1] == 1)
+                       break;
+
+               msleep(100);
+       }
+
+       dev_info(&dev->dev, "MOTU MicroBook II ready\n");
+
+free_buf:
+       kfree(buf);
+       return err;
+}
+
 /*
  * Setup quirks
  */
                return snd_usb_gamecon780_boot_quirk(dev);
        case USB_ID(0x2466, 0x8010): /* Fractal Audio Axe-Fx 3 */
                return snd_usb_axefx3_boot_quirk(dev);
+       case USB_ID(0x07fd, 0x0004): /* MOTU MicroBook II */
+               return snd_usb_motu_microbookii_boot_quirk(dev);
        }
 
        return 0;