• Dominik Brodowski's avatar
    [CPUFREQ] Re-enable cpufreq suspend and resume code · ce6c3997
    Dominik Brodowski authored
    Commit 4bc5d341 is broken and causes regressions:
    
    (1) cpufreq_driver->resume() and ->suspend() were only called on
    __powerpc__, but you could set them on all architectures. In fact,
    ->resume() was defined and used before the PPC-related commit
    42d4dc3f complained about in 4bc5d341.
    
    (2) Therfore, the resume functions in acpi_cpufreq and speedstep-smi
    would never be called.
    
    (3) This means speedstep-smi would be unusuable after suspend or resume.
    
    The _real_ problem was calling cpufreq_driver->get() with interrupts
    off, but it re-enabling interrupts on some platforms. Why is ->get()
    necessary?
    
    Some systems like to change the CPU frequency behind our
    back, especially during BIOS-intensive operations like suspend or
    resume. If such systems also use a CPU frequency-dependant timing loop,
    delays might be off by large factors. Therefore, we need to ascertain
    as soon as possible that the CPU frequency is indeed at the speed we
    think it is. You can do this two ways: either setting it anew, or trying
    to get it. The latter is what was done, the former also has the same IRQ
    issue.
    
    So, let's try something different: defer the checking to after interrupts
    are re-enabled, by calling cpufreq_update_policy() (via schedule_work()).
    Timings may be off until this later stage, so let's watch out for
    resume regressions caused by the deferred handling of frequency changes
    behind the kernel's back.
    Signed-off-by: default avatarDominik Brodowski <linux@dominikbrodowski.net>
    Signed-off-by: default avatarDave Jones <davej@redhat.com>
    ce6c3997
cpufreq.c 47.7 KB