aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/usb/card.c9
-rw-r--r--sound/usb/midi.c28
-rw-r--r--sound/usb/midi.h2
3 files changed, 39 insertions, 0 deletions
diff --git a/sound/usb/card.c b/sound/usb/card.c
index a09e5f3519e3..7ecd0e8a5c51 100644
--- a/sound/usb/card.c
+++ b/sound/usb/card.c
@@ -680,6 +680,7 @@ static int usb_audio_suspend(struct usb_interface *intf, pm_message_t message)
680 struct snd_usb_audio *chip = usb_get_intfdata(intf); 680 struct snd_usb_audio *chip = usb_get_intfdata(intf);
681 struct snd_usb_stream *as; 681 struct snd_usb_stream *as;
682 struct usb_mixer_interface *mixer; 682 struct usb_mixer_interface *mixer;
683 struct list_head *p;
683 684
684 if (chip == (void *)-1L) 685 if (chip == (void *)-1L)
685 return 0; 686 return 0;
@@ -692,6 +693,9 @@ static int usb_audio_suspend(struct usb_interface *intf, pm_message_t message)
692 as->substream[0].need_setup_ep = 693 as->substream[0].need_setup_ep =
693 as->substream[1].need_setup_ep = true; 694 as->substream[1].need_setup_ep = true;
694 } 695 }
696 list_for_each(p, &chip->midi_list) {
697 snd_usbmidi_suspend(p);
698 }
695 } 699 }
696 } else { 700 } else {
697 /* 701 /*
@@ -713,6 +717,7 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume)
713{ 717{
714 struct snd_usb_audio *chip = usb_get_intfdata(intf); 718 struct snd_usb_audio *chip = usb_get_intfdata(intf);
715 struct usb_mixer_interface *mixer; 719 struct usb_mixer_interface *mixer;
720 struct list_head *p;
716 int err = 0; 721 int err = 0;
717 722
718 if (chip == (void *)-1L) 723 if (chip == (void *)-1L)
@@ -731,6 +736,10 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume)
731 goto err_out; 736 goto err_out;
732 } 737 }
733 738
739 list_for_each(p, &chip->midi_list) {
740 snd_usbmidi_resume(p);
741 }
742
734 if (!chip->autosuspended) 743 if (!chip->autosuspended)
735 snd_power_change_state(chip->card, SNDRV_CTL_POWER_D0); 744 snd_power_change_state(chip->card, SNDRV_CTL_POWER_D0);
736 chip->autosuspended = 0; 745 chip->autosuspended = 0;
diff --git a/sound/usb/midi.c b/sound/usb/midi.c
index 9da74d2e8eee..9a4e82cf4ef9 100644
--- a/sound/usb/midi.c
+++ b/sound/usb/midi.c
@@ -2187,6 +2187,34 @@ void snd_usbmidi_input_start(struct list_head* p)
2187EXPORT_SYMBOL(snd_usbmidi_input_start); 2187EXPORT_SYMBOL(snd_usbmidi_input_start);
2188 2188
2189/* 2189/*
2190 * Prepare for suspend. Typically called from the USB suspend callback.
2191 */
2192void snd_usbmidi_suspend(struct list_head *p)
2193{
2194 struct snd_usb_midi *umidi;
2195
2196 umidi = list_entry(p, struct snd_usb_midi, list);
2197 mutex_lock(&umidi->mutex);
2198 snd_usbmidi_input_stop(p);
2199 mutex_unlock(&umidi->mutex);
2200}
2201EXPORT_SYMBOL(snd_usbmidi_suspend);
2202
2203/*
2204 * Resume. Typically called from the USB resume callback.
2205 */
2206void snd_usbmidi_resume(struct list_head *p)
2207{
2208 struct snd_usb_midi *umidi;
2209
2210 umidi = list_entry(p, struct snd_usb_midi, list);
2211 mutex_lock(&umidi->mutex);
2212 snd_usbmidi_input_start(p);
2213 mutex_unlock(&umidi->mutex);
2214}
2215EXPORT_SYMBOL(snd_usbmidi_resume);
2216
2217/*
2190 * Creates and registers everything needed for a MIDI streaming interface. 2218 * Creates and registers everything needed for a MIDI streaming interface.
2191 */ 2219 */
2192int snd_usbmidi_create(struct snd_card *card, 2220int snd_usbmidi_create(struct snd_card *card,
diff --git a/sound/usb/midi.h b/sound/usb/midi.h
index 2fca80b744c0..46e5b65e81e7 100644
--- a/sound/usb/midi.h
+++ b/sound/usb/midi.h
@@ -46,5 +46,7 @@ int snd_usbmidi_create(struct snd_card *card,
46void snd_usbmidi_input_stop(struct list_head* p); 46void snd_usbmidi_input_stop(struct list_head* p);
47void snd_usbmidi_input_start(struct list_head* p); 47void snd_usbmidi_input_start(struct list_head* p);
48void snd_usbmidi_disconnect(struct list_head *p); 48void snd_usbmidi_disconnect(struct list_head *p);
49void snd_usbmidi_suspend(struct list_head *p);
50void snd_usbmidi_resume(struct list_head *p);
49 51
50#endif /* __USBMIDI_H */ 52#endif /* __USBMIDI_H */