ide: add proper PCI PM support (v2)
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Fri, 10 Oct 2008 20:39:32 +0000 (22:39 +0200)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Fri, 10 Oct 2008 20:39:32 +0000 (22:39 +0200)
* Keep pointer to ->init_chipset method also in
  struct ide_host and set it in ide_host_alloc_all().

* Add ide_pci_suspend() and ide_pci_resume() helpers
  (default ->suspend and ->resume implementations).

* ->init_chipset can no longer be marked __devinit.

* Add proper PCI PM support to IDE PCI host drivers
  (rz1000.c and tc86c001.c are skipped for now since
  they need to be converted from using ->init_hwif
  to use ->init_chipset instead).

v2:
* Cleanup CONFIG_PM #ifdef-s per akpm's suggestion.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
30 files changed:
drivers/ide/ide-probe.c
drivers/ide/pci/aec62xx.c
drivers/ide/pci/alim15x3.c
drivers/ide/pci/amd74xx.c
drivers/ide/pci/atiixp.c
drivers/ide/pci/cmd64x.c
drivers/ide/pci/cs5520.c
drivers/ide/pci/cs5530.c
drivers/ide/pci/cs5535.c
drivers/ide/pci/cy82c693.c
drivers/ide/pci/generic.c
drivers/ide/pci/hpt34x.c
drivers/ide/pci/hpt366.c
drivers/ide/pci/it8213.c
drivers/ide/pci/it821x.c
drivers/ide/pci/jmicron.c
drivers/ide/pci/ns87415.c
drivers/ide/pci/opti621.c
drivers/ide/pci/pdc202xx_new.c
drivers/ide/pci/pdc202xx_old.c
drivers/ide/pci/piix.c
drivers/ide/pci/serverworks.c
drivers/ide/pci/siimage.c
drivers/ide/pci/sis5513.c
drivers/ide/pci/sl82c105.c
drivers/ide/pci/slc90e66.c
drivers/ide/pci/triflex.c
drivers/ide/pci/via82cxxx.c
drivers/ide/setup-pci.c
include/linux/ide.h

index e526f4967148fc94488f4284d1acc5d626897ce4..06575a12b63518d01f2de299be39fb97f814afbe 100644 (file)
@@ -1586,8 +1586,10 @@ struct ide_host *ide_host_alloc_all(const struct ide_port_info *d,
        if (hws[0])
                host->dev[0] = hws[0]->dev;
 
-       if (d)
+       if (d) {
+               host->init_chipset = d->init_chipset;
                host->host_flags = d->host_flags;
+       }
 
        return host;
 }
index f65828da65d09dac0fba851887a2b28eecda7d74..e7475ba559c74063543650816335a751864687ac 100644 (file)
@@ -139,7 +139,7 @@ static void aec_set_pio_mode(ide_drive_t *drive, const u8 pio)
        drive->hwif->port_ops->set_dma_mode(drive, pio + XFER_PIO_0);
 }
 
-static unsigned int __devinit init_chipset_aec62xx(struct pci_dev *dev)
+static unsigned int init_chipset_aec62xx(struct pci_dev *dev)
 {
        /* These are necessary to get AEC6280 Macintosh cards to work */
        if ((dev->device == PCI_DEVICE_ID_ARTOP_ATP865) ||
@@ -307,6 +307,8 @@ static struct pci_driver driver = {
        .id_table       = aec62xx_pci_tbl,
        .probe          = aec62xx_init_one,
        .remove         = __devexit_p(aec62xx_remove),
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init aec62xx_ide_init(void)
index ef41e2677a56508db0d435a545fc4935ff06366a..053c75263918d592c60a70024ee7ef47c564953d 100644 (file)
@@ -213,7 +213,7 @@ static int ali15x3_dma_setup(ide_drive_t *drive)
  *     appropriate also sets up the 1533 southbridge.
  */
 
-static unsigned int __devinit init_chipset_ali15x3(struct pci_dev *dev)
+static unsigned int init_chipset_ali15x3(struct pci_dev *dev)
 {
        unsigned long flags;
        u8 tmpbyte;
@@ -581,6 +581,8 @@ static struct pci_driver driver = {
        .id_table       = alim15x3_pci_tbl,
        .probe          = alim15x3_init_one,
        .remove         = ide_pci_remove,
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init ali15x3_ide_init(void)
index 1e66a960a96ac597281909327b2c3cc4b80b2604..824471f91bf5f739047e4f962f53605e9c466dee 100644 (file)
@@ -112,13 +112,13 @@ static void amd_set_pio_mode(ide_drive_t *drive, const u8 pio)
        amd_set_drive(drive, XFER_PIO_0 + pio);
 }
 
-static void __devinit amd7409_cable_detect(struct pci_dev *dev)
+static void amd7409_cable_detect(struct pci_dev *dev)
 {
        /* no host side cable detection */
        amd_80w = 0x03;
 }
 
-static void __devinit amd7411_cable_detect(struct pci_dev *dev)
+static void amd7411_cable_detect(struct pci_dev *dev)
 {
        int i;
        u32 u = 0;
@@ -140,7 +140,7 @@ static void __devinit amd7411_cable_detect(struct pci_dev *dev)
  * The initialization callback.  Initialize drive independent registers.
  */
 
-static unsigned int __devinit init_chipset_amd74xx(struct pci_dev *dev)
+static unsigned int init_chipset_amd74xx(struct pci_dev *dev)
 {
        u8 t = 0, offset = amd_offset(dev);
 
@@ -324,6 +324,8 @@ static struct pci_driver driver = {
        .id_table       = amd74xx_pci_tbl,
        .probe          = amd74xx_probe,
        .remove         = ide_pci_remove,
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init amd74xx_ide_init(void)
index 86e3120cb7c1146388bf4b9b29c96a1922cd0af1..e4437034dd0820d237c9af8ecae7642374293234 100644 (file)
@@ -187,6 +187,8 @@ static struct pci_driver driver = {
        .id_table       = atiixp_pci_tbl,
        .probe          = atiixp_init_one,
        .remove         = ide_pci_remove,
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init atiixp_ide_init(void)
index 13dfeab1d19f8a3d8a1bee7e40fc5927d4a70033..456dee18b660fa94dc72c85877fa598f511c79ca 100644 (file)
@@ -331,7 +331,7 @@ static int cmd646_1_dma_end(ide_drive_t *drive)
        return (dma_stat & 7) != 4;
 }
 
-static unsigned int __devinit init_chipset_cmd64x(struct pci_dev *dev)
+static unsigned int init_chipset_cmd64x(struct pci_dev *dev)
 {
        u8 mrdmode = 0;
 
@@ -510,6 +510,8 @@ static struct pci_driver driver = {
        .id_table       = cmd64x_pci_tbl,
        .probe          = cmd64x_init_one,
        .remove         = ide_pci_remove,
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init cmd64x_ide_init(void)
index 27163147896ba49f27fd2a8b9b7a1b03d4667bbe..d6341f7c4144b15e08b78372637f5e582266c968 100644 (file)
@@ -149,6 +149,8 @@ static struct pci_driver driver = {
        .name           = "Cyrix_IDE",
        .id_table       = cs5520_pci_tbl,
        .probe          = cs5520_init_one,
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init cs5520_ide_init(void)
index d60806bd7dba5347ac2854b949fc54232226e51c..da42fa7e9f979ea5d5eed4731d473f96a1d95929 100644 (file)
@@ -134,7 +134,7 @@ static void cs5530_set_dma_mode(ide_drive_t *drive, const u8 mode)
  *     Initialize the cs5530 bridge for reliable IDE DMA operation.
  */
 
-static unsigned int __devinit init_chipset_cs5530(struct pci_dev *dev)
+static unsigned int init_chipset_cs5530(struct pci_dev *dev)
 {
        struct pci_dev *master_0 = NULL, *cs5530_0 = NULL;
 
@@ -272,6 +272,8 @@ static struct pci_driver driver = {
        .id_table       = cs5530_pci_tbl,
        .probe          = cs5530_init_one,
        .remove         = ide_pci_remove,
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init cs5530_ide_init(void)
index 707d2e1825528a5b1219e51e6e9258f16d52616d..1e5bc59ea2fb03074fa9729501660f0e7b33bfcd 100644 (file)
@@ -193,10 +193,12 @@ static const struct pci_device_id cs5535_pci_tbl[] = {
 MODULE_DEVICE_TABLE(pci, cs5535_pci_tbl);
 
 static struct pci_driver driver = {
-       .name       = "CS5535_IDE",
-       .id_table   = cs5535_pci_tbl,
-       .probe      = cs5535_init_one,
-       .remove     = ide_pci_remove,
+       .name           = "CS5535_IDE",
+       .id_table       = cs5535_pci_tbl,
+       .probe          = cs5535_init_one,
+       .remove         = ide_pci_remove,
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init cs5535_ide_init(void)
index e6d8ee88d56d21c184154d96957eed66756f2f5f..69820e9224d138978a32e8ddc879fe325117633e 100644 (file)
@@ -332,7 +332,7 @@ static void cy82c693_set_pio_mode(ide_drive_t *drive, const u8 pio)
 /*
  * this function is called during init and is used to setup the cy82c693 chip
  */
-static unsigned int __devinit init_chipset_cy82c693(struct pci_dev *dev)
+static unsigned int init_chipset_cy82c693(struct pci_dev *dev)
 {
        if (PCI_FUNC(dev->devfn) != 1)
                return 0;
@@ -448,6 +448,8 @@ static struct pci_driver driver = {
        .id_table       = cy82c693_pci_tbl,
        .probe          = cy82c693_init_one,
        .remove         = __devexit_p(cy82c693_remove),
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init cy82c693_ide_init(void)
index bdc5398687015b9e620d6bebdf33bf4f4db623f1..092b238cb250d81d914f8118f587b8d019fcda1d 100644 (file)
@@ -171,6 +171,8 @@ static struct pci_driver driver = {
        .id_table       = generic_pci_tbl,
        .probe          = generic_init_one,
        .remove         = ide_pci_remove,
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init generic_ide_init(void)
index 4f624899f44a84e79f147fe1c780f67430315b52..644de29f8fe4a9f3ba2732abbc48968ae4a9195d 100644 (file)
@@ -78,7 +78,7 @@ static void hpt34x_set_pio_mode(ide_drive_t *drive, const u8 pio)
  */
 #define        HPT34X_PCI_INIT_REG             0x80
 
-static unsigned int __devinit init_chipset_hpt34x(struct pci_dev *dev)
+static unsigned int init_chipset_hpt34x(struct pci_dev *dev)
 {
        int i = 0;
        unsigned long hpt34xIoBase = pci_resource_start(dev, 4);
@@ -171,6 +171,8 @@ static struct pci_driver driver = {
        .id_table       = hpt34x_pci_tbl,
        .probe          = hpt34x_init_one,
        .remove         = ide_pci_remove,
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init hpt34x_ide_init(void)
index ab6c217f104efe0051d33adda4fc48f344bda858..a194022b6a61b39260169d275278cdd5f1cc119b 100644 (file)
@@ -943,7 +943,7 @@ static void hpt3xxn_rw_disk(ide_drive_t *drive, struct request *rq)
  *     Perform a calibration cycle on the DPLL.
  *     Returns 1 if this succeeds
  */
-static int __devinit hpt37x_calibrate_dpll(struct pci_dev *dev, u16 f_low, u16 f_high)
+static int hpt37x_calibrate_dpll(struct pci_dev *dev, u16 f_low, u16 f_high)
 {
        u32 dpll = (f_high << 16) | f_low | 0x100;
        u8  scr2;
@@ -971,7 +971,7 @@ static int __devinit hpt37x_calibrate_dpll(struct pci_dev *dev, u16 f_low, u16 f
        return 1;
 }
 
-static void __devinit hpt3xx_disable_fast_irq(struct pci_dev *dev, u8 mcr_addr)
+static void hpt3xx_disable_fast_irq(struct pci_dev *dev, u8 mcr_addr)
 {
        struct ide_host *host   = pci_get_drvdata(dev);
        struct hpt_info *info   = host->host_priv + (&dev->dev == host->dev[1]);
@@ -1001,7 +1001,7 @@ static void __devinit hpt3xx_disable_fast_irq(struct pci_dev *dev, u8 mcr_addr)
                pci_write_config_byte(dev, mcr_addr + 1, new_mcr);
 }
 
-static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev)
+static unsigned int init_chipset_hpt366(struct pci_dev *dev)
 {
        unsigned long io_base   = pci_resource_start(dev, 4);
        struct hpt_info *info   = hpt3xx_get_info(&dev->dev);
@@ -1627,6 +1627,8 @@ static struct pci_driver driver = {
        .id_table       = hpt366_pci_tbl,
        .probe          = hpt366_init_one,
        .remove         = __devexit_p(hpt366_remove),
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init hpt366_ide_init(void)
index a0e058a2abfe5e54b25186a7ed29efaa9e3c094d..0954ccd08d6fe718d37dc0fa48bfaa093611c635 100644 (file)
@@ -194,6 +194,8 @@ static struct pci_driver driver = {
        .id_table       = it8213_pci_tbl,
        .probe          = it8213_init_one,
        .remove         = ide_pci_remove,
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init it8213_ide_init(void)
index 0fdea7e91a7a2a05da047bdbb4cd1b19e65b8430..46edd083b3488b4c4ae6da9d31391aeb7c9461b2 100644 (file)
@@ -586,7 +586,7 @@ static void __devinit init_hwif_it821x(ide_hwif_t *hwif)
        hwif->mwdma_mask = ATA_MWDMA2;
 }
 
-static void __devinit it8212_disable_raid(struct pci_dev *dev)
+static void it8212_disable_raid(struct pci_dev *dev)
 {
        /* Reset local CPU, and set BIOS not ready */
        pci_write_config_byte(dev, 0x5E, 0x01);
@@ -603,7 +603,7 @@ static void __devinit it8212_disable_raid(struct pci_dev *dev)
        pci_write_config_byte(dev, PCI_LATENCY_TIMER, 0x20);
 }
 
-static unsigned int __devinit init_chipset_it821x(struct pci_dev *dev)
+static unsigned int init_chipset_it821x(struct pci_dev *dev)
 {
        u8 conf;
        static char *mode[2] = { "pass through", "smart" };
@@ -685,6 +685,8 @@ static struct pci_driver driver = {
        .id_table       = it821x_pci_tbl,
        .probe          = it821x_init_one,
        .remove         = __devexit_p(it821x_remove),
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init it821x_ide_init(void)
index 4010b4a8dfbb8458f0d34e7195225baea4a13fd2..acd647110648628d045e8e6cbf75e7b9faa28c7e 100644 (file)
@@ -154,6 +154,8 @@ static struct pci_driver driver = {
        .id_table       = jmicron_pci_tbl,
        .probe          = jmicron_init_one,
        .remove         = ide_pci_remove,
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init jmicron_ide_init(void)
index a482ade8e455fd2028227bcaff731df9856a466a..53bd645736d965b73eeee8f8ffaeacc12a193cce 100644 (file)
@@ -339,6 +339,8 @@ static struct pci_driver driver = {
        .id_table       = ns87415_pci_tbl,
        .probe          = ns87415_init_one,
        .remove         = ide_pci_remove,
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init ns87415_ide_init(void)
index fefac2c174b6abb8c7b3d1fff1151996a5c5c16c..3de11ddcf863f1e1295c1f47d45fd3a6bef33e23 100644 (file)
@@ -225,6 +225,8 @@ static struct pci_driver driver = {
        .id_table       = opti621_pci_tbl,
        .probe          = opti621_init_one,
        .remove         = ide_pci_remove,
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init opti621_ide_init(void)
index 73bd264fbf9fb87edbf8d808cb78d8034c0c9761..9fc59962553b32fd5f4f72c32ec378d9fb09fe55 100644 (file)
@@ -226,7 +226,7 @@ static void pdcnew_reset(ide_drive_t *drive)
  * read_counter - Read the byte count registers
  * @dma_base: for the port address
  */
-static long __devinit read_counter(u32 dma_base)
+static long read_counter(u32 dma_base)
 {
        u32  pri_dma_base = dma_base, sec_dma_base = dma_base + 0x08;
        u8   cnt0, cnt1, cnt2, cnt3;
@@ -266,7 +266,7 @@ static long __devinit read_counter(u32 dma_base)
  * @dma_base: for the port address
  * E.g. 16949000 on 33 MHz PCI bus, i.e. half of the PCI clock.
  */
-static long __devinit detect_pll_input_clock(unsigned long dma_base)
+static long detect_pll_input_clock(unsigned long dma_base)
 {
        struct timeval start_time, end_time;
        long start_count, end_count;
@@ -309,7 +309,7 @@ static long __devinit detect_pll_input_clock(unsigned long dma_base)
 }
 
 #ifdef CONFIG_PPC_PMAC
-static void __devinit apple_kiwi_init(struct pci_dev *pdev)
+static void apple_kiwi_init(struct pci_dev *pdev)
 {
        struct device_node *np = pci_device_to_OF_node(pdev);
        u8 conf;
@@ -325,7 +325,7 @@ static void __devinit apple_kiwi_init(struct pci_dev *pdev)
 }
 #endif /* CONFIG_PPC_PMAC */
 
-static unsigned int __devinit init_chipset_pdcnew(struct pci_dev *dev)
+static unsigned int init_chipset_pdcnew(struct pci_dev *dev)
 {
        const char *name = DRV_NAME;
        unsigned long dma_base = pci_resource_start(dev, 4);
@@ -566,6 +566,8 @@ static struct pci_driver driver = {
        .id_table       = pdc202new_pci_tbl,
        .probe          = pdc202new_init_one,
        .remove         = __devexit_p(pdc202new_remove),
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init pdc202new_ide_init(void)
index 8f0acb956c6bdd83985ce9c868b34ed9525152b6..cb6d2a00c514a5624e5e4fa2caf1b0c938b7ab36 100644 (file)
@@ -264,7 +264,7 @@ static void pdc202xx_dma_timeout(ide_drive_t *drive)
        ide_dma_timeout(drive);
 }
 
-static unsigned int __devinit init_chipset_pdc202xx(struct pci_dev *dev)
+static unsigned int init_chipset_pdc202xx(struct pci_dev *dev)
 {
        unsigned long dmabase = pci_resource_start(dev, 4);
        u8 udma_speed_flag = 0, primary_mode = 0, secondary_mode = 0;
@@ -431,6 +431,8 @@ static struct pci_driver driver = {
        .id_table       = pdc202xx_pci_tbl,
        .probe          = pdc202xx_init_one,
        .remove         = ide_pci_remove,
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init pdc202xx_ide_init(void)
index 13136dddb2b410737862227e560c4d1ef2cc1be4..a06c03f8e29539da2567dcb8563392d6078bec5a 100644 (file)
@@ -204,7 +204,7 @@ static void piix_set_dma_mode(ide_drive_t *drive, const u8 speed)
  *     out to be nice and simple.
  */
 
-static unsigned int __devinit init_chipset_ich(struct pci_dev *dev)
+static unsigned int init_chipset_ich(struct pci_dev *dev)
 {
        u32 extra = 0;
 
@@ -449,6 +449,8 @@ static struct pci_driver driver = {
        .id_table       = piix_pci_tbl,
        .probe          = piix_init_one,
        .remove         = ide_pci_remove,
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init piix_ide_init(void)
index 5f79d284ff826ec09267665d6eaefaa5f4c34342..3dff2aea317e88ae261d5050b9b0ae3c1023dd7e 100644 (file)
@@ -175,7 +175,7 @@ static void svwks_set_dma_mode(ide_drive_t *drive, const u8 speed)
        pci_write_config_byte(dev, 0x54, ultra_enable);
 }
 
-static unsigned int __devinit init_chipset_svwks(struct pci_dev *dev)
+static unsigned int init_chipset_svwks(struct pci_dev *dev)
 {
        unsigned int reg;
        u8 btr;
@@ -448,6 +448,8 @@ static struct pci_driver driver = {
        .id_table       = svwks_pci_tbl,
        .probe          = svwks_init_one,
        .remove         = ide_pci_remove,
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init svwks_ide_init(void)
index 874c8ca40ed633f04fbe97a7b54d2de89de4ce69..174a873b4c6405229e48eb2714998cf9bef8ce69 100644 (file)
@@ -463,7 +463,7 @@ static void sil_sata_pre_reset(ide_drive_t *drive)
  *     to 133 MHz clocking if the system isn't already set up to do it.
  */
 
-static unsigned int __devinit init_chipset_siimage(struct pci_dev *dev)
+static unsigned int init_chipset_siimage(struct pci_dev *dev)
 {
        struct ide_host *host = pci_get_drvdata(dev);
        void __iomem *ioaddr = host->host_priv;
@@ -834,6 +834,8 @@ static struct pci_driver driver = {
        .id_table       = siimage_pci_tbl,
        .probe          = siimage_init_one,
        .remove         = __devexit_p(siimage_remove),
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init siimage_ide_init(void)
index 56bfb245f1fa1967770ed1629e56b0753fe1732f..734dd41f1f679c649fc635d169f511eb7661518b 100644 (file)
@@ -447,7 +447,7 @@ static int __devinit sis_find_family(struct pci_dev *dev)
        return chipset_family;
 }
 
-static unsigned int __devinit init_chipset_sis5513(struct pci_dev *dev)
+static unsigned int init_chipset_sis5513(struct pci_dev *dev)
 {
        /* Make general config ops here
           1/ tell IDE channels to operate in Compatibility mode only
@@ -610,6 +610,8 @@ static struct pci_driver driver = {
        .id_table       = sis5513_pci_tbl,
        .probe          = sis5513_init_one,
        .remove         = __devexit_p(sis5513_remove),
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init sis5513_ide_init(void)
index 8cc4e137c608b5d9c78e5eec113fd0b4cdf4cbc9..37a6b7bdc0403ac78ef95b89a1a31217c191aa08 100644 (file)
@@ -271,7 +271,7 @@ static u8 sl82c105_bridge_revision(struct pci_dev *dev)
  * channel 0 here at least, but channel 1 has to be enabled by
  * firmware or arch code. We still set both to 16 bits mode.
  */
-static unsigned int __devinit init_chipset_sl82c105(struct pci_dev *dev)
+static unsigned int init_chipset_sl82c105(struct pci_dev *dev)
 {
        u32 val;
 
@@ -350,6 +350,8 @@ static struct pci_driver driver = {
        .id_table       = sl82c105_pci_tbl,
        .probe          = sl82c105_init_one,
        .remove         = ide_pci_remove,
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init sl82c105_ide_init(void)
index a31c6911442d3f23f9fb0d6bf37dc4f118ba5aa4..a9551a13ac5717f014ea6fb0c27c2a7ac6bb1cff 100644 (file)
@@ -159,6 +159,8 @@ static struct pci_driver driver = {
        .id_table       = slc90e66_pci_tbl,
        .probe          = slc90e66_init_one,
        .remove         = ide_pci_remove,
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init slc90e66_ide_init(void)
index c980a7f39052b2c7a880cf84ee3c8d7801154b25..be8715dcee05ec735c35c8b88eb2493f0305736e 100644 (file)
@@ -119,6 +119,8 @@ static struct pci_driver driver = {
        .id_table       = triflex_pci_tbl,
        .probe          = triflex_init_one,
        .remove         = ide_pci_remove,
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init triflex_ide_init(void)
index 9cb531dc905ae242feba375fd1f987502e631a1d..acacdaab69c2345a817b2b048bd19733ee10a072 100644 (file)
@@ -215,7 +215,7 @@ static struct via_isa_bridge *via_config_find(struct pci_dev **isa)
 /*
  * Check and handle 80-wire cable presence
  */
-static void __devinit via_cable_detect(struct via82cxxx_dev *vdev, u32 u)
+static void via_cable_detect(struct via82cxxx_dev *vdev, u32 u)
 {
        int i;
 
@@ -267,7 +267,7 @@ static void __devinit via_cable_detect(struct via82cxxx_dev *vdev, u32 u)
  *     and initialize its drive independent registers.
  */
 
-static unsigned int __devinit init_chipset_via82cxxx(struct pci_dev *dev)
+static unsigned int init_chipset_via82cxxx(struct pci_dev *dev)
 {
        struct ide_host *host = pci_get_drvdata(dev);
        struct via82cxxx_dev *vdev = host->host_priv;
@@ -492,6 +492,8 @@ static struct pci_driver driver = {
        .id_table       = via_pci_tbl,
        .probe          = via_init_one,
        .remove         = __devexit_p(via_remove),
+       .suspend        = ide_pci_suspend,
+       .resume         = ide_pci_resume,
 };
 
 static int __init via_ide_init(void)
index a8e9e8a69a525a2b3f162b32348c44577ad83125..9f1f9163a136e21faf2a4e24f7c161480d840937 100644 (file)
@@ -659,3 +659,36 @@ void ide_pci_remove(struct pci_dev *dev)
        pci_disable_device(dev);
 }
 EXPORT_SYMBOL_GPL(ide_pci_remove);
+
+#ifdef CONFIG_PM
+int ide_pci_suspend(struct pci_dev *dev, pm_message_t state)
+{
+       pci_save_state(dev);
+       pci_disable_device(dev);
+       pci_set_power_state(dev, pci_choose_state(dev, state));
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(ide_pci_suspend);
+
+int ide_pci_resume(struct pci_dev *dev)
+{
+       struct ide_host *host = pci_get_drvdata(dev);
+       int rc;
+
+       pci_set_power_state(dev, PCI_D0);
+
+       rc = pci_enable_device(dev);
+       if (rc)
+               return rc;
+
+       pci_restore_state(dev);
+       pci_set_master(dev);
+
+       if (host->init_chipset)
+               host->init_chipset(dev);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(ide_pci_resume);
+#endif
index 432eb98f7fe730676e5182036ad62e73a436b3a2..2c5d83ddaef649e4209531efb514fac5c8132866 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/device.h>
 #include <linux/pci.h>
 #include <linux/completion.h>
+#include <linux/pm.h>
 #ifdef CONFIG_BLK_DEV_IDEACPI
 #include <acpi/acpi.h>
 #endif
@@ -639,6 +640,7 @@ struct ide_host {
        ide_hwif_t      *ports[MAX_HWIFS];
        unsigned int    n_ports;
        struct device   *dev[2];
+       unsigned int    (*init_chipset)(struct pci_dev *);
        unsigned long   host_flags;
        void            *host_priv;
 };
@@ -1264,6 +1266,14 @@ int ide_pci_init_two(struct pci_dev *, struct pci_dev *,
                     const struct ide_port_info *, void *);
 void ide_pci_remove(struct pci_dev *);
 
+#ifdef CONFIG_PM
+int ide_pci_suspend(struct pci_dev *, pm_message_t);
+int ide_pci_resume(struct pci_dev *);
+#else
+#define ide_pci_suspend NULL
+#define ide_pci_resume NULL
+#endif
+
 void ide_map_sg(ide_drive_t *, struct request *);
 void ide_init_sg_cmd(ide_drive_t *, struct request *);