ide: add struct ide_port_ops (take 2)
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / ide / pci / atiixp.c
index 491871984aaa71213e2820706c8201fea9c2faf2..8b637181681ad2d6d4cfcbf30c39d6e6044b9bc6 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  linux/drivers/ide/pci/atiixp.c     Version 0.05    Nov 9 2007
- *
  *  Copyright (C) 2003 ATI Inc. <hyu@ati.com>
  *  Copyright (C) 2004,2007 Bartlomiej Zolnierkiewicz
  */
@@ -8,15 +6,11 @@
 #include <linux/types.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/ioport.h>
 #include <linux/pci.h>
 #include <linux/hdreg.h>
 #include <linux/ide.h>
-#include <linux/delay.h>
 #include <linux/init.h>
 
-#include <asm/io.h>
-
 #define ATIIXP_IDE_PIO_TIMING          0x40
 #define ATIIXP_IDE_MDMA_TIMING         0x44
 #define ATIIXP_IDE_PIO_CONTROL         0x48
@@ -55,7 +49,7 @@ static DEFINE_SPINLOCK(atiixp_lock);
 
 static void atiixp_set_pio_mode(ide_drive_t *drive, const u8 pio)
 {
-       struct pci_dev *dev = drive->hwif->pci_dev;
+       struct pci_dev *dev = to_pci_dev(drive->hwif->dev);
        unsigned long flags;
        int timing_shift = (drive->dn & 2) ? 16 : 0 + (drive->dn & 1) ? 0 : 8;
        u32 pio_timing_data;
@@ -88,7 +82,7 @@ static void atiixp_set_pio_mode(ide_drive_t *drive, const u8 pio)
 
 static void atiixp_set_dma_mode(ide_drive_t *drive, const u8 speed)
 {
-       struct pci_dev *dev = drive->hwif->pci_dev;
+       struct pci_dev *dev = to_pci_dev(drive->hwif->dev);
        unsigned long flags;
        int timing_shift = (drive->dn & 2) ? 16 : 0 + (drive->dn & 1) ? 0 : 8;
        u32 tmp32;
@@ -123,49 +117,39 @@ static void atiixp_set_dma_mode(ide_drive_t *drive, const u8 speed)
        spin_unlock_irqrestore(&atiixp_lock, flags);
 }
 
-/**
- *     init_hwif_atiixp                -       fill in the hwif for the ATIIXP
- *     @hwif: IDE interface
- *
- *     Set up the ide_hwif_t for the ATIIXP interface according to the
- *     capabilities of the hardware.
- */
-
-static void __devinit init_hwif_atiixp(ide_hwif_t *hwif)
+static u8 __devinit atiixp_cable_detect(ide_hwif_t *hwif)
 {
-       u8 udma_mode = 0;
-       u8 ch = hwif->channel;
-       struct pci_dev *pdev = hwif->pci_dev;
-
-       hwif->set_pio_mode = &atiixp_set_pio_mode;
-       hwif->set_dma_mode = &atiixp_set_dma_mode;
-
-       if (!hwif->dma_base)
-               return;
+       struct pci_dev *pdev = to_pci_dev(hwif->dev);
+       u8 udma_mode = 0, ch = hwif->channel;
 
        pci_read_config_byte(pdev, ATIIXP_IDE_UDMA_MODE + ch, &udma_mode);
 
        if ((udma_mode & 0x07) >= 0x04 || (udma_mode & 0x70) >= 0x40)
-               hwif->cbl = ATA_CBL_PATA80;
+               return ATA_CBL_PATA80;
        else
-               hwif->cbl = ATA_CBL_PATA40;
+               return ATA_CBL_PATA40;
 }
 
+static const struct ide_port_ops atiixp_port_ops = {
+       .set_pio_mode           = atiixp_set_pio_mode,
+       .set_dma_mode           = atiixp_set_dma_mode,
+       .cable_detect           = atiixp_cable_detect,
+};
+
 static const struct ide_port_info atiixp_pci_info[] __devinitdata = {
        {       /* 0 */
                .name           = "ATIIXP",
-               .init_hwif      = init_hwif_atiixp,
                .enablebits     = {{0x48,0x01,0x00}, {0x48,0x08,0x00}},
-               .host_flags     = IDE_HFLAG_LEGACY_IRQS | IDE_HFLAG_BOOTABLE,
+               .port_ops       = &atiixp_port_ops,
+               .host_flags     = IDE_HFLAG_LEGACY_IRQS,
                .pio_mask       = ATA_PIO4,
                .mwdma_mask     = ATA_MWDMA2,
                .udma_mask      = ATA_UDMA5,
        },{     /* 1 */
                .name           = "SB600_PATA",
-               .init_hwif      = init_hwif_atiixp,
                .enablebits     = {{0x48,0x01,0x00}, {0x00,0x00,0x00}},
-               .host_flags     = IDE_HFLAG_SINGLE | IDE_HFLAG_LEGACY_IRQS |
-                                 IDE_HFLAG_BOOTABLE,
+               .port_ops       = &atiixp_port_ops,
+               .host_flags     = IDE_HFLAG_SINGLE | IDE_HFLAG_LEGACY_IRQS,
                .pio_mask       = ATA_PIO4,
                .mwdma_mask     = ATA_MWDMA2,
                .udma_mask      = ATA_UDMA5,