|
@@ -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)
|