#ifdef CONFIG_X86_ACPI_CPUFREQ_PROC_INTF
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
+#include <linux/mutex.h>
#include <asm/uaccess.h>
#endif
#define _COMPONENT ACPI_PROCESSOR_COMPONENT
ACPI_MODULE_NAME("acpi_processor")
-static DECLARE_MUTEX(performance_sem);
+static DEFINE_MUTEX(performance_mutex);
/*
* _PPC support is implemented as a CPUfreq policy notifier:
struct acpi_processor *pr;
unsigned int ppc = 0;
- down(&performance_sem);
+ mutex_lock(&performance_mutex);
if (event != CPUFREQ_INCOMPATIBLE)
goto out;
core_frequency * 1000);
out:
- up(&performance_sem);
+ mutex_unlock(&performance_mutex);
return 0;
}
union acpi_object *psd = NULL;
struct acpi_psd_package *pdomain;
- ACPI_FUNCTION_TRACE("acpi_processor_get_psd");
-
status = acpi_evaluate_object(pr->handle, "_PSD", NULL, &buffer);
if (ACPI_FAILURE(status)) {
- return_VALUE(-ENODEV);
+ return -ENODEV;
}
psd = (union acpi_object *) buffer.pointer;
end:
acpi_os_free(buffer.pointer);
- return_VALUE(result);
+ return result;
}
int acpi_processor_preregister_performance(
struct acpi_processor *match_pr;
struct acpi_psd_package *match_pdomain;
- ACPI_FUNCTION_TRACE("acpi_processor_preregister_performance");
-
- down(&performance_sem);
+ mutex_lock(&performance_mutex);
retval = 0;
/* Call _PSD for all CPUs */
- for_each_cpu(i) {
+ for_each_possible_cpu(i) {
pr = processors[i];
if (!pr) {
/* Look only at processors in ACPI namespace */
* Now that we have _PSD data from all CPUs, lets setup P-state
* domain info.
*/
- for_each_cpu(i) {
+ for_each_possible_cpu(i) {
pr = processors[i];
if (!pr)
continue;
}
cpus_clear(covered_cpus);
- for_each_cpu(i) {
+ for_each_possible_cpu(i) {
pr = processors[i];
if (!pr)
continue;
pr->performance->shared_type = CPUFREQ_SHARED_TYPE_ANY;
}
- for_each_cpu(j) {
+ for_each_possible_cpu(j) {
if (i == j)
continue;
count++;
}
- for_each_cpu(j) {
+ for_each_possible_cpu(j) {
if (i == j)
continue;
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error while parsing _PSD domain information. Assuming no coordination\n"));
}
- for_each_cpu(i) {
+ for_each_possible_cpu(i) {
pr = processors[i];
if (!pr || !pr->performance)
continue;
pr->performance = NULL; /* Will be set for real in register */
}
- up(&performance_sem);
- return_VALUE(retval);
+ mutex_unlock(&performance_mutex);
+ return retval;
}
EXPORT_SYMBOL(acpi_processor_preregister_performance);
if (!(acpi_processor_ppc_status & PPC_REGISTERED))
return_VALUE(-EINVAL);
- down(&performance_sem);
+ mutex_lock(&performance_mutex);
pr = processors[cpu];
if (!pr) {
- up(&performance_sem);
+ mutex_unlock(&performance_mutex);
return_VALUE(-ENODEV);
}
if (pr->performance) {
- up(&performance_sem);
+ mutex_unlock(&performance_mutex);
return_VALUE(-EBUSY);
}
+ WARN_ON(!performance);
+
pr->performance = performance;
if (acpi_processor_get_performance_info(pr)) {
pr->performance = NULL;
- up(&performance_sem);
+ mutex_unlock(&performance_mutex);
return_VALUE(-EIO);
}
acpi_cpufreq_add_file(pr);
- up(&performance_sem);
+ mutex_unlock(&performance_mutex);
return_VALUE(0);
}
ACPI_FUNCTION_TRACE("acpi_processor_unregister_performance");
- down(&performance_sem);
+ mutex_lock(&performance_mutex);
pr = processors[cpu];
if (!pr) {
- up(&performance_sem);
+ mutex_unlock(&performance_mutex);
return_VOID;
}
- kfree(pr->performance->states);
+ if (pr->performance)
+ kfree(pr->performance->states);
pr->performance = NULL;
acpi_cpufreq_remove_file(pr);
- up(&performance_sem);
+ mutex_unlock(&performance_mutex);
return_VOID;
}