|
@@ -3095,6 +3095,32 @@ static int snd_usb_audigy2nx_boot_quirk(struct usb_device *dev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * C-Media CM106/CM106+ have four 16-bit internal registers that are nicely
|
|
|
+ * documented in the device's data sheet.
|
|
|
+ */
|
|
|
+static int snd_usb_cm106_write_int_reg(struct usb_device *dev, int reg, u16 value)
|
|
|
+{
|
|
|
+ u8 buf[4];
|
|
|
+ buf[0] = 0x20;
|
|
|
+ buf[1] = value & 0xff;
|
|
|
+ buf[2] = (value >> 8) & 0xff;
|
|
|
+ buf[3] = reg;
|
|
|
+ return snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), USB_REQ_SET_CONFIGURATION,
|
|
|
+ USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_ENDPOINT,
|
|
|
+ 0, 0, &buf, 4, 1000);
|
|
|
+}
|
|
|
+
|
|
|
+static int snd_usb_cm106_boot_quirk(struct usb_device *dev)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * Enable line-out driver mode, set headphone source to front
|
|
|
+ * channels, enable stereo mic.
|
|
|
+ */
|
|
|
+ return snd_usb_cm106_write_int_reg(dev, 2, 0x8004);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/*
|
|
|
* Setup quirks
|
|
|
*/
|
|
@@ -3365,6 +3391,12 @@ static void *snd_usb_audio_probe(struct usb_device *dev,
|
|
|
goto __err_val;
|
|
|
}
|
|
|
|
|
|
+ /* C-Media CM106 / Turtle Beach Audio Advantage Roadie */
|
|
|
+ if (id == USB_ID(0x10f5, 0x0200)) {
|
|
|
+ if (snd_usb_cm106_boot_quirk(dev) < 0)
|
|
|
+ goto __err_val;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* found a config. now register to ALSA
|
|
|
*/
|