Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.5 54 lines 1.3 kB view raw
1#include <linux/clocksource.h> 2#include <linux/sched_clock.h> 3#include <linux/of_address.h> 4#include <linux/printk.h> 5#include <linux/delay.h> 6#include <linux/init.h> 7#include <linux/clk.h> 8 9static void __iomem *xtal_in_cnt; 10static struct delay_timer delay_timer; 11 12static unsigned long notrace read_xtal_counter(void) 13{ 14 return readl_relaxed(xtal_in_cnt); 15} 16 17static u64 notrace read_sched_clock(void) 18{ 19 return read_xtal_counter(); 20} 21 22static void __init tango_clocksource_init(struct device_node *np) 23{ 24 struct clk *clk; 25 int xtal_freq, ret; 26 27 xtal_in_cnt = of_iomap(np, 0); 28 if (xtal_in_cnt == NULL) { 29 pr_err("%s: invalid address\n", np->full_name); 30 return; 31 } 32 33 clk = of_clk_get(np, 0); 34 if (IS_ERR(clk)) { 35 pr_err("%s: invalid clock\n", np->full_name); 36 return; 37 } 38 39 xtal_freq = clk_get_rate(clk); 40 delay_timer.freq = xtal_freq; 41 delay_timer.read_current_timer = read_xtal_counter; 42 43 ret = clocksource_mmio_init(xtal_in_cnt, "tango-xtal", xtal_freq, 350, 44 32, clocksource_mmio_readl_up); 45 if (!ret) { 46 pr_err("%s: registration failed\n", np->full_name); 47 return; 48 } 49 50 sched_clock_register(read_sched_clock, 32, xtal_freq); 51 register_current_timer_delay(&delay_timer); 52} 53 54CLOCKSOURCE_OF_DECLARE(tango, "sigma,tick-counter", tango_clocksource_init);