mirror of
https://github.com/torvalds/linux.git
synced 2024-12-14 23:25:54 +00:00
davinci: timers: use clk_get_rate()
Use clock framework instead of hard-coded CLOCK_TICK_RATE for determining timer tick frequencies. Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
This commit is contained in:
parent
f5c122da54
commit
e60990023c
@ -31,6 +31,7 @@
|
||||
#include "clock.h"
|
||||
|
||||
static struct clock_event_device clockevent_davinci;
|
||||
static unsigned int davinci_clock_tick_rate;
|
||||
|
||||
#define DAVINCI_TIMER0_BASE (IO_PHYS + 0x21400)
|
||||
#define DAVINCI_TIMER1_BASE (IO_PHYS + 0x21800)
|
||||
@ -282,7 +283,7 @@ static void davinci_set_mode(enum clock_event_mode mode,
|
||||
|
||||
switch (mode) {
|
||||
case CLOCK_EVT_MODE_PERIODIC:
|
||||
t->period = CLOCK_TICK_RATE / (HZ);
|
||||
t->period = davinci_clock_tick_rate / (HZ);
|
||||
t->opts = TIMER_OPTS_PERIODIC;
|
||||
timer32_config(t);
|
||||
break;
|
||||
@ -309,21 +310,29 @@ static struct clock_event_device clockevent_davinci = {
|
||||
|
||||
static void __init davinci_timer_init(void)
|
||||
{
|
||||
struct clk *timer_clk;
|
||||
|
||||
static char err[] __initdata = KERN_ERR
|
||||
"%s: can't register clocksource!\n";
|
||||
|
||||
/* init timer hw */
|
||||
timer_init();
|
||||
|
||||
timer_clk = clk_get(NULL, "timer0");
|
||||
BUG_ON(IS_ERR(timer_clk));
|
||||
clk_enable(timer_clk);
|
||||
|
||||
davinci_clock_tick_rate = clk_get_rate(timer_clk);
|
||||
|
||||
/* setup clocksource */
|
||||
clocksource_davinci.mult =
|
||||
clocksource_khz2mult(CLOCK_TICK_RATE/1000,
|
||||
clocksource_khz2mult(davinci_clock_tick_rate/1000,
|
||||
clocksource_davinci.shift);
|
||||
if (clocksource_register(&clocksource_davinci))
|
||||
printk(err, clocksource_davinci.name);
|
||||
|
||||
/* setup clockevent */
|
||||
clockevent_davinci.mult = div_sc(CLOCK_TICK_RATE, NSEC_PER_SEC,
|
||||
clockevent_davinci.mult = div_sc(davinci_clock_tick_rate, NSEC_PER_SEC,
|
||||
clockevent_davinci.shift);
|
||||
clockevent_davinci.max_delta_ns =
|
||||
clockevent_delta2ns(0xfffffffe, &clockevent_davinci);
|
||||
@ -343,6 +352,15 @@ struct sys_timer davinci_timer = {
|
||||
void davinci_watchdog_reset(void) {
|
||||
u32 tgcr, wdtcr;
|
||||
void __iomem *base = IO_ADDRESS(DAVINCI_WDOG_BASE);
|
||||
struct device dev;
|
||||
struct clk *wd_clk;
|
||||
char *name = "watchdog";
|
||||
|
||||
dev_set_name(&dev, name);
|
||||
wd_clk = clk_get(&dev, NULL);
|
||||
if (WARN_ON(IS_ERR(wd_clk)))
|
||||
return;
|
||||
clk_enable(wd_clk);
|
||||
|
||||
/* disable, internal clock source */
|
||||
__raw_writel(0, base + TCR);
|
||||
|
Loading…
Reference in New Issue
Block a user