comment "Please see Documentation/ide/ide.txt for help/info on IDE drives"
 
+config IDE_TIMINGS
+       bool
+
 config IDE_ATAPI
        bool
 
 config BLK_DEV_AMD74XX
        tristate "AMD and nVidia IDE support"
        depends on !ARM
+       select IDE_TIMINGS
        select BLK_DEV_IDEDMA_PCI
        help
          This driver adds explicit support for AMD-7xx and AMD-8111 chips
 
 config BLK_DEV_VIA82CXXX
        tristate "VIA82CXXX chipset support"
+       select IDE_TIMINGS
        select BLK_DEV_IDEDMA_PCI
        help
          This driver adds explicit support for VIA BusMastering IDE chips.
 config BLK_DEV_IDE_PMAC
        tristate "PowerMac on-board IDE support"
        depends on PPC_PMAC && IDE=y && BLK_DEV_IDE=y
+       select IDE_TIMINGS
        help
          This driver provides support for the on-board IDE controller on
          most of the recent Apple Power Macintoshes and PowerBooks.
 config BLK_DEV_PALMCHIP_BK3710
        tristate "Palmchip bk3710 IDE controller support"
        depends on ARCH_DAVINCI
+       select IDE_TIMINGS
        select BLK_DEV_IDEDMA_SFF
        help
          Say Y here if you want to support the onchip IDE controller on the
 
 ide-core-y += ide.o ide-io.o ide-iops.o ide-lib.o ide-probe.o ide-taskfile.o
 
 # core IDE code
+ide-core-$(CONFIG_IDE_TIMINGS)         += ide-timings.o
 ide-core-$(CONFIG_IDE_ATAPI)           += ide-atapi.o
 ide-core-$(CONFIG_BLK_DEV_IDEPCI)      += setup-pci.o
 ide-core-$(CONFIG_BLK_DEV_IDEDMA)      += ide-dma.o
 
 #define BK3710_IORDYTMP                0x78
 #define BK3710_IORDYTMS                0x7C
 
-#include "../ide-timing.h"
-
 static unsigned ideclk_period; /* in nanoseconds */
 
 static const struct palm_bk3710_udmatiming palm_bk3710_udmatimings[6] = {
 
-#ifndef _IDE_TIMING_H
-#define _IDE_TIMING_H
-
 /*
  *  Copyright (c) 1999-2001 Vojtech Pavlik
  *
 
 #include <linux/kernel.h>
 #include <linux/hdreg.h>
+#include <linux/ide.h>
+#include <linux/module.h>
 
 /*
  * PIO 0-5, MWDMA 0-2 and UDMA 0-6 timings (in nanoseconds).
        { 0xff }
 };
 
+struct ide_timing *ide_timing_find_mode(u8 speed)
+{
+       struct ide_timing *t;
+
+       for (t = ide_timing; t->mode != speed; t++)
+               if (t->mode == 0xff)
+                       return NULL;
+       return t;
+}
+EXPORT_SYMBOL_GPL(ide_timing_find_mode);
+
 #define ENOUGH(v, unit)                (((v) - 1) / (unit) + 1)
 #define EZ(v, unit)            ((v) ? ENOUGH(v, unit) : 0)
 
        q->udma    = EZ(t->udma    * 1000, UT);
 }
 
-static void ide_timing_merge(struct ide_timing *a, struct ide_timing *b,
-                            struct ide_timing *m, unsigned int what)
+void ide_timing_merge(struct ide_timing *a, struct ide_timing *b,
+                     struct ide_timing *m, unsigned int what)
 {
        if (what & IDE_TIMING_SETUP)
                m->setup   = max(a->setup,   b->setup);
        if (what & IDE_TIMING_UDMA)
                m->udma    = max(a->udma,    b->udma);
 }
+EXPORT_SYMBOL_GPL(ide_timing_merge);
 
-static struct ide_timing *ide_timing_find_mode(u8 speed)
-{
-       struct ide_timing *t;
-
-       for (t = ide_timing; t->mode != speed; t++)
-               if (t->mode == 0xff)
-                       return NULL;
-       return t;
-}
-
-static int ide_timing_compute(ide_drive_t *drive, u8 speed,
-                             struct ide_timing *t, int T, int UT)
+int ide_timing_compute(ide_drive_t *drive, u8 speed,
+                      struct ide_timing *t, int T, int UT)
 {
        struct hd_driveid *id = drive->id;
        struct ide_timing *s, p;
 
        return 0;
 }
-
-#endif
+EXPORT_SYMBOL_GPL(ide_timing_compute);
 
 #include <linux/init.h>
 #include <linux/ide.h>
 
-#include "ide-timing.h"
-
 enum {
        AMD_IDE_CONFIG          = 0x41,
        AMD_CABLE_DETECT        = 0x42,
 
 #include <linux/pci.h>
 #include <linux/ide.h>
 
-#include "ide-timing.h"
-
 #define MSR_ATAC_BASE          0x51300000
 #define ATAC_GLD_MSR_CAP       (MSR_ATAC_BASE+0)
 #define ATAC_GLD_MSR_CONFIG    (MSR_ATAC_BASE+0x01)
 
 #include <linux/init.h>
 #include <linux/ide.h>
 
-#include "ide-timing.h"
-
 /* registers layout and init values are chipset family dependant */
 
 #define ATA_16         0x01
 /*
  * TODO:
  *     - CLEANUP
- *     - Use drivers/ide/ide-timing.h !
  *     - More checks in the config registers (force values instead of
  *       relying on the BIOS setting them correctly).
  *     - Further optimisations ?
 
 #include <asm/processor.h>
 #endif
 
-#include "ide-timing.h"
-
 #define VIA_IDE_ENABLE         0x40
 #define VIA_IDE_CONFIG         0x41
 #define VIA_FIFO_CONFIG                0x43
 
 #include <asm/mediabay.h>
 #endif
 
-#include "../ide-timing.h"
-
 #undef IDE_PMAC_DEBUG
 
 #define DMA_WAIT_TIMEOUT       50
 
                                  IDE_TIMING_CYCLE | IDE_TIMING_UDMA,
 };
 
+struct ide_timing *ide_timing_find_mode(u8);
+void ide_timing_merge(struct ide_timing *, struct ide_timing *,
+                     struct ide_timing *, unsigned int);
+int ide_timing_compute(ide_drive_t *, u8, struct ide_timing *, int, int);
+
 typedef struct ide_pio_timings_s {
        int     setup_time;     /* Address setup (ns) minimum */
        int     active_time;    /* Active pulse (ns) minimum */