]> Pileus Git - ~andy/linux/blobdiff - drivers/bcma/host_pci.c
Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs
[~andy/linux] / drivers / bcma / host_pci.c
index b0994c0e05dc9642c0d878ed3bb03021d876e14e..443b83a2fd7aa012c1c6835137e2642a79499b41 100644 (file)
@@ -234,6 +234,41 @@ static void bcma_host_pci_remove(struct pci_dev *dev)
        pci_set_drvdata(dev, NULL);
 }
 
+#ifdef CONFIG_PM
+static int bcma_host_pci_suspend(struct pci_dev *dev, pm_message_t state)
+{
+       /* Host specific */
+       pci_save_state(dev);
+       pci_disable_device(dev);
+       pci_set_power_state(dev, pci_choose_state(dev, state));
+
+       return 0;
+}
+
+static int bcma_host_pci_resume(struct pci_dev *dev)
+{
+       struct bcma_bus *bus = pci_get_drvdata(dev);
+       int err;
+
+       /* Host specific */
+       pci_set_power_state(dev, 0);
+       err = pci_enable_device(dev);
+       if (err)
+               return err;
+       pci_restore_state(dev);
+
+       /* Bus specific */
+       err = bcma_bus_resume(bus);
+       if (err)
+               return err;
+
+       return 0;
+}
+#else /* CONFIG_PM */
+# define bcma_host_pci_suspend NULL
+# define bcma_host_pci_resume  NULL
+#endif /* CONFIG_PM */
+
 static DEFINE_PCI_DEVICE_TABLE(bcma_pci_bridge_tbl) = {
        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x0576) },
        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4331) },
@@ -249,6 +284,8 @@ static struct pci_driver bcma_pci_bridge_driver = {
        .id_table = bcma_pci_bridge_tbl,
        .probe = bcma_host_pci_probe,
        .remove = bcma_host_pci_remove,
+       .suspend = bcma_host_pci_suspend,
+       .resume = bcma_host_pci_resume,
 };
 
 int __init bcma_host_pci_init(void)