ALSA: hda/idt - Cache the power-map bits

For avoiding unnecessary codec read/write verbs at each jack detection.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Iwai 2012-05-15 09:11:36 +02:00
parent bfc89dec97
commit c882246d84

View file

@ -222,6 +222,7 @@ struct sigmatel_spec {
unsigned char aloopback_shift; unsigned char aloopback_shift;
/* power management */ /* power management */
unsigned int power_map_bits;
unsigned int num_pwrs; unsigned int num_pwrs;
const hda_nid_t *pwr_nids; const hda_nid_t *pwr_nids;
const hda_nid_t *dac_list; const hda_nid_t *dac_list;
@ -315,6 +316,9 @@ struct sigmatel_spec {
struct hda_vmaster_mute_hook vmaster_mute; struct hda_vmaster_mute_hook vmaster_mute;
}; };
#define AC_VERB_IDT_SET_POWER_MAP 0x7ec
#define AC_VERB_IDT_GET_POWER_MAP 0xfec
static const hda_nid_t stac9200_adc_nids[1] = { static const hda_nid_t stac9200_adc_nids[1] = {
0x03, 0x03,
}; };
@ -4406,6 +4410,12 @@ static int stac92xx_init(struct hda_codec *codec)
/* sync mute LED */ /* sync mute LED */
snd_hda_sync_vmaster_hook(&spec->vmaster_mute); snd_hda_sync_vmaster_hook(&spec->vmaster_mute);
/* sync the power-map */
if (spec->num_pwrs)
snd_hda_codec_write(codec, codec->afg, 0,
AC_VERB_IDT_SET_POWER_MAP,
spec->power_map_bits);
if (spec->dac_list) if (spec->dac_list)
stac92xx_power_down(codec); stac92xx_power_down(codec);
return 0; return 0;
@ -4651,14 +4661,18 @@ static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid,
idx = 1 << idx; idx = 1 << idx;
val = snd_hda_codec_read(codec, codec->afg, 0, 0x0fec, 0x0) & 0xff; val = spec->power_map_bits;
if (enable) if (enable)
val &= ~idx; val &= ~idx;
else else
val |= idx; val |= idx;
/* power down unused output ports */ /* power down unused output ports */
snd_hda_codec_write(codec, codec->afg, 0, 0x7ec, val); if (val != spec->power_map_bits) {
spec->power_map_bits = val;
snd_hda_codec_write(codec, codec->afg, 0,
AC_VERB_IDT_SET_POWER_MAP, val);
}
} }
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)
@ -4926,7 +4940,8 @@ static void stac92hd_proc_hook(struct snd_info_buffer *buffer,
{ {
if (nid == codec->afg) if (nid == codec->afg)
snd_iprintf(buffer, "Power-Map: 0x%02x\n", snd_iprintf(buffer, "Power-Map: 0x%02x\n",
snd_hda_codec_read(codec, nid, 0, 0x0fec, 0x0)); snd_hda_codec_read(codec, nid, 0,
AC_VERB_IDT_GET_POWER_MAP, 0));
} }
static void analog_loop_proc_hook(struct snd_info_buffer *buffer, static void analog_loop_proc_hook(struct snd_info_buffer *buffer,