* Add "vlb_clock=" parameter for specifying VLB clock frequency (in MHz).
* Add "pci_clock=" parameter for specifying PCI bus clock frequency (in MHz).
While at it:
* qd65xx.c: rename {active,recovery}_cycle variables to {act,rec}_cyc.
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
        put_device(&hwif->gendev);
 }
 
+int ide_vlb_clk;
+EXPORT_SYMBOL_GPL(ide_vlb_clk);
+
+module_param_named(vlb_clock, ide_vlb_clk, int, 0);
+MODULE_PARM_DESC(vlb_clock, "VLB clock frequency (in MHz)");
+
+int ide_pci_clk;
+EXPORT_SYMBOL_GPL(ide_pci_clk);
+
+module_param_named(pci_clock, ide_pci_clk, int, 0);
+MODULE_PARM_DESC(pci_clock, "PCI bus clock frequency (in MHz)");
+
 static unsigned int ide_ignore_cable;
 
 static int ide_set_ignore_cable(const char *s, struct kernel_param *kp)
 
        int time1, time2;
        u8 param1, param2, param3, param4;
        unsigned long flags;
-       int bus_speed = system_bus_clock();
+       int bus_speed = ide_vlb_clk ? ide_vlb_clk : system_bus_clock();
 
        /* calculate timing, according to PIO mode */
        time1 = ide_pio_cycle_time(drive, pio);
 
 {
        int active_time, recovery_time;
        int active_cycles, recovery_cycles;
-       int bus_speed = system_bus_clock();
-       
+       int bus_speed = ide_vlb_clk ? ide_vlb_clk : system_bus_clock();
+
         if (pio) {
                unsigned int cycle_time;
 
 
 
 static u8 qd6500_compute_timing (ide_hwif_t *hwif, int active_time, int recovery_time)
 {
-       u8 active_cycle,recovery_cycle;
+       int clk = ide_vlb_clk ? ide_vlb_clk : system_bus_clock();
+       u8 act_cyc, rec_cyc;
 
-       if (system_bus_clock()<=33) {
-               active_cycle =   9  - IDE_IN(active_time   * system_bus_clock() / 1000 + 1, 2, 9);
-               recovery_cycle = 15 - IDE_IN(recovery_time * system_bus_clock() / 1000 + 1, 0, 15);
+       if (clk <= 33) {
+               act_cyc =  9 - IDE_IN(active_time   * clk / 1000 + 1, 2,  9);
+               rec_cyc = 15 - IDE_IN(recovery_time * clk / 1000 + 1, 0, 15);
        } else {
-               active_cycle =   8  - IDE_IN(active_time   * system_bus_clock() / 1000 + 1, 1, 8);
-               recovery_cycle = 18 - IDE_IN(recovery_time * system_bus_clock() / 1000 + 1, 3, 18);
+               act_cyc =  8 - IDE_IN(active_time   * clk / 1000 + 1, 1,  8);
+               rec_cyc = 18 - IDE_IN(recovery_time * clk / 1000 + 1, 3, 18);
        }
 
-       return((recovery_cycle<<4) | 0x08 | active_cycle);
+       return (rec_cyc << 4) | 0x08 | act_cyc;
 }
 
 /*
 
 static u8 qd6580_compute_timing (int active_time, int recovery_time)
 {
-       u8 active_cycle   = 17 - IDE_IN(active_time   * system_bus_clock() / 1000 + 1, 2, 17);
-       u8 recovery_cycle = 15 - IDE_IN(recovery_time * system_bus_clock() / 1000 + 1, 2, 15);
+       int clk = ide_vlb_clk ? ide_vlb_clk : system_bus_clock();
+       u8 act_cyc, rec_cyc;
 
-       return((recovery_cycle<<4) | active_cycle);
+       act_cyc = 17 - IDE_IN(active_time   * clk / 1000 + 1, 2, 17);
+       rec_cyc = 15 - IDE_IN(recovery_time * clk / 1000 + 1, 2, 15);
+
+       return (rec_cyc << 4) | act_cyc;
 }
 
 /*
 
 
 static unsigned int __devinit init_chipset_aec62xx(struct pci_dev *dev, const char *name)
 {
-       int bus_speed = system_bus_clock();
+       int bus_speed = ide_pci_clk ? ide_pci_clk : system_bus_clock();
 
        if (bus_speed <= 33)
                pci_set_drvdata(dev, (void *) aec6xxx_33_base);
 
        int s_time, a_time, c_time;
        u8 s_clc, a_clc, r_clc;
        unsigned long flags;
-       int bus_speed = system_bus_clock();
+       int bus_speed = ide_pci_clk ? ide_pci_clk : system_bus_clock();
        int port = hwif->channel ? 0x5c : 0x58;
        int portFIFO = hwif->channel ? 0x55 : 0x54;
        u8 cd_dma_fifo = 0;
 
  * Determine the system bus clock.
  */
 
-       amd_clock = system_bus_clock() * 1000;
+       amd_clock = (ide_pci_clk ? ide_pci_clk : system_bus_clock()) * 1000;
 
        switch (amd_clock) {
                case 33000: amd_clock = 33333; break;
 
 {
        int setup_time, active_time, recovery_time, clock_time;
        u8 setup_count, active_count, recovery_count, recovery_count2, cycle_count;
-       int bus_speed = system_bus_clock();
+       int bus_speed;
+
+       if (cmd640_vlb && ide_vlb_clk)
+               bus_speed = ide_vlb_clk;
+       else if (!cmd640_vlb && ide_pci_clk)
+               bus_speed = ide_pci_clk;
+       else
+               bus_speed = system_bus_clock();
 
        if (pio_mode > 5)
                pio_mode = 5;
 
  */
 static void program_cycle_times (ide_drive_t *drive, int cycle_time, int active_time)
 {
-       struct pci_dev *dev     = to_pci_dev(drive->hwif->dev);
-       int clock_time          = 1000 / system_bus_clock();
+       struct pci_dev *dev = to_pci_dev(drive->hwif->dev);
+       int clock_time = 1000 / (ide_pci_clk ? ide_pci_clk : system_bus_clock());
        u8  cycle_count, active_count, recovery_count, drwtim;
        static const u8 recovery_values[] =
                {15, 15, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0};
                            ide_pio_timings[pio].active_time);
 
        setup_count = quantize_timing(ide_pio_timings[pio].setup_time,
-                                     1000 / system_bus_clock());
+                       1000 / (ide_pci_clk ? ide_pci_clk : system_bus_clock()));
 
        /*
         * The primary channel has individual address setup timing registers
 
 static void compute_clocks(u8 pio, pio_clocks_t *p_pclk)
 {
        int clk1, clk2;
-       int bus_speed = system_bus_clock();     /* get speed of PCI bus */
+       int bus_speed = ide_pci_clk ? ide_pci_clk : system_bus_clock();
 
        /* we don't check against CY82C693's min and max speed,
         * so you can play with the idebus=xx parameter
 
 {
        if (pio != PIO_NOT_EXIST) {
                int adr_setup, data_pls;
-               int bus_speed = system_bus_clock();
+               int bus_speed = ide_pci_clk ? ide_pci_clk : system_bus_clock();
 
                adr_setup = ide_pio_timings[pio].setup_time;
                data_pls = ide_pio_timings[pio].active_time;
 
         * Determine system bus clock.
         */
 
-       via_clock = system_bus_clock() * 1000;
+       via_clock = (ide_pci_clk ? ide_pci_clk : system_bus_clock()) * 1000;
 
        switch (via_clock) {
                case 33000: via_clock = 33333; break;
 
 #endif
 extern int noautodma;
 
+extern int ide_vlb_clk;
+extern int ide_pci_clk;
+
 ide_hwif_t *ide_find_port_slot(const struct ide_port_info *);
 
 static inline ide_hwif_t *ide_find_port(void)