34 #define MTU_LR(x) (0x10 + 0x10 * (x) + 0x00)
35 #define MTU_VAL(x) (0x10 + 0x10 * (x) + 0x04)
36 #define MTU_CR(x) (0x10 + 0x10 * (x) + 0x08)
37 #define MTU_BGLR(x) (0x10 + 0x10 * (x) + 0x0c)
40 #define MTU_CRn_ENA 0x80
41 #define MTU_CRn_PERIODIC 0x40
42 #define MTU_CRn_PRESCALE_MASK 0x0c
43 #define MTU_CRn_PRESCALE_1 0x00
44 #define MTU_CRn_PRESCALE_16 0x04
45 #define MTU_CRn_PRESCALE_256 0x08
46 #define MTU_CRn_32BITS 0x02
47 #define MTU_CRn_ONESHOT 0x01
50 #define MTU_ITCR 0xff0
51 #define MTU_ITOP 0xff4
53 #define MTU_PERIPH_ID0 0xfe0
54 #define MTU_PERIPH_ID1 0xfe4
55 #define MTU_PERIPH_ID2 0xfe8
56 #define MTU_PERIPH_ID3 0xfeC
58 #define MTU_PCELL0 0xff0
59 #define MTU_PCELL1 0xff4
60 #define MTU_PCELL2 0xff8
61 #define MTU_PCELL3 0xffC
64 static bool clkevt_periodic;
65 static u32 clk_prescale;
66 static u32 nmdk_cycle;
68 #ifdef CONFIG_NOMADIK_MTU_SCHED_CLOCK
74 static u32 notrace nomadik_read_sched_clock(
void)
84 static int nmdk_clkevt_next(
unsigned long evt,
struct clock_event_device *ev)
98 if (clkevt_periodic) {
109 (
void) nmdk_clkevt_next(nmdk_cycle,
NULL);
113 static void nmdk_clkevt_mode(
enum clock_event_mode
mode,
114 struct clock_event_device *
dev)
117 case CLOCK_EVT_MODE_PERIODIC:
118 clkevt_periodic =
true;
121 case CLOCK_EVT_MODE_ONESHOT:
122 clkevt_periodic =
false;
124 case CLOCK_EVT_MODE_SHUTDOWN:
125 case CLOCK_EVT_MODE_UNUSED:
132 case CLOCK_EVT_MODE_RESUME:
137 static struct clock_event_device nmdk_clkevt = {
139 .features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC,
141 .set_mode = nmdk_clkevt_mode,
142 .set_next_event = nmdk_clkevt_next,
153 evdev->event_handler(evdev);
157 static struct irqaction nmdk_timer_irq = {
158 .name =
"Nomadik Timer Tick",
160 .handler = nmdk_timer_interrupt,
161 .dev_id = &nmdk_clkevt,
197 if (rate > 32000000) {
204 nmdk_cycle = (rate +
HZ/2) /
HZ;
212 pr_err(
"timer: failed to initialize clock source %s\n",
215 #ifdef CONFIG_NOMADIK_MTU_SCHED_CLOCK