]> err.no Git - linux-2.6/blobdiff - drivers/ide/arm/icside.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6
[linux-2.6] / drivers / ide / arm / icside.c
index 8d2cc47a362e1cf1f9d21186a6c0116eda2f2ce5..061456914ca352469ca644df2e83e311ac92d9fb 100644 (file)
@@ -191,6 +191,10 @@ static void icside_maskproc(ide_drive_t *drive, int mask)
        local_irq_restore(flags);
 }
 
+static const struct ide_port_ops icside_v6_no_dma_port_ops = {
+       .maskproc               = icside_maskproc,
+};
+
 #ifdef CONFIG_BLK_DEV_IDEDMA_ICS
 /*
  * SG-DMA support.
@@ -266,6 +270,11 @@ static void icside_set_dma_mode(ide_drive_t *drive, const u8 xfer_mode)
                ide_xfer_verbose(xfer_mode), 2000 / drive->drive_data);
 }
 
+static const struct ide_port_ops icside_v6_port_ops = {
+       .set_dma_mode           = icside_set_dma_mode,
+       .maskproc               = icside_maskproc,
+};
+
 static void icside_dma_host_set(ide_drive_t *drive, int on)
 {
 }
@@ -365,7 +374,7 @@ static void icside_dma_timeout(ide_drive_t *drive)
        if (icside_dma_test_irq(drive))
                return;
 
-       ide_dump_status(drive, "DMA timeout", HWIF(drive)->INB(IDE_STATUS_REG));
+       ide_dump_status(drive, "DMA timeout", ide_read_status(drive));
 
        icside_dma_end(drive);
 }
@@ -375,51 +384,57 @@ static void icside_dma_lost_irq(ide_drive_t *drive)
        printk(KERN_ERR "%s: IRQ lost\n", drive->name);
 }
 
-static void icside_dma_init(ide_hwif_t *hwif)
+static int icside_dma_init(ide_hwif_t *hwif, const struct ide_port_info *d)
 {
-       hwif->mwdma_mask        = 7; /* MW0..2 */
-       hwif->swdma_mask        = 7; /* SW0..2 */
-
        hwif->dmatable_cpu      = NULL;
        hwif->dmatable_dma      = 0;
-       hwif->set_dma_mode      = icside_set_dma_mode;
-
-       hwif->dma_host_set      = icside_dma_host_set;
-       hwif->dma_setup         = icside_dma_setup;
-       hwif->dma_exec_cmd      = icside_dma_exec_cmd;
-       hwif->dma_start         = icside_dma_start;
-       hwif->ide_dma_end       = icside_dma_end;
-       hwif->ide_dma_test_irq  = icside_dma_test_irq;
-       hwif->dma_timeout       = icside_dma_timeout;
-       hwif->dma_lost_irq      = icside_dma_lost_irq;
+
+       return 0;
 }
+
+static const struct ide_dma_ops icside_v6_dma_ops = {
+       .dma_host_set           = icside_dma_host_set,
+       .dma_setup              = icside_dma_setup,
+       .dma_exec_cmd           = icside_dma_exec_cmd,
+       .dma_start              = icside_dma_start,
+       .dma_end                = icside_dma_end,
+       .dma_test_irq           = icside_dma_test_irq,
+       .dma_timeout            = icside_dma_timeout,
+       .dma_lost_irq           = icside_dma_lost_irq,
+};
 #else
-#define icside_dma_init(hwif)  (0)
+#define icside_v6_dma_ops NULL
 #endif
 
+static int icside_dma_off_init(ide_hwif_t *hwif, const struct ide_port_info *d)
+{
+       return -EOPNOTSUPP;
+}
+
 static ide_hwif_t *
 icside_setup(void __iomem *base, struct cardinfo *info, struct expansion_card *ec)
 {
        unsigned long port = (unsigned long)base + info->dataoffset;
        ide_hwif_t *hwif;
 
-       hwif = ide_find_port(port);
+       hwif = ide_find_port();
        if (hwif) {
-               int i;
-
                /*
                 * Ensure we're using MMIO
                 */
                default_hwif_mmiops(hwif);
-               hwif->mmio = 1;
 
-               for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
-                       hwif->io_ports[i] = port;
-                       port += 1 << info->stepping;
-               }
-               hwif->io_ports[IDE_CONTROL_OFFSET] = (unsigned long)base + info->ctrloffset;
+               hwif->io_ports.data_addr = port;
+               hwif->io_ports.error_addr = port + (1 << info->stepping);
+               hwif->io_ports.nsect_addr = port + (2 << info->stepping);
+               hwif->io_ports.lbal_addr = port + (3 << info->stepping);
+               hwif->io_ports.lbam_addr = port + (4 << info->stepping);
+               hwif->io_ports.lbah_addr = port + (5 << info->stepping);
+               hwif->io_ports.device_addr = port + (6 << info->stepping);
+               hwif->io_ports.status_addr = port + (7 << info->stepping);
+               hwif->io_ports.ctl_addr =
+                       (unsigned long)base + info->ctrloffset;
                hwif->irq     = ec->irq;
-               hwif->noprobe = 0;
                hwif->chipset = ide_acorn;
                hwif->gendev.parent = &ec->dev;
                hwif->dev = &ec->dev;
@@ -459,11 +474,20 @@ icside_register_v5(struct icside_state *state, struct expansion_card *ec)
 
        idx[0] = hwif->index;
 
-       ide_device_add(idx);
+       ide_device_add(idx, NULL);
 
        return 0;
 }
 
+static const struct ide_port_info icside_v6_port_info __initdata = {
+       .init_dma               = icside_dma_off_init,
+       .port_ops               = &icside_v6_no_dma_port_ops,
+       .dma_ops                = &icside_v6_dma_ops,
+       .host_flags             = IDE_HFLAG_SERIALIZE | IDE_HFLAG_MMIO,
+       .mwdma_mask             = ATA_MWDMA2,
+       .swdma_mask             = ATA_SWDMA2,
+};
+
 static int __init
 icside_register_v6(struct icside_state *state, struct expansion_card *ec)
 {
@@ -472,6 +496,7 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
        unsigned int sel = 0;
        int ret;
        u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
+       struct ide_port_info d = icside_v6_port_info;
 
        ioc_base = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0);
        if (!ioc_base) {
@@ -520,31 +545,24 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
        state->hwif[0]    = hwif;
        state->hwif[1]    = mate;
 
-       hwif->maskproc    = icside_maskproc;
-       hwif->channel     = 0;
        hwif->hwif_data   = state;
-       hwif->mate        = mate;
-       hwif->serialized  = 1;
        hwif->config_data = (unsigned long)ioc_base;
        hwif->select_data = sel;
 
-       mate->maskproc    = icside_maskproc;
-       mate->channel     = 1;
        mate->hwif_data   = state;
-       mate->mate        = hwif;
-       mate->serialized  = 1;
        mate->config_data = (unsigned long)ioc_base;
        mate->select_data = sel | 1;
 
        if (ec->dma != NO_DMA && !request_dma(ec->dma, hwif->name)) {
-               icside_dma_init(hwif);
-               icside_dma_init(mate);
+               d.init_dma = icside_dma_init;
+               d.port_ops = &icside_v6_port_ops;
+               d.dma_ops = NULL;
        }
 
        idx[0] = hwif->index;
        idx[1] = mate->index;
 
-       ide_device_add(idx);
+       ide_device_add(idx, &d);
 
        return 0;