|
@@ -20,12 +20,6 @@
|
|
|
#include <asm/mach/time.h>
|
|
|
#include <asm/sched_clock.h>
|
|
|
|
|
|
-/*
|
|
|
- * Guaranteed runtime conversion range in seconds for
|
|
|
- * the clocksource and clockevent.
|
|
|
- */
|
|
|
-#define MTU_MIN_RANGE 4
|
|
|
-
|
|
|
/*
|
|
|
* The MTU device hosts four different counters, with 4 set of
|
|
|
* registers. These are register names.
|
|
@@ -66,12 +60,11 @@
|
|
|
#define MTU_PCELL2 0xff8
|
|
|
#define MTU_PCELL3 0xffC
|
|
|
|
|
|
+static void __iomem *mtu_base;
|
|
|
static bool clkevt_periodic;
|
|
|
static u32 clk_prescale;
|
|
|
static u32 nmdk_cycle; /* write-once */
|
|
|
|
|
|
-void __iomem *mtu_base; /* Assigned by machine code */
|
|
|
-
|
|
|
#ifdef CONFIG_NOMADIK_MTU_SCHED_CLOCK
|
|
|
/*
|
|
|
* Override the global weak sched_clock symbol with this
|
|
@@ -103,7 +96,6 @@ static int nmdk_clkevt_next(unsigned long evt, struct clock_event_device *ev)
|
|
|
void nmdk_clkevt_reset(void)
|
|
|
{
|
|
|
if (clkevt_periodic) {
|
|
|
-
|
|
|
/* Timer: configure load and background-load, and fire it up */
|
|
|
writel(nmdk_cycle, mtu_base + MTU_LR(1));
|
|
|
writel(nmdk_cycle, mtu_base + MTU_BGLR(1));
|
|
@@ -121,7 +113,6 @@ void nmdk_clkevt_reset(void)
|
|
|
static void nmdk_clkevt_mode(enum clock_event_mode mode,
|
|
|
struct clock_event_device *dev)
|
|
|
{
|
|
|
-
|
|
|
switch (mode) {
|
|
|
case CLOCK_EVT_MODE_PERIODIC:
|
|
|
clkevt_periodic = true;
|
|
@@ -183,15 +174,16 @@ void nmdk_clksrc_reset(void)
|
|
|
mtu_base + MTU_CR(0));
|
|
|
}
|
|
|
|
|
|
-void __init nmdk_timer_init(void)
|
|
|
+void __init nmdk_timer_init(void __iomem *base)
|
|
|
{
|
|
|
unsigned long rate;
|
|
|
struct clk *clk0;
|
|
|
|
|
|
+ mtu_base = base;
|
|
|
clk0 = clk_get_sys("mtu0", NULL);
|
|
|
BUG_ON(IS_ERR(clk0));
|
|
|
-
|
|
|
- clk_enable(clk0);
|
|
|
+ BUG_ON(clk_prepare(clk0) < 0);
|
|
|
+ BUG_ON(clk_enable(clk0) < 0);
|
|
|
|
|
|
/*
|
|
|
* Tick rate is 2.4MHz for Nomadik and 2.4Mhz, 100MHz or 133 MHz
|
|
@@ -224,17 +216,8 @@ void __init nmdk_timer_init(void)
|
|
|
setup_sched_clock(nomadik_read_sched_clock, 32, rate);
|
|
|
#endif
|
|
|
|
|
|
- /* Timer 1 is used for events */
|
|
|
-
|
|
|
- clockevents_calc_mult_shift(&nmdk_clkevt, rate, MTU_MIN_RANGE);
|
|
|
-
|
|
|
- nmdk_clkevt.max_delta_ns =
|
|
|
- clockevent_delta2ns(0xffffffff, &nmdk_clkevt);
|
|
|
- nmdk_clkevt.min_delta_ns =
|
|
|
- clockevent_delta2ns(0x00000002, &nmdk_clkevt);
|
|
|
- nmdk_clkevt.cpumask = cpumask_of(0);
|
|
|
-
|
|
|
- /* Register irq and clockevents */
|
|
|
+ /* Timer 1 is used for events, register irq and clockevents */
|
|
|
setup_irq(IRQ_MTU0, &nmdk_timer_irq);
|
|
|
- clockevents_register_device(&nmdk_clkevt);
|
|
|
+ nmdk_clkevt.cpumask = cpumask_of(0);
|
|
|
+ clockevents_config_and_register(&nmdk_clkevt, rate, 2, 0xffffffffU);
|
|
|
}
|