|
@@ -1268,10 +1268,6 @@ arch_timer_mem_find_best_frame(struct arch_timer_mem *timer_mem)
|
|
|
|
|
|
iounmap(cntctlbase);
|
|
|
|
|
|
- if (!best_frame)
|
|
|
- pr_err("Unable to find a suitable frame in timer @ %pa\n",
|
|
|
- &timer_mem->cntctlbase);
|
|
|
-
|
|
|
return best_frame;
|
|
|
}
|
|
|
|
|
@@ -1372,6 +1368,8 @@ static int __init arch_timer_mem_of_init(struct device_node *np)
|
|
|
|
|
|
frame = arch_timer_mem_find_best_frame(timer_mem);
|
|
|
if (!frame) {
|
|
|
+ pr_err("Unable to find a suitable frame in timer @ %pa\n",
|
|
|
+ &timer_mem->cntctlbase);
|
|
|
ret = -EINVAL;
|
|
|
goto out;
|
|
|
}
|
|
@@ -1420,7 +1418,7 @@ arch_timer_mem_verify_cntfrq(struct arch_timer_mem *timer_mem)
|
|
|
static int __init arch_timer_mem_acpi_init(int platform_timer_count)
|
|
|
{
|
|
|
struct arch_timer_mem *timers, *timer;
|
|
|
- struct arch_timer_mem_frame *frame;
|
|
|
+ struct arch_timer_mem_frame *frame, *best_frame = NULL;
|
|
|
int timer_count, i, ret = 0;
|
|
|
|
|
|
timers = kcalloc(platform_timer_count, sizeof(*timers),
|
|
@@ -1432,14 +1430,6 @@ static int __init arch_timer_mem_acpi_init(int platform_timer_count)
|
|
|
if (ret || !timer_count)
|
|
|
goto out;
|
|
|
|
|
|
- for (i = 0; i < timer_count; i++) {
|
|
|
- ret = arch_timer_mem_verify_cntfrq(&timers[i]);
|
|
|
- if (ret) {
|
|
|
- pr_err("Disabling MMIO timers due to CNTFRQ mismatch\n");
|
|
|
- goto out;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
/*
|
|
|
* While unlikely, it's theoretically possible that none of the frames
|
|
|
* in a timer expose the combination of feature we want.
|
|
@@ -1448,12 +1438,26 @@ static int __init arch_timer_mem_acpi_init(int platform_timer_count)
|
|
|
timer = &timers[i];
|
|
|
|
|
|
frame = arch_timer_mem_find_best_frame(timer);
|
|
|
- if (frame)
|
|
|
- break;
|
|
|
+ if (!best_frame)
|
|
|
+ best_frame = frame;
|
|
|
+
|
|
|
+ ret = arch_timer_mem_verify_cntfrq(timer);
|
|
|
+ if (ret) {
|
|
|
+ pr_err("Disabling MMIO timers due to CNTFRQ mismatch\n");
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!best_frame) /* implies !frame */
|
|
|
+ /*
|
|
|
+ * Only complain about missing suitable frames if we
|
|
|
+ * haven't already found one in a previous iteration.
|
|
|
+ */
|
|
|
+ pr_err("Unable to find a suitable frame in timer @ %pa\n",
|
|
|
+ &timer->cntctlbase);
|
|
|
}
|
|
|
|
|
|
- if (frame)
|
|
|
- ret = arch_timer_mem_frame_register(frame);
|
|
|
+ if (best_frame)
|
|
|
+ ret = arch_timer_mem_frame_register(best_frame);
|
|
|
out:
|
|
|
kfree(timers);
|
|
|
return ret;
|