fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / ide / pci / amd74xx.c
index 5093d3c..a433699 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * Version 2.13
  *
- * AMD 755/756/766/8111 and nVidia nForce/2/2s/3/3s IDE driver for Linux.
+ * AMD 755/756/766/8111 and nVidia nForce/2/2s/3/3s/CK804/MCP04
+ * IDE driver for Linux.
  *
  * Copyright (c) 2000-2002 Vojtech Pavlik
  *
@@ -15,7 +16,6 @@
  * the Free Software Foundation.
  */
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/ioport.h>
@@ -26,7 +26,8 @@
 #include <asm/io.h>
 
 #include "ide-timing.h"
-#include "amd74xx.h"
+
+#define DISPLAY_AMD_TIMINGS
 
 #define AMD_IDE_ENABLE         (0x00 + amd_config->base)
 #define AMD_IDE_CONFIG         (0x01 + amd_config->base)
@@ -68,6 +69,14 @@ static struct amd_ide_chip {
        { PCI_DEVICE_ID_NVIDIA_NFORCE3S_IDE,    0x50, AMD_UDMA_133 },
        { PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA,   0x50, AMD_UDMA_133 },
        { PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2,  0x50, AMD_UDMA_133 },
+       { PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE,        0x50, AMD_UDMA_133 },
+       { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE,        0x50, AMD_UDMA_133 },
+       { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE,        0x50, AMD_UDMA_133 },
+       { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE,        0x50, AMD_UDMA_133 },
+       { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE,        0x50, AMD_UDMA_133 },
+       { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE,        0x50, AMD_UDMA_133 },
+       { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE,        0x50, AMD_UDMA_133 },
+       { PCI_DEVICE_ID_AMD_CS5536_IDE,                 0x40, AMD_UDMA_100 },
        { 0 }
 };
 
@@ -304,7 +313,7 @@ static int amd74xx_ide_dma_check(ide_drive_t *drive)
  * and initialize its drive independent registers.
  */
 
-static unsigned int __init init_chipset_amd74xx(struct pci_dev *dev, const char *name)
+static unsigned int __devinit init_chipset_amd74xx(struct pci_dev *dev, const char *name)
 {
        unsigned char t;
        unsigned int u;
@@ -340,10 +349,8 @@ static unsigned int __init init_chipset_amd74xx(struct pci_dev *dev, const char
                        break;
 
                case AMD_UDMA_66:
-                       pci_read_config_dword(dev, AMD_UDMA_TIMING, &u);
-                       for (i = 24; i >= 0; i -= 8)
-                               if ((u >> i) & 4)
-                                       amd_80w |= (1 << (1 - (i >> 4)));
+                       /* no host side cable detection */
+                       amd_80w = 0x03;
                        break;
        }
 
@@ -379,8 +386,6 @@ static unsigned int __init init_chipset_amd74xx(struct pci_dev *dev, const char
        if (amd_clock < 20000 || amd_clock > 50000) {
                printk(KERN_WARNING "%s: User given PCI clock speed impossible (%d), using 33 MHz instead.\n",
                        amd_chipset->name, amd_clock);
-               printk(KERN_WARNING "%s: Use ide0=ata66 if you want to assume 80-wire cable\n",
-                       amd_chipset->name);
                amd_clock = 33333;
        }
 
@@ -408,10 +413,13 @@ static unsigned int __init init_chipset_amd74xx(struct pci_dev *dev, const char
        return dev->irq;
 }
 
-static void __init init_hwif_amd74xx(ide_hwif_t *hwif)
+static void __devinit init_hwif_amd74xx(ide_hwif_t *hwif)
 {
        int i;
 
+       if (hwif->irq == 0) /* 0 is bogus but will do for now */
+               hwif->irq = pci_get_legacy_ide_irq(hwif->pci_dev, hwif->channel);
+
        hwif->autodma = 0;
 
        hwif->tuneproc = &amd74xx_tune_drive;
@@ -441,14 +449,63 @@ static void __init init_hwif_amd74xx(ide_hwif_t *hwif)
         hwif->drives[1].autodma = hwif->autodma;
 }
 
+#define DECLARE_AMD_DEV(name_str)                                      \
+       {                                                               \
+               .name           = name_str,                             \
+               .init_chipset   = init_chipset_amd74xx,                 \
+               .init_hwif      = init_hwif_amd74xx,                    \
+               .channels       = 2,                                    \
+               .autodma        = AUTODMA,                              \
+               .enablebits     = {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, \
+               .bootable       = ON_BOARD,                             \
+       }
+
+#define DECLARE_NV_DEV(name_str)                                       \
+       {                                                               \
+               .name           = name_str,                             \
+               .init_chipset   = init_chipset_amd74xx,                 \
+               .init_hwif      = init_hwif_amd74xx,                    \
+               .channels       = 2,                                    \
+               .autodma        = AUTODMA,                              \
+               .enablebits     = {{0x50,0x02,0x02}, {0x50,0x01,0x01}}, \
+               .bootable       = ON_BOARD,                             \
+       }
+
+static ide_pci_device_t amd74xx_chipsets[] __devinitdata = {
+       /*  0 */ DECLARE_AMD_DEV("AMD7401"),
+       /*  1 */ DECLARE_AMD_DEV("AMD7409"),
+       /*  2 */ DECLARE_AMD_DEV("AMD7411"),
+       /*  3 */ DECLARE_AMD_DEV("AMD7441"),
+       /*  4 */ DECLARE_AMD_DEV("AMD8111"),
+
+       /*  5 */ DECLARE_NV_DEV("NFORCE"),
+       /*  6 */ DECLARE_NV_DEV("NFORCE2"),
+       /*  7 */ DECLARE_NV_DEV("NFORCE2-U400R"),
+       /*  8 */ DECLARE_NV_DEV("NFORCE2-U400R-SATA"),
+       /*  9 */ DECLARE_NV_DEV("NFORCE3-150"),
+       /* 10 */ DECLARE_NV_DEV("NFORCE3-250"),
+       /* 11 */ DECLARE_NV_DEV("NFORCE3-250-SATA"),
+       /* 12 */ DECLARE_NV_DEV("NFORCE3-250-SATA2"),
+       /* 13 */ DECLARE_NV_DEV("NFORCE-CK804"),
+       /* 14 */ DECLARE_NV_DEV("NFORCE-MCP04"),
+       /* 15 */ DECLARE_NV_DEV("NFORCE-MCP51"),
+       /* 16 */ DECLARE_NV_DEV("NFORCE-MCP55"),
+       /* 17 */ DECLARE_NV_DEV("NFORCE-MCP61"),
+       /* 18 */ DECLARE_NV_DEV("NFORCE-MCP65"),
+       /* 19 */ DECLARE_NV_DEV("NFORCE-MCP67"),
+       /* 20 */ DECLARE_AMD_DEV("AMD5536"),
+};
+
 static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        amd_chipset = amd74xx_chipsets + id->driver_data;
        amd_config = amd_ide_chips + id->driver_data;
-       if (dev->device != amd_chipset->device) BUG();
-       if (dev->device != amd_config->id) BUG();
-       ide_setup_pci_device(dev, amd_chipset);
-       return 0;
+       if (dev->device != amd_config->id) {
+               printk(KERN_ERR "%s: assertion 0x%02x == 0x%02x failed !\n",
+                      pci_name(dev), dev->device, amd_config->id);
+               return -ENODEV;
+       }
+       return ide_setup_pci_device(dev, amd_chipset);
 }
 
 static struct pci_device_id amd74xx_pci_tbl[] = {
@@ -460,22 +517,34 @@ static struct pci_device_id amd74xx_pci_tbl[] = {
        { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_IDE,        PCI_ANY_ID, PCI_ANY_ID, 0, 0,  5 },
        { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2_IDE,       PCI_ANY_ID, PCI_ANY_ID, 0, 0,  6 },
        { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2S_IDE,      PCI_ANY_ID, PCI_ANY_ID, 0, 0,  7 },
+#ifdef CONFIG_BLK_DEV_IDE_SATA
        { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA,     PCI_ANY_ID, PCI_ANY_ID, 0, 0,  8 },
+#endif
        { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3_IDE,       PCI_ANY_ID, PCI_ANY_ID, 0, 0,  9 },
        { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_IDE,      PCI_ANY_ID, PCI_ANY_ID, 0, 0, 10 },
+#ifdef CONFIG_BLK_DEV_IDE_SATA
        { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA,     PCI_ANY_ID, PCI_ANY_ID, 0, 0, 11 },
        { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2,    PCI_ANY_ID, PCI_ANY_ID, 0, 0, 12 },
+#endif
+       { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 13 },
+       { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14 },
+       { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 15 },
+       { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 16 },
+       { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 17 },
+       { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 18 },
+       { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 19 },
+       { PCI_VENDOR_ID_AMD,    PCI_DEVICE_ID_AMD_CS5536_IDE,           PCI_ANY_ID, PCI_ANY_ID, 0, 0, 20 },
        { 0, },
 };
 MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl);
 
 static struct pci_driver driver = {
-       .name           = "AMD IDE",
+       .name           = "AMD_IDE",
        .id_table       = amd74xx_pci_tbl,
        .probe          = amd74xx_probe,
 };
 
-static int amd74xx_ide_init(void)
+static int __init amd74xx_ide_init(void)
 {
        return ide_pci_register_driver(&driver);
 }