> Good to hear. > Dave, is it OK to apply the patch below through sound tree?
ack below, > > > thanks, > > Takashi > > --- > From: Takashi Iwai <tiwai at suse.de> > Subject: [PATCH] vga_switcheroo: Enable/disable audio clients at the right > time > > The audio clients have to be disabled before disabling the VGA and > switching. ?Similarly, enabling the audio client should be done at > last. ?Otherwise the audio-side operation stalls, eventually leading > to Oops or lockups. > > Tested-by: J?rg-Volker Peetz <jvpeetz at web.de> Acked-by: Dave Airlie <airlied at redhat.com> > Signed-off-by: Takashi Iwai <tiwai at suse.de> > --- > ?drivers/gpu/vga/vga_switcheroo.c | ? 14 ++++++++------ > ?1 file changed, 8 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/vga/vga_switcheroo.c > b/drivers/gpu/vga/vga_switcheroo.c > index 38f9534..e24ad99 100644 > --- a/drivers/gpu/vga/vga_switcheroo.c > +++ b/drivers/gpu/vga/vga_switcheroo.c > @@ -291,8 +291,6 @@ static int vga_switchto_stage1(struct > vga_switcheroo_client *new_client) > ? ? ? ? ? ? ? ?vga_switchon(new_client); > > ? ? ? ?vga_set_default_device(new_client->pdev); > - ? ? ? set_audio_state(new_client->id, VGA_SWITCHEROO_ON); > - > ? ? ? ?return 0; > ?} > > @@ -308,6 +306,8 @@ static int vga_switchto_stage2(struct > vga_switcheroo_client *new_client) > > ? ? ? ?active->active = false; > > + ? ? ? set_audio_state(active->id, VGA_SWITCHEROO_OFF); > + > ? ? ? ?if (new_client->fb_info) { > ? ? ? ? ? ? ? ?struct fb_event event; > ? ? ? ? ? ? ? ?event.info = new_client->fb_info; > @@ -321,11 +321,11 @@ static int vga_switchto_stage2(struct > vga_switcheroo_client *new_client) > ? ? ? ?if (new_client->ops->reprobe) > ? ? ? ? ? ? ? ?new_client->ops->reprobe(new_client->pdev); > > - ? ? ? set_audio_state(active->id, VGA_SWITCHEROO_OFF); > - > ? ? ? ?if (active->pwr_state == VGA_SWITCHEROO_ON) > ? ? ? ? ? ? ? ?vga_switchoff(active); > > + ? ? ? set_audio_state(new_client->id, VGA_SWITCHEROO_ON); > + > ? ? ? ?new_client->active = true; > ? ? ? ?return 0; > ?} > @@ -371,8 +371,9 @@ vga_switcheroo_debugfs_write(struct file *filp, const > char __user *ubuf, > ? ? ? ?/* pwr off the device not in use */ > ? ? ? ?if (strncmp(usercmd, "OFF", 3) == 0) { > ? ? ? ? ? ? ? ?list_for_each_entry(client, &vgasr_priv.clients, list) { > - ? ? ? ? ? ? ? ? ? ? ? if (client->active) > + ? ? ? ? ? ? ? ? ? ? ? if (client->active || client_is_audio(client)) > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?continue; > + ? ? ? ? ? ? ? ? ? ? ? set_audio_state(client->id, VGA_SWITCHEROO_OFF); > ? ? ? ? ? ? ? ? ? ? ? ?if (client->pwr_state == VGA_SWITCHEROO_ON) > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?vga_switchoff(client); > ? ? ? ? ? ? ? ?} > @@ -381,10 +382,11 @@ vga_switcheroo_debugfs_write(struct file *filp, const > char __user *ubuf, > ? ? ? ?/* pwr on the device not in use */ > ? ? ? ?if (strncmp(usercmd, "ON", 2) == 0) { > ? ? ? ? ? ? ? ?list_for_each_entry(client, &vgasr_priv.clients, list) { > - ? ? ? ? ? ? ? ? ? ? ? if (client->active) > + ? ? ? ? ? ? ? ? ? ? ? if (client->active || client_is_audio(client)) > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?continue; > ? ? ? ? ? ? ? ? ? ? ? ?if (client->pwr_state == VGA_SWITCHEROO_OFF) > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?vga_switchon(client); > + ? ? ? ? ? ? ? ? ? ? ? set_audio_state(client->id, VGA_SWITCHEROO_ON); > ? ? ? ? ? ? ? ?} > ? ? ? ? ? ? ? ?goto out; > ? ? ? ?} > -- > 1.7.10.4 > > _______________________________________________ > Alsa-devel mailing list > Alsa-devel at alsa-project.org > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel