• Dominik Brodowski's avatar
    [PATCH] cpufreq: add sysfs interface · 74e7a24b
    Dominik Brodowski authored
    This patch adds a sysfs interface to the cpufreq core, and marks the
    previous /proc/cpufreq interface as deprecated.
    
    As in drivers/base/cpu.c a "CPU driver" is registered, cpufreq acts as
    "interface" to this, offering the following files for each CPU
    (in /system/devices/sys/cpu.../) where CPUfreq support is present
    
    cpuinfo_min_freq (ro)	- minimum frequency (in kHz) the CPU supports
    cpuinfo_max_freq (ro)	- maximum frequency (in kHz) the CPU supports
    scaling_min_freq (rw)	- minimum frequency (in kHz) cpufreq may scale
    			     the CPU core to
    scaling_max_freq (rw)	- maximum frequency (in kHz) cpufreq may scale
    			     the CPU core to
    scaling_governor (rw)	- governor == "A feedback device on a machine
    			      or engine that is used to provide
    			      automatic control, as of speed,
    			      pressure, or temperature" [1, as noted
    			      by David Kimdon]. Decides what frequency
    			      is used. Currently, only "performance"
    			      and "powersave" are supported, more may
    			      be added later.
    
    (In future, a file scaling_driver (ro) which shows what CPUfreq driver
    is used (arm-sa1100,  gx-suspmod, speedstep, longrun, powernow-k6,
    ...) might be added, and this driver will be allowed to add files
    scaling_driver_* for driver-specific settings like "prefer fast FSB".
    And scaling_governor_* files might offer settings for the governor.)
    
    To implement this sysfs interface, the driver model "interface" code
    is used. Unfortunately, it has a non-trivial locking bug in
    drivers/base/intf.c: there's a down_write call for
    cls->subsys.rwsem in add_intf(), which then calls add(), which may call
    intf->add_device(), which may call interface_add_data(), which calls
    kobject_register(), which calls kobject_add(), which then tries to
    down_write cls->subsys.rwsem. Remember, that was already locked writable
    in add_intf().
    
    Because of that, interface_add_data() is commented out; this means
    that no link in /system/class/cpu/cpufreq is added, and that the
    dev-removal code isn't called. This shouldn't be a problem yet,
    though; as no cpufreq driver I know of is capable of CPU hotplugging.
    
        Dominik
    
    [1] http://dictionary.reference.com/search?q=governor
    74e7a24b
cpufreq.c 34.1 KB