Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e6099002 authored by Kevin Hilman's avatar Kevin Hilman
Browse files

davinci: timers: use clk_get_rate()



Use clock framework instead of hard-coded CLOCK_TICK_RATE for
determining timer tick frequencies.

Signed-off-by: default avatarKevin Hilman <khilman@deeprootsystems.com>
parent f5c122da
Loading
Loading
Loading
Loading
+21 −3
Original line number Diff line number Diff line
@@ -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);