From patchwork Mon Dec 16 08:25:38 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hui Wang X-Patchwork-Id: 301536 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) by ozlabs.org (Postfix) with ESMTP id 57CAD2C007B for ; Mon, 16 Dec 2013 19:26:50 +1100 (EST) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1VsTVm-0001ed-IT; Mon, 16 Dec 2013 08:26:46 +0000 Received: from mail-pd0-f181.google.com ([209.85.192.181]) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1VsTVD-0001V9-KN for kernel-team@lists.ubuntu.com; Mon, 16 Dec 2013 08:26:11 +0000 Received: by mail-pd0-f181.google.com with SMTP id p10so4989528pdj.26 for ; Mon, 16 Dec 2013 00:26:10 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=b5gL+x7qgQUDjKo/naNcALEzkr//BECr13CseFZzWts=; b=S7XPldwKFvtlLp4M9MgKBwyiXZKQGM1KqT3PYPjmQP3lz3VUTdhjA/LO0dkN5NLHWa vlp8FGJ3UMeYkP8Muw3e9gedHGfDOFH3VoJhlZiBbaOTJDr9fNgRWnA9VtH7dBbk0LrL +AUAk00OQKdNYE5NKTBlXyAiKfCucJHs1sxJO9BgjR70dkqJN2QJ2vkbRh9gEV7Lmkc2 zhcwWZ/+CvQ4vN8qZPyUL3ve+zyDpYebZWUCp1kE1izy2Ql1kyTTrHXr1VuvA5gWrZ2i OCESLs71UbSgVn7tjcqw5yY6Zlg9sLLYp7YJjjpYU5XSNhQOiCUEtjLlHjk/QR+mK6OQ 9yMg== X-Gm-Message-State: ALoCoQkk+s69+GzAEwguCKp/URdzIfYiwe2+Yx3i8UKCvn1h6YJZutp0+kj8WlJEw7awGHKODN+N X-Received: by 10.68.59.202 with SMTP id b10mr18906143pbr.78.1387182370665; Mon, 16 Dec 2013 00:26:10 -0800 (PST) Received: from localhost.localdomain ([116.213.97.190]) by mx.google.com with ESMTPSA id xs1sm33421390pac.7.2013.12.16.00.26.09 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 16 Dec 2013 00:26:10 -0800 (PST) From: Hui Wang To: kernel-team@lists.ubuntu.com Subject: [Saucy PATCH 3/8] ALSA: hda - Enable Thinkpad mute/micmute LEDs for Realtek Date: Mon, 16 Dec 2013 16:25:38 +0800 Message-Id: <1387182343-17346-3-git-send-email-hui.wang@canonical.com> X-Mailer: git-send-email 1.8.1.2 In-Reply-To: <1387182343-17346-1-git-send-email-hui.wang@canonical.com> References: <1387182343-17346-1-git-send-email-hui.wang@canonical.com> X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.14 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: kernel-team-bounces@lists.ubuntu.com From: David Henningsson BugLink: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1261296 Same as we already have for Conexant. Right now it's only enabled for one machine. Tested-by: Hui Wang Signed-off-by: David Henningsson Signed-off-by: Takashi Iwai (back ported from commit b67ae3f1c97e2e8532ce051f0ed4365e9d796590) Conflicts: sound/pci/hda/patch_realtek.c --- sound/pci/hda/patch_realtek.c | 82 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 0ce3ed6..d808536 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -829,7 +829,11 @@ static inline void alc_shutup(struct hda_codec *codec) snd_hda_shutup_pins(codec); } -#define alc_free snd_hda_gen_free +static void alc_free(struct hda_codec *codec) +{ + snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_FREE); + snd_hda_gen_free(codec); +} #ifdef CONFIG_PM static void alc_power_eapd(struct hda_codec *codec) @@ -3317,6 +3321,74 @@ static void alc290_fixup_mono_speakers(struct hda_codec *codec, snd_hda_override_wcaps(codec, 0x03, 0); } +#if IS_ENABLED(CONFIG_THINKPAD_ACPI) + +#include + +static int (*led_set_func)(int, bool); + +static void update_tpacpi_mute_led(void *private_data, int enabled) +{ + if (led_set_func) + led_set_func(TPACPI_LED_MUTE, !enabled); +} + +static void update_tpacpi_micmute_led(struct hda_codec *codec, + struct snd_ctl_elem_value *ucontrol) +{ + if (!ucontrol || !led_set_func) + return; + if (strcmp("Capture Switch", ucontrol->id.name) == 0 && ucontrol->id.index == 0) { + /* TODO: How do I verify if it's a mono or stereo here? */ + bool val = ucontrol->value.integer.value[0] || ucontrol->value.integer.value[1]; + led_set_func(TPACPI_LED_MICMUTE, !val); + } +} + +static void alc_fixup_thinkpad_acpi(struct hda_codec *codec, + const struct hda_fixup *fix, int action) +{ + struct alc_spec *spec = codec->spec; + bool removefunc = false; + + if (action == HDA_FIXUP_ACT_PROBE) { + if (!led_set_func) + led_set_func = symbol_request(tpacpi_led_set); + if (!led_set_func) { + snd_printk(KERN_WARNING "Failed to find thinkpad-acpi symbol tpacpi_led_set\n"); + return; + } + + removefunc = true; + if (led_set_func(TPACPI_LED_MUTE, false) >= 0) { + spec->gen.vmaster_mute.hook = update_tpacpi_mute_led; + removefunc = false; + } + if (led_set_func(TPACPI_LED_MICMUTE, false) >= 0) { + if (spec->gen.num_adc_nids > 1) + snd_printdd("Skipping micmute LED control due to several ADCs"); + else { + spec->gen.cap_sync_hook = update_tpacpi_micmute_led; + removefunc = false; + } + } + } + + if (led_set_func && (action == HDA_FIXUP_ACT_FREE || removefunc)) { + symbol_put(tpacpi_led_set); + led_set_func = NULL; + } +} + +#else + +static void alc_fixup_thinkpad_acpi(struct hda_codec *codec, + const struct hda_fixup *fix, int action) +{ +} + +#endif + enum { ALC269_FIXUP_SONY_VAIO, ALC275_FIXUP_SONY_VAIO_GPIO2, @@ -3356,6 +3428,7 @@ enum { ALC269_FIXUP_ACER_AC700, ALC269_FIXUP_LIMIT_INT_MIC_BOOST, ALC269VB_FIXUP_ORDISSIMO_EVE2, + ALC269_FIXUP_THINKPAD_ACPI, }; static const struct hda_fixup alc269_fixups[] = { @@ -3629,6 +3702,12 @@ static const struct hda_fixup alc269_fixups[] = { .chained = true, .chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, }, + [ALC269_FIXUP_THINKPAD_ACPI] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc_fixup_thinkpad_acpi, + .chained = true, + .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST + }, }; static const struct snd_pci_quirk alc269_fixup_tbl[] = { @@ -3708,6 +3787,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK), SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK), SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK), + SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI), SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K), SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD), SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */