]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/ide/pci/pdc202xx_old.c
pmac: remove needless pmac_ide_destroy_dmatable() wrapper
[linux-2.6-omap-h63xx.git] / drivers / ide / pci / pdc202xx_old.c
index 150422ec3cfabc6685d8f6a8bf5b82804cf969b4..649b807c6aa6627245941be7706aededa70d9220 100644 (file)
 #include <linux/kernel.h>
 #include <linux/delay.h>
 #include <linux/blkdev.h>
-#include <linux/hdreg.h>
 #include <linux/pci.h>
 #include <linux/init.h>
 #include <linux/ide.h>
 
 #include <asm/io.h>
 
+#define DRV_NAME "pdc202xx_old"
+
 #define PDC202XX_DEBUG_DRIVE_INFO      0
 
 static const char *pdc_quirk_drives[] = {
@@ -84,7 +85,7 @@ static void pdc202xx_set_mode(ide_drive_t *drive, const u8 speed)
                 * Prefetch_EN / IORDY_EN / PA[3:0] bits of register A
                 */
                AP &= ~0x3f;
-               if (drive->id->capability & 4)
+               if (ata_id_iordy_disable(drive->id))
                        AP |= 0x20;     /* set IORDY_EN bit */
                if (drive->media == ide_disk)
                        AP |= 0x10;     /* set Prefetch_EN bit */
@@ -115,7 +116,7 @@ static void pdc202xx_set_pio_mode(ide_drive_t *drive, const u8 pio)
        pdc202xx_set_mode(drive, XFER_PIO_0 + pio);
 }
 
-static u8 __devinit pdc2026x_old_cable_detect(ide_hwif_t *hwif)
+static u8 pdc2026x_cable_detect(ide_hwif_t *hwif)
 {
        struct pci_dev *dev = to_pci_dev(hwif->dev);
        u16 CIS, mask = hwif->channel ? (1 << 11) : (1 << 10);
@@ -152,10 +153,10 @@ static void pdc_old_disable_66MHz_clock(ide_hwif_t *hwif)
 
 static void pdc202xx_quirkproc(ide_drive_t *drive)
 {
-       const char **list, *model = drive->id->model;
+       const char **list, *m = (char *)&drive->id[ATA_ID_PROD];
 
        for (list = pdc_quirk_drives; *list != NULL; list++)
-               if (strstr(model, *list) != NULL) {
+               if (strstr(m, *list) != NULL) {
                        drive->quirk_list = 2;
                        return;
                }
@@ -163,11 +164,11 @@ static void pdc202xx_quirkproc(ide_drive_t *drive)
        drive->quirk_list = 0;
 }
 
-static void pdc202xx_old_ide_dma_start(ide_drive_t *drive)
+static void pdc202xx_dma_start(ide_drive_t *drive)
 {
        if (drive->current_speed > XFER_UDMA_2)
                pdc_old_enable_66MHz_clock(drive->hwif);
-       if (drive->media != ide_disk || drive->addressing == 1) {
+       if (drive->media != ide_disk || (drive->dev_flags & IDE_DFLAG_LBA48)) {
                struct request *rq      = HWGROUP(drive)->rq;
                ide_hwif_t *hwif        = HWIF(drive);
                unsigned long high_16   = hwif->extra_base - 16;
@@ -185,9 +186,9 @@ static void pdc202xx_old_ide_dma_start(ide_drive_t *drive)
        ide_dma_start(drive);
 }
 
-static int pdc202xx_old_ide_dma_end(ide_drive_t *drive)
+static int pdc202xx_dma_end(ide_drive_t *drive)
 {
-       if (drive->media != ide_disk || drive->addressing == 1) {
+       if (drive->media != ide_disk || (drive->dev_flags & IDE_DFLAG_LBA48)) {
                ide_hwif_t *hwif        = HWIF(drive);
                unsigned long high_16   = hwif->extra_base - 16;
                unsigned long atapi_reg = high_16 + (hwif->channel ? 0x24 : 0x20);
@@ -202,11 +203,11 @@ static int pdc202xx_old_ide_dma_end(ide_drive_t *drive)
        return __ide_dma_end(drive);
 }
 
-static int pdc202xx_old_ide_dma_test_irq(ide_drive_t *drive)
+static int pdc202xx_dma_test_irq(ide_drive_t *drive)
 {
        ide_hwif_t *hwif        = HWIF(drive);
        unsigned long high_16   = hwif->extra_base - 16;
-       u8 dma_stat             = inb(hwif->dma_status);
+       u8 dma_stat             = inb(hwif->dma_base + ATA_DMA_STATUS);
        u8 sc1d                 = inb(high_16 + 0x001d);
 
        if (hwif->channel) {
@@ -226,26 +227,6 @@ somebody_else:
        return (dma_stat & 4) == 4;     /* return 1 if INTR asserted */
 }
 
-static void pdc202xx_dma_lost_irq(ide_drive_t *drive)
-{
-       ide_hwif_t *hwif = HWIF(drive);
-
-       if (hwif->resetproc != NULL)
-               hwif->resetproc(drive);
-
-       ide_dma_lost_irq(drive);
-}
-
-static void pdc202xx_dma_timeout(ide_drive_t *drive)
-{
-       ide_hwif_t *hwif = HWIF(drive);
-
-       if (hwif->resetproc != NULL)
-               hwif->resetproc(drive);
-
-       ide_dma_timeout(drive);
-}
-
 static void pdc202xx_reset_host (ide_hwif_t *hwif)
 {
        unsigned long high_16   = hwif->extra_base - 16;
@@ -271,68 +252,45 @@ static void pdc202xx_reset (ide_drive_t *drive)
        ide_set_max_pio(drive);
 }
 
-static unsigned int __devinit init_chipset_pdc202xx(struct pci_dev *dev,
-                                                       const char *name)
+static void pdc202xx_dma_lost_irq(ide_drive_t *drive)
 {
-       return dev->irq;
+       pdc202xx_reset(drive);
+       ide_dma_lost_irq(drive);
 }
 
-static void __devinit init_hwif_pdc202xx(ide_hwif_t *hwif)
+static void pdc202xx_dma_timeout(ide_drive_t *drive)
 {
-       struct pci_dev *dev = to_pci_dev(hwif->dev);
-
-       hwif->set_pio_mode = &pdc202xx_set_pio_mode;
-       hwif->set_dma_mode = &pdc202xx_set_mode;
-
-       hwif->quirkproc = &pdc202xx_quirkproc;
-
-       if (dev->device != PCI_DEVICE_ID_PROMISE_20246) {
-               hwif->resetproc = &pdc202xx_reset;
-
-               hwif->cable_detect = pdc2026x_old_cable_detect;
-       }
-
-       if (hwif->dma_base == 0)
-               return;
-
-       hwif->dma_lost_irq = &pdc202xx_dma_lost_irq;
-       hwif->dma_timeout = &pdc202xx_dma_timeout;
-
-       if (dev->device != PCI_DEVICE_ID_PROMISE_20246) {
-               hwif->dma_start = &pdc202xx_old_ide_dma_start;
-               hwif->ide_dma_end = &pdc202xx_old_ide_dma_end;
-       } 
-       hwif->ide_dma_test_irq = &pdc202xx_old_ide_dma_test_irq;
+       pdc202xx_reset(drive);
+       ide_dma_timeout(drive);
 }
 
-static void __devinit init_dma_pdc202xx(ide_hwif_t *hwif, unsigned long dmabase)
+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;
 
-       if (hwif->channel) {
-               ide_setup_dma(hwif, dmabase);
-               return;
-       }
+       if (dmabase == 0)
+               goto out;
 
        udma_speed_flag = inb(dmabase | 0x1f);
        primary_mode    = inb(dmabase | 0x1a);
        secondary_mode  = inb(dmabase | 0x1b);
        printk(KERN_INFO "%s: (U)DMA Burst Bit %sABLED " \
                "Primary %s Mode " \
-               "Secondary %s Mode.\n", hwif->cds->name,
+               "Secondary %s Mode.\n", pci_name(dev),
                (udma_speed_flag & 1) ? "EN" : "DIS",
                (primary_mode & 1) ? "MASTER" : "PCI",
                (secondary_mode & 1) ? "MASTER" : "PCI" );
 
        if (!(udma_speed_flag & 1)) {
                printk(KERN_INFO "%s: FORCING BURST BIT 0x%02x->0x%02x ",
-                       hwif->cds->name, udma_speed_flag,
+                       pci_name(dev), udma_speed_flag,
                        (udma_speed_flag|1));
                outb(udma_speed_flag | 1, dmabase | 0x1f);
                printk("%sACTIVE\n", (inb(dmabase | 0x1f) & 1) ? "" : "IN");
        }
-
-       ide_setup_dma(hwif, dmabase);
+out:
+       return dev->irq;
 }
 
 static void __devinit pdc202ata4_fixup_irq(struct pci_dev *dev,
@@ -346,24 +304,58 @@ static void __devinit pdc202ata4_fixup_irq(struct pci_dev *dev,
                if (irq != irq2) {
                        pci_write_config_byte(dev,
                                (PCI_INTERRUPT_LINE)|0x80, irq);     /* 0xbc */
-                       printk(KERN_INFO "%s: PCI config space interrupt "
-                                        "mirror fixed\n", name);
+                       printk(KERN_INFO "%s %s: PCI config space interrupt "
+                               "mirror fixed\n", name, pci_name(dev));
                }
        }
 }
 
 #define IDE_HFLAGS_PDC202XX \
        (IDE_HFLAG_ERROR_STOPS_FIFO | \
-        IDE_HFLAG_ABUSE_SET_DMA_MODE | \
         IDE_HFLAG_OFF_BOARD)
 
-#define DECLARE_PDC2026X_DEV(name_str, udma, extra_flags) \
+static const struct ide_port_ops pdc20246_port_ops = {
+       .set_pio_mode           = pdc202xx_set_pio_mode,
+       .set_dma_mode           = pdc202xx_set_mode,
+       .quirkproc              = pdc202xx_quirkproc,
+};
+
+static const struct ide_port_ops pdc2026x_port_ops = {
+       .set_pio_mode           = pdc202xx_set_pio_mode,
+       .set_dma_mode           = pdc202xx_set_mode,
+       .quirkproc              = pdc202xx_quirkproc,
+       .resetproc              = pdc202xx_reset,
+       .cable_detect           = pdc2026x_cable_detect,
+};
+
+static const struct ide_dma_ops pdc20246_dma_ops = {
+       .dma_host_set           = ide_dma_host_set,
+       .dma_setup              = ide_dma_setup,
+       .dma_exec_cmd           = ide_dma_exec_cmd,
+       .dma_start              = ide_dma_start,
+       .dma_end                = __ide_dma_end,
+       .dma_test_irq           = pdc202xx_dma_test_irq,
+       .dma_lost_irq           = pdc202xx_dma_lost_irq,
+       .dma_timeout            = pdc202xx_dma_timeout,
+};
+
+static const struct ide_dma_ops pdc2026x_dma_ops = {
+       .dma_host_set           = ide_dma_host_set,
+       .dma_setup              = ide_dma_setup,
+       .dma_exec_cmd           = ide_dma_exec_cmd,
+       .dma_start              = pdc202xx_dma_start,
+       .dma_end                = pdc202xx_dma_end,
+       .dma_test_irq           = pdc202xx_dma_test_irq,
+       .dma_lost_irq           = pdc202xx_dma_lost_irq,
+       .dma_timeout            = pdc202xx_dma_timeout,
+};
+
+#define DECLARE_PDC2026X_DEV(udma, extra_flags) \
        { \
-               .name           = name_str, \
+               .name           = DRV_NAME, \
                .init_chipset   = init_chipset_pdc202xx, \
-               .init_hwif      = init_hwif_pdc202xx, \
-               .init_dma       = init_dma_pdc202xx, \
-               .extra          = 48, \
+               .port_ops       = &pdc2026x_port_ops, \
+               .dma_ops        = &pdc2026x_dma_ops, \
                .host_flags     = IDE_HFLAGS_PDC202XX | extra_flags, \
                .pio_mask       = ATA_PIO4, \
                .mwdma_mask     = ATA_MWDMA2, \
@@ -371,22 +363,21 @@ static void __devinit pdc202ata4_fixup_irq(struct pci_dev *dev,
        }
 
 static const struct ide_port_info pdc202xx_chipsets[] __devinitdata = {
-       {       /* 0 */
-               .name           = "PDC20246",
+       {       /* 0: PDC20246 */
+               .name           = DRV_NAME,
                .init_chipset   = init_chipset_pdc202xx,
-               .init_hwif      = init_hwif_pdc202xx,
-               .init_dma       = init_dma_pdc202xx,
-               .extra          = 16,
+               .port_ops       = &pdc20246_port_ops,
+               .dma_ops        = &pdc20246_dma_ops,
                .host_flags     = IDE_HFLAGS_PDC202XX,
                .pio_mask       = ATA_PIO4,
                .mwdma_mask     = ATA_MWDMA2,
                .udma_mask      = ATA_UDMA2,
        },
 
-       /* 1 */ DECLARE_PDC2026X_DEV("PDC20262", ATA_UDMA4, 0),
-       /* 2 */ DECLARE_PDC2026X_DEV("PDC20263", ATA_UDMA4, 0),
-       /* 3 */ DECLARE_PDC2026X_DEV("PDC20265", ATA_UDMA5, IDE_HFLAG_RQSIZE_256),
-       /* 4 */ DECLARE_PDC2026X_DEV("PDC20267", ATA_UDMA5, IDE_HFLAG_RQSIZE_256),
+       /* 1: PDC2026{2,3} */
+       DECLARE_PDC2026X_DEV(ATA_UDMA4, 0),
+       /* 2: PDC2026{5,7} */
+       DECLARE_PDC2026X_DEV(ATA_UDMA5, IDE_HFLAG_RQSIZE_256),
 };
 
 /**
@@ -405,47 +396,57 @@ static int __devinit pdc202xx_init_one(struct pci_dev *dev, const struct pci_dev
 
        d = &pdc202xx_chipsets[idx];
 
-       if (idx < 3)
+       if (idx < 2)
                pdc202ata4_fixup_irq(dev, d->name);
 
-       if (idx == 3) {
+       if (dev->vendor == PCI_DEVICE_ID_PROMISE_20265) {
                struct pci_dev *bridge = dev->bus->self;
 
                if (bridge &&
                    bridge->vendor == PCI_VENDOR_ID_INTEL &&
                    (bridge->device == PCI_DEVICE_ID_INTEL_I960 ||
                     bridge->device == PCI_DEVICE_ID_INTEL_I960RM)) {
-                       printk(KERN_INFO "ide: Skipping Promise PDC20265 "
-                               "attached to I2O RAID controller\n");
+                       printk(KERN_INFO DRV_NAME " %s: skipping Promise "
+                               "PDC20265 attached to I2O RAID controller\n",
+                               pci_name(dev));
                        return -ENODEV;
                }
        }
 
-       return ide_setup_pci_device(dev, d);
+       return ide_pci_init_one(dev, d, NULL);
 }
 
 static const struct pci_device_id pdc202xx_pci_tbl[] = {
        { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20246), 0 },
        { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20262), 1 },
-       { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20263), 2 },
-       { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20265), 3 },
-       { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20267), 4 },
+       { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20263), 1 },
+       { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20265), 2 },
+       { PCI_VDEVICE(PROMISE, PCI_DEVICE_ID_PROMISE_20267), 2 },
        { 0, },
 };
 MODULE_DEVICE_TABLE(pci, pdc202xx_pci_tbl);
 
-static struct pci_driver driver = {
+static struct pci_driver pdc202xx_pci_driver = {
        .name           = "Promise_Old_IDE",
        .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)
 {
-       return ide_pci_register_driver(&driver);
+       return ide_pci_register_driver(&pdc202xx_pci_driver);
+}
+
+static void __exit pdc202xx_ide_exit(void)
+{
+       pci_unregister_driver(&pdc202xx_pci_driver);
 }
 
 module_init(pdc202xx_ide_init);
+module_exit(pdc202xx_ide_exit);
 
 MODULE_AUTHOR("Andre Hedrick, Frank Tiernan");
 MODULE_DESCRIPTION("PCI driver module for older Promise IDE");