On Mon, Aug 17, 2009 at 02:46:14PM +0800, Takashi Iwai wrote:
At Sun, 16 Aug 2009 19:01:10 +0800, Wu Fengguang wrote:
On Sun, Aug 16, 2009 at 05:22:23PM +0800, Takashi Iwai wrote:
At Sun, 16 Aug 2009 16:53:17 +0800, Wu Fengguang wrote:
There are 3 causes to the silence of Compaq 6530s' internal speaker:
- HP pin 0x11 always return 0xffff,ffff (pin_presence=1), which automutes the speaker at module loading time.
This is odd. Is the sense-trigger issued before reading the pin sense?
Sorry, what do you mean? The facts I explored are:
- ad1884a_hp_automute() will be explicitly called by ad1884a_hp_init()
- ad1884a_hp_unsol_event() is never called on plug events
- I tried manually execute AC_VERB_SET_PIN_SENSE then read pin sense, it takes effect on the impedance, but pin_presence still remains 1.
The fact that it returns only -1 sounds rather like a hardware issue. Or, at least, reading a wrong place or so.
It may well be a hardware issue. But note that SET_PIN_SENSE could change the return value of GET_PIN_SENSE, except for the highest pin_presence bit:
root@hp /home/wfg# hda-verb /dev/snd/hwC0D0 0x16 GET_PIN_SENSE 0 nid = 0x16, verb = 0xf09, param = 0x0 value = 0x7fffffff root@hp /home/wfg# hda-verb /dev/snd/hwC0D0 0x16 GET_PIN_SENSE 0 nid = 0x16, verb = 0xf09, param = 0x0 value = 0x7fffffff root@hp /home/wfg# hda-verb /dev/snd/hwC0D0 0x16 SET_PIN_SENSE 0 nid = 0x16, verb = 0x709, param = 0x0 value = 0x0 root@hp /home/wfg# hda-verb /dev/snd/hwC0D0 0x16 GET_PIN_SENSE 0 nid = 0x16, verb = 0xf09, param = 0x0 value = 0xcd00 root@hp /home/wfg# hda-verb /dev/snd/hwC0D0 0x16 GET_PIN_SENSE 0 nid = 0x16, verb = 0xf09, param = 0x0 value = 0xcd00
- HP pin 0x11 won't emit unsol events on jack plug/unplug, so the speaker have no chance to be unmuted.
Can it be fixed with enable_msi=1 option?
Not yet, will try it.
- pin 0x1c must be set to PIN_OUT mode to make the speaker work this is the most weird part - line-in pin 0x1c and speaker pin 0x16 seem to be unrelated.
Hm, sounds strange.
Yes. Note that the 6530s I have is a test box. Another 6531s which is bought directly from market don't have this bug.
Fix the problems by
- add "Speaker" and "Headphone" mixers to allow hand tuning by user
It's a bit buggy because the auto-mute feature can turn on/off these silently. If any, these controls have to be notified at changing the state via plugging.
OK. Are there code examples for doing this? Thank you!
Basically you need to call snd_ctl_notify() to control elements which h/w values are changed. In that way, the mixer app can be notified and update the values appropriately.
However, I think adding these control unconditionally to the existing model is no right solution. The laptop model is designed for the device where the HP jack detection works properly. If the device isn't such one, the model itself isn't applicable.
So, it's better to create either another model without jack detection, or add a check for hint strings, at least. In either case, you can create two controls, Headphone and Speaker, which access the h/w normally without master control. Then a master control will be automatically created as vmaster.
Thanks for the tips! However I'm now wondering the value of doing this: it may well be an early stage hardware bug and may no longer exist in the market.. I'm quite content on enabling 6531s and assume the patch will work alike for 6530s in the market :)
Thanks, Fengguang
- add the 0x1c PIN_OUT quirk
Signed-off-by: Wu Fengguang fengguang.wu@intel.com
sound/pci/hda/patch_analog.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
--- sound-2.6.orig/sound/pci/hda/patch_analog.c 2009-08-05 09:40:13.000000000 +0800 +++ sound-2.6/sound/pci/hda/patch_analog.c 2009-08-16 16:49:39.000000000 +0800 @@ -3717,6 +3717,8 @@ static struct snd_kcontrol_new ad1884a_l HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT), HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT), HDA_CODEC_MUTE("Dock Playback Switch", 0x12, 0x0, HDA_OUTPUT),
- HDA_CODEC_MUTE("Headphone Playback Switch", 0x11, 0x0, HDA_OUTPUT),
- HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT), HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT), HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT), HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x00, HDA_INPUT),
@@ -3837,8 +3839,10 @@ static struct hda_verb ad1884a_laptop_ve {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, /* Port-F pin */
- {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
- {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
- /* required for compaq 6530s speaker output */
- {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Port-C pin - internal mic-in */ {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */
@@ -4003,6 +4007,8 @@ static struct snd_pci_quirk ad1884a_cfg_ SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE), SND_PCI_QUIRK(0x103c, 0x3037, "HP 2230s", AD1884A_LAPTOP), SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE),
- SND_PCI_QUIRK(0x103c, 0x30e8, "HP Compaq 6530s", AD1884A_LAPTOP),
- SND_PCI_QUIRK(0x103c, 0x30e9, "HP Compaq 6531s", AD1884A_LAPTOP), SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x3070, "HP", AD1884A_MOBILE), SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x30d0, "HP laptop", AD1884A_LAPTOP), SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x30e0, "HP laptop", AD1884A_LAPTOP),