Commit e854747d authored by Kailang Yang's avatar Kailang Yang Committed by Takashi Iwai

ALSA: hda/realtek - Enable headset button support for new codec

This patch will enable headset button for new Chrome platform.
Signed-off-by: default avatarKailang Yang <kailang@realtek.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 911761c2
...@@ -5380,6 +5380,66 @@ static void alc285_fixup_invalidate_dacs(struct hda_codec *codec, ...@@ -5380,6 +5380,66 @@ static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
snd_hda_override_wcaps(codec, 0x03, 0); snd_hda_override_wcaps(codec, 0x03, 0);
} }
static const struct hda_jack_keymap alc_headset_btn_keymap[] = {
{ SND_JACK_BTN_0, KEY_PLAYPAUSE },
{ SND_JACK_BTN_1, KEY_VOICECOMMAND },
{ SND_JACK_BTN_2, KEY_VOLUMEUP },
{ SND_JACK_BTN_3, KEY_VOLUMEDOWN },
{}
};
static void alc_headset_btn_callback(struct hda_codec *codec,
struct hda_jack_callback *jack)
{
int report = 0;
if (jack->unsol_res & (7 << 13))
report |= SND_JACK_BTN_0;
if (jack->unsol_res & (1 << 16 | 3 << 8))
report |= SND_JACK_BTN_1;
/* Volume up key */
if (jack->unsol_res & (7 << 23))
report |= SND_JACK_BTN_2;
/* Volume down key */
if (jack->unsol_res & (7 << 10))
report |= SND_JACK_BTN_3;
jack->jack->button_state = report;
}
static void alc_fixup_headset_jack(struct hda_codec *codec,
const struct hda_fixup *fix, int action)
{
switch (action) {
case HDA_FIXUP_ACT_PRE_PROBE:
snd_hda_jack_detect_enable_callback(codec, 0x55,
alc_headset_btn_callback);
snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack", false,
SND_JACK_HEADSET, alc_headset_btn_keymap);
break;
case HDA_FIXUP_ACT_INIT:
switch (codec->core.vendor_id) {
case 0x10ec0225:
case 0x10ec0295:
case 0x10ec0299:
alc_write_coef_idx(codec, 0x48, 0xd011);
alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
break;
case 0x10ec0236:
case 0x10ec0256:
alc_write_coef_idx(codec, 0x48, 0xd011);
alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
break;
}
break;
}
}
/* for hda_fixup_thinkpad_acpi() */ /* for hda_fixup_thinkpad_acpi() */
#include "thinkpad_helper.c" #include "thinkpad_helper.c"
...@@ -5517,6 +5577,7 @@ enum { ...@@ -5517,6 +5577,7 @@ enum {
ALC285_FIXUP_LENOVO_HEADPHONE_NOISE, ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
ALC295_FIXUP_HP_AUTO_MUTE, ALC295_FIXUP_HP_AUTO_MUTE,
ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE, ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
ALC225_FIXUP_HEADSET_JACK,
}; };
static const struct hda_fixup alc269_fixups[] = { static const struct hda_fixup alc269_fixups[] = {
...@@ -6403,6 +6464,10 @@ static const struct hda_fixup alc269_fixups[] = { ...@@ -6403,6 +6464,10 @@ static const struct hda_fixup alc269_fixups[] = {
.chained = true, .chained = true,
.chain_id = ALC269_FIXUP_HEADSET_MIC .chain_id = ALC269_FIXUP_HEADSET_MIC
}, },
[ALC225_FIXUP_HEADSET_JACK] = {
.type = HDA_FIXUP_FUNC,
.v.func = alc_fixup_headset_jack,
},
}; };
static const struct snd_pci_quirk alc269_fixup_tbl[] = { static const struct snd_pci_quirk alc269_fixup_tbl[] = {
...@@ -6805,6 +6870,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = { ...@@ -6805,6 +6870,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
{.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"}, {.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
{.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"}, {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
{.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"}, {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
{.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-sense-combo"},
{} {}
}; };
#define ALC225_STANDARD_PINS \ #define ALC225_STANDARD_PINS \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment