ide: add ->fixup method to ide_hwif_t
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Fri, 19 Oct 2007 22:32:31 +0000 (00:32 +0200)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Fri, 19 Oct 2007 22:32:31 +0000 (00:32 +0200)
* Add ->fixup method to ide_hwif_t.

* Set hwif->fixup in ide_pci_setup_ports() to d->fixup.

* Use hwif->fixup in probe_hwif().

* Use probe_hwif_init() instead of probe_hwif_init_with_fixup() in
  ide_setup_pci_device().

* Add 'fixup' argument to ide_register_hw() and use it to set hwif->fixup,
  update all ide_register_hw() users accordingly.

* Convert ide-cs/delkin_cb host drivers to use ide_register_hw().

* Restore hwif->fixup in ide_hwif_restore().

* Remove ide_register_hw_with_fixup(), probe_hwif_init_with_fixup()
  and 'fixup' argument from probe_hwif().

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
17 files changed:
drivers/ide/arm/bast-ide.c
drivers/ide/arm/ide_arm.c
drivers/ide/cris/ide-cris.c
drivers/ide/h8300/ide-h8300.c
drivers/ide/ide-pnp.c
drivers/ide/ide-probe.c
drivers/ide/ide.c
drivers/ide/legacy/buddha.c
drivers/ide/legacy/falconide.c
drivers/ide/legacy/gayle.c
drivers/ide/legacy/ide-cs.c
drivers/ide/legacy/macide.c
drivers/ide/legacy/q40ide.c
drivers/ide/pci/delkin_cb.c
drivers/ide/setup-pci.c
drivers/macintosh/mediabay.c
include/linux/ide.h

index f7449d04114a1b1e984917e35fb23755424abaf3..48db6167bb90f6005927590431ba56a231061cd3 100644 (file)
@@ -45,7 +45,7 @@ bastide_register(unsigned int base, unsigned int aux, int irq,
        hw.io_ports[IDE_CONTROL_OFFSET] = aux + (6 * 0x20);
        hw.irq = irq;
 
-       ide_register_hw(&hw, 0, hwif);
+       ide_register_hw(&hw, NULL, 0, hwif);
 
        return 0;
 }
index bce2bec81413eafa8f9358bb81efc3306ca7ad83..8957cbadf5c2a8c5870800a54ebd1d4b6eebae70 100644 (file)
@@ -31,5 +31,5 @@ void __init ide_arm_init(void)
        memset(&hw, 0, sizeof(hw));
        ide_std_init_ports(&hw, IDE_ARM_IO, IDE_ARM_IO + 0x206);
        hw.irq = IDE_ARM_IRQ;
-       ide_register_hw(&hw, 1, NULL);
+       ide_register_hw(&hw, NULL, 1, NULL);
 }
index 9a96a10ba9d3a7f69573f117b59c34a95db3a220..ff20377b4c822d4a562929d7c8f122b17488d5f4 100644 (file)
@@ -782,7 +782,7 @@ init_e100_ide (void)
                                ide_offsets,
                                0, 0, cris_ide_ack_intr,
                                ide_default_irq(0));
-               ide_register_hw(&hw, 1, &hwif);
+               ide_register_hw(&hw, NULL, 1, &hwif);
                hwif->mmio = 1;
                hwif->chipset = ide_etrax100;
                hwif->set_pio_mode = &cris_set_pio_mode;
index 6d26ad7360d52c35dd01ab897dafe24b8fd2dacd..37b9174a7edcd2d1a842ee5abc2d844cb7a0080b 100644 (file)
@@ -101,7 +101,7 @@ void __init h8300_ide_init(void)
        hw_setup(&hw);
 
        /* register if */
-       idx = ide_register_hw(&hw, 1, &hwif);
+       idx = ide_register_hw(&hw, NULL, 1, &hwif);
        if (idx == -1) {
                printk(KERN_ERR "ide-h8300: IDE I/F register failed\n");
                return;
index 2b8009c50e91363c1316c3a8bbfad6208e823942..2afaa87022e3069b51c9f9ccec1406a9c1a54110 100644 (file)
@@ -42,7 +42,7 @@ static int idepnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id
        hw.irq = pnp_irq(dev, 0);
        hw.dma = NO_DMA;
 
-       index = ide_register_hw(&hw, 1, &hwif);
+       index = ide_register_hw(&hw, NULL, 1, &hwif);
 
        if (index != -1) {
                printk(KERN_INFO "ide%d: generic PnP IDE interface\n", index);
index 5491748533811aaa938d42f418c0678c4e888ce9..c6ba439b1435785443ddf988bb59cb6851f22f38 100644 (file)
@@ -717,7 +717,7 @@ EXPORT_SYMBOL_GPL(ide_undecoded_slave);
  * This routine only knows how to look for drive units 0 and 1
  * on an interface, so any setting of MAX_DRIVES > 2 won't work here.
  */
-static void probe_hwif(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif))
+static void probe_hwif(ide_hwif_t *hwif)
 {
        unsigned long flags;
        unsigned int irqd;
@@ -819,8 +819,8 @@ static void probe_hwif(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif))
                return;
        }
 
-       if (fixup)
-               fixup(hwif);
+       if (hwif->fixup)
+               hwif->fixup(hwif);
 
        for (unit = 0; unit < MAX_DRIVES; ++unit) {
                ide_drive_t *drive = &hwif->drives[unit];
@@ -861,9 +861,9 @@ static void probe_hwif(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif))
 static int hwif_init(ide_hwif_t *hwif);
 static void hwif_register_devices(ide_hwif_t *hwif);
 
-int probe_hwif_init_with_fixup(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif))
+int probe_hwif_init(ide_hwif_t *hwif)
 {
-       probe_hwif(hwif, fixup);
+       probe_hwif(hwif);
 
        if (!hwif_init(hwif)) {
                printk(KERN_INFO "%s: failed to initialize IDE interface\n",
@@ -877,11 +877,6 @@ int probe_hwif_init_with_fixup(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif)
        return 0;
 }
 
-int probe_hwif_init(ide_hwif_t *hwif)
-{
-       return probe_hwif_init_with_fixup(hwif, NULL);
-}
-
 EXPORT_SYMBOL(probe_hwif_init);
 
 #if MAX_HWIFS > 1
@@ -1394,7 +1389,7 @@ int ideprobe_init (void)
 
        for (index = 0; index < MAX_HWIFS; ++index)
                if (probe[index])
-                       probe_hwif(&ide_hwifs[index], NULL);
+                       probe_hwif(&ide_hwifs[index]);
        for (index = 0; index < MAX_HWIFS; ++index)
                if (probe[index])
                        hwif_init(&ide_hwifs[index]);
index 961e6c897286e7a1245d7c56ba3eda2420374761..35f24b9b8219eb7a14df67152078d387cf324db5 100644 (file)
@@ -391,6 +391,8 @@ static void ide_hwif_restore(ide_hwif_t *hwif, ide_hwif_t *tmp_hwif)
        hwif->cds                       = tmp_hwif->cds;
 #endif
 
+       hwif->fixup                     = tmp_hwif->fixup;
+
        hwif->set_pio_mode              = tmp_hwif->set_pio_mode;
        hwif->set_dma_mode              = tmp_hwif->set_dma_mode;
        hwif->mdma_filter               = tmp_hwif->mdma_filter;
@@ -660,11 +662,11 @@ void ide_setup_ports (    hw_regs_t *hw,
 }
 
 /**
- *     ide_register_hw_with_fixup      -       register IDE interface
+ *     ide_register_hw         -       register IDE interface
  *     @hw: hardware registers
+ *     @fixup: fixup function
  *     @initializing: set while initializing built-in drivers
  *     @hwifp: pointer to returned hwif
- *     @fixup: fixup function
  *
  *     Register an IDE interface, specifying exactly the registers etc.
  *     Set init=1 iff calling before probes have taken place.
@@ -672,9 +674,8 @@ void ide_setup_ports (      hw_regs_t *hw,
  *     Returns -1 on error.
  */
 
-int ide_register_hw_with_fixup(hw_regs_t *hw, int initializing,
-                              ide_hwif_t **hwifp,
-                              void(*fixup)(ide_hwif_t *hwif))
+int ide_register_hw(hw_regs_t *hw, void (*fixup)(ide_hwif_t *),
+                   int initializing, ide_hwif_t **hwifp)
 {
        int index, retry = 1;
        ide_hwif_t *hwif;
@@ -710,11 +711,12 @@ found:
        memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->hw.io_ports));
        hwif->irq = hw->irq;
        hwif->noprobe = 0;
+       hwif->fixup = fixup;
        hwif->chipset = hw->chipset;
        hwif->gendev.parent = hw->dev;
 
        if (!initializing) {
-               probe_hwif_init_with_fixup(hwif, fixup);
+               probe_hwif_init(hwif);
                ide_proc_register_port(hwif);
        }
 
@@ -724,13 +726,6 @@ found:
        return (initializing || hwif->present) ? index : -1;
 }
 
-EXPORT_SYMBOL(ide_register_hw_with_fixup);
-
-int ide_register_hw(hw_regs_t *hw, int initializing, ide_hwif_t **hwifp)
-{
-       return ide_register_hw_with_fixup(hw, initializing, hwifp, NULL);
-}
-
 EXPORT_SYMBOL(ide_register_hw);
 
 /*
@@ -1046,7 +1041,7 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device
                        ide_init_hwif_ports(&hw, (unsigned long) args[0],
                                            (unsigned long) args[1], NULL);
                        hw.irq = args[2];
-                       if (ide_register_hw(&hw, 0, NULL) == -1)
+                       if (ide_register_hw(&hw, NULL, 0, NULL) == -1)
                                return -EIO;
                        return 0;
                }
index 101aee1711c489c7985bc1d730e3ca6fb1452c29..4a0be251a05fd84ddaa606c2b1161c2c99d93a59 100644 (file)
@@ -212,8 +212,8 @@ fail_base2:
 //                                             xsurf_iops,
                                                IRQ_AMIGA_PORTS);
                        }       
-                       
-                       index = ide_register_hw(&hw, 1, &hwif);
+
+                       index = ide_register_hw(&hw, NULL, 1, &hwif);
                        if (index != -1) {
                                hwif->mmio = 1;
                                printk("ide%d: ", index);
index f0829b83e970db20c5f7a500eee860bf1aa484a2..7d7936f1b9007b06c50bfe477f1171ef49a33150 100644 (file)
@@ -72,7 +72,7 @@ void __init falconide_init(void)
                        0, 0, NULL,
 //                     falconide_iops,
                        IRQ_MFP_IDE);
-       index = ide_register_hw(&hw, 1, NULL);
+       index = ide_register_hw(&hw, NULL, 1, NULL);
 
        if (index != -1)
            printk("ide%d: Falcon IDE interface\n", index);
index 0830a021bbb609d4b103dc037239a0f2ec5bc934..53331ee1e957c9a71c651a2eeb3c5ae2aaa191bf 100644 (file)
@@ -165,7 +165,7 @@ found:
 //                     &gayle_iops,
                        IRQ_AMIGA_PORTS);
 
-       index = ide_register_hw(&hw, 1, &hwif);
+       index = ide_register_hw(&hw, NULL, 1, &hwif);
        if (index != -1) {
            hwif->mmio = 1;
            switch (i) {
index e8e360c2619d1eea7365ae2bd5645716834c97f5..03715c05866408b1d14773e365d265d74b7194c4 100644 (file)
@@ -153,7 +153,7 @@ static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq
     hw.irq = irq;
     hw.chipset = ide_pci;
     hw.dev = &handle->dev;
-    return ide_register_hw_with_fixup(&hw, 0, NULL, ide_undecoded_slave);
+    return ide_register_hw(&hw, &ide_undecoded_slave, 0, NULL);
 }
 
 /*======================================================================
index b557c45a5a9dc614e7aa556e07554f5b3623457a..e87cd2f16430a6555e4f7e88fca5ee1e17d0e3e0 100644 (file)
@@ -93,21 +93,21 @@ void macide_init(void)
                                0, 0, macide_ack_intr,
 //                             quadra_ide_iops,
                                IRQ_NUBUS_F);
-               index = ide_register_hw(&hw, 1, &hwif);
+               index = ide_register_hw(&hw, NULL, 1, &hwif);
                break;
        case MAC_IDE_PB:
                ide_setup_ports(&hw, IDE_BASE, macide_offsets,
                                0, 0, macide_ack_intr,
 //                             macide_pb_iops,
                                IRQ_NUBUS_C);
-               index = ide_register_hw(&hw, 1, &hwif);
+               index = ide_register_hw(&hw, NULL, 1, &hwif);
                break;
        case MAC_IDE_BABOON:
                ide_setup_ports(&hw, BABOON_BASE, macide_offsets,
                                0, 0, NULL,
 //                             macide_baboon_iops,
                                IRQ_BABOON_1);
-               index = ide_register_hw(&hw, 1, &hwif);
+               index = ide_register_hw(&hw, NULL, 1, &hwif);
                if (index == -1) break;
                if (macintosh_config->ident == MAC_MODEL_PB190) {
 
index e628a983ce3395706cdf905c52a37eab15abc9d9..a530d6de194a74448122cf9dd0c5d34fc12d9c9e 100644 (file)
@@ -142,7 +142,7 @@ void q40ide_init(void)
                        0, NULL,
 //                     m68kide_iops,
                        q40ide_default_irq(pcide_bases[i]));
-       index = ide_register_hw(&hw, 1, &hwif);
+       index = ide_register_hw(&hw, NULL, 1, &hwif);
        // **FIXME**
        if (index != -1)
                hwif->mmio = 1;
index 46f4a888c03711c341eddaeea2be7933e3bcbf57..83829081640a6f84727f18260a169477e8d3d257 100644 (file)
@@ -80,7 +80,7 @@ delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id)
        hw.irq = dev->irq;
        hw.chipset = ide_pci;           /* this enables IRQ sharing */
 
-       rc = ide_register_hw_with_fixup(&hw, 0, &hwif, ide_undecoded_slave);
+       rc = ide_register_hw(&hw, &ide_undecoded_slave, 0, &hwif);
        if (rc < 0) {
                printk(KERN_ERR "delkin_cb: ide_register_hw failed (%d)\n", rc);
                pci_disable_device(dev);
index d62b225f569f8de8cc3fb4085c95f8523d699a39..4e9de20431131742774fa97e1cdc0bfe6d75029a 100644 (file)
@@ -567,6 +567,8 @@ void ide_pci_setup_ports(struct pci_dev *dev, ide_pci_device_t *d, int pciirq, a
                    (d->host_flags & IDE_HFLAG_FORCE_LEGACY_IRQS))
                        hwif->irq = port ? 15 : 14;
 
+               hwif->fixup = d->fixup;
+
                hwif->host_flags = d->host_flags;
                hwif->pio_mask = d->pio_mask;
 
@@ -692,9 +694,9 @@ int ide_setup_pci_device(struct pci_dev *dev, ide_pci_device_t *d)
                mate = &ide_hwifs[index_list.b.high];
 
        if (hwif)
-               probe_hwif_init_with_fixup(hwif, d->fixup);
+               probe_hwif_init(hwif);
        if (mate)
-               probe_hwif_init_with_fixup(mate, d->fixup);
+               probe_hwif_init(mate);
 
        if (hwif)
                ide_proc_register_port(hwif);
index c803d2bba65db3148a3bfd3060deebf4ae9a69af..48d647abea460ce914168072012208690c4c57d5 100644 (file)
@@ -563,7 +563,7 @@ static void media_bay_step(int i)
                                ide_init_hwif_ports(&hw, (unsigned long) bay->cd_base, (unsigned long) 0, NULL);
                                hw.irq = bay->cd_irq;
                                hw.chipset = ide_pmac;
-                               bay->cd_index = ide_register_hw(&hw, 0, NULL);
+                               bay->cd_index = ide_register_hw(&hw, NULL, 0, NULL);
                                pmu_resume();
                        }
                        if (bay->cd_index == -1) {
index 258a15cc27461e19b8da6c09e00b1c509cf0c69c..831b9cc2f1d9fdd03a3c31cfc5682dc2ae0aad52 100644 (file)
@@ -223,12 +223,8 @@ typedef struct hw_regs_s {
        struct device   *dev;
 } hw_regs_t;
 
-/*
- * Register new hardware with ide
- */
-int ide_register_hw(hw_regs_t *, int, struct hwif_s **);
-int ide_register_hw_with_fixup(hw_regs_t *, int, struct hwif_s **,
-                              void (*)(struct hwif_s *));
+int ide_register_hw(hw_regs_t *, void (*)(struct hwif_s *), int,
+                   struct hwif_s **);
 
 /*
  * Set up hw_regs_t structure before calling ide_register_hw (optional)
@@ -727,6 +723,8 @@ typedef struct hwif_s {
        u8 (*mdma_filter)(ide_drive_t *);
        u8 (*udma_filter)(ide_drive_t *);
 
+       void (*fixup)(struct hwif_s *);
+
        void (*ata_input_data)(ide_drive_t *, void *, u32);
        void (*ata_output_data)(ide_drive_t *, void *, u32);
 
@@ -1380,7 +1378,6 @@ void ide_unregister_region(struct gendisk *);
 
 void ide_undecoded_slave(ide_hwif_t *);
 
-int probe_hwif_init_with_fixup(ide_hwif_t *, void (*)(ide_hwif_t *));
 extern int probe_hwif_init(ide_hwif_t *);
 
 static inline void *ide_get_hwifdata (ide_hwif_t * hwif)