|
@@ -1076,15 +1076,28 @@ static const struct of_device_id arch_timer_mem_of_match[] __initconst = {
|
|
|
{},
|
|
|
};
|
|
|
|
|
|
-static bool __init
|
|
|
-arch_timer_needs_probing(int type, const struct of_device_id *matches)
|
|
|
+static bool __init arch_timer_needs_of_probing(void)
|
|
|
{
|
|
|
struct device_node *dn;
|
|
|
bool needs_probing = false;
|
|
|
+ unsigned int mask = ARCH_TIMER_TYPE_CP15 | ARCH_TIMER_TYPE_MEM;
|
|
|
|
|
|
- dn = of_find_matching_node(NULL, matches);
|
|
|
- if (dn && of_device_is_available(dn) && !(arch_timers_present & type))
|
|
|
+ /* We have two timers, and both device-tree nodes are probed. */
|
|
|
+ if ((arch_timers_present & mask) == mask)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Only one type of timer is probed,
|
|
|
+ * check if we have another type of timer node in device-tree.
|
|
|
+ */
|
|
|
+ if (arch_timers_present & ARCH_TIMER_TYPE_CP15)
|
|
|
+ dn = of_find_matching_node(NULL, arch_timer_mem_of_match);
|
|
|
+ else
|
|
|
+ dn = of_find_matching_node(NULL, arch_timer_of_match);
|
|
|
+
|
|
|
+ if (dn && of_device_is_available(dn))
|
|
|
needs_probing = true;
|
|
|
+
|
|
|
of_node_put(dn);
|
|
|
|
|
|
return needs_probing;
|
|
@@ -1092,17 +1105,8 @@ arch_timer_needs_probing(int type, const struct of_device_id *matches)
|
|
|
|
|
|
static int __init arch_timer_common_init(void)
|
|
|
{
|
|
|
- unsigned mask = ARCH_TIMER_TYPE_CP15 | ARCH_TIMER_TYPE_MEM;
|
|
|
-
|
|
|
- /* Wait until both nodes are probed if we have two timers */
|
|
|
- if ((arch_timers_present & mask) != mask) {
|
|
|
- if (arch_timer_needs_probing(ARCH_TIMER_TYPE_MEM,
|
|
|
- arch_timer_mem_of_match))
|
|
|
- return 0;
|
|
|
- if (arch_timer_needs_probing(ARCH_TIMER_TYPE_CP15,
|
|
|
- arch_timer_of_match))
|
|
|
- return 0;
|
|
|
- }
|
|
|
+ if (acpi_disabled && arch_timer_needs_of_probing())
|
|
|
+ return 0;
|
|
|
|
|
|
arch_timer_banner(arch_timers_present);
|
|
|
arch_counter_register(arch_timers_present);
|