]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/ata/pata_ns87415.c
libata: implement and use ops inheritance
[linux-2.6-omap-h63xx.git] / drivers / ata / pata_ns87415.c
index bb97ef583f9b5703c10450cb4a42a2eac368bb4e..38d86a262dbb85eed220e3d3135acd0fba433b4f 100644 (file)
@@ -17,7 +17,7 @@
  *    TODO:
  *     Test PARISC SuperIO
  *     Get someone to test on SPARC
- *     Implement lazy pio/dma switching for better performance 
+ *     Implement lazy pio/dma switching for better performance
  *     8bit shared timing.
  *     See if we need to kill the FIFO for ATAPI
  */
@@ -60,10 +60,10 @@ static void ns87415_set_mode(struct ata_port *ap, struct ata_device *adev, u8 mo
        u16 clocking;
        u8 iordy;
        u8 status;
-       
+
        /* Timing register format is 17 - low nybble read timing with
           the high nybble being 16 - x for recovery time in PCI clocks */
-   
+
        ata_timing_compute(adev, adev->pio_mode, &t, T, 0);
 
        clocking = 17 - FIT(t.active, 2, 17);
@@ -71,7 +71,7 @@ static void ns87415_set_mode(struct ata_port *ap, struct ata_device *adev, u8 mo
        /* Use the same timing for read and write bytes */
        clocking |= (clocking << 8);
        pci_write_config_word(dev, timing, clocking);
-       
+
        /* Set the IORDY enable versus DMA enable on or off properly */
        pci_read_config_byte(dev, 0x42, &iordy);
        iordy &= ~(1 << (4 + unit));
@@ -185,7 +185,7 @@ static void ns87415_bmdma_irq_clear(struct ata_port *ap)
 
        if (!mmio)
                return;
-       iowrite8((ioread8(mmio + ATA_DMA_CMD) | ATA_DMA_INTR | ATA_DMA_ERR), 
+       iowrite8((ioread8(mmio + ATA_DMA_CMD) | ATA_DMA_INTR | ATA_DMA_ERR),
                        mmio + ATA_DMA_CMD);
 }
 
@@ -215,6 +215,8 @@ static int ns87415_check_atapi_dma(struct ata_queued_cmd *qc)
 
 #include <asm/superio.h>
 
+#define SUPERIO_IDE_MAX_RETRIES 25
+
 /**
  *     ns87560_read_buggy      -       workaround buggy Super I/O chip
  *     @port: Port to read
@@ -295,90 +297,32 @@ static u8 ns87560_bmdma_status(struct ata_port *ap)
 {
        return ns87560_read_buggy(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
 }
+#endif         /* 87560 SuperIO Support */
 
-static const struct ata_port_operations ns87560_pata_ops = {
-       .set_piomode            = ns87415_set_piomode,
-       .mode_filter            = ata_pci_default_filter,
+static struct ata_port_operations ns87415_pata_ops = {
+       .inherits               = &ata_bmdma_port_ops,
 
-       .tf_load                = ata_tf_load,
-       .tf_read                = ns87560_tf_read,
-       .check_status           = ns87560_check_status,
        .check_atapi_dma        = ns87415_check_atapi_dma,
-       .exec_command           = ata_exec_command,
-       .dev_select             = ata_std_dev_select,
-
-       .freeze                 = ata_bmdma_freeze,
-       .thaw                   = ata_bmdma_thaw,
-       .error_handler          = ata_bmdma_error_handler,
-       .post_internal_cmd      = ata_bmdma_post_internal_cmd,
-       .cable_detect           = ata_cable_40wire,
-
        .bmdma_setup            = ns87415_bmdma_setup,
        .bmdma_start            = ns87415_bmdma_start,
        .bmdma_stop             = ns87415_bmdma_stop,
-       .bmdma_status           = ns87560_bmdma_status,
-       .qc_prep                = ata_qc_prep,
-       .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_data_xfer,
-
-       .irq_handler            = ata_interrupt,
        .irq_clear              = ns87415_bmdma_irq_clear,
-       .irq_on                 = ata_irq_on,
-
-       .port_start             = ata_sff_port_start,
-};
-
-#endif         /* 87560 SuperIO Support */
-
-
-static const struct ata_port_operations ns87415_pata_ops = {
-       .set_piomode            = ns87415_set_piomode,
-       .mode_filter            = ata_pci_default_filter,
-
-       .tf_load                = ata_tf_load,
-       .tf_read                = ata_tf_read,
-       .check_status           = ata_check_status,
-       .check_atapi_dma        = ns87415_check_atapi_dma,
-       .exec_command           = ata_exec_command,
-       .dev_select             = ata_std_dev_select,
 
-       .freeze                 = ata_bmdma_freeze,
-       .thaw                   = ata_bmdma_thaw,
-       .error_handler          = ata_bmdma_error_handler,
-       .post_internal_cmd      = ata_bmdma_post_internal_cmd,
        .cable_detect           = ata_cable_40wire,
+       .set_piomode            = ns87415_set_piomode,
+};
 
-       .bmdma_setup            = ns87415_bmdma_setup,
-       .bmdma_start            = ns87415_bmdma_start,
-       .bmdma_stop             = ns87415_bmdma_stop,
-       .bmdma_status           = ata_bmdma_status,
-       .qc_prep                = ata_qc_prep,
-       .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_data_xfer,
-
-       .irq_handler            = ata_interrupt,
-       .irq_clear              = ns87415_bmdma_irq_clear,
-       .irq_on                 = ata_irq_on,
-
-       .port_start             = ata_sff_port_start,
+#if defined(CONFIG_SUPERIO)
+static struct ata_port_operations ns87560_pata_ops = {
+       .inherits               = &ns87415_pata_ops,
+       .tf_read                = ns87560_tf_read,
+       .check_status           = ns87560_check_status,
+       .bmdma_status           = ns87560_bmdma_status,
 };
+#endif
 
 static struct scsi_host_template ns87415_sht = {
-       .module                 = THIS_MODULE,
-       .name                   = DRV_NAME,
-       .ioctl                  = ata_scsi_ioctl,
-       .queuecommand           = ata_scsi_queuecmd,
-       .can_queue              = ATA_DEF_QUEUE,
-       .this_id                = ATA_SHT_THIS_ID,
-       .sg_tablesize           = LIBATA_MAX_PRD,
-       .cmd_per_lun            = ATA_SHT_CMD_PER_LUN,
-       .emulated               = ATA_SHT_EMULATED,
-       .use_clustering         = ATA_SHT_USE_CLUSTERING,
-       .proc_name              = DRV_NAME,
-       .dma_boundary           = ATA_DMA_BOUNDARY,
-       .slave_configure        = ata_scsi_slave_config,
-       .slave_destroy          = ata_scsi_slave_destroy,
-       .bios_param             = ata_std_bios_param,
+       ATA_BMDMA_SHT(DRV_NAME),
 };
 
 
@@ -408,6 +352,7 @@ static int ns87415_init_one (struct pci_dev *pdev, const struct pci_device_id *e
                .port_ops       = &ns87415_pata_ops,
        };
        const struct ata_port_info *ppi[] = { &info, NULL };
+       int rc;
 #if defined(CONFIG_SUPERIO)
        static const struct ata_port_info info87560 = {
                .sht            = &ns87415_sht,
@@ -423,6 +368,11 @@ static int ns87415_init_one (struct pci_dev *pdev, const struct pci_device_id *e
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev,
                           "version " DRV_VERSION "\n");
+
+       rc = pcim_enable_device(pdev);
+       if (rc)
+               return rc;
+
        /* Select 512 byte sectors */
        pci_write_config_byte(pdev, 0x55, 0xEE);
        /* Select PIO0 8bit clocking */