ide: remove hwif->autodma and drive->autodma
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / ide / pci / pdc202xx_new.c
index 7b0e479c355c116ea732402339c444535d54eb54..8704b6f33312636034d0a6a33cbdffe1df3fea62 100644 (file)
@@ -146,21 +146,16 @@ static struct udma_timing {
        { 0x1a, 0x01, 0xcb },   /* UDMA mode 6 */
 };
 
-static int pdcnew_tune_chipset(ide_drive_t *drive, u8 speed)
+static void pdcnew_set_mode(ide_drive_t *drive, const u8 speed)
 {
        ide_hwif_t *hwif        = HWIF(drive);
        u8 adj                  = (drive->dn & 1) ? 0x08 : 0x00;
-       int                     err;
-
-       speed = ide_rate_filter(drive, speed);
 
        /*
-        * Issue SETFEATURES_XFER to the drive first. PDC202xx hardware will
+        * IDE core issues SETFEATURES_XFER to the drive first (thanks to
+        * IDE_HFLAG_POST_SET_MODE in ->host_flags).  PDC202xx hardware will
         * automatically set the timing registers based on 100 MHz PLL output.
-        */
-       err = ide_config_drive_speed(drive, speed);
-
-       /*
+        *
         * As we set up the PLL to output 133 MHz for UltraDMA/133 capable
         * chips, we must override the default register settings...
         */
@@ -213,14 +208,11 @@ static int pdcnew_tune_chipset(ide_drive_t *drive, u8 speed)
 
                set_indexed_reg(hwif, 0x10 + adj, tmp & 0x7f);
        }
-
-       return err;
 }
 
-static void pdcnew_tune_drive(ide_drive_t *drive, u8 pio)
+static void pdcnew_set_pio_mode(ide_drive_t *drive, const u8 pio)
 {
-       pio = ide_get_best_pio_mode(drive, pio, 4);
-       (void)pdcnew_tune_chipset(drive, XFER_PIO_0 + pio);
+       pdcnew_set_mode(drive, XFER_PIO_0 + pio);
 }
 
 static u8 pdcnew_cable_detect(ide_hwif_t *hwif)
@@ -231,19 +223,6 @@ static u8 pdcnew_cable_detect(ide_hwif_t *hwif)
                return ATA_CBL_PATA80;
 }
 
-static int pdcnew_config_drive_xfer_rate(ide_drive_t *drive)
-{
-       drive->init_speed = 0;
-
-       if (ide_tune_dma(drive))
-               return 0;
-
-       if (ide_use_fast_pio(drive))
-               pdcnew_tune_drive(drive, 255);
-
-       return -1;
-}
-
 static int pdcnew_quirkproc(ide_drive_t *drive)
 {
        const char **list, *model = drive->id->model;
@@ -490,11 +469,10 @@ static unsigned int __devinit init_chipset_pdcnew(struct pci_dev *dev, const cha
 
 static void __devinit init_hwif_pdc202new(ide_hwif_t *hwif)
 {
-       hwif->autodma = 0;
+       hwif->set_pio_mode = &pdcnew_set_pio_mode;
+       hwif->set_dma_mode = &pdcnew_set_mode;
 
-       hwif->tuneproc  = &pdcnew_tune_drive;
        hwif->quirkproc = &pdcnew_quirkproc;
-       hwif->speedproc = &pdcnew_tune_chipset;
        hwif->resetproc = &pdcnew_reset;
 
        hwif->err_stops_fifo = 1;
@@ -509,14 +487,8 @@ static void __devinit init_hwif_pdc202new(ide_hwif_t *hwif)
        hwif->ultra_mask = hwif->cds->udma_mask;
        hwif->mwdma_mask = 0x07;
 
-       hwif->ide_dma_check = &pdcnew_config_drive_xfer_rate;
-
        if (hwif->cbl != ATA_CBL_PATA40_SHORT)
                hwif->cbl = pdcnew_cable_detect(hwif);
-
-       if (!noautodma)
-               hwif->autodma = 1;
-       hwif->drives[0].autodma = hwif->drives[1].autodma = hwif->autodma;
 }
 
 static int __devinit init_setup_pdcnew(struct pci_dev *dev, ide_pci_device_t *d)
@@ -524,44 +496,52 @@ static int __devinit init_setup_pdcnew(struct pci_dev *dev, ide_pci_device_t *d)
        return ide_setup_pci_device(dev, d);
 }
 
-static int __devinit init_setup_pdc20270(struct pci_dev *dev,
-                                        ide_pci_device_t *d)
+static int __devinit init_setup_pdc20270(struct pci_dev *dev, ide_pci_device_t *d)
 {
-       struct pci_dev *findev = NULL;
-       int ret;
+       struct pci_dev *bridge = dev->bus->self;
+
+       if (bridge != NULL &&
+           bridge->vendor == PCI_VENDOR_ID_DEC &&
+           bridge->device == PCI_DEVICE_ID_DEC_21150) {
+               struct pci_dev *dev2;
 
-       if ((dev->bus->self &&
-            dev->bus->self->vendor == PCI_VENDOR_ID_DEC) &&
-           (dev->bus->self->device == PCI_DEVICE_ID_DEC_21150)) {
                if (PCI_SLOT(dev->devfn) & 2)
                        return -ENODEV;
 
-               while ((findev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, findev)) != NULL) {
-                       if ((findev->vendor == dev->vendor) &&
-                           (findev->device == dev->device) &&
-                           (PCI_SLOT(findev->devfn) & 2)) {
-                               if (findev->irq != dev->irq) {
-                                       findev->irq = dev->irq;
-                               }
-                               ret = ide_setup_pci_devices(dev, findev, d);
-                               if (ret < 0)
-                                       pci_dev_put(findev);
-                               return ret;
+               dev2 = pci_get_slot(dev->bus, PCI_DEVFN(PCI_SLOT(dev->devfn) + 2,
+                                                       PCI_FUNC(dev->devfn)));
+               if (dev2 != NULL &&
+                   dev2->vendor == dev->vendor &&
+                   dev2->device == dev->device) {
+                       int ret;
+
+                       if (dev2->irq != dev->irq) {
+                               dev2->irq = dev->irq;
+
+                               printk(KERN_WARNING "%s: PCI config space "
+                                      "interrupt fixed.\n", d->name);
                        }
+
+                       ret = ide_setup_pci_devices(dev, dev2, d);
+                       if (ret < 0)
+                               pci_dev_put(dev2);
+                       return ret;
                }
        }
        return ide_setup_pci_device(dev, d);
 }
 
-static int __devinit init_setup_pdc20276(struct pci_dev *dev,
-                                        ide_pci_device_t *d)
+static int __devinit init_setup_pdc20276(struct pci_dev *dev, ide_pci_device_t *d)
 {
-       if ((dev->bus->self) &&
-           (dev->bus->self->vendor == PCI_VENDOR_ID_INTEL) &&
-           ((dev->bus->self->device == PCI_DEVICE_ID_INTEL_I960) ||
-            (dev->bus->self->device == PCI_DEVICE_ID_INTEL_I960RM))) {
-               printk(KERN_INFO "ide: Skipping Promise PDC20276 "
-                       "attached to I2O RAID controller.\n");
+       struct pci_dev *bridge = dev->bus->self;
+
+       if (bridge != NULL &&
+           bridge->vendor == PCI_VENDOR_ID_INTEL &&
+          (bridge->device == PCI_DEVICE_ID_INTEL_I960 ||
+           bridge->device == PCI_DEVICE_ID_INTEL_I960RM)) {
+
+               printk(KERN_INFO "%s: attached to I2O RAID controller, "
+                                "skipping.\n", d->name);
                return -ENODEV;
        }
        return ide_setup_pci_device(dev, d);
@@ -577,6 +557,7 @@ static ide_pci_device_t pdcnew_chipsets[] __devinitdata = {
                .bootable       = OFF_BOARD,
                .pio_mask       = ATA_PIO4,
                .udma_mask      = 0x3f, /* udma0-5 */
+               .host_flags     = IDE_HFLAG_POST_SET_MODE,
        },{     /* 1 */
                .name           = "PDC20269",
                .init_setup     = init_setup_pdcnew,
@@ -586,6 +567,7 @@ static ide_pci_device_t pdcnew_chipsets[] __devinitdata = {
                .bootable       = OFF_BOARD,
                .pio_mask       = ATA_PIO4,
                .udma_mask      = 0x7f, /* udma0-6*/
+               .host_flags     = IDE_HFLAG_POST_SET_MODE,
        },{     /* 2 */
                .name           = "PDC20270",
                .init_setup     = init_setup_pdc20270,
@@ -595,6 +577,7 @@ static ide_pci_device_t pdcnew_chipsets[] __devinitdata = {
                .bootable       = OFF_BOARD,
                .pio_mask       = ATA_PIO4,
                .udma_mask      = 0x3f, /* udma0-5 */
+               .host_flags     = IDE_HFLAG_POST_SET_MODE,
        },{     /* 3 */
                .name           = "PDC20271",
                .init_setup     = init_setup_pdcnew,
@@ -604,6 +587,7 @@ static ide_pci_device_t pdcnew_chipsets[] __devinitdata = {
                .bootable       = OFF_BOARD,
                .pio_mask       = ATA_PIO4,
                .udma_mask      = 0x7f, /* udma0-6*/
+               .host_flags     = IDE_HFLAG_POST_SET_MODE,
        },{     /* 4 */
                .name           = "PDC20275",
                .init_setup     = init_setup_pdcnew,
@@ -613,6 +597,7 @@ static ide_pci_device_t pdcnew_chipsets[] __devinitdata = {
                .bootable       = OFF_BOARD,
                .pio_mask       = ATA_PIO4,
                .udma_mask      = 0x7f, /* udma0-6*/
+               .host_flags     = IDE_HFLAG_POST_SET_MODE,
        },{     /* 5 */
                .name           = "PDC20276",
                .init_setup     = init_setup_pdc20276,
@@ -622,6 +607,7 @@ static ide_pci_device_t pdcnew_chipsets[] __devinitdata = {
                .bootable       = OFF_BOARD,
                .pio_mask       = ATA_PIO4,
                .udma_mask      = 0x7f, /* udma0-6*/
+               .host_flags     = IDE_HFLAG_POST_SET_MODE,
        },{     /* 6 */
                .name           = "PDC20277",
                .init_setup     = init_setup_pdcnew,
@@ -631,6 +617,7 @@ static ide_pci_device_t pdcnew_chipsets[] __devinitdata = {
                .bootable       = OFF_BOARD,
                .pio_mask       = ATA_PIO4,
                .udma_mask      = 0x7f, /* udma0-6*/
+               .host_flags     = IDE_HFLAG_POST_SET_MODE,
        }
 };
 
@@ -650,14 +637,14 @@ static int __devinit pdc202new_init_one(struct pci_dev *dev, const struct pci_de
        return d->init_setup(dev, d);
 }
 
-static struct pci_device_id pdc202new_pci_tbl[] = {
-       { PCI_VENDOR_ID_PROMISE, PCI_DEVICE_ID_PROMISE_20268, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       { PCI_VENDOR_ID_PROMISE, PCI_DEVICE_ID_PROMISE_20269, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1},
-       { PCI_VENDOR_ID_PROMISE, PCI_DEVICE_ID_PROMISE_20270, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2},
-       { PCI_VENDOR_ID_PROMISE, PCI_DEVICE_ID_PROMISE_20271, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3},
-       { PCI_VENDOR_ID_PROMISE, PCI_DEVICE_ID_PROMISE_20275, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4},
-       { PCI_VENDOR_ID_PROMISE, PCI_DEVICE_ID_PROMISE_20276, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5},
-       { PCI_VENDOR_ID_PROMISE, PCI_DEVICE_ID_PROMISE_20277, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 6},
+static const struct pci_device_id pdc202new_pci_tbl[] = {
+       { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20268), 0 },
+       { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20269), 1 },
+       { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20270), 2 },
+       { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20271), 3 },
+       { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20275), 4 },
+       { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20276), 5 },
+       { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20277), 6 },
        { 0, },
 };
 MODULE_DEVICE_TABLE(pci, pdc202new_pci_tbl);