pata_optidma: rework for cable detect and to remove post_set_mode()
authorAlan Cox <alan@redhat.com>
Tue, 27 Mar 2007 05:43:43 +0000 (21:43 -0800)
committerJeff Garzik <jeff@garzik.org>
Sat, 28 Apr 2007 18:16:01 +0000 (14:16 -0400)
A lot of noise because I had to rename the optidma_set_mode() method to
avoid confusion with the new ->set_mode() method that was added. Cable
detect side is pretty trivial.

Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/ata/pata_optidma.c

index 9764907..b70e04c 100644 (file)
@@ -33,7 +33,7 @@
 #include <linux/libata.h>
 
 #define DRV_NAME "pata_optidma"
-#define DRV_VERSION "0.2.4"
+#define DRV_VERSION "0.3.2"
 
 enum {
        READ_REG        = 0,    /* index of Read cycle timing register */
@@ -62,7 +62,6 @@ static int optidma_pre_reset(struct ata_port *ap)
        if (ap->port_no && !pci_test_config_bits(pdev, &optidma_enable_bits))
                return -ENOENT;
 
-       ap->cbl = ATA_CBL_PATA40;
        return ata_std_prereset(ap);
 }
 
@@ -115,7 +114,7 @@ static void optidma_lock(struct ata_port *ap)
 }
 
 /**
- *     optidma_set_mode        -       set mode data
+ *     optidma_mode_setup      -       set mode data
  *     @ap: ATA interface
  *     @adev: ATA device
  *     @mode: Mode to set
@@ -128,7 +127,7 @@ static void optidma_lock(struct ata_port *ap)
  *     IRQ here we depend on the host set locking to avoid catastrophe.
  */
 
-static void optidma_set_mode(struct ata_port *ap, struct ata_device *adev, u8 mode)
+static void optidma_mode_setup(struct ata_port *ap, struct ata_device *adev, u8 mode)
 {
        struct ata_device *pair = ata_dev_pair(adev);
        int pio = adev->pio_mode - XFER_PIO_0;
@@ -202,7 +201,7 @@ static void optidma_set_mode(struct ata_port *ap, struct ata_device *adev, u8 mo
 }
 
 /**
- *     optiplus_set_mode       -       DMA setup for Firestar Plus
+ *     optiplus_mode_setup     -       DMA setup for Firestar Plus
  *     @ap: ATA port
  *     @adev: device
  *     @mode: desired mode
@@ -213,7 +212,7 @@ static void optidma_set_mode(struct ata_port *ap, struct ata_device *adev, u8 mo
  *     one
  */
 
-static void optiplus_set_mode(struct ata_port *ap, struct ata_device *adev, u8 mode)
+static void optiplus_mode_setup(struct ata_port *ap, struct ata_device *adev, u8 mode)
 {
        struct pci_dev *pdev = to_pci_dev(ap->host->dev);
        u8 udcfg;
@@ -225,7 +224,7 @@ static void optiplus_set_mode(struct ata_port *ap, struct ata_device *adev, u8 m
        pci_read_config_byte(pdev, 0x44, &udcfg);
        if (mode <= XFER_UDMA_0) {
                udcfg &= ~(1 << unit);
-               optidma_set_mode(ap, adev, adev->dma_mode);
+               optidma_mode_setup(ap, adev, adev->dma_mode);
        } else {
                udcfg |=  (1 << unit);
                if (ap->port_no) {
@@ -253,7 +252,7 @@ static void optiplus_set_mode(struct ata_port *ap, struct ata_device *adev, u8 m
 
 static void optidma_set_pio_mode(struct ata_port *ap, struct ata_device *adev)
 {
-       optidma_set_mode(ap, adev, adev->pio_mode);
+       optidma_mode_setup(ap, adev, adev->pio_mode);
 }
 
 /**
@@ -268,7 +267,7 @@ static void optidma_set_pio_mode(struct ata_port *ap, struct ata_device *adev)
 
 static void optidma_set_dma_mode(struct ata_port *ap, struct ata_device *adev)
 {
-       optidma_set_mode(ap, adev, adev->dma_mode);
+       optidma_mode_setup(ap, adev, adev->dma_mode);
 }
 
 /**
@@ -283,7 +282,7 @@ static void optidma_set_dma_mode(struct ata_port *ap, struct ata_device *adev)
 
 static void optiplus_set_pio_mode(struct ata_port *ap, struct ata_device *adev)
 {
-       optiplus_set_mode(ap, adev, adev->pio_mode);
+       optiplus_mode_setup(ap, adev, adev->pio_mode);
 }
 
 /**
@@ -298,7 +297,7 @@ static void optiplus_set_pio_mode(struct ata_port *ap, struct ata_device *adev)
 
 static void optiplus_set_dma_mode(struct ata_port *ap, struct ata_device *adev)
 {
-       optiplus_set_mode(ap, adev, adev->dma_mode);
+       optiplus_mode_setup(ap, adev, adev->dma_mode);
 }
 
 /**
@@ -322,26 +321,29 @@ static u8 optidma_make_bits43(struct ata_device *adev)
 }
 
 /**
- *     optidma_post_set_mode   -       finalize PCI setup
+ *     optidma_set_mode        -       mode setup
  *     @ap: port to set up
  *
- *     Finalise the configuration by writing the nibble of extra bits
- *     of data into the chip.
+ *     Use the standard setup to tune the chipset and then finalise the
+ *     configuration by writing the nibble of extra bits of data into
+ *     the chip.
  */
 
-static void optidma_post_set_mode(struct ata_port *ap)
+static int optidma_set_mode(struct ata_port *ap, struct ata_device **r_failed)
 {
        u8 r;
        int nybble = 4 * ap->port_no;
        struct pci_dev *pdev = to_pci_dev(ap->host->dev);
-
-       pci_read_config_byte(pdev, 0x43, &r);
-
-       r &= (0x0F << nybble);
-       r |= (optidma_make_bits43(&ap->device[0]) +
-            (optidma_make_bits43(&ap->device[0]) << 2)) << nybble;
-
-       pci_write_config_byte(pdev, 0x43, r);
+       int rc  = ata_do_set_mode(ap, r_failed);
+       if (rc == 0) {
+               pci_read_config_byte(pdev, 0x43, &r);
+
+               r &= (0x0F << nybble);
+               r |= (optidma_make_bits43(&ap->device[0]) +
+                    (optidma_make_bits43(&ap->device[0]) << 2)) << nybble;
+               pci_write_config_byte(pdev, 0x43, r);
+       }
+       return rc;
 }
 
 static struct scsi_host_template optidma_sht = {
@@ -381,7 +383,8 @@ static struct ata_port_operations optidma_port_ops = {
        .thaw           = ata_bmdma_thaw,
        .post_internal_cmd = ata_bmdma_post_internal_cmd,
        .error_handler  = optidma_error_handler,
-       .post_set_mode  = optidma_post_set_mode,
+       .set_mode       = optidma_set_mode,
+       .cable_detect   = ata_cable_40wire,
 
        .bmdma_setup    = ata_bmdma_setup,
        .bmdma_start    = ata_bmdma_start,
@@ -416,7 +419,8 @@ static struct ata_port_operations optiplus_port_ops = {
        .thaw           = ata_bmdma_thaw,
        .post_internal_cmd = ata_bmdma_post_internal_cmd,
        .error_handler  = optidma_error_handler,
-       .post_set_mode  = optidma_post_set_mode,
+       .set_mode       = optidma_set_mode,
+       .cable_detect   = ata_cable_40wire,
 
        .bmdma_setup    = ata_bmdma_setup,
        .bmdma_start    = ata_bmdma_start,