Commit 964af639 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: usb-audio: Initialize Dell Dock playback volumes

In the early commit adcdd0d5 ("ALSA: usb-audio: Skip volume
controls triggers hangup on Dell USB Dock"), we add the mixer quirks
for Dell dock to skip two mixer FU's for playback.  This supposed that
the device has always the proper initial volume, but it doesn't seem
always correct.

This patch adds the explicit initialization of the volumes to the
fixed 0dB at the device probe time.  Also, such a fixup is needed
after the resume, so a new function is hooked to the resume callback
as well.

Bugzilla: http://bugzilla.suse.com/show_bug.cgi?id=1089467Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 9c367c01
...@@ -2948,6 +2948,8 @@ int snd_usb_mixer_resume(struct usb_mixer_interface *mixer, bool reset_resume) ...@@ -2948,6 +2948,8 @@ int snd_usb_mixer_resume(struct usb_mixer_interface *mixer, bool reset_resume)
} }
} }
snd_usb_mixer_resume_quirk(mixer);
return snd_usb_mixer_activate(mixer); return snd_usb_mixer_activate(mixer);
} }
#endif #endif
......
...@@ -1799,6 +1799,26 @@ static int snd_soundblaster_e1_switch_create(struct usb_mixer_interface *mixer) ...@@ -1799,6 +1799,26 @@ static int snd_soundblaster_e1_switch_create(struct usb_mixer_interface *mixer)
NULL); NULL);
} }
static void dell_dock_init_vol(struct snd_usb_audio *chip, int ch, int id)
{
u16 buf = 0;
snd_usb_ctl_msg(chip->dev, usb_sndctrlpipe(chip->dev, 0), UAC_SET_CUR,
USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
ch, snd_usb_ctrl_intf(chip) | (id << 8),
&buf, 2);
}
static int dell_dock_mixer_init(struct usb_mixer_interface *mixer)
{
/* fix to 0dB playback volumes */
dell_dock_init_vol(mixer->chip, 1, 16);
dell_dock_init_vol(mixer->chip, 2, 16);
dell_dock_init_vol(mixer->chip, 1, 19);
dell_dock_init_vol(mixer->chip, 2, 19);
return 0;
}
int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer) int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
{ {
int err = 0; int err = 0;
...@@ -1884,11 +1904,25 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer) ...@@ -1884,11 +1904,25 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
case USB_ID(0x041e, 0x323b): /* Creative Sound Blaster E1 */ case USB_ID(0x041e, 0x323b): /* Creative Sound Blaster E1 */
err = snd_soundblaster_e1_switch_create(mixer); err = snd_soundblaster_e1_switch_create(mixer);
break; break;
case USB_ID(0x0bda, 0x4014): /* Dell WD15 dock */
err = dell_dock_mixer_init(mixer);
break;
} }
return err; return err;
} }
#ifdef CONFIG_PM
void snd_usb_mixer_resume_quirk(struct usb_mixer_interface *mixer)
{
switch (mixer->chip->usb_id) {
case USB_ID(0x0bda, 0x4014): /* Dell WD15 dock */
dell_dock_mixer_init(mixer);
break;
}
}
#endif
void snd_usb_mixer_rc_memory_change(struct usb_mixer_interface *mixer, void snd_usb_mixer_rc_memory_change(struct usb_mixer_interface *mixer,
int unitid) int unitid)
{ {
......
...@@ -14,5 +14,9 @@ void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer, ...@@ -14,5 +14,9 @@ void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
struct usb_mixer_elem_info *cval, int unitid, struct usb_mixer_elem_info *cval, int unitid,
struct snd_kcontrol *kctl); struct snd_kcontrol *kctl);
#ifdef CONFIG_PM
void snd_usb_mixer_resume_quirk(struct usb_mixer_interface *mixer);
#endif
#endif /* SND_USB_MIXER_QUIRKS_H */ #endif /* SND_USB_MIXER_QUIRKS_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment