Re: [regression] Sound not transferred to docking station after resume from StR

Previous thread: [PATCHv4 2.6.34-rc4 1/7] mxc: Update GPIO for USB support on Freescale MX51 Babbage HW by Dinh.Nguyen on Friday, April 16, 2010 - 12:16 pm. (1 message)

Next thread: Power consumption on 802.11 / ASPM / device measurements by Luis R. Rodriguez on Friday, April 16, 2010 - 12:53 pm. (2 messages)
From: Frans Pop
Date: Friday, April 16, 2010 - 12:31 pm

Scenario:
- suspend laptop while *un*docked, i.e. with laptop speakers in use
- dock laptop
- resume

With 2.6.33 and earlier the sound would always come from the external 
speakers connected to the docking station. But with 2.6.34-rc4 I get sound 
still coming from the laptop's internal speakers, which is not correct.

System: HP 2510p running Debian stable ("Lenny")
Sound driver: snd_hda_intel; codec: AD1981

Attached my kernel config for .34, and dmesg output for both .33 and .34 
showing:
- boot (docked)
- undocking (visible as several USB disconnects)
- suspend
- resume after docking

I don't see any significant changes in dmesg output during resume.

I'll do a bisect, unless someone has some idea what may be causing this.

From: Frans Pop
Date: Friday, April 16, 2010 - 12:48 pm

Forgot to mention that sound does get transferred to the external speakers 
with .34 if I do an extra undock and redock after the resume.
--

From: Frans Pop
Date: Saturday, April 17, 2010 - 2:06 am

The problem is slightly different than I thought. Turns out *both* the
internal (laptop) and external (docking station) speakers are active after
the resume. So the problem is that the internal speakers are not switched off.

I have traced this to an ALSA merge: 524df55725217. Unfortunately I get
boot failures when I try to bisect down into that merge.

Here's the bisect log:
# bad: [0d0fb0f9c5fddef4a10242fe3337f00f528a3099] Linux 2.6.34-rc4
# good: [724e6d3fe8003c3f60bf404bf22e4e331327c596] Linux 2.6.33-rc8
git bisect start 'v2.6.34-rc4' 'v2.6.33-rc8'
# bad: [94468080220162f74dc6ce5c3e95e5fec8022902]
  Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6
git bisect bad 94468080220162f74dc6ce5c3e95e5fec8022902
# bad: [524df55725217b13d5a232fb5badb5846418ea0e] Merge branch 'for-linus'
  of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
git bisect bad 524df55725217b13d5a232fb5badb5846418ea0e
# good: [0f4533979473a456a8adb3869365e12c7a99cf65]
  Merge branches 'futexes-for-linus', 'irq-core-for-linus' and
  'bkl-drivers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
git bisect good 0f4533979473a456a8adb3869365e12c7a99cf65

Cheers,
FJP
--

From: Takashi Iwai
Date: Monday, April 19, 2010 - 12:47 am

At Sat, 17 Apr 2010 11:06:22 +0200,

Could you give alsa-info.sh on your machine, preferably before/after
suspend on both working (2.6.33) and non-working kernels?

Also, you can try to copy sound/pci/hda/patch_analog.c from 2.6.33 to
2.6.34 to check whether it works.  There shouldn't be many changes in
that file.


thanks,

Takashi
--

From: Frans Pop
Date: Monday, April 19, 2010 - 4:38 am

See files in attached tarball. Contents are:
* system boot (docked)
  => alsa-info.txt_3[34]_docked
* undock
  => alsa-info.txt_3[34]_undocked
* suspend - dock (while suspended) - resume
  => alsa-info.txt_3[34]_after_resume_docked
* undock - redock (this disables the internal speakers)

That fixes the problem.

Thanks,
FJP

From: Takashi Iwai
Date: Monday, April 19, 2010 - 4:59 am

At Mon, 19 Apr 2010 13:38:14 +0200,

Then my rough guess is

commit ea52bf260ecbb175339af3178c15788df21b7516
Author: Daniel T Chen <crimsun@ubuntu.com>
Date:   Sun Dec 27 18:48:29 2009 -0500

    ALSA: hda: Add powerdown for Analog Devices HDA codecs
    
Could you try to revert it?


thanks,

Takashi
--

From: Takashi Iwai
Date: Monday, April 19, 2010 - 5:14 am

At Mon, 19 Apr 2010 13:59:36 +0200,

Or how about the patch below?


Takashi

---
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
index 9cbd80c..2cf7d19 100644
--- a/sound/pci/hda/patch_analog.c
+++ b/sound/pci/hda/patch_analog.c
@@ -85,6 +85,9 @@ struct ad198x_spec {
 	const char **slave_sws;
 };
 
+#define AD_HP_EVENT			0x01
+#define AD_MIC_EVENT			0x02
+
 /*
  * input MUX handling (common part)
  */
@@ -533,6 +536,11 @@ static int ad198x_resume(struct hda_codec *codec)
 	ad198x_init(codec);
 	snd_hda_codec_resume_amp(codec);
 	snd_hda_codec_resume_cache(codec);
+	if (codec->patch_ops.unsol_event) {
+		/* fake unsol events */
+		codec->patch_ops.unsol_event(codec, AD_HP_EVENT << 26);
+		codec->patch_ops.unsol_event(codec, AD_MIC_EVENT << 26);
+	}
 	return 0;
 }
 #endif
@@ -822,7 +830,7 @@ static void ad1986a_automic(struct hda_codec *codec)
 			    present ? 0 : 2);
 }
 
-#define AD1986A_MIC_EVENT		0x36
+#define AD1986A_MIC_EVENT		AD_MIC_EVENT
 
 static void ad1986a_automic_unsol_event(struct hda_codec *codec,
 					    unsigned int res)
@@ -865,7 +873,7 @@ static void ad1986a_hp_automute(struct hda_codec *codec)
 	ad1986a_update_hp(codec);
 }
 
-#define AD1986A_HP_EVENT		0x37
+#define AD1986A_HP_EVENT		AD_HP_EVENT
 
 static void ad1986a_hp_unsol_event(struct hda_codec *codec, unsigned int res)
 {
@@ -1609,8 +1617,8 @@ static struct hda_amp_list ad1981_loopbacks[] = {
  * speaker output enabled _and_ mute-LED off.
  */
 
-#define AD1981_HP_EVENT		0x37
-#define AD1981_MIC_EVENT	0x38
+#define AD1981_HP_EVENT			AD_HP_EVENT
+#define AD1981_MIC_EVENT		AD_MIC_EVENT
 
 static struct hda_verb ad1981_hp_init_verbs[] = {
 	{0x05, AC_VERB_SET_EAPD_BTLENABLE, 0x00 }, /* default off */
@@ -2599,7 +2607,7 @@ static struct hda_verb ad1988_laptop_hp_off[] = {
 	{ } /* end */
 };
 
-#define AD1988_HP_EVENT	0x01
+#define AD1988_HP_EVENT		AD_HP_EVENT
 
 static struct hda_verb ad1988_laptop_init_verbs[] = {
 	/* Front, Surround, ...
From: Frans Pop
Date: Monday, April 19, 2010 - 5:39 am

That fixes the problem too.

Please add my:
Reported-and-tested-by: Frans Pop <elendil@planet.nl>

Cheers,
FJP
--

From: Takashi Iwai
Date: Monday, April 19, 2010 - 5:53 am

At Mon, 19 Apr 2010 14:39:44 +0200,

Thanks for a quick check.  But I found that the patch isn't fully
correct.

The patch below should suffice instead of the previous one.
Could you check it again?


thanks,

Takashi

---
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
index 9cbd80c..afbe314 100644
--- a/sound/pci/hda/patch_analog.c
+++ b/sound/pci/hda/patch_analog.c
@@ -527,14 +527,6 @@ static int ad198x_suspend(struct hda_codec *codec, pm_message_t state)
 	ad198x_power_eapd(codec);
 	return 0;
 }
-
-static int ad198x_resume(struct hda_codec *codec)
-{
-	ad198x_init(codec);
-	snd_hda_codec_resume_amp(codec);
-	snd_hda_codec_resume_cache(codec);
-	return 0;
-}
 #endif
 
 static struct hda_codec_ops ad198x_patch_ops = {
@@ -547,7 +539,6 @@ static struct hda_codec_ops ad198x_patch_ops = {
 #endif
 #ifdef SND_HDA_NEEDS_RESUME
 	.suspend = ad198x_suspend,
-	.resume = ad198x_resume,
 #endif
 	.reboot_notify = ad198x_shutup,
 };
--

From: Frans Pop
Date: Monday, April 19, 2010 - 7:58 am

Works as well.

Reported-and-tested-by: Frans Pop <elendil@planet.nl>
--

From: Takashi Iwai
Date: Monday, April 19, 2010 - 9:17 am

At Mon, 19 Apr 2010 16:58:39 +0200,

Thanks.  Now applied to sound git tree.


Takashi
--

From: Frans Pop
Date: Monday, April 19, 2010 - 5:18 am

Yep, that's the culprit.

Let me know if a fix needs to be tested.

Thanks,
FJP
--

Previous thread: [PATCHv4 2.6.34-rc4 1/7] mxc: Update GPIO for USB support on Freescale MX51 Babbage HW by Dinh.Nguyen on Friday, April 16, 2010 - 12:16 pm. (1 message)

Next thread: Power consumption on 802.11 / ASPM / device measurements by Luis R. Rodriguez on Friday, April 16, 2010 - 12:53 pm. (2 messages)