Merge ../linux-2.6-watchdog-mm
[pandora-kernel.git] / drivers / ata / sata_via.c
index a0699a1..d3d5c0d 100644 (file)
@@ -74,12 +74,14 @@ enum {
 static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
 static u32 svia_scr_read (struct ata_port *ap, unsigned int sc_reg);
 static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
+static void svia_noop_freeze(struct ata_port *ap);
 static void vt6420_error_handler(struct ata_port *ap);
 
 static const struct pci_device_id svia_pci_tbl[] = {
-       { 0x1106, 0x0591, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6420 },
-       { 0x1106, 0x3149, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6420 },
-       { 0x1106, 0x3249, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6421 },
+       { PCI_VDEVICE(VIA, 0x5337), vt6420 },
+       { PCI_VDEVICE(VIA, 0x0591), vt6420 },
+       { PCI_VDEVICE(VIA, 0x3149), vt6420 },
+       { PCI_VDEVICE(VIA, 0x3249), vt6421 },
 
        { }     /* terminate list */
 };
@@ -127,7 +129,7 @@ static const struct ata_port_operations vt6420_sata_ops = {
        .qc_issue               = ata_qc_issue_prot,
        .data_xfer              = ata_pio_data_xfer,
 
-       .freeze                 = ata_bmdma_freeze,
+       .freeze                 = svia_noop_freeze,
        .thaw                   = ata_bmdma_thaw,
        .error_handler          = vt6420_error_handler,
        .post_internal_cmd      = ata_bmdma_post_internal_cmd,
@@ -176,7 +178,7 @@ static const struct ata_port_operations vt6421_sata_ops = {
 
 static struct ata_port_info vt6420_port_info = {
        .sht            = &svia_sht,
-       .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
+       .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
        .pio_mask       = 0x1f,
        .mwdma_mask     = 0x07,
        .udma_mask      = 0x7f,
@@ -203,6 +205,15 @@ static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
        outl(val, ap->ioaddr.scr_addr + (4 * sc_reg));
 }
 
+static void svia_noop_freeze(struct ata_port *ap)
+{
+       /* Some VIA controllers choke if ATA_NIEN is manipulated in
+        * certain way.  Leave it alone and just clear pending IRQ.
+        */
+       ata_chk_status(ap);
+       ata_bmdma_irq_clear(ap);
+}
+
 /**
  *     vt6420_prereset - prereset for vt6420
  *     @ap: target ATA port
@@ -230,7 +241,7 @@ static int vt6420_prereset(struct ata_port *ap)
        int online;
 
        /* don't do any SCR stuff if we're not loading */
-       if (!ATA_PFLAG_LOADING)
+       if (!(ap->pflags & ATA_PFLAG_LOADING))
                goto skip_scr;
 
        /* Resume phy.  This is the old resume sequence from
@@ -318,9 +329,10 @@ static void vt6421_init_addrs(struct ata_probe_ent *probe_ent,
 static struct ata_probe_ent *vt6420_init_probe_ent(struct pci_dev *pdev)
 {
        struct ata_probe_ent *probe_ent;
-       struct ata_port_info *ppi = &vt6420_port_info;
-
-       probe_ent = ata_pci_init_native_mode(pdev, &ppi, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY);
+       struct ata_port_info *ppi[2];
+       
+       ppi[0] = ppi[1] = &vt6420_port_info;
+       probe_ent = ata_pci_init_native_mode(pdev, ppi, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY);
        if (!probe_ent)
                return NULL;
 
@@ -346,7 +358,7 @@ static struct ata_probe_ent *vt6421_init_probe_ent(struct pci_dev *pdev)
        INIT_LIST_HEAD(&probe_ent->node);
 
        probe_ent->sht          = &svia_sht;
-       probe_ent->host_flags   = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY;
+       probe_ent->port_flags   = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY;
        probe_ent->port_ops     = &vt6421_sata_ops;
        probe_ent->n_ports      = N_PORTS;
        probe_ent->irq          = pdev->irq;