em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
 
        /* Unlock device */
-       em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
+       em28xx_set_mode(dev, EM28XX_SUSPEND);
 }
 
 static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
 
        if (!gpio)
                return rc;
 
-       em28xx_write_reg(dev, 0x48, 0x00);
-       if (dev->mode == EM28XX_ANALOG_MODE)
-               em28xx_write_reg(dev, EM28XX_R12_VINENABLE, 0x67);
-       else
-               em28xx_write_reg(dev, EM28XX_R12_VINENABLE, 0x37);
-       msleep(6);
+       if (dev->mode != EM28XX_SUSPEND) {
+               em28xx_write_reg(dev, 0x48, 0x00);
+               if (dev->mode == EM28XX_ANALOG_MODE)
+                       em28xx_write_reg(dev, EM28XX_R12_VINENABLE, 0x67);
+               else
+                       em28xx_write_reg(dev, EM28XX_R12_VINENABLE, 0x37);
+               msleep(6);
+       }
 
        /* Send GPIO reset sequences specified at board entry */
        while (gpio->sleep >= 0) {
        if (dev->mode == set_mode)
                return 0;
 
-       if (set_mode == EM28XX_MODE_UNDEFINED) {
+       if (set_mode == EM28XX_SUSPEND) {
                dev->mode = set_mode;
-               return 0;
+
+               /* FIXME: add suspend support for ac97 */
+
+               return em28xx_gpio_set(dev, dev->board.suspend_gpio);
        }
 
        dev->mode = set_mode;
 
 
        em28xx_uninit_isoc(dev);
 
-       em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
+       em28xx_set_mode(dev, EM28XX_SUSPEND);
 
        return 0;
 }
        if (acquire)
                return em28xx_set_mode(dev, EM28XX_DIGITAL_MODE);
        else
-               return em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
+               return em28xx_set_mode(dev, EM28XX_SUSPEND);
 }
 
 /* ------------------------------------------------------------------ */
        if (result < 0)
                goto out_free;
 
-       em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
+       em28xx_set_mode(dev, EM28XX_SUSPEND);
        printk(KERN_INFO "Successfully loaded em28xx-dvb\n");
        return 0;
 
 out_free:
-       em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
+       em28xx_set_mode(dev, EM28XX_SUSPEND);
        kfree(dvb);
        dev->dvb = NULL;
        return result;
 
 
                /* do this before setting alternate! */
                em28xx_uninit_isoc(dev);
-               em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
+               em28xx_set_mode(dev, EM28XX_SUSPEND);
 
                /* set alternate 0 */
                dev->alt = 0;
 
 #define EM2800_I2C_WRITE_TIMEOUT 20
 
 enum em28xx_mode {
-       EM28XX_MODE_UNDEFINED,
+       EM28XX_SUSPEND,
        EM28XX_ANALOG_MODE,
        EM28XX_DIGITAL_MODE,
 };
        unsigned int tda9887_conf;
 
        struct em28xx_reg_seq *dvb_gpio;
+       struct em28xx_reg_seq *suspend_gpio;
 
        unsigned int is_em2800:1;
        unsigned int has_msp34xx:1;