]> err.no Git - linux-2.6/blobdiff - drivers/ide/pci/sl82c105.c
it821x: add ->remove method and module_exit()
[linux-2.6] / drivers / ide / pci / sl82c105.c
index 2c2fe59a0d9ea27691690297cdd7cc7203207c6f..be22f8125d7107093b57ff6eb3b37d81260283b4 100644 (file)
  */
 static unsigned int get_pio_timings(ide_drive_t *drive, u8 pio)
 {
+       struct ide_timing *t = ide_timing_find_mode(XFER_PIO_0 + pio);
        unsigned int cmd_on, cmd_off;
        u8 iordy = 0;
 
-       cmd_on  = (ide_pio_timings[pio].active_time + 29) / 30;
+       cmd_on  = (t->active + 29) / 30;
        cmd_off = (ide_pio_cycle_time(drive, pio) - 30 * cmd_on + 29) / 30;
 
        if (cmd_on == 0)
@@ -156,9 +157,9 @@ static void sl82c105_dma_lost_irq(ide_drive_t *drive)
         * Was DMA enabled?  If so, disable it - we're resetting the
         * host.  The IDE layer will be handling the drive for us.
         */
-       dma_cmd = inb(hwif->dma_command);
+       dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD);
        if (dma_cmd & 1) {
-               outb(dma_cmd & ~1, hwif->dma_command);
+               outb(dma_cmd & ~1, hwif->dma_base + ATA_DMA_CMD);
                printk("sl82c105: DMA was enabled\n");
        }
 
@@ -282,43 +283,36 @@ static unsigned int __devinit init_chipset_sl82c105(struct pci_dev *dev, const c
        return dev->irq;
 }
 
-/*
- * Initialise IDE channel
- */
-static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif)
-{
-       DBG(("init_hwif_sl82c105(hwif: ide%d)\n", hwif->index));
-
-       if (!hwif->dma_base)
-               return;
-
-       hwif->dma_lost_irq              = &sl82c105_dma_lost_irq;
-       hwif->dma_start                 = &sl82c105_dma_start;
-       hwif->ide_dma_end               = &sl82c105_dma_end;
-       hwif->dma_timeout               = &sl82c105_dma_timeout;
-
-       if (hwif->mate)
-               hwif->serialized = hwif->mate->serialized = 1;
-}
-
 static const struct ide_port_ops sl82c105_port_ops = {
        .set_pio_mode           = sl82c105_set_pio_mode,
        .set_dma_mode           = sl82c105_set_dma_mode,
        .resetproc              = sl82c105_resetproc,
 };
 
+static const struct ide_dma_ops sl82c105_dma_ops = {
+       .dma_host_set           = ide_dma_host_set,
+       .dma_setup              = ide_dma_setup,
+       .dma_exec_cmd           = ide_dma_exec_cmd,
+       .dma_start              = sl82c105_dma_start,
+       .dma_end                = sl82c105_dma_end,
+       .dma_test_irq           = ide_dma_test_irq,
+       .dma_lost_irq           = sl82c105_dma_lost_irq,
+       .dma_timeout            = sl82c105_dma_timeout,
+};
+
 static const struct ide_port_info sl82c105_chipset __devinitdata = {
        .name           = "W82C105",
        .init_chipset   = init_chipset_sl82c105,
-       .init_hwif      = init_hwif_sl82c105,
        .enablebits     = {{0x40,0x01,0x01}, {0x40,0x10,0x10}},
        .port_ops       = &sl82c105_port_ops,
+       .dma_ops        = &sl82c105_dma_ops,
        .host_flags     = IDE_HFLAG_IO_32BIT |
                          IDE_HFLAG_UNMASK_IRQS |
 /* FIXME: check for Compatibility mode in generic IDE PCI code */
 #if defined(CONFIG_LOPEC) || defined(CONFIG_SANDPOINT)
                          IDE_HFLAG_FORCE_LEGACY_IRQS |
 #endif
+                         IDE_HFLAG_SERIALIZE_DMA |
                          IDE_HFLAG_NO_AUTODMA,
        .pio_mask       = ATA_PIO5,
        .mwdma_mask     = ATA_MWDMA2,
@@ -336,11 +330,12 @@ static int __devinit sl82c105_init_one(struct pci_dev *dev, const struct pci_dev
                 */
                printk(KERN_INFO "W82C105_IDE: Winbond W83C553 bridge "
                                 "revision %d, BM-DMA disabled\n", rev);
-               d.init_hwif = NULL;
+               d.dma_ops = NULL;
                d.mwdma_mask = 0;
+               d.host_flags &= ~IDE_HFLAG_SERIALIZE_DMA;
        }
 
-       return ide_setup_pci_device(dev, &d);
+       return ide_pci_init_one(dev, &d, NULL);
 }
 
 static const struct pci_device_id sl82c105_pci_tbl[] = {