Merge master.kernel.org:/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw
[pandora-kernel.git] / drivers / ata / sata_promise.c
index 15c9437..a2778cf 100644 (file)
 #include "sata_promise.h"
 
 #define DRV_NAME       "sata_promise"
-#define DRV_VERSION    "1.04"
+#define DRV_VERSION    "1.05"
 
 
 enum {
        PDC_PKT_SUBMIT          = 0x40, /* Command packet pointer addr */
        PDC_INT_SEQMASK         = 0x40, /* Mask of asserted SEQ INTs */
-       PDC_TBG_MODE            = 0x41, /* TBG mode */
        PDC_FLASH_CTL           = 0x44, /* Flash control register */
-       PDC_PCI_CTL             = 0x48, /* PCI control and status register */
        PDC_GLOBAL_CTL          = 0x48, /* Global control/status (per port) */
        PDC_CTLSTAT             = 0x60, /* IDE control and status (per port) */
        PDC_SATA_PLUG_CSR       = 0x6C, /* SATA Plug control/status reg */
        PDC2_SATA_PLUG_CSR      = 0x60, /* SATAII Plug control/status reg */
-       PDC_SLEW_CTL            = 0x470, /* slew rate control reg */
+       PDC_TBG_MODE            = 0x41C, /* TBG mode (not SATAII) */
+       PDC_SLEW_CTL            = 0x470, /* slew rate control reg (not SATAII) */
 
        PDC_ERR_MASK            = (1<<19) | (1<<20) | (1<<21) | (1<<22) |
                                  (1<<8) | (1<<9) | (1<<10),
@@ -78,6 +77,9 @@ enum {
        PDC_COMMON_FLAGS        = ATA_FLAG_NO_LEGACY | ATA_FLAG_SRST |
                                  ATA_FLAG_MMIO | ATA_FLAG_NO_ATAPI |
                                  ATA_FLAG_PIO_POLLING,
+
+       /* hp->flags bits */
+       PDC_FLAG_GEN_II         = (1 << 0),
 };
 
 
@@ -87,13 +89,14 @@ struct pdc_port_priv {
 };
 
 struct pdc_host_priv {
+       unsigned long           flags;
        int                     hotplug_offset;
 };
 
 static u32 pdc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg);
 static void pdc_sata_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
 static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
-static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *regs);
+static irqreturn_t pdc_interrupt (int irq, void *dev_instance);
 static void pdc_eng_timeout(struct ata_port *ap);
 static int pdc_port_start(struct ata_port *ap);
 static void pdc_port_stop(struct ata_port *ap);
@@ -235,20 +238,20 @@ static const struct ata_port_info pdc_port_info[] = {
 
 static const struct pci_device_id pdc_ata_pci_tbl[] = {
        { PCI_VDEVICE(PROMISE, 0x3371), board_2037x },
-       { PCI_VDEVICE(PROMISE, 0x3570), board_2037x },
-       { PCI_VDEVICE(PROMISE, 0x3571), board_2037x },
        { PCI_VDEVICE(PROMISE, 0x3373), board_2037x },
        { PCI_VDEVICE(PROMISE, 0x3375), board_2037x },
        { PCI_VDEVICE(PROMISE, 0x3376), board_2037x },
+       { PCI_VDEVICE(PROMISE, 0x3570), board_2057x },
+       { PCI_VDEVICE(PROMISE, 0x3571), board_2057x },
        { PCI_VDEVICE(PROMISE, 0x3574), board_2057x },
+       { PCI_VDEVICE(PROMISE, 0x3d73), board_2057x },
        { PCI_VDEVICE(PROMISE, 0x3d75), board_2057x },
-       { PCI_VDEVICE(PROMISE, 0x3d73), board_2037x },
 
        { PCI_VDEVICE(PROMISE, 0x3318), board_20319 },
        { PCI_VDEVICE(PROMISE, 0x3319), board_20319 },
        { PCI_VDEVICE(PROMISE, 0x3515), board_20319 },
        { PCI_VDEVICE(PROMISE, 0x3519), board_20319 },
-       { PCI_VDEVICE(PROMISE, 0x3d17), board_20319 },
+       { PCI_VDEVICE(PROMISE, 0x3d17), board_40518 },
        { PCI_VDEVICE(PROMISE, 0x3d18), board_40518 },
 
        { PCI_VDEVICE(PROMISE, 0x6629), board_20619 },
@@ -260,6 +263,7 @@ static const struct pci_device_id pdc_ata_pci_tbl[] = {
 #if 0
        { PCI_VDEVICE(PROMISE, 0x3570), board_20771 },
 #endif
+       { PCI_VDEVICE(PROMISE, 0x3577), board_20771 },
 
        { }     /* terminate list */
 };
@@ -276,6 +280,7 @@ static struct pci_driver pdc_ata_pci_driver = {
 static int pdc_port_start(struct ata_port *ap)
 {
        struct device *dev = ap->host->dev;
+       struct pdc_host_priv *hp = ap->host->private_data;
        struct pdc_port_priv *pp;
        int rc;
 
@@ -297,6 +302,16 @@ static int pdc_port_start(struct ata_port *ap)
 
        ap->private_data = pp;
 
+       /* fix up PHYMODE4 align timing */
+       if ((hp->flags & PDC_FLAG_GEN_II) && sata_scr_valid(ap)) {
+               void __iomem *mmio = (void __iomem *) ap->ioaddr.scr_addr;
+               unsigned int tmp;
+
+               tmp = readl(mmio + 0x014);
+               tmp = (tmp & ~3) | 1;   /* set bits 1:0 = 0:1 */
+               writel(tmp, mmio + 0x014);
+       }
+
        return 0;
 
 err_out_kfree:
@@ -360,7 +375,7 @@ static void pdc_sata_phy_reset(struct ata_port *ap)
 static void pdc_pata_cbl_detect(struct ata_port *ap)
 {
        u8 tmp;
-       void __iomem *mmio = (void *) ap->ioaddr.cmd_addr + PDC_CTLSTAT + 0x03;
+       void __iomem *mmio = (void __iomem *) ap->ioaddr.cmd_addr + PDC_CTLSTAT + 0x03;
 
        tmp = readb(mmio);
 
@@ -498,7 +513,7 @@ static void pdc_irq_clear(struct ata_port *ap)
        readl(mmio + PDC_INT_SEQMASK);
 }
 
-static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
+static irqreturn_t pdc_interrupt (int irq, void *dev_instance)
 {
        struct ata_host *host = dev_instance;
        struct ata_port *ap;
@@ -639,9 +654,11 @@ static void pdc_host_init(unsigned int chip_id, struct ata_probe_ent *pe)
         * "TODO: figure out why we do this"
         */
 
-       /* change FIFO_SHD to 8 dwords, enable BMR_BURST */
+       /* enable BMR_BURST, maybe change FIFO_SHD to 8 dwords */
        tmp = readl(mmio + PDC_FLASH_CTL);
-       tmp |= 0x12000; /* bit 16 (fifo 8 dw) and 13 (bmr burst?) */
+       tmp |= 0x02000; /* bit 13 (enable bmr burst) */
+       if (!(hp->flags & PDC_FLAG_GEN_II))
+               tmp |= 0x10000; /* bit 16 (fifo threshold at 8 dw) */
        writel(tmp, mmio + PDC_FLASH_CTL);
 
        /* clear plug/unplug flags for all ports */
@@ -652,6 +669,10 @@ static void pdc_host_init(unsigned int chip_id, struct ata_probe_ent *pe)
        tmp = readl(mmio + hotplug_offset);
        writel(tmp | 0xff0000, mmio + hotplug_offset);
 
+       /* don't initialise TBG or SLEW on 2nd generation chips */
+       if (hp->flags & PDC_FLAG_GEN_II)
+               return;
+
        /* reduce TBG clock to 133 Mhz. */
        tmp = readl(mmio + PDC_TBG_MODE);
        tmp &= ~0x30000; /* clear bit 17, 16*/
@@ -745,6 +766,7 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
        /* notice 4-port boards */
        switch (board_idx) {
        case board_40518:
+               hp->flags |= PDC_FLAG_GEN_II;
                /* Override hotplug offset for SATAII150 */
                hp->hotplug_offset = PDC2_SATA_PLUG_CSR;
                /* Fall through */
@@ -758,15 +780,14 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
                probe_ent->port[3].scr_addr = base + 0x700;
                break;
        case board_2057x:
+       case board_20771:
+               hp->flags |= PDC_FLAG_GEN_II;
                /* Override hotplug offset for SATAII150 */
                hp->hotplug_offset = PDC2_SATA_PLUG_CSR;
                /* Fall through */
        case board_2037x:
                probe_ent->n_ports = 2;
                break;
-       case board_20771:
-               probe_ent->n_ports = 2;
-               break;
        case board_20619:
                probe_ent->n_ports = 4;