[Acked] [Precise/SRU][PATCH] UBUNTU: SAUCE: (drop after 3.2) ALSA: hda - restrict bass configuration on Dell Inspiron 17
Andy Whitcroft
apw at canonical.com
Wed Jul 11 13:56:47 UTC 2012
On Tue, Jul 10, 2012 at 04:56:35PM -0300, Herton Ronaldo Krzesinski wrote:
> The ALC269VB configuration on Dell Inspiron 17 results in mixer volume
> controls only for the main and "bass"/surround speakers, lacking a
> separate volume control for headphones, due to the lack of DACs
> available. Realtek auto config avoids to create an duplicate volume
> slider for the same nid (DAC), so as headphone and first set of speakers
> share the same DAC, and the volume control is done on DAC amp, only one
> volume slider with the name "Speaker Playback Volume" is created.
>
> The problem is that on Ubuntu pulse configuration also uses control
> names to do automute. So when you insert a headphone, it goes there and
> mutes and lowers volumes of all Speaker controls. As Speaker volume
> slider also controls the volume on headphones, this ends up also
> "muting" the headphone output, and you have bug 994685 reported.
>
> This change workarounds the issue, forcing the current auto config code
> in 3.2 kernel to allocate an exclusive DAC for headphones, which allows
> the creation of separate Headphone and Speaker controls. We do that
> forcing the headphone pins and speaker pins to "see" only the mixers
> routing to DACs we want, and after the setup is done we undo the hidden
> connections.
>
> Also we make sure to add a mixer item back to control the second speaker
> pin, otherwise it is gone with the workaround in place.
>
> And as it happens sometimes, where manufactures end up using their same
> subvendor and subdevice ids for different setups/hardware, we play safe
> and do some sanity checks first before applying the fixup.
>
> BugLink: http://bugs.launchpad.net/bugs/994685
> Signed-off-by: Herton Ronaldo Krzesinski <herton.krzesinski at canonical.com>
> ---
> sound/pci/hda/patch_realtek.c | 72 +++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 72 insertions(+)
>
> diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
> index 491dc2f..b63f2fc 100644
> --- a/sound/pci/hda/patch_realtek.c
> +++ b/sound/pci/hda/patch_realtek.c
> @@ -4868,6 +4868,72 @@ static void alc269_fixup_quanta_mute(struct hda_codec *codec,
> spec->automute_hook = alc269_quanta_automute;
> }
>
> +/* Hide the connection of speakers and headphone pins to specific DACs,
> + * so we prevent autoconfig to make headphone pin share the same DAC
> + * with the first set of speakers, which in the end makes the mixer lack
> + * a headphone volume control (as speaker volume slider controls the DAC
> + * amp, and the code prevents adding another volume slider to do the
> + * same thing). This means user space (pulse), depending on
> + * configuration, can foolish think that it can turn the speaker volume
> + * down to 0, while in practice it's also turning down the volume for
> + * headphone pin... http://bugs.launchpad.net/bugs/994685 */
> +static void alc269vb_fixup_restrict_bass(struct hda_codec *codec,
> + const struct alc_fixup *fix,
> + int action)
> +{
> + unsigned int defcfg, i;
> + short dev, con;
> + struct alc_spec *spec = codec->spec;
> + int spk_nids[] = { 0x14, 0x1a };
> + int clear_nids[] = { 0x17, 0x18, 0x1b };
> + static const struct snd_kcontrol_new alc269vb_bass_switch[] = {
> + HDA_CODEC_MUTE("Bass Speaker Playback Switch", 0x1a, 0x0, HDA_OUTPUT),
> + { }
> + };
> +
> + /* Do some sanity checks first. If we don't find pins where they
> + * should be, just do nothing */
> + defcfg = snd_hda_codec_get_pincfg(codec, 0x21);
> + if (get_defcfg_device(defcfg) != AC_JACK_HP_OUT ||
> + get_defcfg_connect(defcfg) == AC_JACK_PORT_NONE)
> + return;
> + for (i = 0; i < ARRAY_SIZE(spk_nids); i++) {
> + defcfg = snd_hda_codec_get_pincfg(codec, spk_nids[i]);
> + dev = get_defcfg_device(defcfg);
> + con = get_defcfg_connect(defcfg);
> + if (dev == AC_JACK_LINE_OUT) {
> + if (con == AC_JACK_PORT_FIXED)
> + dev = AC_JACK_SPEAKER;
> + }
> + if (dev != AC_JACK_SPEAKER || con == AC_JACK_PORT_NONE)
> + return;
> + }
> + for (i = 0; i < ARRAY_SIZE(clear_nids); i++) {
> + defcfg = snd_hda_codec_get_pincfg(codec, clear_nids[i]);
> + dev = get_defcfg_device(defcfg);
> + con = get_defcfg_connect(defcfg);
> + if ((dev == AC_JACK_SPEAKER || dev == AC_JACK_LINE_OUT ||
> + dev == AC_JACK_HP_OUT) && con != AC_JACK_PORT_NONE)
> + return;
> + }
> +
> + if (action == ALC_FIXUP_ACT_PRE_PROBE) {
> + /* fake the connections during parsing the tree */
> + hda_nid_t conn1[1] = { 0x0c };
> + hda_nid_t conn2[1] = { 0x0d };
> + snd_hda_override_conn_list(codec, 0x14, 1, conn2);
> + snd_hda_override_conn_list(codec, 0x1a, 1, conn2);
> + snd_hda_override_conn_list(codec, 0x21, 1, conn1);
> + } else if (action == ALC_FIXUP_ACT_PROBE) {
> + /* restore the connections */
> + hda_nid_t conn[2] = { 0x0c, 0x0d };
> + snd_hda_override_conn_list(codec, 0x14, 2, conn);
> + snd_hda_override_conn_list(codec, 0x1a, 2, conn);
> + snd_hda_override_conn_list(codec, 0x21, 2, conn);
> + add_mixer(spec, alc269vb_bass_switch);
> + }
> +}
> +
> enum {
> ALC269_FIXUP_SONY_VAIO,
> ALC275_FIXUP_SONY_VAIO_GPIO2,
> @@ -4885,6 +4951,7 @@ enum {
> ALC269_FIXUP_DMIC,
> ALC269VB_FIXUP_AMIC,
> ALC269VB_FIXUP_DMIC,
> + ALC269VB_FIXUP_RESTRICT_BASS,
> };
>
> static const struct alc_fixup alc269_fixups[] = {
> @@ -5005,6 +5072,10 @@ static const struct alc_fixup alc269_fixups[] = {
> { }
> },
> },
> + [ALC269VB_FIXUP_RESTRICT_BASS] = {
> + .type = ALC_FIXUP_FUNC,
> + .v.func = alc269vb_fixup_restrict_bass,
> + },
> };
>
> static const struct snd_pci_quirk alc269_fixup_tbl[] = {
> @@ -5020,6 +5091,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
> SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
> SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
> SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
> + SND_PCI_QUIRK(0x1028, 0x04d8, "Dell Inspiron 17", ALC269VB_FIXUP_RESTRICT_BASS),
> SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
> SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
> SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
> --
Looks to have sensible sanity checks, only ties to one PCI id pair, and
overall looks to do what is claimed. Low Risk.
Acked-by: Andy Whitcroft <apw at canonical.com>
-apw
More information about the kernel-team
mailing list