ALSA: hda - Introduce snd_hda_set_pin_ctl*() helper functions
For setting the pin-control values more safely to match with the actual pin capability bits, a copule of new helper functions, snd_hda_set_pin_ctl() and snd_hda_set_pin_ctl_cache(), are introduced. These are simple replacement of the codec verb write with AC_VERB_SET_PIN_WIDGET but do more sanity checks and filter out superfluous pin-control bits if they don't fit with the corresponding pin capabilities. Some codecs are screwed up or ignore the command when such a wrong bit is set. These helpers will avoid such secret errors. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
@@ -681,8 +681,7 @@ static int stac_vrefout_set(struct hda_codec *codec,
|
||||
pinctl &= ~AC_PINCTL_VREFEN;
|
||||
pinctl |= (new_vref & AC_PINCTL_VREFEN);
|
||||
|
||||
error = snd_hda_codec_write_cache(codec, nid, 0,
|
||||
AC_VERB_SET_PIN_WIDGET_CONTROL, pinctl);
|
||||
error = snd_hda_set_pin_ctl_cache(codec, nid, pinctl);
|
||||
if (error < 0)
|
||||
return error;
|
||||
|
||||
@@ -706,8 +705,7 @@ static unsigned int stac92xx_vref_set(struct hda_codec *codec,
|
||||
else
|
||||
pincfg |= AC_PINCTL_IN_EN;
|
||||
|
||||
error = snd_hda_codec_write_cache(codec, nid, 0,
|
||||
AC_VERB_SET_PIN_WIDGET_CONTROL, pincfg);
|
||||
error = snd_hda_set_pin_ctl_cache(codec, nid, pincfg);
|
||||
if (error < 0)
|
||||
return error;
|
||||
else
|
||||
@@ -2524,8 +2522,7 @@ static unsigned int stac92xx_get_default_vref(struct hda_codec *codec,
|
||||
static void stac92xx_auto_set_pinctl(struct hda_codec *codec, hda_nid_t nid, int pin_type)
|
||||
|
||||
{
|
||||
snd_hda_codec_write_cache(codec, nid, 0,
|
||||
AC_VERB_SET_PIN_WIDGET_CONTROL, pin_type);
|
||||
snd_hda_set_pin_ctl_cache(codec, nid, pin_type);
|
||||
}
|
||||
|
||||
#define stac92xx_hp_switch_info snd_ctl_boolean_mono_info
|
||||
@@ -4460,8 +4457,7 @@ static void stac92xx_shutup_pins(struct hda_codec *codec)
|
||||
struct hda_pincfg *pin = snd_array_elem(&codec->init_pins, i);
|
||||
def_conf = snd_hda_codec_get_pincfg(codec, pin->nid);
|
||||
if (get_defcfg_connect(def_conf) != AC_JACK_PORT_NONE)
|
||||
snd_hda_codec_write(codec, pin->nid, 0,
|
||||
AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
|
||||
snd_hda_set_pin_ctl(codec, pin->nid, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4517,9 +4513,7 @@ static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid,
|
||||
|
||||
pin_ctl |= flag;
|
||||
if (old_ctl != pin_ctl)
|
||||
snd_hda_codec_write_cache(codec, nid, 0,
|
||||
AC_VERB_SET_PIN_WIDGET_CONTROL,
|
||||
pin_ctl);
|
||||
snd_hda_set_pin_ctl_cache(codec, nid, pin_ctl);
|
||||
}
|
||||
|
||||
static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid,
|
||||
@@ -4528,9 +4522,7 @@ static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid,
|
||||
unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
|
||||
0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
|
||||
if (pin_ctl & flag)
|
||||
snd_hda_codec_write_cache(codec, nid, 0,
|
||||
AC_VERB_SET_PIN_WIDGET_CONTROL,
|
||||
pin_ctl & ~flag);
|
||||
snd_hda_set_pin_ctl_cache(codec, nid, pin_ctl & ~flag);
|
||||
}
|
||||
|
||||
static inline int get_pin_presence(struct hda_codec *codec, hda_nid_t nid)
|
||||
|
Reference in New Issue
Block a user