Skip to content

Commit

Permalink
clocksource: arm_arch_timer: Discard unavailable timers correctly
Browse files Browse the repository at this point in the history
Currently we wait until both cp15 and mem timers are probed if we
have both timer device nodes present in the device tree without
checking if the device is actually available. If one of the timer
device node present is disabled, the system locks up on the boot
as no timer gets registered.

This patch adds the check for the availability of the timer device
so that unavailable timers are discarded correctly. It also adds
the missing of_node_put.

Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
Reviewed-by: Stephen Boyd <sboyd@codeaurora.org>
Acked-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
  • Loading branch information
Sudeep Holla authored and Daniel Lezcano committed Sep 28, 2014
1 parent 04f7e3e commit c387f07
Showing 1 changed file with 16 additions and 4 deletions.
20 changes: 16 additions & 4 deletions drivers/clocksource/arm_arch_timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -616,17 +616,29 @@ static const struct of_device_id arch_timer_mem_of_match[] __initconst = {
{},
};

static bool __init
arch_timer_probed(int type, const struct of_device_id *matches)
{
struct device_node *dn;
bool probed = false;

dn = of_find_matching_node(NULL, matches);
if (dn && of_device_is_available(dn) && (arch_timers_present & type))
probed = true;
of_node_put(dn);

return probed;
}

static void __init arch_timer_common_init(void)
{
unsigned mask = ARCH_CP15_TIMER | ARCH_MEM_TIMER;

/* Wait until both nodes are probed if we have two timers */
if ((arch_timers_present & mask) != mask) {
if (of_find_matching_node(NULL, arch_timer_mem_of_match) &&
!(arch_timers_present & ARCH_MEM_TIMER))
if (!arch_timer_probed(ARCH_MEM_TIMER, arch_timer_mem_of_match))
return;
if (of_find_matching_node(NULL, arch_timer_of_match) &&
!(arch_timers_present & ARCH_CP15_TIMER))
if (!arch_timer_probed(ARCH_CP15_TIMER, arch_timer_of_match))
return;
}

Expand Down

0 comments on commit c387f07

Please sign in to comment.