ide: remove IDE_*_REG macros
[deliverable/linux.git] / drivers / ide / pci / scc_pata.c
index 2b1d5bd0009f30abc4f788154705e7445536aba3..ef07c7a8b97ae5a3868f8613a3ed8abaf9e06dc6 100644 (file)
@@ -254,19 +254,7 @@ static void scc_set_dma_mode(ide_drive_t *drive, const u8 speed)
                offset = 0; /* 100MHz */
        }
 
-       switch (speed) {
-       case XFER_UDMA_6:
-       case XFER_UDMA_5:
-       case XFER_UDMA_4:
-       case XFER_UDMA_3:
-       case XFER_UDMA_2:
-       case XFER_UDMA_1:
-       case XFER_UDMA_0:
-               idx = speed - XFER_UDMA_0;
-               break;
-       default:
-               return;
-       }
+       idx = speed - XFER_UDMA_0;
 
        jcactsel = JCACTSELtbl[offset][idx];
        if (is_slave) {
@@ -346,7 +334,8 @@ static int scc_ide_dma_end(ide_drive_t * drive)
 
        /* errata A308 workaround: Step5 (check data loss) */
        /* We don't check non ide_disk because it is limited to UDMA4 */
-       if (!(in_be32((void __iomem *)IDE_ALTSTATUS_REG) & ERR_STAT) &&
+       if (!(in_be32((void __iomem *)hwif->io_ports[IDE_ALTSTATUS_OFFSET])
+             & ERR_STAT) &&
            drive->media == ide_disk && drive->current_speed > XFER_UDMA_4) {
                reg = in_be32((void __iomem *)intsts_port);
                if (!(reg & INTSTS_ACTEINT)) {
@@ -449,7 +438,8 @@ static int scc_dma_test_irq(ide_drive_t *drive)
        u32 int_stat = in_be32((void __iomem *)hwif->dma_base + 0x014);
 
        /* SCC errata A252,A308 workaround: Step4 */
-       if ((in_be32((void __iomem *)IDE_ALTSTATUS_REG) & ERR_STAT) &&
+       if ((in_be32((void __iomem *)hwif->io_ports[IDE_ALTSTATUS_OFFSET])
+            & ERR_STAT) &&
            (int_stat & INTSTS_INTRQ))
                return 1;
 
@@ -535,15 +525,53 @@ static int setup_mmio_scc (struct pci_dev *dev, const char *name)
        return -ENOMEM;
 }
 
+static int scc_ide_setup_pci_device(struct pci_dev *dev,
+                                   const struct ide_port_info *d)
+{
+       struct scc_ports *ports = pci_get_drvdata(dev);
+       ide_hwif_t *hwif = NULL;
+       hw_regs_t hw;
+       u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
+       int i;
+
+       for (i = 0; i < MAX_HWIFS; i++) {
+               hwif = &ide_hwifs[i];
+               if (hwif->chipset == ide_unknown)
+                       break; /* pick an unused entry */
+       }
+       if (i == MAX_HWIFS) {
+               printk(KERN_ERR "%s: too many IDE interfaces, "
+                               "no room in table\n", SCC_PATA_NAME);
+               return -ENOMEM;
+       }
+
+       memset(&hw, 0, sizeof(hw));
+       for (i = IDE_DATA_OFFSET; i <= IDE_CONTROL_OFFSET; i++)
+               hw.io_ports[i] = ports->dma + 0x20 + i * 4;
+       hw.irq = dev->irq;
+       hw.dev = &dev->dev;
+       hw.chipset = ide_pci;
+       ide_init_port_hw(hwif, &hw);
+       hwif->dev = &dev->dev;
+       hwif->cds = d;
+
+       idx[0] = hwif->index;
+
+       ide_device_add(idx, d);
+
+       return 0;
+}
+
 /**
  *     init_setup_scc  -       set up an SCC PATA Controller
  *     @dev: PCI device
- *     @d: IDE PCI device
+ *     @d: IDE port info
  *
  *     Perform the initial set up for this device.
  */
 
-static int __devinit init_setup_scc(struct pci_dev *dev, ide_pci_device_t *d)
+static int __devinit init_setup_scc(struct pci_dev *dev,
+                                   const struct ide_port_info *d)
 {
        unsigned long ctl_base;
        unsigned long dma_base;
@@ -556,10 +584,13 @@ static int __devinit init_setup_scc(struct pci_dev *dev, ide_pci_device_t *d)
        struct scc_ports *ports;
        int rc;
 
+       rc = pci_enable_device(dev);
+       if (rc)
+               goto end;
+
        rc = setup_mmio_scc(dev, d->name);
-       if (rc < 0) {
-               return rc;
-       }
+       if (rc < 0)
+               goto end;
 
        ports = pci_get_drvdata(dev);
        ctl_base = ports->ctl;
@@ -594,7 +625,10 @@ static int __devinit init_setup_scc(struct pci_dev *dev, ide_pci_device_t *d)
        out_be32((void*)mode_port, MODE_JCUSFEN);
        out_be32((void*)intmask_port, INTMASK_MSK);
 
-       return ide_setup_pci_device(dev, d);
+       rc = scc_ide_setup_pci_device(dev, d);
+
+ end:
+       return rc;
 }
 
 /**
@@ -605,7 +639,7 @@ static int __devinit init_setup_scc(struct pci_dev *dev, ide_pci_device_t *d)
 
 static void __devinit init_mmio_iops_scc(ide_hwif_t *hwif)
 {
-       struct pci_dev *dev = hwif->pci_dev;
+       struct pci_dev *dev = to_pci_dev(hwif->dev);
        struct scc_ports *ports = pci_get_drvdata(dev);
        unsigned long dma_base = ports->dma;
 
@@ -621,17 +655,6 @@ static void __devinit init_mmio_iops_scc(ide_hwif_t *hwif)
        hwif->OUTSW = scc_ide_outsw;
        hwif->OUTSL = scc_ide_outsl;
 
-       hwif->io_ports[IDE_DATA_OFFSET] = dma_base + 0x20;
-       hwif->io_ports[IDE_ERROR_OFFSET] = dma_base + 0x24;
-       hwif->io_ports[IDE_NSECTOR_OFFSET] = dma_base + 0x28;
-       hwif->io_ports[IDE_SECTOR_OFFSET] = dma_base + 0x2c;
-       hwif->io_ports[IDE_LCYL_OFFSET] = dma_base + 0x30;
-       hwif->io_ports[IDE_HCYL_OFFSET] = dma_base + 0x34;
-       hwif->io_ports[IDE_SELECT_OFFSET] = dma_base + 0x38;
-       hwif->io_ports[IDE_STATUS_OFFSET] = dma_base + 0x3c;
-       hwif->io_ports[IDE_CONTROL_OFFSET] = dma_base + 0x40;
-
-       hwif->irq = hwif->pci_dev->irq;
        hwif->dma_base = dma_base;
        hwif->config_data = ports->ctl;
        hwif->mmio = 1;
@@ -647,13 +670,19 @@ static void __devinit init_mmio_iops_scc(ide_hwif_t *hwif)
 
 static void __devinit init_iops_scc(ide_hwif_t *hwif)
 {
-       struct pci_dev *dev =  hwif->pci_dev;
+       struct pci_dev *dev = to_pci_dev(hwif->dev);
+
        hwif->hwif_data = NULL;
        if (pci_get_drvdata(dev) == NULL)
                return;
        init_mmio_iops_scc(hwif);
 }
 
+static u8 __devinit scc_cable_detect(ide_hwif_t *hwif)
+{
+       return ATA_CBL_PATA80;
+}
+
 /**
  *     init_hwif_scc   -       set up hwif
  *     @hwif: interface to set up
@@ -683,22 +712,17 @@ static void __devinit init_hwif_scc(ide_hwif_t *hwif)
        hwif->ide_dma_test_irq = scc_dma_test_irq;
        hwif->udma_filter = scc_udma_filter;
 
-       hwif->drives[0].autotune = IDE_TUNE_AUTO;
-       hwif->drives[1].autotune = IDE_TUNE_AUTO;
-
        if (in_be32((void __iomem *)(hwif->config_data + 0xff0)) & CCKCTRL_ATACLKOEN)
                hwif->ultra_mask = ATA_UDMA6; /* 133MHz */
        else
                hwif->ultra_mask = ATA_UDMA5; /* 100MHz */
 
-       /* we support 80c cable only. */
-       hwif->cbl = ATA_CBL_PATA80;
+       hwif->cable_detect = scc_cable_detect;
 }
 
 #define DECLARE_SCC_DEV(name_str)                      \
   {                                                    \
       .name            = name_str,                     \
-      .init_setup      = init_setup_scc,               \
       .init_iops       = init_iops_scc,                \
       .init_hwif       = init_hwif_scc,                \
       .host_flags      = IDE_HFLAG_SINGLE |            \
@@ -706,7 +730,7 @@ static void __devinit init_hwif_scc(ide_hwif_t *hwif)
       .pio_mask                = ATA_PIO4,                     \
   }
 
-static ide_pci_device_t scc_chipsets[] __devinitdata = {
+static const struct ide_port_info scc_chipsets[] __devinitdata = {
        /* 0 */ DECLARE_SCC_DEV("sccIDE"),
 };
 
@@ -721,8 +745,7 @@ static ide_pci_device_t scc_chipsets[] __devinitdata = {
 
 static int __devinit scc_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
-       ide_pci_device_t *d = &scc_chipsets[id->driver_data];
-       return d->init_setup(dev, d);
+       return init_setup_scc(dev, &scc_chipsets[id->driver_data]);
 }
 
 /**
@@ -742,10 +765,8 @@ static void __devexit scc_remove(struct pci_dev *dev)
        unsigned long dma_size = pci_resource_len(dev, 1);
 
        if (hwif->dmatable_cpu) {
-               pci_free_consistent(hwif->pci_dev,
-                                   PRD_ENTRIES * PRD_BYTES,
-                                   hwif->dmatable_cpu,
-                                   hwif->dmatable_dma);
+               pci_free_consistent(dev, PRD_ENTRIES * PRD_BYTES,
+                                   hwif->dmatable_cpu, hwif->dmatable_dma);
                hwif->dmatable_cpu = NULL;
        }
 
This page took 0.027831 seconds and 5 git commands to generate.