Re: [alsa-devel] Thinkpad hda regression in 3.3
At Fri, 13 Apr 2012 08:43:06 -0400, Josh Boyer wrote:
Hi Takashi and Jaroslav,
We've had a number of bugs reported about sound not working correctly on various models of Thinkpad machines in the 3.3 kernel. I've listed them below.
I looked through the commits and found:
commit 29c5fbbcfefba5225a6783683c46c39e10877703: ALSA: HDA: Use model=auto for Thinkpad T510 The user reports that model=auto works fine for him. Using model=auto bring in new features such as jack detection notification to userspace.
I did a local build here with that comment reverted and so far most of the people reported their sound to be working again. The trivial revert patch is below in case you want it.
Could you get alsa-info.sh output on the non-working T510? If it's really about the built-in speaker or headphone jack, I doubt it's rahter the muted output in mixer. I see only "me too" in the bug report, which doesn't help much to diagnose the problem.
I've got a few positive feedbacks of T410 and T510, so basically the driver should work. But I know the problem of docking-station (see below).
It seems there are multiple models that have PCI ID 17aa:215e and using model=auto does not work for them all. It particularly messes with machines using a docking station for some reason.
Aside from just reverting the above commit, do you have other thoughts on how to fix this?
The problem regarding the docking station is basically a BIOS issue. ThinkPad BIOS doesn't expose the pins for docking stations at all. We have already a workaround for X200, and similar others would be needed for T410, T420, etc.
For testing, you don't need even patch the driver. When the driver is built with CONFIG_SND_HDA_PATCH_LOADER=y, create a file containing the below as /lib/firmware/alsa-tp-dock:
================================================================ [codec] 0x14f15069 0x17aa21a4 0
[pincfg] 0x1a 0x21a11000 0x1c 0x23014250 ================================================================
then pass the module option patch="alsa-tp-dock" to snd-hda-intel, e.g. create a file containing below in /etc/modprobe.d/*
options snd-hda-intel patch="alsa-tp-dock"
This will override the pin-default values of 0x1a and 0x1c, which corresponds to the docking-station mic and docking-station output. This will set dock-out as the line-out so that the built-in headphone is preferred over it.
Note that after applying this, the new mixer elements will appear, so you'd need to adjust the values manually once.
Similarly, for T420, create a file with the contents below instead:
================================================================ [codec] 0x14f1506e 0x17aa21d2 0
[pincfg] 0x19 0x0421104f 0x1a 0x21a19050 0x1c 0x2121401f ================================================================
The rest procedure is same.
If the above seem work (again, make sure that you adjust the mixer mutes and levels), I'll make kernel patches to add these fixups statically in the driver so that it works without extra patching.
thanks,
Takashi
At Fri, 13 Apr 2012 15:07:07 +0200, Takashi Iwai wrote:
For testing, you don't need even patch the driver. When the driver is built with CONFIG_SND_HDA_PATCH_LOADER=y, create a file containing the below as /lib/firmware/alsa-tp-dock:
================================================================ [codec] 0x14f15069 0x17aa21a4 0
[pincfg] 0x1a 0x21a11000 0x1c 0x23014250 ================================================================
Forgot to mention that the above is only for TP410/510. For TP420 & co, the second one should be used.
Also, for TP410/510, the following values might be better (this time contains 0x19, too):
0x19 0x042110ff 0x1a 0x21a190f0 0x1c 0x212140ff
This will make the built-in and the dock headphones as headphones. The mixer elements will be more intuitive than the former version.
thanks,
Takashi
At Fri, 13 Apr 2012 15:07:07 +0200, Takashi Iwai wrote: (snip)
If the above seem work (again, make sure that you adjust the mixer mutes and levels), I'll make kernel patches to add these fixups statically in the driver so that it works without extra patching.
Looking through alsa-info.sh outputs from various ThinkPad models I've gathered, it seems that we can use the same pin setups for all.
Below is a test patch for 3.3 kernel. (Note that it'd give a merge conflict for 3.4 kernel.)
thanks,
Takashi
--- diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index d29d6d3..681a8a9 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c @@ -4362,8 +4362,10 @@ static void apply_pin_fixup(struct hda_codec *codec,
enum { CXT_PINCFG_LENOVO_X200, + CXT_PINCFG_LENOVO_TP410, };
+/* ThinkPad X200 & co with cxt5051 */ static const struct cxt_pincfg cxt_pincfg_lenovo_x200[] = { { 0x16, 0x042140ff }, /* HP (seq# overridden) */ { 0x17, 0x21a11000 }, /* dock-mic */ @@ -4371,15 +4373,33 @@ static const struct cxt_pincfg cxt_pincfg_lenovo_x200[] = { {} };
+/* ThinkPad 410/420/510/520, X201 & co with cxt5066 */ +static const struct cxt_pincfg cxt_pincfg_lenovo_tp410[] = { + { 0x19, 0x042110ff }, /* HP (seq# overridden) */ + { 0x1a, 0x21a190f0 }, /* dock-mic */ + { 0x1c, 0x212140ff }, /* dock-HP */ + {} +}; + static const struct cxt_pincfg *cxt_pincfg_tbl[] = { [CXT_PINCFG_LENOVO_X200] = cxt_pincfg_lenovo_x200, + [CXT_PINCFG_LENOVO_TP410] = cxt_pincfg_lenovo_tp410, };
-static const struct snd_pci_quirk cxt_fixups[] = { +static const struct snd_pci_quirk cxt5051_fixups[] = { SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo X200", CXT_PINCFG_LENOVO_X200), {} };
+static const struct snd_pci_quirk cxt5066_fixups[] = { + SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400", CXT_PINCFG_LENOVO_TP410), + SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo T410", CXT_PINCFG_LENOVO_TP410), + SND_PCI_QUIRK(0x17aa, 0x215f, "Lenovo T510", CXT_PINCFG_LENOVO_TP410), + SND_PCI_QUIRK(0x17aa, 0x21ce, "Lenovo T420", CXT_PINCFG_LENOVO_TP410), + SND_PCI_QUIRK(0x17aa, 0x21cf, "Lenovo T520", CXT_PINCFG_LENOVO_TP410), + {} +}; + /* add "fake" mute amp-caps to DACs on cx5051 so that mixer mute switches * can be created (bko#42825) */ @@ -4416,11 +4436,13 @@ static int patch_conexant_auto(struct hda_codec *codec) break; case 0x14f15051: add_cx5051_fake_mutes(codec); + apply_pin_fixup(codec, cxt5051_fixups, cxt_pincfg_tbl); + break; + default: + apply_pin_fixup(codec, cxt5066_fixups, cxt_pincfg_tbl); break; }
- apply_pin_fixup(codec, cxt_fixups, cxt_pincfg_tbl); - err = cx_auto_search_adcs(codec); if (err < 0) return err;
participants (1)
-
Takashi Iwai