static ssize_t __cpuinit store_cpus_offlined(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count) { int ret = 0; uint32_t val = 0; mutex_lock(&core_control_mutex); ret = kstrtouint(buf, 10, &val); if (ret) { pr_err("%s: Invalid input %s\n", KBUILD_MODNAME, buf); goto done_cc; } if (enabled) { pr_err("%s: Ignoring request; polling thread is enabled.\n", KBUILD_MODNAME); goto done_cc; } if (cpus_offlined == val) goto done_cc; update_offline_cores(val); done_cc: mutex_unlock(&core_control_mutex); return count; }
static __ref int do_hotplug(void *data) { int ret = 0; int cpu = 0; uint32_t mask = 0; if (!core_control_enabled) return -EINVAL; while (!kthread_should_stop()) { wait_for_completion(&hotplug_notify_complete); INIT_COMPLETION(hotplug_notify_complete); mask = 0; mutex_lock(&core_control_mutex); for_each_possible_cpu(cpu) { if (cpus[cpu].offline || cpus[cpu].user_offline) mask |= BIT(cpu); } if (mask != cpus_offlined) update_offline_cores(mask); mutex_unlock(&core_control_mutex); sysfs_notify(cc_kobj, NULL, "cpus_offlined"); } return ret; }
static ssize_t __cpuinit store_cc_enabled(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count) { int ret = 0; int val = 0; mutex_lock(&core_control_mutex); ret = kstrtoint(buf, 10, &val); if (ret) { pr_err("%s: Invalid input %s\n", KBUILD_MODNAME, buf); goto done_store_cc; } if (core_control_enabled == !!val) goto done_store_cc; core_control_enabled = !!val; if (core_control_enabled) { pr_info("%s: Core control enabled\n", KBUILD_MODNAME); register_cpu_notifier(&msm_thermal_cpu_notifier); update_offline_cores(cpus_offlined); } else { pr_info("%s: Core control disabled\n", KBUILD_MODNAME); unregister_cpu_notifier(&msm_thermal_cpu_notifier); } done_store_cc: mutex_unlock(&core_control_mutex); return count; }
int __devinit msm_thermal_init(struct msm_thermal_data *pdata) { int ret = 0; BUG_ON(!pdata); tsens_get_max_sensor_num(&max_tsens_num); memcpy(&msm_thermal_info, pdata, sizeof(struct msm_thermal_data)); if (create_sensor_id_map()) return -EINVAL; if (check_sensor_id(msm_thermal_info.sensor_id)) return -EINVAL; enabled = 1; INIT_DELAYED_WORK(&check_temp_work, check_temp); schedule_delayed_work(&check_temp_work, 0); if (num_possible_cpus() > 1) { mutex_lock(&core_control_mutex); core_control_enabled = 1; register_cpu_notifier(&msm_thermal_cpu_notifier); update_offline_cores(cpus_offlined); mutex_unlock(&core_control_mutex); } return ret; }