]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/ide/pci/cs5520.c
cs5520: fix ->dma_base equal zero handling
[linux-2.6-omap-h63xx.git] / drivers / ide / pci / cs5520.c
index 400859a839f7dcd9b1fb4c25b1796a98e87a12cb..fbce90048aecfc0ad1389c7503ab4159cef4a409 100644 (file)
@@ -66,32 +66,13 @@ static struct pio_clocks cs5520_pio_clocks[]={
        {1, 2, 1}
 };
 
-static int cs5520_tune_chipset(ide_drive_t *drive, u8 xferspeed)
+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;
-       u8 speed = min((u8)XFER_PIO_4, xferspeed);
-       int pio = speed;
-       u8 reg;
        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);
-       
+       u8 reg;
+
        /* FIXME: if DMA = 1 do we need to set the DMA bit here ? */
 
        /* 8bit CAT/CRT - 8bit command timing for channel */
@@ -115,25 +96,19 @@ static int cs5520_tune_chipset(ide_drive_t *drive, u8 xferspeed)
        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)
+static void cs5520_set_dma_mode(ide_drive_t *drive, const u8 speed)
 {
-       pio = ide_get_best_pio_mode(drive, pio, 4, NULL);
-       cs5520_tune_chipset(drive, (XFER_PIO_0 + pio));
+       printk(KERN_ERR "cs55x0: bad ide timing.\n");
+
+       cs5520_set_pio_mode(drive, 0);
 }
 
 static int cs5520_config_drive_xfer_rate(ide_drive_t *drive)
 {
        /* Tune the drive for PIO modes up to PIO 4 */  
-       cs5520_tune_drive(drive, 4);
+       ide_set_max_pio(drive);
 
        /* Then tell the core to use DMA operations */
        return 0;
@@ -165,26 +140,26 @@ static int cs5520_dma_on(ide_drive_t *drive)
 
 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) {
+               hwif->drives[1].autotune = hwif->drives[0].autotune = 1;
                return;
        }
-       
+
+       hwif->ide_dma_check = &cs5520_config_drive_xfer_rate;
+       hwif->ide_dma_on = &cs5520_dma_on;
+
+       /* ATAPI is harder so leave it for now */
        hwif->atapi_dma = 0;
        hwif->ultra_mask = 0;
        hwif->swdma_mask = 0;
        hwif->mwdma_mask = 0;
-       
+
+       if (!noautodma)
+               hwif->autodma = 1;
+
        hwif->drives[0].autodma = hwif->autodma;
        hwif->drives[1].autodma = hwif->autodma;
 }
@@ -194,10 +169,10 @@ static void __devinit init_hwif_cs5520(ide_hwif_t *hwif)
                .name           = name_str,                     \
                .init_setup_dma = cs5520_init_setup_dma,        \
                .init_hwif      = init_hwif_cs5520,             \
-               .channels       = 2,                            \
                .autodma        = AUTODMA,                      \
                .bootable       = ON_BOARD,                     \
-               .flags          = IDEPCI_FLAG_ISA_PORTS,        \
+               .host_flags     = IDE_HFLAG_ISA_PORTS,          \
+               .pio_mask       = ATA_PIO4,                     \
        }
 
 static ide_pci_device_t cyrix_chipsets[] __devinitdata = {
@@ -213,6 +188,7 @@ 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];
 
@@ -239,10 +215,21 @@ static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_devic
 
        ide_pci_setup_ports(dev, d, 14, &index);
 
-       if((index.b.low & 0xf0) != 0xf0)
-               probe_hwif_init(&ide_hwifs[index.b.low]);
-       if((index.b.high & 0xf0) != 0xf0)
-               probe_hwif_init(&ide_hwifs[index.b.high]);
+       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);
+
+       if (hwif)
+               ide_proc_register_port(hwif);
+       if (mate)
+               ide_proc_register_port(mate);
+
        return 0;
 }