ACK w/cmt: [UTOPIC PATCH 1/3] ALSA: hda - add mic mute led hook for dell machines
Hui Wang
hui.wang at canonical.com
Mon Feb 9 02:24:43 UTC 2015
On 02/06/2015 09:41 PM, Chris J Arges wrote:
> Hi,
> Need to add (backported from XXXXX) in patches 1/2 (cherry-pick -x can
> do this in the future). The backports make sense because the enum is
Got it. thanks.
> slightly different. Looks good overall,
>
> Acked-by: <chris.j.arges at canonical.com>
>
> --chris
>
> On 02/06/2015 02:23 AM, Hui Wang wrote:
>> BugLink: http://bugs.launchpad.net/bugs/1418832
>>
>> commit 00ef99408b6cc8d86ca614ada8025aa3606860db upstream
>>
>> The mic mute led on dell laptops is controlled by the wmi driver.
>> Followed this part being merged to the kernel, we add the mic mute led
>> hook in the hda driver.
>>
>> Signed-off-by: David Henningsson <david.henningsson at canonical.com>
>> Signed-off-by: Hui Wang <hui.wang at canonical.com>
>> Signed-off-by: Takashi Iwai <tiwai at suse.de>
>>
>> Conflicts:
>> sound/pci/hda/patch_realtek.c
>>
>> Signed-off-by: Hui Wang <hui.wang at canonical.com>
>> ---
>> sound/pci/hda/dell_wmi_helper.c | 76 +++++++++++++++++++++++++++++++++++++++++
>> sound/pci/hda/patch_realtek.c | 12 +++++++
>> 2 files changed, 88 insertions(+)
>> create mode 100644 sound/pci/hda/dell_wmi_helper.c
>>
>> diff --git a/sound/pci/hda/dell_wmi_helper.c b/sound/pci/hda/dell_wmi_helper.c
>> new file mode 100644
>> index 0000000..9c22f95
>> --- /dev/null
>> +++ b/sound/pci/hda/dell_wmi_helper.c
>> @@ -0,0 +1,76 @@
>> +/* Helper functions for Dell Mic Mute LED control;
>> + * to be included from codec driver
>> + */
>> +
>> +#if IS_ENABLED(CONFIG_LEDS_DELL_NETBOOKS)
>> +#include <linux/dell-led.h>
>> +
>> +static int dell_led_value;
>> +static int (*dell_led_set_func)(int, int);
>> +static void (*dell_old_cap_hook)(struct hda_codec *,
>> + struct snd_kcontrol *,
>> + struct snd_ctl_elem_value *);
>> +
>> +static void update_dell_wmi_micmute_led(struct hda_codec *codec,
>> + struct snd_kcontrol *kcontrol,
>> + struct snd_ctl_elem_value *ucontrol)
>> +{
>> + if (dell_old_cap_hook)
>> + dell_old_cap_hook(codec, kcontrol, ucontrol);
>> +
>> + if (!ucontrol || !dell_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? */
>> + int val = (ucontrol->value.integer.value[0] || ucontrol->value.integer.value[1]) ? 0 : 1;
>> + if (val == dell_led_value)
>> + return;
>> + dell_led_value = val;
>> + if (dell_led_set_func)
>> + dell_led_set_func(DELL_LED_MICMUTE, dell_led_value);
>> + }
>> +}
>> +
>> +
>> +static void alc_fixup_dell_wmi(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 (!dell_led_set_func)
>> + dell_led_set_func = symbol_request(dell_app_wmi_led_set);
>> + if (!dell_led_set_func) {
>> + codec_warn(codec, "Failed to find dell wmi symbol dell_app_wmi_led_set\n");
>> + return;
>> + }
>> +
>> + removefunc = true;
>> + if (dell_led_set_func(DELL_LED_MICMUTE, false) >= 0) {
>> + dell_led_value = 0;
>> + if (spec->gen.num_adc_nids > 1)
>> + codec_dbg(codec, "Skipping micmute LED control due to several ADCs");
>> + else {
>> + dell_old_cap_hook = spec->gen.cap_sync_hook;
>> + spec->gen.cap_sync_hook = update_dell_wmi_micmute_led;
>> + removefunc = false;
>> + }
>> + }
>> +
>> + }
>> +
>> + if (dell_led_set_func && (action == HDA_FIXUP_ACT_FREE || removefunc)) {
>> + symbol_put(dell_app_wmi_led_set);
>> + dell_led_set_func = NULL;
>> + dell_old_cap_hook = NULL;
>> + }
>> +}
>> +
>> +#else /* CONFIG_LEDS_DELL_NETBOOKS */
>> +static void alc_fixup_dell_wmi(struct hda_codec *codec,
>> + const struct hda_fixup *fix, int action)
>> +{
>> +}
>> +
>> +#endif /* CONFIG_LEDS_DELL_NETBOOKS */
>> diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
>> index e517902..d70f130 100644
>> --- a/sound/pci/hda/patch_realtek.c
>> +++ b/sound/pci/hda/patch_realtek.c
>> @@ -4249,6 +4249,9 @@ static void alc290_fixup_mono_speakers(struct hda_codec *codec,
>> /* for hda_fixup_thinkpad_acpi() */
>> #include "thinkpad_helper.c"
>>
>> +/* for dell wmi mic mute led */
>> +#include "dell_wmi_helper.c"
>> +
>> enum {
>> ALC269_FIXUP_SONY_VAIO,
>> ALC275_FIXUP_SONY_VAIO_GPIO2,
>> @@ -4310,6 +4313,7 @@ enum {
>> ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
>> ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
>> ALC292_FIXUP_TPT440_DOCK,
>> + ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED,
>> };
>>
>> static const struct hda_fixup alc269_fixups[] = {
>> @@ -4736,6 +4740,12 @@ static const struct hda_fixup alc269_fixups[] = {
>> .chained = true,
>> .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
>> },
>> + [ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED] = {
>> + .type = HDA_FIXUP_FUNC,
>> + .v.func = alc_fixup_dell_wmi,
>> + .chained_before = true,
>> + .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
>> + },
>> };
>>
>> static const struct snd_pci_quirk alc269_fixup_tbl[] = {
>> @@ -4779,10 +4789,12 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
>> SND_PCI_QUIRK(0x1028, 0x0606, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
>> SND_PCI_QUIRK(0x1028, 0x0608, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
>> SND_PCI_QUIRK(0x1028, 0x0609, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
>> + SND_PCI_QUIRK(0x1028, 0x0610, "Dell", ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED),
>> SND_PCI_QUIRK(0x1028, 0x0613, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
>> SND_PCI_QUIRK(0x1028, 0x0614, "Dell Inspiron 3135", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
>> SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
>> SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
>> + SND_PCI_QUIRK(0x1028, 0x061f, "Dell", ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED),
>> SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
>> SND_PCI_QUIRK(0x1028, 0x063f, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
>> SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
>>
More information about the kernel-team
mailing list