aboutsummaryrefslogtreecommitdiffstats
path: root/sound/usb/usbaudio.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/usb/usbaudio.c')
-rw-r--r--sound/usb/usbaudio.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c
index a8ef2cbcc03b..c7b902358b7b 100644
--- a/sound/usb/usbaudio.c
+++ b/sound/usb/usbaudio.c
@@ -3291,6 +3291,25 @@ static int snd_usb_cm106_boot_quirk(struct usb_device *dev)
3291 return snd_usb_cm106_write_int_reg(dev, 2, 0x8004); 3291 return snd_usb_cm106_write_int_reg(dev, 2, 0x8004);
3292} 3292}
3293 3293
3294/*
3295 * C-Media CM6206 is based on CM106 with two additional
3296 * registers that are not documented in the data sheet.
3297 * Values here are chosen based on sniffing USB traffic
3298 * under Windows.
3299 */
3300static int snd_usb_cm6206_boot_quirk(struct usb_device *dev)
3301{
3302 int err, reg;
3303 int val[] = {0x200c, 0x3000, 0xf800, 0x143f, 0x0000, 0x3000};
3304
3305 for (reg = 0; reg < ARRAY_SIZE(val); reg++) {
3306 err = snd_usb_cm106_write_int_reg(dev, reg, val[reg]);
3307 if (err < 0)
3308 return err;
3309 }
3310
3311 return err;
3312}
3294 3313
3295/* 3314/*
3296 * Setup quirks 3315 * Setup quirks
@@ -3577,6 +3596,12 @@ static void *snd_usb_audio_probe(struct usb_device *dev,
3577 goto __err_val; 3596 goto __err_val;
3578 } 3597 }
3579 3598
3599 /* C-Media CM6206 / CM106-Like Sound Device */
3600 if (id == USB_ID(0x0d8c, 0x0102)) {
3601 if (snd_usb_cm6206_boot_quirk(dev) < 0)
3602 goto __err_val;
3603 }
3604
3580 /* 3605 /*
3581 * found a config. now register to ALSA 3606 * found a config. now register to ALSA
3582 */ 3607 */