ALSA: hda - Fix pin-detection in patch_sigmatel.c

The pin-detection function used in patch_sigmatel.c shouldn't be specific
to HP pin because it's used for input pins in general, too.

This patch fixes the detection function, removes the HP check from it
and moves to stac92xx_hp_detect().

Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Iwai 2008-12-05 12:54:56 +01:00
parent 4151d154ef
commit e6e3ea25b1

View file

@ -4061,20 +4061,13 @@ static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid,
pin_ctl & ~flag); pin_ctl & ~flag);
} }
static int get_hp_pin_presence(struct hda_codec *codec, hda_nid_t nid) static int get_pin_presence(struct hda_codec *codec, hda_nid_t nid)
{ {
if (!nid) if (!nid)
return 0; return 0;
if (snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_SENSE, 0x00) if (snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_SENSE, 0x00)
& (1 << 31)) { & (1 << 31))
unsigned int pinctl; return 1;
pinctl = snd_hda_codec_read(codec, nid, 0,
AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
if (pinctl & AC_PINCTL_IN_EN)
return 0; /* mic- or line-input */
else
return 1; /* HP-output */
}
return 0; return 0;
} }
@ -4114,7 +4107,14 @@ static void stac92xx_hp_detect(struct hda_codec *codec)
break; break;
if (no_hp_sensing(spec, i)) if (no_hp_sensing(spec, i))
continue; continue;
presence = get_hp_pin_presence(codec, cfg->hp_pins[i]); presence = get_pin_presence(codec, cfg->hp_pins[i]);
if (presence) {
unsigned int pinctl;
pinctl = snd_hda_codec_read(codec, cfg->hp_pins[i], 0,
AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
if (pinctl & AC_PINCTL_IN_EN)
presence = 0; /* mic- or line-input */
}
} }
if (presence) { if (presence) {
@ -4191,7 +4191,7 @@ static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid,
static void stac92xx_pin_sense(struct hda_codec *codec, hda_nid_t nid) static void stac92xx_pin_sense(struct hda_codec *codec, hda_nid_t nid)
{ {
stac_toggle_power_map(codec, nid, get_hp_pin_presence(codec, nid)); stac_toggle_power_map(codec, nid, get_pin_presence(codec, nid));
} }
static void stac92xx_report_jack(struct hda_codec *codec, hda_nid_t nid) static void stac92xx_report_jack(struct hda_codec *codec, hda_nid_t nid)
@ -4213,7 +4213,7 @@ static void stac92xx_report_jack(struct hda_codec *codec, hda_nid_t nid)
type = (pin_ctl & AC_PINCTL_HP_EN) type = (pin_ctl & AC_PINCTL_HP_EN)
? SND_JACK_HEADPHONE : SND_JACK_LINEOUT; ? SND_JACK_HEADPHONE : SND_JACK_LINEOUT;
snd_jack_report(jacks->jack, snd_jack_report(jacks->jack,
get_hp_pin_presence(codec, nid) get_pin_presence(codec, nid)
? type : 0); ? type : 0);
} }
jacks++; jacks++;
@ -5349,7 +5349,7 @@ static int stac9872_vaio_init(struct hda_codec *codec)
static void stac9872_vaio_hp_detect(struct hda_codec *codec, unsigned int res) static void stac9872_vaio_hp_detect(struct hda_codec *codec, unsigned int res)
{ {
if (get_hp_pin_presence(codec, 0x0a)) { if (get_pin_presence(codec, 0x0a)) {
stac92xx_reset_pinctl(codec, 0x0f, AC_PINCTL_OUT_EN); stac92xx_reset_pinctl(codec, 0x0f, AC_PINCTL_OUT_EN);
stac92xx_set_pinctl(codec, 0x0a, AC_PINCTL_OUT_EN); stac92xx_set_pinctl(codec, 0x0a, AC_PINCTL_OUT_EN);
} else { } else {