struct cpufreq_freqs freqs;
        unsigned long flags;
        unsigned int pic1_mask, pic2_mask;
+       u32 bm_status = 0;
+       u32 bm_timeout = 100000;
 
        if (old_ratio == clock_ratio_index)
                return;
        outb(0xFF,0xA1);        /* Overkill */
        outb(0xFE,0x21);        /* TMR0 only */
 
+       /* Wait while PCI bus is busy. */
+       if (longhaul_flags & USE_NORTHBRIDGE
+           || ((pr != NULL) && pr->flags.bm_control)) {
+               acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS, &bm_status);
+               while (bm_status && bm_timeout) {
+                       acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS, 1);
+                       bm_timeout--;
+                       acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS,
+                                         &bm_status);
+               }
+       }
+
        if (longhaul_flags & USE_NORTHBRIDGE) {
                /* Disable AGP and PCI arbiters */
                outb(3, 0x22);
 
        freqs.new = calc_speed(longhaul_get_cpu_mult());
        cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
+
+       if (!bm_timeout)
+               printk(KERN_INFO PFX "Warning: Timeout while waiting for "
+                       "idle PCI bus.\n");
 }
 
 /*