|
@@ -63,6 +63,7 @@ enum {
|
|
|
};
|
|
|
|
|
|
static int pdc2027x_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
|
|
+static int pdc2027x_reinit_one(struct pci_dev *pdev);
|
|
|
static int pdc2027x_prereset(struct ata_link *link, unsigned long deadline);
|
|
|
static void pdc2027x_set_piomode(struct ata_port *ap, struct ata_device *adev);
|
|
|
static void pdc2027x_set_dmamode(struct ata_port *ap, struct ata_device *adev);
|
|
@@ -126,6 +127,10 @@ static struct pci_driver pdc2027x_pci_driver = {
|
|
|
.id_table = pdc2027x_pci_tbl,
|
|
|
.probe = pdc2027x_init_one,
|
|
|
.remove = ata_pci_remove_one,
|
|
|
+#ifdef CONFIG_PM
|
|
|
+ .suspend = ata_pci_device_suspend,
|
|
|
+ .resume = pdc2027x_reinit_one,
|
|
|
+#endif
|
|
|
};
|
|
|
|
|
|
static struct scsi_host_template pdc2027x_sht = {
|
|
@@ -754,6 +759,31 @@ static int __devinit pdc2027x_init_one(struct pci_dev *pdev, const struct pci_de
|
|
|
IRQF_SHARED, &pdc2027x_sht);
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_PM
|
|
|
+static int pdc2027x_reinit_one(struct pci_dev *pdev)
|
|
|
+{
|
|
|
+ struct ata_host *host = dev_get_drvdata(&pdev->dev);
|
|
|
+ unsigned int board_idx;
|
|
|
+ int rc;
|
|
|
+
|
|
|
+ rc = ata_pci_device_do_resume(pdev);
|
|
|
+ if (rc)
|
|
|
+ return rc;
|
|
|
+
|
|
|
+ if (pdev->device == PCI_DEVICE_ID_PROMISE_20268 ||
|
|
|
+ pdev->device == PCI_DEVICE_ID_PROMISE_20270)
|
|
|
+ board_idx = PDC_UDMA_100;
|
|
|
+ else
|
|
|
+ board_idx = PDC_UDMA_133;
|
|
|
+
|
|
|
+ if (pdc_hardware_init(host, board_idx))
|
|
|
+ return -EIO;
|
|
|
+
|
|
|
+ ata_host_resume(host);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
/**
|
|
|
* pdc2027x_init - Called after this module is loaded into the kernel.
|
|
|
*/
|