ret = of_property_read_u32(np, "clock-frequency", &rate); if (ret) {
clk = of_clk_get(np, 0); if (IS_ERR(clk)) {
ret = PTR_ERR(clk);
pr_err("failed to get clock for clockevent: %d\n", ret); goto out;
}
ret = clk_prepare_enable(clk); if (ret) {
pr_err("failed to enable clock for clockevent: %d\n", ret); goto out_clk_put;
}
rate = clk_get_rate(clk);
}
base = of_iomap(np, 0); if (!base) {
ret = -EADDRNOTAVAIL;
pr_err("failed to map register for clockevent: %d\n", ret); goto out_clk_disable;
}
irq = irq_of_parse_and_map(np, 0); if (!irq) {
ret = -ENOENT;
pr_err("failed to get irq for clockevent: %d\n", ret); goto out_iounmap;
}
ce = kzalloc(sizeof(*ce), GFP_KERNEL); if (!ce) {
ret = -ENOMEM; goto out_iounmap;
}
ret = of_property_read_u32(np, "clock-frequency", &rate); if (ret) {
clk = of_clk_get(np, 0); if (IS_ERR(clk)) {
ret = PTR_ERR(clk);
pr_err("failed to get clock for clocksource: %d\n", ret); goto out;
}
ret = clk_prepare_enable(clk); if (ret) {
pr_err("failed to enable clock for clocksource: %d\n", ret); goto out_clk_put;
}
rate = clk_get_rate(clk);
}
base = of_iomap(np, 0); if (!base) {
ret = -EADDRNOTAVAIL;
pr_err("failed to map register for clocksource: %d\n", ret); goto out_clk_disable;
}
/* Ensure timer is disabled */
writel_relaxed(0, base + TIMER_CTRL);
/* ... and set it up as free-running clocksource */
writel_relaxed(0xffffffff, base + TIMER_VALUE);
writel_relaxed(0xffffffff, base + TIMER_RELOAD);
writel_relaxed(TIMER_CTRL_ENABLE, base + TIMER_CTRL);
ret = clocksource_mmio_init(base + TIMER_VALUE, name,
rate, 200, 32,
clocksource_mmio_readl_down); if (ret) {
pr_err("failed to init clocksource: %d\n", ret); goto out_iounmap;
}
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.