diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/clocksource/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/clocksource/arm_arch_timer.c | 23 | 
2 files changed, 10 insertions, 14 deletions
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig index e507ab7df60..d98e7e1ee59 100644 --- a/drivers/clocksource/Kconfig +++ b/drivers/clocksource/Kconfig @@ -62,6 +62,7 @@ config CLKSRC_DBX500_PRCMU_SCHED_CLOCK  config ARM_ARCH_TIMER  	bool +	select CLKSRC_OF if OF  config CLKSRC_METAG_GENERIC  	def_bool y if METAG diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c index d7ad425ab9b..122ff05628b 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c @@ -337,22 +337,14 @@ out:  	return err;  } -static const struct of_device_id arch_timer_of_match[] __initconst = { -	{ .compatible	= "arm,armv7-timer",	}, -	{ .compatible	= "arm,armv8-timer",	}, -	{}, -}; - -int __init arch_timer_init(void) +static void __init arch_timer_init(struct device_node *np)  { -	struct device_node *np;  	u32 freq;  	int i; -	np = of_find_matching_node(NULL, arch_timer_of_match); -	if (!np) { -		pr_err("arch_timer: can't find DT node\n"); -		return -ENODEV; +	if (arch_timer_get_rate()) { +		pr_warn("arch_timer: multiple nodes in dt, skipping\n"); +		return;  	}  	/* Try to determine the frequency from the device tree or CNTFRQ */ @@ -378,7 +370,7 @@ int __init arch_timer_init(void)  		if (!arch_timer_ppi[PHYS_SECURE_PPI] ||  		    !arch_timer_ppi[PHYS_NONSECURE_PPI]) {  			pr_warn("arch_timer: No interrupt available, giving up\n"); -			return -EINVAL; +			return;  		}  	} @@ -387,5 +379,8 @@ int __init arch_timer_init(void)  	else  		arch_timer_read_counter = arch_counter_get_cntpct; -	return arch_timer_register(); +	arch_timer_register(); +	arch_timer_arch_init();  } +CLOCKSOURCE_OF_DECLARE(armv7_arch_timer, "arm,armv7-timer", arch_timer_init); +CLOCKSOURCE_OF_DECLARE(armv8_arch_timer, "arm,armv8-timer", arch_timer_init);  |