|
@@ -3279,6 +3279,25 @@ static int snd_usb_cm106_boot_quirk(struct usb_device *dev)
|
|
|
return snd_usb_cm106_write_int_reg(dev, 2, 0x8004);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * C-Media CM6206 is based on CM106 with two additional
|
|
|
+ * registers that are not documented in the data sheet.
|
|
|
+ * Values here are chosen based on sniffing USB traffic
|
|
|
+ * under Windows.
|
|
|
+ */
|
|
|
+static int snd_usb_cm6206_boot_quirk(struct usb_device *dev)
|
|
|
+{
|
|
|
+ int err, reg;
|
|
|
+ int val[] = {0x200c, 0x3000, 0xf800, 0x143f, 0x0000, 0x3000};
|
|
|
+
|
|
|
+ for (reg = 0; reg < ARRAY_SIZE(val); reg++) {
|
|
|
+ err = snd_usb_cm106_write_int_reg(dev, reg, val[reg]);
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+
|
|
|
+ return err;
|
|
|
+}
|
|
|
|
|
|
/*
|
|
|
* Setup quirks
|
|
@@ -3565,6 +3584,12 @@ static void *snd_usb_audio_probe(struct usb_device *dev,
|
|
|
goto __err_val;
|
|
|
}
|
|
|
|
|
|
+ /* C-Media CM6206 / CM106-Like Sound Device */
|
|
|
+ if (id == USB_ID(0x0d8c, 0x0102)) {
|
|
|
+ if (snd_usb_cm6206_boot_quirk(dev) < 0)
|
|
|
+ goto __err_val;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* found a config. now register to ALSA
|
|
|
*/
|