diff options
Diffstat (limited to 'sound/usb/usbaudio.c')
-rw-r--r-- | sound/usb/usbaudio.c | 25 |
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 | */ | ||
3300 | static 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 | */ |