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

Commit 72474be6 authored by Matt Ranostay's avatar Matt Ranostay Committed by Jaroslav Kysela
Browse files

ALSA: hda: VREF powerdown for headphones



Add support for powering down VREF on standard headphone insertion, also
powers up the VREF on a headset insertion.

Signed-off-by: default avatarMatthew Ranostay <mranostay@embeddedalley.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarJaroslav Kysela <perex@perex.cz>
parent b9aea715
Loading
Loading
Loading
Loading
+22 −1
Original line number Original line Diff line number Diff line
@@ -38,6 +38,7 @@
#define NUM_CONTROL_ALLOC	32
#define NUM_CONTROL_ALLOC	32
#define STAC_PWR_EVENT		0x20
#define STAC_PWR_EVENT		0x20
#define STAC_HP_EVENT		0x30
#define STAC_HP_EVENT		0x30
#define STAC_VREF_EVENT		0x40


enum {
enum {
	STAC_REF,
	STAC_REF,
@@ -3854,13 +3855,22 @@ static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res)
	struct sigmatel_spec *spec = codec->spec;
	struct sigmatel_spec *spec = codec->spec;
	int idx = res >> 26 & 0x0f;
	int idx = res >> 26 & 0x0f;


	switch ((res >> 26) & 0x30) {
	switch ((res >> 26) & 0x70) {
	case STAC_HP_EVENT:
	case STAC_HP_EVENT:
		stac92xx_hp_detect(codec, res);
		stac92xx_hp_detect(codec, res);
		/* fallthru */
		/* fallthru */
	case STAC_PWR_EVENT:
	case STAC_PWR_EVENT:
		if (spec->num_pwrs > 0)
		if (spec->num_pwrs > 0)
			stac92xx_pin_sense(codec, idx);
			stac92xx_pin_sense(codec, idx);
		break;
	case STAC_VREF_EVENT: {
		int data = snd_hda_codec_read(codec, codec->afg, 0,
			AC_VERB_GET_GPIO_DATA, 0);
		/* toggle VREF state based on GPIOx status */
		snd_hda_codec_write(codec, codec->afg, 0, 0x7e0,
			!!(data & (1 << idx)));
		break;
		}
	}
	}
}
}


@@ -4360,6 +4370,17 @@ static int patch_stac92hd71bxx(struct hda_codec *codec)
		codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
		codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
		break;
		break;
	case 0x111d7608: /* 5 Port with Analog Mixer */
	case 0x111d7608: /* 5 Port with Analog Mixer */
		switch (codec->subsystem_id) {
		case 0x103c361a:
			/* Enable VREF power saving on GPIO1 detect */
			snd_hda_codec_write(codec, codec->afg, 0,
				AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02);
			snd_hda_codec_write_cache(codec, codec->afg, 0,
					AC_VERB_SET_UNSOLICITED_ENABLE,
					(AC_USRSP_EN | STAC_VREF_EVENT | 0x01));
			spec->gpio_mask |= 0x02;
			break;
		}
		if ((codec->revision_id & 0xf) == 0 ||
		if ((codec->revision_id & 0xf) == 0 ||
				(codec->revision_id & 0xf) == 1) {
				(codec->revision_id & 0xf) == 1) {
#ifdef SND_HDA_NEEDS_RESUME
#ifdef SND_HDA_NEEDS_RESUME