diff options
Diffstat (limited to 'sound/usb/mixer.c')
-rw-r--r-- | sound/usb/mixer.c | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 5a2d9a768f70..2faf5767c7f8 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -3631,20 +3631,43 @@ static int restore_mixer_value(struct usb_mixer_elem_list *list) return 0; } +static int default_mixer_resume(struct usb_mixer_elem_list *list) +{ + struct usb_mixer_elem_info *cval = mixer_elem_list_to_info(list); + + /* get connector value to "wake up" the USB audio */ + if (cval->val_type == USB_MIXER_BOOLEAN && cval->channels == 1) + get_connector_value(cval, NULL, NULL); + + return 0; +} + +static int default_mixer_reset_resume(struct usb_mixer_elem_list *list) +{ + int err = default_mixer_resume(list); + + if (err < 0) + return err; + return restore_mixer_value(list); +} + int snd_usb_mixer_resume(struct usb_mixer_interface *mixer, bool reset_resume) { struct usb_mixer_elem_list *list; + usb_mixer_elem_resume_func_t f; int id, err; - if (reset_resume) { - /* restore cached mixer values */ - for (id = 0; id < MAX_ID_ELEMS; id++) { - for_each_mixer_elem(list, mixer, id) { - if (list->resume) { - err = list->resume(list); - if (err < 0) - return err; - } + /* restore cached mixer values */ + for (id = 0; id < MAX_ID_ELEMS; id++) { + for_each_mixer_elem(list, mixer, id) { + if (reset_resume) + f = list->reset_resume; + else + f = list->resume; + if (f) { + err = f(list); + if (err < 0) + return err; } } } @@ -3663,6 +3686,7 @@ void snd_usb_mixer_elem_init_std(struct usb_mixer_elem_list *list, list->id = unitid; list->dump = snd_usb_mixer_dump_cval; #ifdef CONFIG_PM - list->resume = restore_mixer_value; + list->resume = default_mixer_resume; + list->reset_resume = default_mixer_reset_resume; #endif } |