fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / ide / pci / cs5520.c
index dc0f6c8..ba6786a 100644 (file)
@@ -32,7 +32,6 @@
  *
  */
  
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <linux/ide.h>
+#include <linux/dma-mapping.h>
 
 #include <asm/io.h>
 #include <asm/irq.h>
 
-#include "cs5520.h"
-
-#if defined(DISPLAY_CS5520_TIMINGS) && defined(CONFIG_PROC_FS)
-#include <linux/stat.h>
-#include <linux/proc_fs.h>
-
-static u8 cs5520_proc = 0;
-static struct pci_dev *bmide_dev;
-
-static int cs5520_get_info(char *buffer, char **addr, off_t offset, int count)
-{
-       char *p = buffer;
-       unsigned long bmiba = pci_resource_start(bmide_dev, 2);
-       int len;
-       u8 c0 = 0, c1 = 0;
-       u16 reg16;
-       u32 reg32;
-
-       /*
-        * at that point bibma+0x2 et bibma+0xa are byte registers
-        * to investigate:
-        */
-       c0 = inb(bmiba + 0x02);
-       c1 = inb(bmiba + 0x0a);
-       
-       p += sprintf(p, "\nCyrix CS55x0 IDE\n");
-       p += sprintf(p, "--------------- Primary Channel "
-                       "---------------- Secondary Channel "
-                       "-------------\n");
-       p += sprintf(p, "                %sabled "
-                       "                        %sabled\n",
-                       (c0&0x80) ? "dis" : " en",
-                       (c1&0x80) ? "dis" : " en");
-                       
-       p += sprintf(p, "\n\nTimings: \n");
-       
-       pci_read_config_word(bmide_dev, 0x62, &reg16);
-       p += sprintf(p, "8bit CAT/CRT   : %04x\n", reg16);
-       pci_read_config_dword(bmide_dev, 0x64, &reg32);
-       p += sprintf(p, "16bit Primary  : %08x\n", reg32);
-       pci_read_config_dword(bmide_dev, 0x68, &reg32);
-       p += sprintf(p, "16bit Secondary: %08x\n", reg32);
-       
-       len = (p - buffer) - offset;
-       *addr = buffer + offset;
-       
-       return len > count ? count : len;
-}
-
-#endif
-
 struct pio_clocks
 {
        int address;
@@ -109,7 +58,7 @@ struct pio_clocks
        int recovery;
 };
 
-struct pio_clocks cs5520_pio_clocks[]={
+static struct pio_clocks cs5520_pio_clocks[]={
        {3, 6, 11},
        {2, 5, 6},
        {1, 4, 3},
@@ -144,12 +93,14 @@ static int cs5520_tune_chipset(ide_drive_t *drive, u8 xferspeed)
        printk("PIO clocking = %d\n", pio);
        
        /* FIXME: if DMA = 1 do we need to set the DMA bit here ? */
-       
-       /* 8bit command timing for channel */
+
+       /* 8bit CAT/CRT - 8bit command timing for channel */
        pci_write_config_byte(pdev, 0x62 + controller, 
                (cs5520_pio_clocks[pio].recovery << 4) |
                (cs5520_pio_clocks[pio].assert));
-               
+
+       /* 0x64 - 16bit Primary, 0x68 - 16bit Secondary */
+
        /* FIXME: should these use address ? */
        /* Data read timing */
        pci_write_config_byte(pdev, 0x64 + 4*controller + (drive->dn&1),
@@ -188,19 +139,6 @@ static int cs5520_config_drive_xfer_rate(ide_drive_t *drive)
        /* Then tell the core to use DMA operations */
        return hwif->ide_dma_on(drive);
 }
-       
-       
-static unsigned int __devinit init_chipset_cs5520(struct pci_dev *dev, const char *name)
-{
-#if defined(DISPLAY_CS5520_TIMINGS) && defined(CONFIG_PROC_FS)
-       if (!cs5520_proc) {
-               cs5520_proc = 1;
-               bmide_dev = dev;
-               ide_pci_create_host_proc("cs5520", cs5520_get_info);
-       }
-#endif /* DISPLAY_CS5520_TIMINGS && CONFIG_PROC_FS */
-       return 0;
-}
 
 /*
  *     We provide a callback for our nonstandard DMA location
@@ -251,7 +189,23 @@ static void __devinit init_hwif_cs5520(ide_hwif_t *hwif)
        hwif->drives[0].autodma = hwif->autodma;
        hwif->drives[1].autodma = hwif->autodma;
 }
-               
+
+#define DECLARE_CS_DEV(name_str)                               \
+       {                                                       \
+               .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,        \
+       }
+
+static ide_pci_device_t cyrix_chipsets[] __devinitdata = {
+       /* 0 */ DECLARE_CS_DEV("Cyrix 5510"),
+       /* 1 */ DECLARE_CS_DEV("Cyrix 5520")
+};
+
 /*
  *     The 5510/5520 are a bit weird. They don't quite set up the way
  *     the PCI helper layer expects so we must do much of the set up 
@@ -267,14 +221,15 @@ static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_devic
 
        /* 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))
-       {
+       if (pci_enable_device_bars(dev, 1<<2)) {
                printk(KERN_WARNING "%s: Unable to enable 55x0.\n", d->name);
-               return 1;
+               return -ENODEV;
        }
        pci_set_master(dev);
-       pci_set_dma_mask(dev, 0xFFFFFFFF);
-       init_chipset_cs5520(dev, d->name);
+       if (pci_set_dma_mask(dev, DMA_32BIT_MASK)) {
+               printk(KERN_WARNING "cs5520: No suitable DMA available.\n");
+               return -ENODEV;
+       }
 
        index.all = 0xf0f0;
 
@@ -283,10 +238,8 @@ static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_devic
         *      do all the device setup for us
         */
 
-       ide_pci_setup_ports(dev, d, 1, 14, &index);
+       ide_pci_setup_ports(dev, d, 14, &index);
 
-       printk("Index.b %d %d\n", index.b.low, index.b.high);
-       mdelay(2000);
        if((index.b.low & 0xf0) != 0xf0)
                probe_hwif_init(&ide_hwifs[index.b.low]);
        if((index.b.high & 0xf0) != 0xf0)
@@ -302,12 +255,12 @@ static struct pci_device_id cs5520_pci_tbl[] = {
 MODULE_DEVICE_TABLE(pci, cs5520_pci_tbl);
 
 static struct pci_driver driver = {
-       .name           = "CyrixIDE",
+       .name           = "Cyrix_IDE",
        .id_table       = cs5520_pci_tbl,
        .probe          = cs5520_init_one,
 };
 
-static int cs5520_ide_init(void)
+static int __init cs5520_ide_init(void)
 {
        return ide_pci_register_driver(&driver);
 }