Commit 72474be6 authored by Matthew Ranostay's avatar Matthew Ranostay Committed by Jaroslav Kysela

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
...@@ -38,6 +38,7 @@ ...@@ -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) ...@@ -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) ...@@ -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
......
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