}
 }
 
-#ifdef CONFIG_PM
-
 /*
  * suspend/resume synchronization:
  * - open, close, do_ioctl:
  * Detach must occur under spin_unlock_irq(), interrupts from a detached
  * device would cause an irq storm.
  */
-static int w840_suspend (struct pci_dev *pdev, pm_message_t state)
+static int __maybe_unused w840_suspend(struct device *dev_d)
 {
-       struct net_device *dev = pci_get_drvdata (pdev);
+       struct net_device *dev = dev_get_drvdata(dev_d);
        struct netdev_private *np = netdev_priv(dev);
        void __iomem *ioaddr = np->base_addr;
 
        return 0;
 }
 
-static int w840_resume (struct pci_dev *pdev)
+static int __maybe_unused w840_resume(struct device *dev_d)
 {
-       struct net_device *dev = pci_get_drvdata (pdev);
+       struct net_device *dev = dev_get_drvdata(dev_d);
        struct netdev_private *np = netdev_priv(dev);
-       int retval = 0;
 
        rtnl_lock();
        if (netif_device_present(dev))
                goto out; /* device not suspended */
        if (netif_running(dev)) {
-               if ((retval = pci_enable_device(pdev))) {
-                       dev_err(&dev->dev,
-                               "pci_enable_device failed in resume\n");
-                       goto out;
-               }
                spin_lock_irq(&np->lock);
                iowrite32(1, np->base_addr+PCIBusCfg);
                ioread32(np->base_addr+PCIBusCfg);
        }
 out:
        rtnl_unlock();
-       return retval;
+       return 0;
 }
-#endif
+
+static SIMPLE_DEV_PM_OPS(w840_pm_ops, w840_suspend, w840_resume);
 
 static struct pci_driver w840_driver = {
        .name           = DRV_NAME,
        .id_table       = w840_pci_tbl,
        .probe          = w840_probe1,
        .remove         = w840_remove1,
-#ifdef CONFIG_PM
-       .suspend        = w840_suspend,
-       .resume         = w840_resume,
-#endif
+       .driver.pm      = &w840_pm_ops,
 };
 
 static int __init w840_init(void)