Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/pci-2.6
[safe/jmp/linux-2.6] / drivers / ide / pci / cs5520.c
index af67438..eb68a9a 100644 (file)
@@ -66,31 +66,12 @@ static struct pio_clocks cs5520_pio_clocks[]={
        {1, 2, 1}
 };
 
-static int cs5520_tune_chipset(ide_drive_t *drive, const u8 speed)
+static void cs5520_set_pio_mode(ide_drive_t *drive, const u8 pio)
 {
        ide_hwif_t *hwif = HWIF(drive);
-       struct pci_dev *pdev = hwif->pci_dev;
-       int pio = speed;
-       u8 reg;
+       struct pci_dev *pdev = to_pci_dev(hwif->dev);
        int controller = drive->dn > 1 ? 1 : 0;
-       int error;
 
-       switch(speed)
-       {
-               case XFER_PIO_4:
-               case XFER_PIO_3:
-               case XFER_PIO_2:
-               case XFER_PIO_1:
-               case XFER_PIO_0:
-                       pio -= XFER_PIO_0;
-                       break;
-               default:
-                       pio = 0;
-                       printk(KERN_ERR "cs55x0: bad ide timing.\n");
-       }
-       
-       printk("PIO clocking = %d\n", pio);
-       
        /* FIXME: if DMA = 1 do we need to set the DMA bit here ? */
 
        /* 8bit CAT/CRT - 8bit command timing for channel */
@@ -109,97 +90,54 @@ static int cs5520_tune_chipset(ide_drive_t *drive, const u8 speed)
        pci_write_config_byte(pdev, 0x66 + 4*controller + (drive->dn&1),
                (cs5520_pio_clocks[pio].recovery << 4) |
                (cs5520_pio_clocks[pio].assert));
-               
-       /* Set the DMA enable/disable flag */
-       reg = inb(hwif->dma_base + 0x02 + 8*controller);
-       reg |= 1<<((drive->dn&1)+5);
-       outb(reg, hwif->dma_base + 0x02 + 8*controller);
-               
-       error = ide_config_drive_speed(drive, speed);
-       /* ATAPI is harder so leave it for now */
-       if(!error && drive->media == ide_disk)
-               error = hwif->ide_dma_on(drive);
-
-       return error;
-}      
-       
-static void cs5520_tune_drive(ide_drive_t *drive, u8 pio)
-{
-       pio = ide_get_best_pio_mode(drive, pio, 4);
-       cs5520_tune_chipset(drive, (XFER_PIO_0 + pio));
 }
 
-static int cs5520_config_drive_xfer_rate(ide_drive_t *drive)
+static void cs5520_set_dma_mode(ide_drive_t *drive, const u8 speed)
 {
-       /* Tune the drive for PIO modes up to PIO 4 */  
-       cs5520_tune_drive(drive, 255);
-
-       /* Then tell the core to use DMA operations */
-       return 0;
-}
+       printk(KERN_ERR "cs55x0: bad ide timing.\n");
 
-/*
- *     We provide a callback for our nonstandard DMA location
- */
-
-static void __devinit cs5520_init_setup_dma(struct pci_dev *dev, ide_pci_device_t *d, ide_hwif_t *hwif)
-{
-       unsigned long bmide = pci_resource_start(dev, 2);       /* Not the usual 4 */
-       if(hwif->mate && hwif->mate->dma_base)  /* Second channel at primary + 8 */
-               bmide += 8;
-       ide_setup_dma(hwif, bmide, 8);
+       cs5520_set_pio_mode(drive, 0);
 }
 
 /*
  *     We wrap the DMA activate to set the vdma flag. This is needed
  *     so that the IDE DMA layer issues PIO not DMA commands over the
  *     DMA channel
+ *
+ *     ATAPI is harder so disable it for now using IDE_HFLAG_NO_ATAPI_DMA
  */
-static int cs5520_dma_on(ide_drive_t *drive)
+
+static void cs5520_dma_host_set(ide_drive_t *drive, int on)
 {
-       drive->vdma = 1;
-       return 0;
+       drive->vdma = on;
+       ide_dma_host_set(drive, on);
 }
 
 static void __devinit init_hwif_cs5520(ide_hwif_t *hwif)
 {
-       hwif->tuneproc = &cs5520_tune_drive;
-       hwif->speedproc = &cs5520_tune_chipset;
-       hwif->ide_dma_check = &cs5520_config_drive_xfer_rate;
-       hwif->ide_dma_on = &cs5520_dma_on;
+       hwif->set_pio_mode = &cs5520_set_pio_mode;
+       hwif->set_dma_mode = &cs5520_set_dma_mode;
 
-       if(!noautodma)
-               hwif->autodma = 1;
-       
-       if(!hwif->dma_base)
-       {
-               hwif->drives[0].autotune = 1;
-               hwif->drives[1].autotune = 1;
+       if (hwif->dma_base == 0)
                return;
-       }
-       
-       hwif->atapi_dma = 0;
-       hwif->ultra_mask = 0;
-       hwif->swdma_mask = 0;
-       hwif->mwdma_mask = 0;
-       
-       hwif->drives[0].autodma = hwif->autodma;
-       hwif->drives[1].autodma = hwif->autodma;
+
+       hwif->dma_host_set = &cs5520_dma_host_set;
 }
 
 #define DECLARE_CS_DEV(name_str)                               \
        {                                                       \
                .name           = name_str,                     \
-               .init_setup_dma = cs5520_init_setup_dma,        \
                .init_hwif      = init_hwif_cs5520,             \
-               .autodma        = AUTODMA,                      \
-               .bootable       = ON_BOARD,                     \
-               .host_flags     = IDE_HFLAG_ISA_PORTS,          \
+               .host_flags     = IDE_HFLAG_ISA_PORTS |         \
+                                 IDE_HFLAG_CS5520 |            \
+                                 IDE_HFLAG_VDMA |              \
+                                 IDE_HFLAG_NO_ATAPI_DMA |      \
+                                 IDE_HFLAG_ABUSE_SET_DMA_MODE |\
+                                 IDE_HFLAG_BOOTABLE,           \
                .pio_mask       = ATA_PIO4,                     \
        }
 
-static ide_pci_device_t cyrix_chipsets[] __devinitdata = {
+static const struct ide_port_info cyrix_chipsets[] __devinitdata = {
        /* 0 */ DECLARE_CS_DEV("Cyrix 5510"),
        /* 1 */ DECLARE_CS_DEV("Cyrix 5520")
 };
@@ -212,15 +150,20 @@ static ide_pci_device_t cyrix_chipsets[] __devinitdata = {
  
 static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
-       ide_hwif_t *hwif = NULL, *mate = NULL;
-       ata_index_t index;
-       ide_pci_device_t *d = &cyrix_chipsets[id->driver_data];
+       const struct ide_port_info *d = &cyrix_chipsets[id->driver_data];
+       u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
 
        ide_setup_pci_noise(dev, d);
 
        /* We must not grab the entire device, it has 'ISA' space in its
-          BARS too and we will freak out other bits of the kernel */
-       if (pci_enable_device_bars(dev, 1<<2)) {
+        * BARS too and we will freak out other bits of the kernel
+        *
+        * pci_enable_device_bars() is going away. I replaced it with
+        * IO only enable for now but I'll need confirmation this is
+        * allright for that device. If not, it will need some kind of
+        * quirk. --BenH.
+        */
+       if (pci_enable_device_io(dev)) {
                printk(KERN_WARNING "%s: Unable to enable 55x0.\n", d->name);
                return -ENODEV;
        }
@@ -230,36 +173,21 @@ static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_devic
                return -ENODEV;
        }
 
-       index.all = 0xf0f0;
-
        /*
         *      Now the chipset is configured we can let the core
         *      do all the device setup for us
         */
 
-       ide_pci_setup_ports(dev, d, 14, &index);
-
-       if ((index.b.low & 0xf0) != 0xf0)
-               hwif = &ide_hwifs[index.b.low];
-       if ((index.b.high & 0xf0) != 0xf0)
-               mate = &ide_hwifs[index.b.high];
-
-       if (hwif)
-               probe_hwif_init(hwif);
-       if (mate)
-               probe_hwif_init(mate);
+       ide_pci_setup_ports(dev, d, 14, &idx[0]);
 
-       if (hwif)
-               ide_proc_register_port(hwif);
-       if (mate)
-               ide_proc_register_port(mate);
+       ide_device_add(idx);
 
        return 0;
 }
 
-static struct pci_device_id cs5520_pci_tbl[] = {
-       { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5510, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5520, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1},
+static const struct pci_device_id cs5520_pci_tbl[] = {
+       { PCI_VDEVICE(CYRIX, PCI_DEVICE_ID_CYRIX_5510), 0 },
+       { PCI_VDEVICE(CYRIX, PCI_DEVICE_ID_CYRIX_5520), 1 },
        { 0, },
 };
 MODULE_DEVICE_TABLE(pci, cs5520_pci_tbl);