Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+66 −0
Original line number Diff line number Diff line
@@ -5380,6 +5380,66 @@ static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
	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() */
#include "thinkpad_helper.c"

@@ -5517,6 +5577,7 @@ enum {
	ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
	ALC295_FIXUP_HP_AUTO_MUTE,
	ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
	ALC225_FIXUP_HEADSET_JACK,
};

static const struct hda_fixup alc269_fixups[] = {
@@ -6403,6 +6464,10 @@ static const struct hda_fixup alc269_fixups[] = {
		.chained = true,
		.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[] = {
@@ -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_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
	{.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
	{.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-sense-combo"},
	{}
};
#define ALC225_STANDARD_PINS \