[alsa-devel] [PATCH] ALSA: usb-audio: disable autopm for MIDI devices

Takashi Iwai tiwai at suse.de
Mon Apr 15 16:07:47 CEST 2013


At Mon, 15 Apr 2013 15:59:51 +0200,
Clemens Ladisch wrote:
> 
> Commit 88a8516a2128 (ALSA: usbaudio: implement USB autosuspend)
> introduced autopm for all USB audio/MIDI devices.  However, many MIDI
> devices, such as synthesizers, do not merely transmit MIDI messages but
> use their MIDI inputs to control other functions.  With autopm, these
> devices would get powered down as soon as the last MIDI port device is
> closed on the host.
> 
> Even some plain MIDI interfaces could get broken: they automatically
> send Active Sensing messages while powered up, but as soon as these
> messages cease, the receiving device would interpret this as an
> accidental disconnection.
> 
> Commit f5f165418cab (ALSA: usb-audio: Fix missing autopm for MIDI input)
> introduced another regression: some devices (e.g. the Roland GAIA SH-01)
> are self-powered but do a reset whenever the USB interface's power state
> changes.
> 
> To work around all this, just disable autopm for all USB MIDI devices.
> 
> Reported-by: Laurens Holst
> Cc: <stable at vger.kernel.org>
> Signed-off-by: Clemens Ladisch <clemens at ladisch.de>

Thanks, applied now, but queued for 3.10 since this is no new
regression in 3.9, and we're so close to 3.9 release.


Takashi


> ---
>  sound/usb/midi.c |   13 ++-----------
>  1 file changed, 2 insertions(+), 11 deletions(-)
> 
> diff --git a/sound/usb/midi.c b/sound/usb/midi.c
> index 34b9bb7..e5fee18 100644
> --- a/sound/usb/midi.c
> +++ b/sound/usb/midi.c
> @@ -126,7 +126,6 @@ struct snd_usb_midi {
>  		struct snd_usb_midi_in_endpoint *in;
>  	} endpoints[MIDI_MAX_ENDPOINTS];
>  	unsigned long input_triggered;
> -	bool autopm_reference;
>  	unsigned int opened[2];
>  	unsigned char disconnected;
>  	unsigned char input_running;
> @@ -1040,7 +1039,6 @@ static int substream_open(struct snd_rawmidi_substream *substream, int dir,
>  {
>  	struct snd_usb_midi* umidi = substream->rmidi->private_data;
>  	struct snd_kcontrol *ctl;
> -	int err;
> 
>  	down_read(&umidi->disc_rwsem);
>  	if (umidi->disconnected) {
> @@ -1051,13 +1049,6 @@ static int substream_open(struct snd_rawmidi_substream *substream, int dir,
>  	mutex_lock(&umidi->mutex);
>  	if (open) {
>  		if (!umidi->opened[0] && !umidi->opened[1]) {
> -			err = usb_autopm_get_interface(umidi->iface);
> -			umidi->autopm_reference = err >= 0;
> -			if (err < 0 && err != -EACCES) {
> -				mutex_unlock(&umidi->mutex);
> -				up_read(&umidi->disc_rwsem);
> -				return -EIO;
> -			}
>  			if (umidi->roland_load_ctl) {
>  				ctl = umidi->roland_load_ctl;
>  				ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
> @@ -1080,8 +1071,6 @@ static int substream_open(struct snd_rawmidi_substream *substream, int dir,
>  				snd_ctl_notify(umidi->card,
>  				       SNDRV_CTL_EVENT_MASK_INFO, &ctl->id);
>  			}
> -			if (umidi->autopm_reference)
> -				usb_autopm_put_interface(umidi->iface);
>  		}
>  	}
>  	mutex_unlock(&umidi->mutex);
> @@ -2256,6 +2245,8 @@ int snd_usbmidi_create(struct snd_card *card,
>  		return err;
>  	}
> 
> +	usb_autopm_get_interface_no_resume(umidi->iface);
> +
>  	list_add_tail(&umidi->list, midi_list);
>  	return 0;
>  }
> 


More information about the Alsa-devel mailing list