static void update_power_regs(struct snd_ac97 *ac97);
+#ifdef CONFIG_SND_AC97_POWER_SAVE
+#define ac97_is_power_save_mode(ac97) \
+       ((ac97->scaps & AC97_SCAP_POWER_SAVE) && power_save)
+#else
+#define ac97_is_power_save_mode(ac97) 0
+#endif
+
 
 /*
  *  I/O routines
 {
        if (ac97) {
 #ifdef CONFIG_SND_AC97_POWER_SAVE
-               if (ac97->power_workq)
-                       destroy_workqueue(ac97->power_workq);
+               cancel_delayed_work(&ac97->power_work);
 #endif
                snd_ac97_proc_done(ac97);
                if (ac97->bus)
        mutex_init(&ac97->reg_mutex);
        mutex_init(&ac97->page_mutex);
 #ifdef CONFIG_SND_AC97_POWER_SAVE
-       ac97->power_workq = create_workqueue("ac97");
        INIT_DELAYED_WORK(&ac97->power_work, do_update_power);
 #endif
 
        udelay(100);
        power |= AC97_PD_PR2 | AC97_PD_PR3;     /* Analog Mixer powerdown */
        snd_ac97_write(ac97, AC97_POWERDOWN, power);
-#ifdef CONFIG_SND_AC97_POWER_SAVE
-       if (power_save) {
+       if (ac97_is_power_save_mode(ac97)) {
                udelay(100);
                /* AC-link powerdown, internal Clk disable */
                /* FIXME: this may cause click noises on some boards */
                power |= AC97_PD_PR4 | AC97_PD_PR5;
                snd_ac97_write(ac97, AC97_POWERDOWN, power);
        }
-#endif
 }
 
 
                }
        }
 
-       if (power_save && !powerup && ac97->power_workq)
+       if (ac97_is_power_save_mode(ac97) && !powerup)
                /* adjust power-down bits after two seconds delay
                 * (for avoiding loud click noises for many (OSS) apps
                 *  that open/close frequently)
                 */
-               queue_delayed_work(ac97->power_workq, &ac97->power_work, HZ*2);
-       else
+               schedule_delayed_work(&ac97->power_work, HZ*2);
+       else {
+               cancel_delayed_work(&ac97->power_work);
                update_power_regs(ac97);
+       }
 
        return 0;
 }
        unsigned int power_up, bits;
        int i;
 
+       power_up = (1 << PWIDX_FRONT) | (1 << PWIDX_ADC);
+       power_up |= (1 << PWIDX_MIC);
+       if (ac97->scaps & AC97_SCAP_SURROUND_DAC)
+               power_up |= (1 << PWIDX_SURR);
+       if (ac97->scaps & AC97_SCAP_CENTER_LFE_DAC)
+               power_up |= (1 << PWIDX_CLFE);
 #ifdef CONFIG_SND_AC97_POWER_SAVE
-       if (power_save)
+       if (ac97_is_power_save_mode(ac97))
                power_up = ac97->power_up;
-       else {
-#endif
-               power_up = (1 << PWIDX_FRONT) | (1 << PWIDX_ADC);
-               power_up |= (1 << PWIDX_MIC);
-               if (ac97->scaps & AC97_SCAP_SURROUND_DAC)
-                       power_up |= (1 << PWIDX_SURR);
-               if (ac97->scaps & AC97_SCAP_CENTER_LFE_DAC)
-                       power_up |= (1 << PWIDX_CLFE);
-#ifdef CONFIG_SND_AC97_POWER_SAVE
-       }
 #endif
        if (power_up) {
                if (ac97->regs[AC97_POWERDOWN] & AC97_PD_PR2) {