From patchwork Wed Jun 17 04:58:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kai-Heng Feng X-Patchwork-Id: 11609021 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 925AF618 for ; Wed, 17 Jun 2020 04:59:48 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 99DBD20786 for ; Wed, 17 Jun 2020 04:59:47 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=alsa-project.org header.i=@alsa-project.org header.b="mIyLL+yS" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 99DBD20786 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=canonical.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id DC3541614; Wed, 17 Jun 2020 06:58:56 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz DC3541614 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1592369985; bh=y9Ta6EwF9AE87jqwd/NojPnS2wZp8LlHC544bmiCAFs=; h=From:To:Subject:Date:Cc:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From; b=mIyLL+ySJXjdiBu7v5enHdP/s4K0RpBlE1UfrRlaDkGCPEZyBHnWpf6yxYBzpyimh +6DCaIUgf7mSfgw7cLEwhH9p1Ygwku+mI9Nv2Yn1z0Gnyy8ozjuMgRFV1709F6BGSK DzTbZDQxYb0mIM0Tyrh/+5PovucrD3RCclof5+fM= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 4265AF80171; Wed, 17 Jun 2020 06:58:56 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa1.perex.cz (Postfix, from userid 50401) id D8431F801D9; Wed, 17 Jun 2020 06:58:52 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on alsa1.perex.cz X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=AC_FROM_MANY_DOTS, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE,URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 0EE71F800EF for ; Wed, 17 Jun 2020 06:58:44 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 0EE71F800EF Received: from 61-220-137-37.hinet-ip.hinet.net ([61.220.137.37] helo=localhost) by youngberry.canonical.com with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1jlQ9g-0006w0-U0; Wed, 17 Jun 2020 04:58:33 +0000 From: Kai-Heng Feng To: tiwai@suse.com Subject: [PATCH v2 1/2] ALSA: hda/realtek: Add COEF controlled micmute LED support Date: Wed, 17 Jun 2020 12:58:24 +0800 Message-Id: <20200617045828.3735-1-kai.heng.feng@canonical.com> X-Mailer: git-send-email 2.17.1 Cc: Wenwen Wang , Kailang Yang , Tomas Espeleta , Thomas Hebb , "moderated list:SOUND" , open list , Pierre-Louis Bossart , =?utf-8?b?TWlj?= =?utf-8?b?aGHFgiBNaXJvc8WCYXc=?= , Hui Wang , Kai-Heng Feng , Jian-Hong Pan X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" Currently, HDA codec LED class can only used by by GPIO controlled LED. However, there are some new systems that control LED via COEF instead of GPIO. In order to support those systems, create a new helper that can be facilitated by both COEF controlled and GPIO controlled LED, and use generic call_micmute_led_update() to control both case. In addition to that, add LED_CORE_SUSPENDRESUME flag since some systems don't restore the LED properly after suspend. Signed-off-by: Kai-Heng Feng --- v2: - Prevent platforms like Dell, Lenovoe and Huawei create double LED class devices. sound/pci/hda/hda_generic.c | 3 ++- sound/pci/hda/hda_generic.h | 1 + sound/pci/hda/patch_realtek.c | 29 ++++++++++++++++------------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index f4e9d9445e18..9c3f1990c621 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c @@ -3897,7 +3897,7 @@ enum { MICMUTE_LED_FOLLOW_MUTE, }; -static void call_micmute_led_update(struct hda_codec *codec) +void call_micmute_led_update(struct hda_codec *codec) { struct hda_gen_spec *spec = codec->spec; unsigned int val; @@ -3924,6 +3924,7 @@ static void call_micmute_led_update(struct hda_codec *codec) if (spec->micmute_led.update) spec->micmute_led.update(codec); } +EXPORT_SYMBOL_GPL(call_micmute_led_update); static void update_micmute_led(struct hda_codec *codec, struct snd_kcontrol *kcontrol, diff --git a/sound/pci/hda/hda_generic.h b/sound/pci/hda/hda_generic.h index fb9f1a90238b..9f08a9ee9112 100644 --- a/sound/pci/hda/hda_generic.h +++ b/sound/pci/hda/hda_generic.h @@ -353,6 +353,7 @@ unsigned int snd_hda_gen_path_power_filter(struct hda_codec *codec, void snd_hda_gen_stream_pm(struct hda_codec *codec, hda_nid_t nid, bool on); int snd_hda_gen_fix_pin_power(struct hda_codec *codec, hda_nid_t pin); +void call_micmute_led_update(struct hda_codec *codec); int snd_hda_gen_add_micmute_led(struct hda_codec *codec, void (*hook)(struct hda_codec *)); void snd_hda_gen_fixup_micmute_led(struct hda_codec *codec, diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 6d73f8beadb6..9691af8241cf 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -4114,10 +4114,10 @@ static int micmute_led_set(struct led_classdev *led_cdev, enum led_brightness brightness) { struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent); - struct alc_spec *spec = codec->spec; + struct hda_gen_spec *spec = codec->spec; - alc_update_gpio_led(codec, spec->gpio_mic_led_mask, - spec->micmute_led_polarity, !!brightness); + spec->micmute_led.led_mode = !brightness; + call_micmute_led_update(codec); return 0; } @@ -4126,7 +4126,17 @@ static struct led_classdev micmute_led_cdev = { .max_brightness = 1, .brightness_set_blocking = micmute_led_set, .default_trigger = "audio-micmute", + .flags = LED_CORE_SUSPENDRESUME, }; + +static void alc_register_micmute_led(struct hda_codec *codec) +{ + micmute_led_cdev.brightness = ledtrig_audio_get(LED_AUDIO_MICMUTE); + if (devm_led_classdev_register(&codec->core.dev, &micmute_led_cdev)) + codec_warn(codec, "failed to register micmute LED\n"); +} +#else +static inline void alc_register_micmute_led(struct hda_codec *codec) {} #endif /* setup mute and mic-mute GPIO bits, add hooks appropriately */ @@ -4136,9 +4146,6 @@ static void alc_fixup_hp_gpio_led(struct hda_codec *codec, unsigned int micmute_mask) { struct alc_spec *spec = codec->spec; -#if IS_REACHABLE(CONFIG_LEDS_TRIGGER_AUDIO) - int err; -#endif alc_fixup_gpio(codec, action, mute_mask | micmute_mask); @@ -4151,13 +4158,7 @@ static void alc_fixup_hp_gpio_led(struct hda_codec *codec, if (micmute_mask) { spec->gpio_mic_led_mask = micmute_mask; snd_hda_gen_add_micmute_led(codec, alc_gpio_micmute_update); - -#if IS_REACHABLE(CONFIG_LEDS_TRIGGER_AUDIO) - micmute_led_cdev.brightness = ledtrig_audio_get(LED_AUDIO_MICMUTE); - err = devm_led_classdev_register(&codec->core.dev, &micmute_led_cdev); - if (err) - codec_warn(codec, "failed to register micmute LED\n"); -#endif + alc_register_micmute_led(codec); } } @@ -4305,6 +4306,7 @@ static void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec, spec->mic_led_coefbit_on = 1<<13; spec->mic_led_coefbit_off = 0; snd_hda_gen_add_micmute_led(codec, alc_hp_cap_micmute_update); + alc_register_micmute_led(codec); } } @@ -4319,6 +4321,7 @@ static void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec, spec->mic_led_coefbit_on = 2<<2; spec->mic_led_coefbit_off = 1<<2; snd_hda_gen_add_micmute_led(codec, alc_hp_cap_micmute_update); + alc_register_micmute_led(codec); } }