regmap_st = syscon_node_to_regmap(node); if (IS_ERR(regmap_st)) {
pr_err("Unable to get regmap\n"); return PTR_ERR(regmap_st);
}
/* Disable all timer interrupts, and clear any pending ones */
regmap_write(regmap_st, AT91_ST_IDR,
AT91_ST_PITS | AT91_ST_WDOVF | AT91_ST_RTTINC | AT91_ST_ALMS);
regmap_read(regmap_st, AT91_ST_SR, &val);
/* Get the interrupts property */
irq = irq_of_parse_and_map(node, 0); if (!irq) {
pr_err("Unable to get IRQ from DT\n"); return -EINVAL;
}
/* Make IRQs happen for the system timer */
ret = request_irq(irq, at91rm9200_timer_interrupt,
IRQF_SHARED | IRQF_TIMER | IRQF_IRQPOLL, "at91_tick", regmap_st); if (ret) {
pr_err("Unable to setup IRQ\n"); return ret;
}
sclk = of_clk_get(node, 0); if (IS_ERR(sclk)) {
pr_err("Unable to get slow clock\n"); return PTR_ERR(sclk);
}
ret = clk_prepare_enable(sclk); if (ret) {
pr_err("Could not enable slow clock\n"); return ret;
}
/* The 32KiHz "Slow Clock" (tick every 30517.58 nanoseconds) is used *directlyfortheclocksourceandallclockevents,afteradjusting *itsprescalerfromthe1Hzdefault.
*/
regmap_write(regmap_st, AT91_ST_RTMR, 1);
/* Setup timer clockevent, with minimum of two ticks (important!!) */
clkevt.cpumask = cpumask_of(0);
clockevents_config_and_register(&clkevt, sclk_rate, 2, AT91_ST_ALMV);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.