pata_pdc2027x: add Power Management support
Bartlomiej Zolnierkiewicz [Thu, 13 Oct 2011 10:57:51 +0000 (12:57 +0200)]
Fixes IDE -> libata regression.

There shouldn't be any problems with it as corresponding IDE's host
driver (pdc202xx_new) has been supporting PCI Power Management since
Oct 10 2008 (commit feb22b7f "ide: add proper PCI PM support (v2)")
and IDE PM since Jun 14 2003 (patch v2.5.73 "ide: Power Management").

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>

drivers/ata/pata_pdc2027x.c

index b1511f3..7d63f24 100644 (file)
@@ -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.
  */