summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Chen <peter.chen@freescale.com>2014-12-31 16:06:49 +0800
committerPeter Chen <peter.chen@freescale.com>2015-01-04 14:54:52 +0800
commit496fbe0b831b77d0ea0a2c7bbd1d58820b3a01f7 (patch)
tree46fb95f93bbb3218fefe88127c74681e344fbc9a
parent6cb794b964ea4a8f00116c800a7075c3b67fff6b (diff)
MLK-10067 Revert "ALSA: usb-audio: Resume mixer values properly"rel_imx_3.10.53_1.1.0_ga
This reverts commit 178bb7bed5b467463a3861aecdd5361ea9d295b7. It causes the USB audio which defines quirk will be dead lock at its resume code Signed-off-by: Peter Chen <peter.chen@freescale.com>
-rw-r--r--sound/usb/card.c18
-rw-r--r--sound/usb/mixer.c99
-rw-r--r--sound/usb/mixer.h7
3 files changed, 25 insertions, 99 deletions
diff --git a/sound/usb/card.c b/sound/usb/card.c
index 07de1e7..64952e2 100644
--- a/sound/usb/card.c
+++ b/sound/usb/card.c
@@ -694,12 +694,12 @@ static int usb_audio_suspend(struct usb_interface *intf, pm_message_t message)
}
list_for_each_entry(mixer, &chip->mixer_list, list)
- snd_usb_mixer_suspend(mixer);
+ snd_usb_mixer_inactivate(mixer);
return 0;
}
-static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume)
+static int usb_audio_resume(struct usb_interface *intf)
{
struct snd_usb_audio *chip = usb_get_intfdata(intf);
struct usb_mixer_interface *mixer;
@@ -714,7 +714,7 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume)
* we just notify and restart the mixers
*/
list_for_each_entry(mixer, &chip->mixer_list, list) {
- err = snd_usb_mixer_resume(mixer, reset_resume);
+ err = snd_usb_mixer_activate(mixer);
if (err < 0)
goto err_out;
}
@@ -726,20 +726,9 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume)
err_out:
return err;
}
-
-static int usb_audio_resume(struct usb_interface *intf)
-{
- return __usb_audio_resume(intf, false);
-}
-
-static int usb_audio_reset_resume(struct usb_interface *intf)
-{
- return __usb_audio_resume(intf, true);
-}
#else
#define usb_audio_suspend NULL
#define usb_audio_resume NULL
-#define usb_audio_reset_resume NULL
#endif /* CONFIG_PM */
static struct usb_device_id usb_audio_ids [] = {
@@ -761,7 +750,6 @@ static struct usb_driver usb_audio_driver = {
.disconnect = usb_audio_disconnect,
.suspend = usb_audio_suspend,
.resume = usb_audio_resume,
- .reset_resume = usb_audio_reset_resume,
.id_table = usb_audio_ids,
.supports_autosuspend = 1,
};
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
index cde3b91..be4db47 100644
--- a/sound/usb/mixer.c
+++ b/sound/usb/mixer.c
@@ -2300,6 +2300,26 @@ requeue:
}
}
+/* stop any bus activity of a mixer */
+void snd_usb_mixer_inactivate(struct usb_mixer_interface *mixer)
+{
+ usb_kill_urb(mixer->urb);
+ usb_kill_urb(mixer->rc_urb);
+}
+
+int snd_usb_mixer_activate(struct usb_mixer_interface *mixer)
+{
+ int err;
+
+ if (mixer->urb) {
+ err = usb_submit_urb(mixer->urb, GFP_NOIO);
+ if (err < 0)
+ return err;
+ }
+
+ return 0;
+}
+
/* create the handler for the optional status interrupt endpoint */
static int snd_usb_mixer_status_create(struct usb_mixer_interface *mixer)
{
@@ -2398,82 +2418,3 @@ void snd_usb_mixer_disconnect(struct list_head *p)
usb_kill_urb(mixer->urb);
usb_kill_urb(mixer->rc_urb);
}
-
-#ifdef CONFIG_PM
-/* stop any bus activity of a mixer */
-static void snd_usb_mixer_inactivate(struct usb_mixer_interface *mixer)
-{
- usb_kill_urb(mixer->urb);
- usb_kill_urb(mixer->rc_urb);
-}
-
-static int snd_usb_mixer_activate(struct usb_mixer_interface *mixer)
-{
- int err;
-
- if (mixer->urb) {
- err = usb_submit_urb(mixer->urb, GFP_NOIO);
- if (err < 0)
- return err;
- }
-
- return 0;
-}
-
-int snd_usb_mixer_suspend(struct usb_mixer_interface *mixer)
-{
- snd_usb_mixer_inactivate(mixer);
- return 0;
-}
-
-static int restore_mixer_value(struct usb_mixer_elem_info *cval)
-{
- int c, err, idx;
-
- if (cval->cmask) {
- idx = 0;
- for (c = 0; c < MAX_CHANNELS; c++) {
- if (!(cval->cmask & (1 << c)))
- continue;
- if (cval->cached & (1 << c)) {
- err = set_cur_mix_value(cval, c + 1, idx,
- cval->cache_val[idx]);
- if (err < 0)
- return err;
- }
- idx++;
- }
- } else {
- /* master */
- if (cval->cached) {
- err = set_cur_mix_value(cval, 0, 0, *cval->cache_val);
- if (err < 0)
- return err;
- }
- }
-
- return 0;
-}
-
-int snd_usb_mixer_resume(struct usb_mixer_interface *mixer, bool reset_resume)
-{
- struct usb_mixer_elem_info *cval;
- int id, err;
-
- /* FIXME: any mixer quirks? */
-
- if (reset_resume) {
- /* restore cached mixer values */
- for (id = 0; id < MAX_ID_ELEMS; id++) {
- for (cval = mixer->id_elems[id]; cval;
- cval = cval->next_id_elem) {
- err = restore_mixer_value(cval);
- if (err < 0)
- return err;
- }
- }
- }
-
- return snd_usb_mixer_activate(mixer);
-}
-#endif
diff --git a/sound/usb/mixer.h b/sound/usb/mixer.h
index 73b1f64..aab80df 100644
--- a/sound/usb/mixer.h
+++ b/sound/usb/mixer.h
@@ -63,6 +63,8 @@ void snd_usb_mixer_notify_id(struct usb_mixer_interface *mixer, int unitid);
int snd_usb_mixer_set_ctl_value(struct usb_mixer_elem_info *cval,
int request, int validx, int value_set);
+void snd_usb_mixer_inactivate(struct usb_mixer_interface *mixer);
+int snd_usb_mixer_activate(struct usb_mixer_interface *mixer);
int snd_usb_mixer_add_control(struct usb_mixer_interface *mixer,
struct snd_kcontrol *kctl);
@@ -70,9 +72,4 @@ int snd_usb_mixer_add_control(struct usb_mixer_interface *mixer,
int snd_usb_mixer_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
unsigned int size, unsigned int __user *_tlv);
-#ifdef CONFIG_PM
-int snd_usb_mixer_suspend(struct usb_mixer_interface *mixer);
-int snd_usb_mixer_resume(struct usb_mixer_interface *mixer, bool reset_resume);
-#endif
-
#endif /* __USBMIXER_H */