At Fri, 08 Jun 2012 17:45:17 +0200,
J?rg-Volker Peetz wrote:
> 
> Hello Takashi,
> 
> Takashi Iwai wrote, on 06/08/12 15:03:
> > At Fri, 08 Jun 2012 13:26:57 +0200,
> > J?rg-Volker Peetz wrote:
> >>
> >> Takashi Iwai wrote, on 06/07/12 12:15:
> >>> Hi,
> >>>
> >>> this is a series of patches to fix the regressions of HD-audio HDMI
> >>> on D-GPUs in 3.5-rc1 due to the support of VGA-switcheroo audio clients.
> >>>
> >>> The first patch adds a new helper function to vga-switcheroo and the
> >>> second just uses that instead of an open code.
> >>>
> >>> Dave, if the first patch is OK, I'm going to apply it though sound tree.
> >>> Let me know if any problem is found.
> >>>
> >>> Joerg, could you check whether this doesn't break your setup, too?
> >>>
> >>>
> >>> thanks,
> >>>
> >>> Takashi
> >>
> >> Hello Takashi,
> >>
> >> I applied both your patches on 3.5-rc1. With this kernel I made three 
> >> tests.
> >> 1) After booting I switched off the discrete GPU via vga_switcheroo.
> >>    Then ca. 210 times the message
> >>
> >>      hda-intel: spurious response 0x0:0x0, last cmd=0x170503
> >>
> >>    appears on the console and in the logs.
> >>    Starting X and using the built-in USB web-cam work, as well as sound 
> >> with
> >>    mplayer2 works.
> >>
> >> 2) After booting I switched to the discrete GPU via
> >>
> >>      echo -n DDIS > /sys/kernel/debugfs/vgaswitcheroo/switch
> >>
> >>    Then I started X via startx. The desktop screen appears but the system
> >>    freezes. No reaction on keyboard or touchpad input. The computer is not
> >>    reachable via ethernet wire.
> > 
> > Hm, these issues aren't seen on 3.5-rc1 before my patches?
> > If so, we need to fix now.
> > 
> No, these issues aren't seen on 3.5-rc1 without your patches. I'm able to 
> start
> X with the discrete GPU in use, direct rendering and the built-in USB camera 
> work.

OK, it means that the switching from the audio-ON to audio-OFF doesn't
work.  Could you try the patch below in additon?

> Probably unrelated: in both cases I'm unable to lower the screen brightness 
> from
> highest value. Without your patches it appears a warning:
> 
>   ACPI Warning: _BQC returned an invalid level (20120320/video-472)

Hmm, I see no relation between this and the HDMI audio part.
It's of course possible that some non-working state gives
side-effects...


thanks,

Takashi

---
diff --git a/drivers/gpu/vga/vga_switcheroo.c b/drivers/gpu/vga/vga_switcheroo.c
index eb4f64f..5b3c7d1 100644
--- a/drivers/gpu/vga/vga_switcheroo.c
+++ b/drivers/gpu/vga/vga_switcheroo.c
@@ -304,8 +304,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;
 }

@@ -321,6 +319,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;
@@ -334,11 +334,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;
 }
@@ -384,8 +384,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);
                }
@@ -394,10 +395,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;
        }

Reply via email to