diff options
author | Takashi Iwai <tiwai@suse.de> | 2013-01-10 08:38:04 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2013-01-12 08:44:25 +0100 |
commit | d7fdc00ae50b3dc02364301b334a6352c58e9e85 (patch) | |
tree | 7f30105bcb7462efc8b667792bd81c67c9f7fd69 /sound/pci/hda/hda_codec.c | |
parent | 980428cecc4ca767bd9dd61fc286cd4124fd34af (diff) | |
download | op-kernel-dev-d7fdc00ae50b3dc02364301b334a6352c58e9e85.zip op-kernel-dev-d7fdc00ae50b3dc02364301b334a6352c58e9e85.tar.gz |
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: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/hda/hda_codec.c')
-rw-r--r-- | sound/pci/hda/hda_codec.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 733bce6..505cb72 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -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); +/* 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 * @codec: the HDA codec @@ -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); } } + snd_hda_codec_set_pin_target(codec, pin, val); if (cached) return snd_hda_codec_update_cache(codec, pin, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val); |