/** * cpuidle_switch_governor - changes the governor * @gov: the new target governor * * NOTE: "gov" can be NULL to specify disabled * Must be called with cpuidle_lock acquired. */ int cpuidle_switch_governor(struct cpuidle_governor *gov) { struct cpuidle_device *dev; if (gov == cpuidle_curr_governor) return 0; cpuidle_uninstall_idle_handler(); if (cpuidle_curr_governor) { list_for_each_entry(dev, &cpuidle_detected_devices, device_list) cpuidle_disable_device(dev); module_put(cpuidle_curr_governor->owner); } cpuidle_curr_governor = gov; if (gov) { if (!try_module_get(cpuidle_curr_governor->owner)) return -EINVAL; list_for_each_entry(dev, &cpuidle_detected_devices, device_list) cpuidle_enable_device(dev); cpuidle_install_idle_handler(); printk(KERN_INFO "cpuidle: using governor %s\n", gov->name); } return 0; }
/** * cpuidle_register_device - registers a CPU's idle PM feature * @dev: the cpu */ int cpuidle_register_device(struct cpuidle_device *dev) { int ret; struct sys_device *sys_dev = get_cpu_sysdev((unsigned long)dev->cpu); if (!sys_dev) return -EINVAL; if (!try_module_get(cpuidle_curr_driver->owner)) return -EINVAL; init_completion(&dev->kobj_unregister); mutex_lock(&cpuidle_lock); poll_idle_init(dev); per_cpu(cpuidle_devices, dev->cpu) = dev; list_add(&dev->device_list, &cpuidle_detected_devices); if ((ret = cpuidle_add_sysfs(sys_dev))) { mutex_unlock(&cpuidle_lock); module_put(cpuidle_curr_driver->owner); return ret; } cpuidle_enable_device(dev); cpuidle_install_idle_handler(); mutex_unlock(&cpuidle_lock); return 0; }
int cpuidle_register_device(struct cpuidle_device *dev) { int ret; mutex_lock(&cpuidle_lock); if ((ret = __cpuidle_register_device(dev))) { mutex_unlock(&cpuidle_lock); return ret; } cpuidle_enable_device(dev); cpuidle_install_idle_handler(); mutex_unlock(&cpuidle_lock); return 0; }
void cpuidle_resume_and_unlock(void) { cpuidle_install_idle_handler(); mutex_unlock(&cpuidle_lock); }
/* Currently used in suspend/resume path to resume cpuidle */ void cpuidle_resume(void) { mutex_lock(&cpuidle_lock); cpuidle_install_idle_handler(); mutex_unlock(&cpuidle_lock); }