[ALSA] Add experimental support of aggressive AC97 power-saving mode
Added CONFIG_SND_AC97_POWER_SAVE kernel config to enable the support of aggressive AC97 power-saving mode. In this mode, the AC97 powerdown register bits are dynamically controlled at each open/close of PCM streams. The mode is activated via power_save option for snd-ac97-codec driver. As default it's off. It can be turned on/off on the fly via sysfs, too. Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@suse.cz>
This commit is contained in:

committed by
Jaroslav Kysela

parent
2b29b13c57
commit
6dbe662874
@@ -269,6 +269,7 @@ int snd_ac97_set_rate(struct snd_ac97 *ac97, int reg, unsigned int rate)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
snd_ac97_update_power(ac97, reg, 1);
|
||||
switch (reg) {
|
||||
case AC97_PCM_MIC_ADC_RATE:
|
||||
if ((ac97->regs[AC97_EXTENDED_STATUS] & AC97_EA_VRM) == 0) /* MIC VRA */
|
||||
@@ -606,6 +607,7 @@ int snd_ac97_pcm_open(struct ac97_pcm *pcm, unsigned int rate,
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
pcm->cur_dbl = r;
|
||||
spin_unlock_irq(&pcm->bus->bus_lock);
|
||||
for (i = 3; i < 12; i++) {
|
||||
if (!(slots & (1 << i)))
|
||||
@@ -651,6 +653,21 @@ int snd_ac97_pcm_close(struct ac97_pcm *pcm)
|
||||
unsigned short slots = pcm->aslots;
|
||||
int i, cidx;
|
||||
|
||||
#ifdef CONFIG_SND_AC97_POWER_SAVE
|
||||
int r = pcm->cur_dbl;
|
||||
for (i = 3; i < 12; i++) {
|
||||
if (!(slots & (1 << i)))
|
||||
continue;
|
||||
for (cidx = 0; cidx < 4; cidx++) {
|
||||
if (pcm->r[r].rslots[cidx] & (1 << i)) {
|
||||
int reg = get_slot_reg(pcm, cidx, i, r);
|
||||
snd_ac97_update_power(pcm->r[r].codec[cidx],
|
||||
reg, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
bus = pcm->bus;
|
||||
spin_lock_irq(&pcm->bus->bus_lock);
|
||||
for (i = 3; i < 12; i++) {
|
||||
@@ -660,6 +677,7 @@ int snd_ac97_pcm_close(struct ac97_pcm *pcm)
|
||||
bus->used_slots[pcm->stream][cidx] &= ~(1 << i);
|
||||
}
|
||||
pcm->aslots = 0;
|
||||
pcm->cur_dbl = 0;
|
||||
spin_unlock_irq(&pcm->bus->bus_lock);
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user