diff options
Diffstat (limited to 'drivers/clocksource/arm_arch_timer.c')
| -rw-r--r-- | drivers/clocksource/arm_arch_timer.c | 18 | 
1 files changed, 15 insertions, 3 deletions
diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c index befe54a9af60..ecf7b7db2d05 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c @@ -889,6 +889,17 @@ static int arch_timer_starting_cpu(unsigned int cpu)  	return 0;  } +static int validate_timer_rate(void) +{ +	if (!arch_timer_rate) +		return -EINVAL; + +	/* Arch timer frequency < 1MHz can cause trouble */ +	WARN_ON(arch_timer_rate < 1000000); + +	return 0; +} +  /*   * For historical reasons, when probing with DT we use whichever (non-zero)   * rate was probed first, and don't verify that others match. If the first node @@ -904,7 +915,7 @@ static void arch_timer_of_configure_rate(u32 rate, struct device_node *np)  		arch_timer_rate = rate;  	/* Check the timer frequency. */ -	if (arch_timer_rate == 0) +	if (validate_timer_rate())  		pr_warn("frequency not available\n");  } @@ -1596,9 +1607,10 @@ static int __init arch_timer_acpi_init(struct acpi_table_header *table)  	 * CNTFRQ value. This *must* be correct.  	 */  	arch_timer_rate = arch_timer_get_cntfrq(); -	if (!arch_timer_rate) { +	ret = validate_timer_rate(); +	if (ret) {  		pr_err(FW_BUG "frequency not available.\n"); -		return -EINVAL; +		return ret;  	}  	arch_timer_uses_ppi = arch_timer_select_ppi();  | 
