On Sat, Nov 10, 2018 at 1:46 AM Ayman Bagabas ayman.bagabas@gmail.com wrote:
Some of Huawei laptops come with a LED in the micmute key. This patch enables and disable this LED accordingly. This enables micmute LED for:
- Matebook X (19e5:3200), (19e5:3201)
- Matebook X Pro (19e5:3204)
Signed-off-by: Ayman Bagabas ayman.bagabas@gmail.com
sound/pci/hda/huawei_wmi_helper.c | 47 +++++++++++++++++++++++++++++++ sound/pci/hda/patch_realtek.c | 14 ++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 sound/pci/hda/huawei_wmi_helper.c
diff --git a/sound/pci/hda/huawei_wmi_helper.c b/sound/pci/hda/huawei_wmi_helper.c new file mode 100644 index 000000000000..7c91f914ffba --- /dev/null +++ b/sound/pci/hda/huawei_wmi_helper.c @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Helper functions for Huawei WMI micmute LED;
- to be included from codec driver
- */
+#if IS_ENABLED(CONFIG_HUAWEI_LAPTOP)
ENABLED or REACHABLE?
+#include <linux/platform_data/x86/huawei_wmi.h>
+static int (*huawei_wmi_micmute_led_set_func)(bool);
+static void update_huawei_wmi_micmute_led(struct hda_codec *codec) +{
struct hda_gen_spec *spec = codec->spec;
huawei_wmi_micmute_led_set_func(spec->micmute_led.led_value);
+}
+static void alc_fixup_huawei_wmi(struct hda_codec *codec,
const struct hda_fixup *fix, int action)
+{
bool removefunc = false;
if (action == HDA_FIXUP_ACT_PROBE) {
if (!huawei_wmi_micmute_led_set_func)
huawei_wmi_micmute_led_set_func = symbol_request(huawei_wmi_micmute_led_set);
if (!huawei_wmi_micmute_led_set_func) {
codec_warn(codec, "Failed to find huawei_wmi symbol huawei_wmi_micmute_led_set\n");
return;
}
removefunc = (huawei_wmi_micmute_led_set_func(false) < 0)
|| (snd_hda_gen_add_micmute_led(codec, update_huawei_wmi_micmute_led) < 0);
}
if (huawei_wmi_micmute_led_set_func && (action == HDA_FIXUP_ACT_FREE || removefunc)) {
symbol_put(huawei_wmi_micmute_led_set);
huawei_wmi_micmute_led_set_func = NULL;
}
+}
+#else
+static void alc_fixup_huawei_wmi(struct hda_codec *codec,
const struct hda_fixup *fix, int action)
+{ +}
+#endif diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 135c0826859b..5431dee40f4f 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -5374,6 +5374,9 @@ static void alc_fixup_thinkpad_acpi(struct hda_codec *codec, /* for alc295_fixup_hp_top_speakers */ #include "hp_x360_helper.c"
+/* for alc_fixup_huawei_micmute_led */ +#include "huawei_wmi_helper.c"
enum { ALC269_FIXUP_SONY_VAIO, ALC275_FIXUP_SONY_VAIO_GPIO2, @@ -5494,6 +5497,7 @@ enum { ALC255_FIXUP_DUMMY_LINEOUT_VERB, ALC255_FIXUP_DELL_HEADSET_MIC, ALC256_FIXUP_HUAWEI_MBXP_PINS,
ALC256_FIXUP_HUAWEI_WMI_MICMUTE_LED, ALC295_FIXUP_HP_X360, ALC221_FIXUP_HP_HEADSET_MIC,
}; @@ -5765,6 +5769,10 @@ static const struct hda_fixup alc269_fixups[] = { .chained = true, .chain_id = ALC269_FIXUP_HEADSET_MIC },
[ALC256_FIXUP_HUAWEI_WMI_MICMUTE_LED] = {
.type = HDA_FIXUP_FUNC,
.v.func = alc_fixup_huawei_wmi
}, [ALC256_FIXUP_HUAWEI_MBXP_PINS] = { .type = HDA_FIXUP_PINS, .v.pins = (const struct hda_pintbl[]) {
@@ -5779,7 +5787,9 @@ static const struct hda_fixup alc269_fixups[] = { {0x1e, 0x411111f0}, {0x21, 0x04211020}, { }
}
},
.chained = true,
.chain_id = ALC256_FIXUP_HUAWEI_WMI_MICMUTE_LED }, [ALC269_FIXUP_ASUS_X101_FUNC] = { .type = HDA_FIXUP_FUNC,
@@ -6611,6 +6621,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), 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(0x19e5, 0x3200, "Huawei MBX", ALC256_FIXUP_HUAWEI_WMI_MICMUTE_LED),
SND_PCI_QUIRK(0x19e5, 0x3201, "Huawei MBX", ALC256_FIXUP_HUAWEI_WMI_MICMUTE_LED), SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MBXP", ALC256_FIXUP_HUAWEI_MBXP_PINS), SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
-- 2.17.2