Commit 8ce84198 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda - Avoid to set the pin control again if already set

Check the present pin control bit and avoid the write if it's already
set in patch_sigmatel.c.  This will reduce the number of verb execs at
jack plugging.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 1eaf5c07
...@@ -4126,7 +4126,9 @@ static void stac92xx_free(struct hda_codec *codec) ...@@ -4126,7 +4126,9 @@ static void stac92xx_free(struct hda_codec *codec)
static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid, static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid,
unsigned int flag) unsigned int flag)
{ {
unsigned int pin_ctl = snd_hda_codec_read(codec, nid, unsigned int old_ctl, pin_ctl;
pin_ctl = snd_hda_codec_read(codec, nid,
0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00); 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
if (pin_ctl & AC_PINCTL_IN_EN) { if (pin_ctl & AC_PINCTL_IN_EN) {
...@@ -4140,14 +4142,17 @@ static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid, ...@@ -4140,14 +4142,17 @@ static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid,
return; return;
} }
old_ctl = pin_ctl;
/* if setting pin direction bits, clear the current /* if setting pin direction bits, clear the current
direction bits first */ direction bits first */
if (flag & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)) if (flag & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN))
pin_ctl &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN); pin_ctl &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
snd_hda_codec_write_cache(codec, nid, 0, pin_ctl |= flag;
AC_VERB_SET_PIN_WIDGET_CONTROL, if (old_ctl != pin_ctl)
pin_ctl | flag); snd_hda_codec_write_cache(codec, nid, 0,
AC_VERB_SET_PIN_WIDGET_CONTROL,
pin_ctl);
} }
static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid, static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid,
...@@ -4155,9 +4160,10 @@ static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid, ...@@ -4155,9 +4160,10 @@ static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid,
{ {
unsigned int pin_ctl = snd_hda_codec_read(codec, nid, unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00); 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
snd_hda_codec_write_cache(codec, nid, 0, if (pin_ctl & flag)
AC_VERB_SET_PIN_WIDGET_CONTROL, snd_hda_codec_write_cache(codec, nid, 0,
pin_ctl & ~flag); AC_VERB_SET_PIN_WIDGET_CONTROL,
pin_ctl & ~flag);
} }
static int get_pin_presence(struct hda_codec *codec, hda_nid_t nid) static int get_pin_presence(struct hda_codec *codec, hda_nid_t nid)
......
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