Skip to content

Commit

Permalink
ALSA: usb - Add boot quirk for C-Media 6206 USB Audio
Browse files Browse the repository at this point in the history
Added boot quirk for C-Media CM6206 device in snd_usb_audio_probe.
The function snd_usb_cm6206_boot_quirk sets up six internal 16-bit
registers in order to initialize the device. Values for the registers
came from sniffing USB traffic under Windows since only four of the six
are documented in the datasheet for CM106 and some reserved bits were
also being set.

[Minor coding-style fixes by tiwai]

Signed-off-by: Dan Allongo <gongo2k1@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Dan Allongo authored and Takashi Iwai committed Jun 8, 2009
1 parent ca85b6b commit 92a4379
Showing 1 changed file with 25 additions and 0 deletions.
25 changes: 25 additions & 0 deletions sound/usb/usbaudio.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
*/
Expand Down

0 comments on commit 92a4379

Please sign in to comment.