]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/ata/pata_ali.c
drivers/ata/pata_ali.c: s/isa_bridge/ali_isa_bridge/ to fix alpha build
[linux-2.6-omap-h63xx.git] / drivers / ata / pata_ali.c
index d2ea2db61e526fda331e005482337a7944d4fd69..eb99dbe78081087a79f8e3d578b494b29f9dfa76 100644 (file)
 #include <linux/dmi.h>
 
 #define DRV_NAME "pata_ali"
-#define DRV_VERSION "0.7.7"
+#define DRV_VERSION "0.7.8"
 
 static int ali_atapi_dma = 0;
 module_param_named(atapi_dma, ali_atapi_dma, int, 0644);
 MODULE_PARM_DESC(atapi_dma, "Enable ATAPI DMA (0=disable, 1=enable)");
 
-static struct pci_dev *isa_bridge;
+static struct pci_dev *ali_isa_bridge;
 
 /*
  *     Cable special cases
@@ -151,8 +151,7 @@ static void ali_fifo_control(struct ata_port *ap, struct ata_device *adev, int o
 
        pci_read_config_byte(pdev, pio_fifo, &fifo);
        fifo &= ~(0x0F << shift);
-       if (on)
-               fifo |= (on << shift);
+       fifo |= (on << shift);
        pci_write_config_byte(pdev, pio_fifo, fifo);
 }
 
@@ -341,6 +340,23 @@ static int ali_check_atapi_dma(struct ata_queued_cmd *qc)
        return 0;
 }
 
+static void ali_c2_c3_postreset(struct ata_link *link, unsigned int *classes)
+{
+       u8 r;
+       int port_bit = 4 << link->ap->port_no;
+
+       /* If our bridge is an ALI 1533 then do the extra work */
+       if (ali_isa_bridge) {
+               /* Tristate and re-enable the bus signals */
+               pci_read_config_byte(ali_isa_bridge, 0x58, &r);
+               r &= ~port_bit;
+               pci_write_config_byte(ali_isa_bridge, 0x58, r);
+               r |= port_bit;
+               pci_write_config_byte(ali_isa_bridge, 0x58, r);
+       }
+       ata_sff_postreset(link, classes);
+}
+
 static struct scsi_host_template ali_sht = {
        ATA_BMDMA_SHT(DRV_NAME),
 };
@@ -353,10 +369,11 @@ static struct ata_port_operations ali_early_port_ops = {
        .inherits       = &ata_sff_port_ops,
        .cable_detect   = ata_cable_40wire,
        .set_piomode    = ali_set_piomode,
+       .sff_data_xfer  = ata_sff_data_xfer32,
 };
 
 static const struct ata_port_operations ali_dma_base_ops = {
-       .inherits       = &ata_bmdma_port_ops,
+       .inherits       = &ata_bmdma32_port_ops,
        .set_piomode    = ali_set_piomode,
        .set_dmamode    = ali_set_dmamode,
 };
@@ -381,6 +398,17 @@ static struct ata_port_operations ali_c2_port_ops = {
        .check_atapi_dma = ali_check_atapi_dma,
        .cable_detect   = ali_c2_cable_detect,
        .dev_config     = ali_lock_sectors,
+       .postreset      = ali_c2_c3_postreset,
+};
+
+/*
+ *     Port operations for DMA capable ALi with cable detect
+ */
+static struct ata_port_operations ali_c4_port_ops = {
+       .inherits       = &ali_dma_base_ops,
+       .check_atapi_dma = ali_check_atapi_dma,
+       .cable_detect   = ali_c2_cable_detect,
+       .dev_config     = ali_lock_sectors,
 };
 
 /*
@@ -439,14 +467,14 @@ static void ali_init_chipset(struct pci_dev *pdev)
                pci_write_config_byte(pdev, 0x53, tmp);
        }
        north = pci_get_bus_and_slot(0, PCI_DEVFN(0,0));
-       if (north && north->vendor == PCI_VENDOR_ID_AL && isa_bridge) {
+       if (north && north->vendor == PCI_VENDOR_ID_AL && ali_isa_bridge) {
                /* Configure the ALi bridge logic. For non ALi rely on BIOS.
                   Set the south bridge enable bit */
-               pci_read_config_byte(isa_bridge, 0x79, &tmp);
+               pci_read_config_byte(ali_isa_bridge, 0x79, &tmp);
                if (pdev->revision == 0xC2)
-                       pci_write_config_byte(isa_bridge, 0x79, tmp | 0x04);
+                       pci_write_config_byte(ali_isa_bridge, 0x79, tmp | 0x04);
                else if (pdev->revision > 0xC2 && pdev->revision < 0xC5)
-                       pci_write_config_byte(isa_bridge, 0x79, tmp | 0x02);
+                       pci_write_config_byte(ali_isa_bridge, 0x79, tmp | 0x02);
        }
        pci_dev_put(north);
        ata_pci_bmdma_clear_simplex(pdev);
@@ -504,7 +532,7 @@ static int ali_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
                .pio_mask = 0x1f,
                .mwdma_mask = 0x07,
                .udma_mask = ATA_UDMA5,
-               .port_ops = &ali_c2_port_ops
+               .port_ops = &ali_c4_port_ops
        };
        /* Revision 0xC5 is UDMA133 with LBA48 DMA */
        static const struct ata_port_info info_c5 = {
@@ -543,9 +571,9 @@ static int ali_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
 
        ali_init_chipset(pdev);
 
-       if (isa_bridge && pdev->revision >= 0x20 && pdev->revision < 0xC2) {
+       if (ali_isa_bridge && pdev->revision >= 0x20 && pdev->revision < 0xC2) {
                /* Are we paired with a UDMA capable chip */
-               pci_read_config_byte(isa_bridge, 0x5E, &tmp);
+               pci_read_config_byte(ali_isa_bridge, 0x5E, &tmp);
                if ((tmp & 0x1E) == 0x12)
                        ppi[0] = &info_20_udma;
        }
@@ -589,11 +617,11 @@ static struct pci_driver ali_pci_driver = {
 static int __init ali_init(void)
 {
        int ret;
-       isa_bridge = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, NULL);
+       ali_isa_bridge = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, NULL);
 
        ret = pci_register_driver(&ali_pci_driver);
        if (ret < 0)
-               pci_dev_put(isa_bridge);
+               pci_dev_put(ali_isa_bridge);
        return ret;
 }
 
@@ -601,7 +629,7 @@ static int __init ali_init(void)
 static void __exit ali_exit(void)
 {
        pci_unregister_driver(&ali_pci_driver);
-       pci_dev_put(isa_bridge);
+       pci_dev_put(ali_isa_bridge);
 }