[alsa-devel] [PATCH - sound/usb 1/1] Respond to suspend and resume callbacks for input in sound/usb/midi.c

Takashi Iwai tiwai at suse.de
Tue Aug 5 14:36:35 CEST 2014


At Tue,  5 Aug 2014 08:20:30 -0400,
Adam Goode wrote:
> 
> sound/usb/card.c registers USB suspend and resume but did not previously
> kill the input URBs. This means that USB MIDI devices left open across
> suspend/resume had non-functional input (output still usually worked,
> but it looks like that is another issue). Before this change, we would
> get ESHUTDOWN for each of the input URBs at suspend time, killing input.
> 
> Signed-off-by: Adam Goode <agoode at google.com>

The changes look OK, but could you rearrange the subject line to align
with other commits, and also fix cosmetic errors reported by
checkpatch.pl?


thanks,

Takashi

> 
> diff --git a/sound/usb/card.c b/sound/usb/card.c
> index a09e5f3..7ecd0e8 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)
>  	struct snd_usb_audio *chip = usb_get_intfdata(intf);
>  	struct snd_usb_stream *as;
>  	struct usb_mixer_interface *mixer;
> +	struct list_head *p;
>  
>  	if (chip == (void *)-1L)
>  		return 0;
> @@ -692,6 +693,9 @@ static int usb_audio_suspend(struct usb_interface *intf, pm_message_t message)
>  				as->substream[0].need_setup_ep =
>  					as->substream[1].need_setup_ep = true;
>  			}
> +			list_for_each(p, &chip->midi_list) {
> +				snd_usbmidi_suspend(p);
> +			}
>  		}
>  	} else {
>  		/*
> @@ -713,6 +717,7 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume)
>  {
>  	struct snd_usb_audio *chip = usb_get_intfdata(intf);
>  	struct usb_mixer_interface *mixer;
> +	struct list_head *p;
>  	int err = 0;
>  
>  	if (chip == (void *)-1L)
> @@ -731,6 +736,10 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume)
>  			goto err_out;
>  	}
>  
> +	list_for_each(p, &chip->midi_list) {
> +		snd_usbmidi_resume(p);
> +	}
> +
>  	if (!chip->autosuspended)
>  		snd_power_change_state(chip->card, SNDRV_CTL_POWER_D0);
>  	chip->autosuspended = 0;
> diff --git a/sound/usb/midi.c b/sound/usb/midi.c
> index 9da74d2..e7c6c9d 100644
> --- a/sound/usb/midi.c
> +++ b/sound/usb/midi.c
> @@ -2187,6 +2187,34 @@ void snd_usbmidi_input_start(struct list_head* p)
>  EXPORT_SYMBOL(snd_usbmidi_input_start);
>  
>  /*
> + * Prepare for suspend. Typically called from the USB suspend callback.
> + */
> +void snd_usbmidi_suspend(struct list_head* p)
> +{
> +	struct snd_usb_midi* umidi;
> +
> +	umidi = list_entry(p, struct snd_usb_midi, list);
> +	mutex_lock(&umidi->mutex);
> +	snd_usbmidi_input_stop(p);
> +	mutex_unlock(&umidi->mutex);
> +}
> +EXPORT_SYMBOL(snd_usbmidi_suspend);
> +
> +/*
> + * Resume. Typically called from the USB resume callback.
> + */
> +void snd_usbmidi_resume(struct list_head* p)
> +{
> +	struct snd_usb_midi* umidi;
> +
> +	umidi = list_entry(p, struct snd_usb_midi, list);
> +	mutex_lock(&umidi->mutex);
> +	snd_usbmidi_input_start(p);
> +	mutex_unlock(&umidi->mutex);
> +}
> +EXPORT_SYMBOL(snd_usbmidi_resume);
> +
> +/*
>   * Creates and registers everything needed for a MIDI streaming interface.
>   */
>  int snd_usbmidi_create(struct snd_card *card,
> diff --git a/sound/usb/midi.h b/sound/usb/midi.h
> index 2fca80b..46e5b65 100644
> --- a/sound/usb/midi.h
> +++ b/sound/usb/midi.h
> @@ -46,5 +46,7 @@ int snd_usbmidi_create(struct snd_card *card,
>  void snd_usbmidi_input_stop(struct list_head* p);
>  void snd_usbmidi_input_start(struct list_head* p);
>  void snd_usbmidi_disconnect(struct list_head *p);
> +void snd_usbmidi_suspend(struct list_head *p);
> +void snd_usbmidi_resume(struct list_head *p);
>  
>  #endif /* __USBMIDI_H */
> -- 
> 2.0.0.526.g5318336
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> 


More information about the Alsa-devel mailing list