|
@@ -368,22 +368,16 @@ static int __init pcc_cpufreq_do_osc(acpi_handle *handle)
|
|
return -ENODEV;
|
|
return -ENODEV;
|
|
|
|
|
|
out_obj = output.pointer;
|
|
out_obj = output.pointer;
|
|
- if (out_obj->type != ACPI_TYPE_BUFFER) {
|
|
|
|
- ret = -ENODEV;
|
|
|
|
- goto out_free;
|
|
|
|
- }
|
|
|
|
|
|
+ if (out_obj->type != ACPI_TYPE_BUFFER)
|
|
|
|
+ return -ENODEV;
|
|
|
|
|
|
errors = *((u32 *)out_obj->buffer.pointer) & ~(1 << 0);
|
|
errors = *((u32 *)out_obj->buffer.pointer) & ~(1 << 0);
|
|
- if (errors) {
|
|
|
|
- ret = -ENODEV;
|
|
|
|
- goto out_free;
|
|
|
|
- }
|
|
|
|
|
|
+ if (errors)
|
|
|
|
+ return -ENODEV;
|
|
|
|
|
|
supported = *((u32 *)(out_obj->buffer.pointer + 4));
|
|
supported = *((u32 *)(out_obj->buffer.pointer + 4));
|
|
- if (!(supported & 0x1)) {
|
|
|
|
- ret = -ENODEV;
|
|
|
|
- goto out_free;
|
|
|
|
- }
|
|
|
|
|
|
+ if (!(supported & 0x1))
|
|
|
|
+ return -ENODEV;
|
|
|
|
|
|
out_free:
|
|
out_free:
|
|
kfree(output.pointer);
|
|
kfree(output.pointer);
|
|
@@ -397,13 +391,17 @@ static int __init pcc_cpufreq_probe(void)
|
|
struct pcc_memory_resource *mem_resource;
|
|
struct pcc_memory_resource *mem_resource;
|
|
struct pcc_register_resource *reg_resource;
|
|
struct pcc_register_resource *reg_resource;
|
|
union acpi_object *out_obj, *member;
|
|
union acpi_object *out_obj, *member;
|
|
- acpi_handle handle, osc_handle;
|
|
|
|
|
|
+ acpi_handle handle, osc_handle, pcch_handle;
|
|
int ret = 0;
|
|
int ret = 0;
|
|
|
|
|
|
status = acpi_get_handle(NULL, "\\_SB", &handle);
|
|
status = acpi_get_handle(NULL, "\\_SB", &handle);
|
|
if (ACPI_FAILURE(status))
|
|
if (ACPI_FAILURE(status))
|
|
return -ENODEV;
|
|
return -ENODEV;
|
|
|
|
|
|
|
|
+ status = acpi_get_handle(handle, "PCCH", &pcch_handle);
|
|
|
|
+ if (ACPI_FAILURE(status))
|
|
|
|
+ return -ENODEV;
|
|
|
|
+
|
|
status = acpi_get_handle(handle, "_OSC", &osc_handle);
|
|
status = acpi_get_handle(handle, "_OSC", &osc_handle);
|
|
if (ACPI_SUCCESS(status)) {
|
|
if (ACPI_SUCCESS(status)) {
|
|
ret = pcc_cpufreq_do_osc(&osc_handle);
|
|
ret = pcc_cpufreq_do_osc(&osc_handle);
|
|
@@ -543,13 +541,13 @@ static int pcc_cpufreq_cpu_init(struct cpufreq_policy *policy)
|
|
|
|
|
|
if (!pcch_virt_addr) {
|
|
if (!pcch_virt_addr) {
|
|
result = -1;
|
|
result = -1;
|
|
- goto pcch_null;
|
|
|
|
|
|
+ goto out;
|
|
}
|
|
}
|
|
|
|
|
|
result = pcc_get_offset(cpu);
|
|
result = pcc_get_offset(cpu);
|
|
if (result) {
|
|
if (result) {
|
|
dprintk("init: PCCP evaluation failed\n");
|
|
dprintk("init: PCCP evaluation failed\n");
|
|
- goto free;
|
|
|
|
|
|
+ goto out;
|
|
}
|
|
}
|
|
|
|
|
|
policy->max = policy->cpuinfo.max_freq =
|
|
policy->max = policy->cpuinfo.max_freq =
|
|
@@ -558,14 +556,15 @@ static int pcc_cpufreq_cpu_init(struct cpufreq_policy *policy)
|
|
ioread32(&pcch_hdr->minimum_frequency) * 1000;
|
|
ioread32(&pcch_hdr->minimum_frequency) * 1000;
|
|
policy->cur = pcc_get_freq(cpu);
|
|
policy->cur = pcc_get_freq(cpu);
|
|
|
|
|
|
|
|
+ if (!policy->cur) {
|
|
|
|
+ dprintk("init: Unable to get current CPU frequency\n");
|
|
|
|
+ result = -EINVAL;
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
+
|
|
dprintk("init: policy->max is %d, policy->min is %d\n",
|
|
dprintk("init: policy->max is %d, policy->min is %d\n",
|
|
policy->max, policy->min);
|
|
policy->max, policy->min);
|
|
-
|
|
|
|
- return 0;
|
|
|
|
-free:
|
|
|
|
- pcc_clear_mapping();
|
|
|
|
- free_percpu(pcc_cpu_info);
|
|
|
|
-pcch_null:
|
|
|
|
|
|
+out:
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|