Message ID | 20181109234526.4280-4-ayman.bagabas@gmail.com (mailing list archive) |
---|---|
State | Changes Requested, archived |
Headers | show |
Series | Huawei laptops | expand |
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: > 1. Matebook X (19e5:3200), (19e5:3201) > 2. 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 >
On Sat, 10 Nov 2018 15:26:55 +0100, Andy Shevchenko wrote: > > 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: > > 1. Matebook X (19e5:3200), (19e5:3201) > > 2. 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? FWIW, other similar codes take ENABLED. It's dynamic binding, and the codec driver may be re-bound even if it's a built-in. Takashi
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) +#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 */
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: 1. Matebook X (19e5:3200), (19e5:3201) 2. 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