public inbox for linux-pm@vger.kernel.org
 help / color / mirror / Atom feed
From: Takashi Iwai <tiwai-l3A5Bk7waGM@public.gmane.org>
To: Clemens Ladisch <clemens-P6GI/4k7KOmELgA04lAiVw@public.gmane.org>
Cc: "Jonathan Nieder"
	<jrnieder-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	"Steffen Müller"
	<steffen.mueller-Coi19p7x1OHFVwzeVveEFA@public.gmane.org>,
	alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw@public.gmane.org,
	"Olivier MATZ" <zer0-RqaWXwjnwG4BE+pwOMkbTQ@public.gmane.org>,
	linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	"Oliver Neukum" <oneukum-l3A5Bk7waGM@public.gmane.org>,
	stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	"David Banks" <amoebae-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	"Ralf Lang" <lang-shG/GajIFYqbacvFa/9K2g@public.gmane.org>
Subject: Re: [alsa-devel] [PATCH] usb: add USB_QUIRK_RESET_RESUME for M-Audio 49
Date: Mon, 26 Nov 2012 10:35:05 +0100	[thread overview]
Message-ID: <s5hlidoiu5y.wl%tiwai@suse.de> (raw)
In-Reply-To: <50B29537.7060007-P6GI/4k7KOmELgA04lAiVw@public.gmane.org>

At Sun, 25 Nov 2012 23:01:27 +0100,
Clemens Ladisch wrote:
> 
> Jonathan Nieder wrote:
> > Some USB MIDI keyboards fail to operate after a USB autosuspend.
> 
> Make that *all* USB MIDI devices with input ports.
> 
> This is not a bug in the device, but one of the many bugs introduced
> with the autosuspend code in <http://git.kernel.org/linus/88a8516a2128>.
> 
> That patch does not handle input at all, i.e., when the driver wants to
> read from the device, it just doesn't take it out of suspend mode.
> 
> > A workaround is to disable USB autosuspend for these devices by
> > putting AUTOSUSPEND_USBID_BLACKLIST="0763:2027" (resp. 0763:019b) in
> > /etc/laptop-mode/conf.d/usb-autosuspend.conf.  In the spirit of commit
> > 166cb70e97bd ("usb: add USB_QUIRK_RESET_RESUME for M-Audio 88es"),
> > reset the device on resume so this workaround is not needed any more.
> 
> It is not feasible to add the IDs of all USB MIDI devices.
> 
> I'm working on a fix that adds proper power management for input ports,
> but this requires the driver to be reorganized a little ...

Doesn't a simple patch like below work?
(It even reduces more lines! :)


Takashi

---
diff --git a/sound/usb/midi.c b/sound/usb/midi.c
index eeefbce..2e0fabc 100644
--- a/sound/usb/midi.c
+++ b/sound/usb/midi.c
@@ -148,7 +148,6 @@ struct snd_usb_midi_out_endpoint {
 		struct snd_usb_midi_out_endpoint* ep;
 		struct snd_rawmidi_substream *substream;
 		int active;
-		bool autopm_reference;
 		uint8_t cable;		/* cable number << 4 */
 		uint8_t state;
 #define STATE_UNKNOWN	0
@@ -1033,29 +1032,35 @@ static void update_roland_altsetting(struct snd_usb_midi* umidi)
 	snd_usbmidi_input_start(&umidi->list);
 }
 
-static void substream_open(struct snd_rawmidi_substream *substream, int open)
+static int substream_open(struct snd_rawmidi_substream *substream, int open)
 {
 	struct snd_usb_midi* umidi = substream->rmidi->private_data;
 	struct snd_kcontrol *ctl;
+	int err = 0;
 
 	mutex_lock(&umidi->mutex);
-	if (open) {
-		if (umidi->opened++ == 0 && umidi->roland_load_ctl) {
+	if (open && umidi->opened++ == 0) {
+		err = usb_autopm_get_interface(umidi->iface);
+		if (err == -EACCES)
+			err = 0;
+		if (!err && umidi->roland_load_ctl) {
 			ctl = umidi->roland_load_ctl;
 			ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 			snd_ctl_notify(umidi->card,
 				       SNDRV_CTL_EVENT_MASK_INFO, &ctl->id);
 			update_roland_altsetting(umidi);
 		}
-	} else {
-		if (--umidi->opened == 0 && umidi->roland_load_ctl) {
+	} else if (!open && --umidi->opened == 0) {
+		if (umidi->roland_load_ctl) {
 			ctl = umidi->roland_load_ctl;
 			ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 			snd_ctl_notify(umidi->card,
 				       SNDRV_CTL_EVENT_MASK_INFO, &ctl->id);
 		}
+		usb_autopm_put_interface(umidi->iface);
 	}
 	mutex_unlock(&umidi->mutex);
+	return err;
 }
 
 static int snd_usbmidi_output_open(struct snd_rawmidi_substream *substream)
@@ -1076,25 +1081,17 @@ static int snd_usbmidi_output_open(struct snd_rawmidi_substream *substream)
 		snd_BUG();
 		return -ENXIO;
 	}
-	err = usb_autopm_get_interface(umidi->iface);
-	port->autopm_reference = err >= 0;
-	if (err < 0 && err != -EACCES)
-		return -EIO;
+	err = substream_open(substream, 1);
+	if (err < 0)
+		return err;
 	substream->runtime->private_data = port;
 	port->state = STATE_UNKNOWN;
-	substream_open(substream, 1);
 	return 0;
 }
 
 static int snd_usbmidi_output_close(struct snd_rawmidi_substream *substream)
 {
-	struct snd_usb_midi* umidi = substream->rmidi->private_data;
-	struct usbmidi_out_port *port = substream->runtime->private_data;
-
-	substream_open(substream, 0);
-	if (port->autopm_reference)
-		usb_autopm_put_interface(umidi->iface);
-	return 0;
+	return substream_open(substream, 0);
 }
 
 static void snd_usbmidi_output_trigger(struct snd_rawmidi_substream *substream, int up)
@@ -1147,14 +1144,12 @@ static void snd_usbmidi_output_drain(struct snd_rawmidi_substream *substream)
 
 static int snd_usbmidi_input_open(struct snd_rawmidi_substream *substream)
 {
-	substream_open(substream, 1);
-	return 0;
+	return substream_open(substream, 1);
 }
 
 static int snd_usbmidi_input_close(struct snd_rawmidi_substream *substream)
 {
-	substream_open(substream, 0);
-	return 0;
+	return substream_open(substream, 0);
 }
 
 static void snd_usbmidi_input_trigger(struct snd_rawmidi_substream *substream, int up)
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

  parent reply	other threads:[~2012-11-26  9:35 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <4FA2D481.4070304@droids-corp.org>
     [not found] ` <4FA2DB9D.1040303@droids-corp.org>
     [not found]   ` <20120604110608.GG8248@droids-corp.org>
     [not found]     ` <20120605232432.GE3619@burratino>
     [not found]       ` <4FD06563.7050605@droids-corp.org>
     [not found]         ` <20121125094110.GA21387@elie.Belkin>
     [not found]           ` <50B2815E.2090105@droids-corp.org>
2012-11-25 21:21             ` [PATCH] usb: add USB_QUIRK_RESET_RESUME for M-Audio 49 Jonathan Nieder
     [not found]               ` <20121125212100.GE24024-fcEM2ccDkbL2nhBuCrrZHw@public.gmane.org>
2012-11-25 22:01                 ` [alsa-devel] " Clemens Ladisch
     [not found]                   ` <50B29537.7060007-P6GI/4k7KOmELgA04lAiVw@public.gmane.org>
2012-11-26  9:35                     ` Takashi Iwai [this message]
2012-11-26 12:35                       ` Clemens Ladisch
2012-11-26 13:04                         ` Takashi Iwai
     [not found]                           ` <s5hwqx8h5w1.wl%tiwai-l3A5Bk7waGM@public.gmane.org>
2012-11-26 13:43                             ` Clemens Ladisch
2012-11-26 13:54                               ` Oliver Neukum
2012-11-26 16:12                                 ` Alan Stern
     [not found]                                   ` <Pine.LNX.4.44L0.1211261111130.2168-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2012-11-26 20:12                                     ` Clemens Ladisch
2012-11-26 21:54                                       ` Alan Stern
2012-11-26 13:58                               ` Takashi Iwai

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=s5hlidoiu5y.wl%tiwai@suse.de \
    --to=tiwai-l3a5bk7wagm@public.gmane.org \
    --cc=alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw@public.gmane.org \
    --cc=amoebae-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=clemens-P6GI/4k7KOmELgA04lAiVw@public.gmane.org \
    --cc=jrnieder-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=lang-shG/GajIFYqbacvFa/9K2g@public.gmane.org \
    --cc=linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=oneukum-l3A5Bk7waGM@public.gmane.org \
    --cc=stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=steffen.mueller-Coi19p7x1OHFVwzeVveEFA@public.gmane.org \
    --cc=zer0-RqaWXwjnwG4BE+pwOMkbTQ@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox