Commit 25b48ff8 authored by Mark Salter's avatar Mark Salter

C6X: fix timer64 initialization

Some SoCs have a timer block enable controlled through the DSCR registers.
There is a problem in the timer64 driver initialization where the code
accesses a timer register to get the divisor used to calculate timer clock
rate. If the timer block has not been enabled when this register read takes
place, an exception is generated. This patch makes sure that the timer block
is enabled before accessing the registers.
Signed-off-by: default avatarMark Salter <msalter@redhat.com>
parent 4a059ff3
...@@ -215,9 +215,17 @@ void __init timer64_init(void) ...@@ -215,9 +215,17 @@ void __init timer64_init(void)
/* If there is a device state control, save the ID. */ /* If there is a device state control, save the ID. */
err = of_property_read_u32(np, "ti,dscr-dev-enable", &val); err = of_property_read_u32(np, "ti,dscr-dev-enable", &val);
if (!err) if (!err) {
timer64_devstate_id = val; timer64_devstate_id = val;
/*
* It is necessary to enable the timer block here because
* the TIMER_DIVISOR macro needs to read a timer register
* to get the divisor.
*/
dscr_set_devstate(timer64_devstate_id, DSCR_DEVSTATE_ENABLED);
}
pr_debug("%s: Timer irq=%d.\n", np->full_name, cd->irq); pr_debug("%s: Timer irq=%d.\n", np->full_name, cd->irq);
clockevents_calc_mult_shift(cd, c6x_core_freq / TIMER_DIVISOR, 5); clockevents_calc_mult_shift(cd, c6x_core_freq / TIMER_DIVISOR, 5);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment