diff options
author | Takashi Iwai <tiwai@suse.de> | 2013-12-19 14:32:53 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2013-12-20 16:37:02 +0100 |
commit | 19570d747795f0ecff79403698b868dc5ad7fa86 (patch) | |
tree | 5a6ac72e3f80db30d4e7ab45b67f4d45f3ab534d /sound/usb/quirks.c | |
parent | 0f4881dc1fd858649589edae76efd9c318bb562f (diff) | |
download | linux-19570d747795f0ecff79403698b868dc5ad7fa86.tar.bz2 |
ALSA: usb-audio: Add a quirk for Plantronics Gamecom 780
Plantronics Gamecom 780 headset has a firmware problem, and when the
FU 0x09 volume is changed, it results in either too loud or silence
except for a very narrow range. This patch provides a workaround,
ignoring the node, initialize the volume in a sane value and keep
untouched.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=65251
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/usb/quirks.c')
-rw-r--r-- | sound/usb/quirks.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index 0df9ede99dfd..ede753685491 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -660,6 +660,18 @@ static int snd_usb_cm6206_boot_quirk(struct usb_device *dev) return err; } +/* quirk for Plantronics GameCom 780 with CM6302 chip */ +static int snd_usb_gamecon780_boot_quirk(struct usb_device *dev) +{ + /* set the initial volume and don't change; other values are either + * too loud or silent due to firmware bug (bko#65251) + */ + u8 buf[2] = { 0x74, 0xdc }; + return snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), UAC_SET_CUR, + USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT, + UAC_FU_VOLUME << 8, 9 << 8, buf, 2); +} + /* * Novation Twitch DJ controller */ @@ -986,6 +998,8 @@ int snd_usb_apply_boot_quirk(struct usb_device *dev, return snd_usb_nativeinstruments_boot_quirk(dev); case USB_ID(0x0763, 0x2012): /* M-Audio Fast Track Pro USB */ return snd_usb_fasttrackpro_boot_quirk(dev); + case USB_ID(0x047f, 0xc010): /* Plantronics Gamecom 780 */ + return snd_usb_gamecon780_boot_quirk(dev); } return 0; |