diff options
author | Takashi Iwai <tiwai@suse.de> | 2006-10-24 12:25:29 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2007-02-09 03:01:09 -0500 |
commit | f1a63a38d2a885cc7e38c67b699171a7c5666d88 (patch) | |
tree | 9425150713ffa2af52f8b28bdadf453cf62b2afc /sound/pci/ac97/ac97_codec.c | |
parent | 7cdbff945e9e3bb592dee2f66afbcc2255747f8f (diff) |
[ALSA] ac97 - Suppress power-saving mode on non-supporting drivers
Don't enable power-saving mode on drivers that don't support
it. The supporting drivers set AC97_SCAP_POWER_SAVE to scaps
at creation of ac97 instance.
Currently enable on the following drivers: intel8x0, intel8x0m,
atiixp, atiixp-modem, via82xx and via82xx-modem.
Also, a bit clean up of power-saving stuff:
- Don't create an own workq
- Remove superfluous ifdefs
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>
Diffstat (limited to 'sound/pci/ac97/ac97_codec.c')
-rw-r--r-- | sound/pci/ac97/ac97_codec.c | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c index d2994cb4c8c9..9da4977c0a0c 100644 --- a/sound/pci/ac97/ac97_codec.c +++ b/sound/pci/ac97/ac97_codec.c | |||
@@ -194,6 +194,13 @@ static const struct ac97_codec_id snd_ac97_codec_ids[] = { | |||
194 | 194 | ||
195 | 195 | ||
196 | static void update_power_regs(struct snd_ac97 *ac97); | 196 | static void update_power_regs(struct snd_ac97 *ac97); |
197 | #ifdef CONFIG_SND_AC97_POWER_SAVE | ||
198 | #define ac97_is_power_save_mode(ac97) \ | ||
199 | ((ac97->scaps & AC97_SCAP_POWER_SAVE) && power_save) | ||
200 | #else | ||
201 | #define ac97_is_power_save_mode(ac97) 0 | ||
202 | #endif | ||
203 | |||
197 | 204 | ||
198 | /* | 205 | /* |
199 | * I/O routines | 206 | * I/O routines |
@@ -982,8 +989,7 @@ static int snd_ac97_free(struct snd_ac97 *ac97) | |||
982 | { | 989 | { |
983 | if (ac97) { | 990 | if (ac97) { |
984 | #ifdef CONFIG_SND_AC97_POWER_SAVE | 991 | #ifdef CONFIG_SND_AC97_POWER_SAVE |
985 | if (ac97->power_workq) | 992 | cancel_delayed_work(&ac97->power_work); |
986 | destroy_workqueue(ac97->power_workq); | ||
987 | #endif | 993 | #endif |
988 | snd_ac97_proc_done(ac97); | 994 | snd_ac97_proc_done(ac97); |
989 | if (ac97->bus) | 995 | if (ac97->bus) |
@@ -1989,7 +1995,6 @@ int snd_ac97_mixer(struct snd_ac97_bus *bus, struct snd_ac97_template *template, | |||
1989 | mutex_init(&ac97->reg_mutex); | 1995 | mutex_init(&ac97->reg_mutex); |
1990 | mutex_init(&ac97->page_mutex); | 1996 | mutex_init(&ac97->page_mutex); |
1991 | #ifdef CONFIG_SND_AC97_POWER_SAVE | 1997 | #ifdef CONFIG_SND_AC97_POWER_SAVE |
1992 | ac97->power_workq = create_workqueue("ac97"); | ||
1993 | INIT_DELAYED_WORK(&ac97->power_work, do_update_power); | 1998 | INIT_DELAYED_WORK(&ac97->power_work, do_update_power); |
1994 | #endif | 1999 | #endif |
1995 | 2000 | ||
@@ -2275,15 +2280,13 @@ static void snd_ac97_powerdown(struct snd_ac97 *ac97) | |||
2275 | udelay(100); | 2280 | udelay(100); |
2276 | power |= AC97_PD_PR2 | AC97_PD_PR3; /* Analog Mixer powerdown */ | 2281 | power |= AC97_PD_PR2 | AC97_PD_PR3; /* Analog Mixer powerdown */ |
2277 | snd_ac97_write(ac97, AC97_POWERDOWN, power); | 2282 | snd_ac97_write(ac97, AC97_POWERDOWN, power); |
2278 | #ifdef CONFIG_SND_AC97_POWER_SAVE | 2283 | if (ac97_is_power_save_mode(ac97)) { |
2279 | if (power_save) { | ||
2280 | udelay(100); | 2284 | udelay(100); |
2281 | /* AC-link powerdown, internal Clk disable */ | 2285 | /* AC-link powerdown, internal Clk disable */ |
2282 | /* FIXME: this may cause click noises on some boards */ | 2286 | /* FIXME: this may cause click noises on some boards */ |
2283 | power |= AC97_PD_PR4 | AC97_PD_PR5; | 2287 | power |= AC97_PD_PR4 | AC97_PD_PR5; |
2284 | snd_ac97_write(ac97, AC97_POWERDOWN, power); | 2288 | snd_ac97_write(ac97, AC97_POWERDOWN, power); |
2285 | } | 2289 | } |
2286 | #endif | ||
2287 | } | 2290 | } |
2288 | 2291 | ||
2289 | 2292 | ||
@@ -2337,14 +2340,16 @@ int snd_ac97_update_power(struct snd_ac97 *ac97, int reg, int powerup) | |||
2337 | } | 2340 | } |
2338 | } | 2341 | } |
2339 | 2342 | ||
2340 | if (power_save && !powerup && ac97->power_workq) | 2343 | if (ac97_is_power_save_mode(ac97) && !powerup) |
2341 | /* adjust power-down bits after two seconds delay | 2344 | /* adjust power-down bits after two seconds delay |
2342 | * (for avoiding loud click noises for many (OSS) apps | 2345 | * (for avoiding loud click noises for many (OSS) apps |
2343 | * that open/close frequently) | 2346 | * that open/close frequently) |
2344 | */ | 2347 | */ |
2345 | queue_delayed_work(ac97->power_workq, &ac97->power_work, HZ*2); | 2348 | schedule_delayed_work(&ac97->power_work, HZ*2); |
2346 | else | 2349 | else { |
2350 | cancel_delayed_work(&ac97->power_work); | ||
2347 | update_power_regs(ac97); | 2351 | update_power_regs(ac97); |
2352 | } | ||
2348 | 2353 | ||
2349 | return 0; | 2354 | return 0; |
2350 | } | 2355 | } |
@@ -2357,19 +2362,15 @@ static void update_power_regs(struct snd_ac97 *ac97) | |||
2357 | unsigned int power_up, bits; | 2362 | unsigned int power_up, bits; |
2358 | int i; | 2363 | int i; |
2359 | 2364 | ||
2365 | power_up = (1 << PWIDX_FRONT) | (1 << PWIDX_ADC); | ||
2366 | power_up |= (1 << PWIDX_MIC); | ||
2367 | if (ac97->scaps & AC97_SCAP_SURROUND_DAC) | ||
2368 | power_up |= (1 << PWIDX_SURR); | ||
2369 | if (ac97->scaps & AC97_SCAP_CENTER_LFE_DAC) | ||
2370 | power_up |= (1 << PWIDX_CLFE); | ||
2360 | #ifdef CONFIG_SND_AC97_POWER_SAVE | 2371 | #ifdef CONFIG_SND_AC97_POWER_SAVE |
2361 | if (power_save) | 2372 | if (ac97_is_power_save_mode(ac97)) |
2362 | power_up = ac97->power_up; | 2373 | power_up = ac97->power_up; |
2363 | else { | ||
2364 | #endif | ||
2365 | power_up = (1 << PWIDX_FRONT) | (1 << PWIDX_ADC); | ||
2366 | power_up |= (1 << PWIDX_MIC); | ||
2367 | if (ac97->scaps & AC97_SCAP_SURROUND_DAC) | ||
2368 | power_up |= (1 << PWIDX_SURR); | ||
2369 | if (ac97->scaps & AC97_SCAP_CENTER_LFE_DAC) | ||
2370 | power_up |= (1 << PWIDX_CLFE); | ||
2371 | #ifdef CONFIG_SND_AC97_POWER_SAVE | ||
2372 | } | ||
2373 | #endif | 2374 | #endif |
2374 | if (power_up) { | 2375 | if (power_up) { |
2375 | if (ac97->regs[AC97_POWERDOWN] & AC97_PD_PR2) { | 2376 | if (ac97->regs[AC97_POWERDOWN] & AC97_PD_PR2) { |