Commit d7fdc00a authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda - Add helper functions to cache the current pinctl target

We already have the list of whole pin widgets and there is an unused
space in the list; let's use it for caching the current pinctl value.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 980428ce
...@@ -1100,6 +1100,32 @@ unsigned int snd_hda_codec_get_pincfg(struct hda_codec *codec, hda_nid_t nid) ...@@ -1100,6 +1100,32 @@ unsigned int snd_hda_codec_get_pincfg(struct hda_codec *codec, hda_nid_t nid)
} }
EXPORT_SYMBOL_HDA(snd_hda_codec_get_pincfg); EXPORT_SYMBOL_HDA(snd_hda_codec_get_pincfg);
/* remember the current pinctl target value */
int snd_hda_codec_set_pin_target(struct hda_codec *codec, hda_nid_t nid,
unsigned int val)
{
struct hda_pincfg *pin;
pin = look_up_pincfg(codec, &codec->init_pins, nid);
if (!pin)
return -EINVAL;
pin->target = val;
return 0;
}
EXPORT_SYMBOL_HDA(snd_hda_codec_set_pin_target);
/* return the current pinctl target value */
int snd_hda_codec_get_pin_target(struct hda_codec *codec, hda_nid_t nid)
{
struct hda_pincfg *pin;
pin = look_up_pincfg(codec, &codec->init_pins, nid);
if (!pin)
return 0;
return pin->target;
}
EXPORT_SYMBOL_HDA(snd_hda_codec_get_pin_target);
/** /**
* snd_hda_shutup_pins - Shut up all pins * snd_hda_shutup_pins - Shut up all pins
* @codec: the HDA codec * @codec: the HDA codec
...@@ -5266,6 +5292,7 @@ int _snd_hda_set_pin_ctl(struct hda_codec *codec, hda_nid_t pin, ...@@ -5266,6 +5292,7 @@ int _snd_hda_set_pin_ctl(struct hda_codec *codec, hda_nid_t pin,
val &= ~(AC_PINCTL_IN_EN | AC_PINCTL_VREFEN); val &= ~(AC_PINCTL_IN_EN | AC_PINCTL_VREFEN);
} }
} }
snd_hda_codec_set_pin_target(codec, pin, val);
if (cached) if (cached)
return snd_hda_codec_update_cache(codec, pin, 0, return snd_hda_codec_update_cache(codec, pin, 0,
AC_VERB_SET_PIN_WIDGET_CONTROL, val); AC_VERB_SET_PIN_WIDGET_CONTROL, val);
......
...@@ -981,8 +981,8 @@ void snd_hda_codec_resume_cache(struct hda_codec *codec); ...@@ -981,8 +981,8 @@ void snd_hda_codec_resume_cache(struct hda_codec *codec);
/* the struct for codec->pin_configs */ /* the struct for codec->pin_configs */
struct hda_pincfg { struct hda_pincfg {
hda_nid_t nid; hda_nid_t nid;
unsigned char ctrl; /* current pin control value */ unsigned char ctrl; /* original pin control value */
unsigned char pad; /* reserved */ unsigned char target; /* target pin control value */
unsigned int cfg; /* default configuration */ unsigned int cfg; /* default configuration */
}; };
......
...@@ -529,6 +529,10 @@ snd_hda_set_pin_ctl_cache(struct hda_codec *codec, hda_nid_t pin, ...@@ -529,6 +529,10 @@ snd_hda_set_pin_ctl_cache(struct hda_codec *codec, hda_nid_t pin,
return _snd_hda_set_pin_ctl(codec, pin, val, true); return _snd_hda_set_pin_ctl(codec, pin, val, true);
} }
int snd_hda_codec_get_pin_target(struct hda_codec *codec, hda_nid_t nid);
int snd_hda_codec_set_pin_target(struct hda_codec *codec, hda_nid_t nid,
unsigned int val);
/* /*
* get widget capabilities * get widget capabilities
*/ */
......
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