Skip to content

Commit ee17f11

Browse files
committed
ARM: OMAP: Add support for dmtimer v2 ip
The registers are slightly different between v1 and v2 ip that is available in omap4 and later for some timers. Add support for v2 ip by mapping the interrupt related registers separately and adding func_base for the functional registers. Also disable dmtimer driver features on omap4 for now as those need the hwmod conversion series to deal with enabling the timers properly in omap_dm_timer_init. Signed-off-by: Afzal Mohammed <[email protected]> Tested-by: Hemant Pedanekar <[email protected]> Signed-off-by: Tony Lindgren <[email protected]>
1 parent ceb1c53 commit ee17f11

File tree

3 files changed

+123
-76
lines changed

3 files changed

+123
-76
lines changed

arch/arm/mach-omap2/timer.c

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id)
7878
{
7979
struct clock_event_device *evt = &clockevent_gpt;
8080

81-
__omap_dm_timer_write_status(clkev.io_base, OMAP_TIMER_INT_OVERFLOW);
81+
__omap_dm_timer_write_status(&clkev, OMAP_TIMER_INT_OVERFLOW);
8282

8383
evt->event_handler(evt);
8484
return IRQ_HANDLED;
@@ -93,7 +93,7 @@ static struct irqaction omap2_gp_timer_irq = {
9393
static int omap2_gp_timer_set_next_event(unsigned long cycles,
9494
struct clock_event_device *evt)
9595
{
96-
__omap_dm_timer_load_start(clkev.io_base, OMAP_TIMER_CTRL_ST,
96+
__omap_dm_timer_load_start(&clkev, OMAP_TIMER_CTRL_ST,
9797
0xffffffff - cycles, 1);
9898

9999
return 0;
@@ -104,16 +104,16 @@ static void omap2_gp_timer_set_mode(enum clock_event_mode mode,
104104
{
105105
u32 period;
106106

107-
__omap_dm_timer_stop(clkev.io_base, 1, clkev.rate);
107+
__omap_dm_timer_stop(&clkev, 1, clkev.rate);
108108

109109
switch (mode) {
110110
case CLOCK_EVT_MODE_PERIODIC:
111111
period = clkev.rate / HZ;
112112
period -= 1;
113113
/* Looks like we need to first set the load value separately */
114-
__omap_dm_timer_write(clkev.io_base, OMAP_TIMER_LOAD_REG,
114+
__omap_dm_timer_write(&clkev, OMAP_TIMER_LOAD_REG,
115115
0xffffffff - period, 1);
116-
__omap_dm_timer_load_start(clkev.io_base,
116+
__omap_dm_timer_load_start(&clkev,
117117
OMAP_TIMER_CTRL_AR | OMAP_TIMER_CTRL_ST,
118118
0xffffffff - period, 1);
119119
break;
@@ -189,7 +189,8 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,
189189
clk_put(src);
190190
}
191191
}
192-
__omap_dm_timer_reset(timer->io_base, 1, 1);
192+
__omap_dm_timer_init_regs(timer);
193+
__omap_dm_timer_reset(timer, 1, 1);
193194
timer->posted = 1;
194195

195196
timer->rate = clk_get_rate(timer->fclk);
@@ -210,7 +211,7 @@ static void __init omap2_gp_clockevent_init(int gptimer_id,
210211
omap2_gp_timer_irq.dev_id = (void *)&clkev;
211212
setup_irq(clkev.irq, &omap2_gp_timer_irq);
212213

213-
__omap_dm_timer_int_enable(clkev.io_base, OMAP_TIMER_INT_OVERFLOW);
214+
__omap_dm_timer_int_enable(&clkev, OMAP_TIMER_INT_OVERFLOW);
214215

215216
clockevent_gpt.mult = div_sc(clkev.rate, NSEC_PER_SEC,
216217
clockevent_gpt.shift);
@@ -251,7 +252,7 @@ static struct omap_dm_timer clksrc;
251252
static DEFINE_CLOCK_DATA(cd);
252253
static cycle_t clocksource_read_cycles(struct clocksource *cs)
253254
{
254-
return (cycle_t)__omap_dm_timer_read_counter(clksrc.io_base, 1);
255+
return (cycle_t)__omap_dm_timer_read_counter(&clksrc, 1);
255256
}
256257

257258
static struct clocksource clocksource_gpt = {
@@ -266,7 +267,7 @@ static void notrace dmtimer_update_sched_clock(void)
266267
{
267268
u32 cyc;
268269

269-
cyc = __omap_dm_timer_read_counter(clksrc.io_base, 1);
270+
cyc = __omap_dm_timer_read_counter(&clksrc, 1);
270271

271272
update_sched_clock(&cd, cyc, (u32)~0);
272273
}
@@ -276,7 +277,7 @@ unsigned long long notrace sched_clock(void)
276277
u32 cyc = 0;
277278

278279
if (clksrc.reserved)
279-
cyc = __omap_dm_timer_read_counter(clksrc.io_base, 1);
280+
cyc = __omap_dm_timer_read_counter(&clksrc, 1);
280281

281282
return cyc_to_sched_clock(&cd, cyc, (u32)~0);
282283
}
@@ -293,7 +294,7 @@ static void __init omap2_gp_clocksource_init(int gptimer_id,
293294
pr_info("OMAP clocksource: GPTIMER%d at %lu Hz\n",
294295
gptimer_id, clksrc.rate);
295296

296-
__omap_dm_timer_load_start(clksrc.io_base,
297+
__omap_dm_timer_load_start(&clksrc,
297298
OMAP_TIMER_CTRL_ST | OMAP_TIMER_CTRL_AR, 0, 1);
298299
init_sched_clock(&cd, dmtimer_update_sched_clock, 32, clksrc.rate);
299300

arch/arm/plat-omap/dmtimer.c

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,8 @@ static spinlock_t dm_timer_lock;
170170
*/
171171
static inline u32 omap_dm_timer_read_reg(struct omap_dm_timer *timer, u32 reg)
172172
{
173-
return __omap_dm_timer_read(timer->io_base, reg, timer->posted);
173+
WARN_ON((reg & 0xff) < _OMAP_TIMER_WAKEUP_EN_OFFSET);
174+
return __omap_dm_timer_read(timer, reg, timer->posted);
174175
}
175176

176177
/*
@@ -182,15 +183,19 @@ static inline u32 omap_dm_timer_read_reg(struct omap_dm_timer *timer, u32 reg)
182183
static void omap_dm_timer_write_reg(struct omap_dm_timer *timer, u32 reg,
183184
u32 value)
184185
{
185-
__omap_dm_timer_write(timer->io_base, reg, value, timer->posted);
186+
WARN_ON((reg & 0xff) < _OMAP_TIMER_WAKEUP_EN_OFFSET);
187+
__omap_dm_timer_write(timer, reg, value, timer->posted);
186188
}
187189

188190
static void omap_dm_timer_wait_for_reset(struct omap_dm_timer *timer)
189191
{
190192
int c;
191193

194+
if (!timer->sys_stat)
195+
return;
196+
192197
c = 0;
193-
while (!(omap_dm_timer_read_reg(timer, OMAP_TIMER_SYS_STAT_REG) & 1)) {
198+
while (!(__raw_readl(timer->sys_stat) & 1)) {
194199
c++;
195200
if (c > 100000) {
196201
printk(KERN_ERR "Timer failed to reset\n");
@@ -219,7 +224,7 @@ static void omap_dm_timer_reset(struct omap_dm_timer *timer)
219224
if (cpu_class_is_omap2())
220225
wakeup = 1;
221226

222-
__omap_dm_timer_reset(timer->io_base, autoidle, wakeup);
227+
__omap_dm_timer_reset(timer, autoidle, wakeup);
223228
timer->posted = 1;
224229
}
225230

@@ -401,7 +406,7 @@ void omap_dm_timer_stop(struct omap_dm_timer *timer)
401406
rate = clk_get_rate(timer->fclk);
402407
#endif
403408

404-
__omap_dm_timer_stop(timer->io_base, timer->posted, rate);
409+
__omap_dm_timer_stop(timer, timer->posted, rate);
405410
}
406411
EXPORT_SYMBOL_GPL(omap_dm_timer_stop);
407412

@@ -466,7 +471,7 @@ void omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload,
466471
}
467472
l |= OMAP_TIMER_CTRL_ST;
468473

469-
__omap_dm_timer_load_start(timer->io_base, l, load, timer->posted);
474+
__omap_dm_timer_load_start(timer, l, load, timer->posted);
470475
}
471476
EXPORT_SYMBOL_GPL(omap_dm_timer_set_load_start);
472477

@@ -519,29 +524,29 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_set_prescaler);
519524
void omap_dm_timer_set_int_enable(struct omap_dm_timer *timer,
520525
unsigned int value)
521526
{
522-
__omap_dm_timer_int_enable(timer->io_base, value);
527+
__omap_dm_timer_int_enable(timer, value);
523528
}
524529
EXPORT_SYMBOL_GPL(omap_dm_timer_set_int_enable);
525530

526531
unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer)
527532
{
528533
unsigned int l;
529534

530-
l = omap_dm_timer_read_reg(timer, OMAP_TIMER_STAT_REG);
535+
l = __raw_readl(timer->irq_stat);
531536

532537
return l;
533538
}
534539
EXPORT_SYMBOL_GPL(omap_dm_timer_read_status);
535540

536541
void omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value)
537542
{
538-
__omap_dm_timer_write_status(timer->io_base, value);
543+
__omap_dm_timer_write_status(timer, value);
539544
}
540545
EXPORT_SYMBOL_GPL(omap_dm_timer_write_status);
541546

542547
unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer)
543548
{
544-
return __omap_dm_timer_read_counter(timer->io_base, timer->posted);
549+
return __omap_dm_timer_read_counter(timer, timer->posted);
545550
}
546551
EXPORT_SYMBOL_GPL(omap_dm_timer_read_counter);
547552

@@ -601,6 +606,9 @@ static int __init omap_dm_timer_init(void)
601606
dm_timer_count = omap4_dm_timer_count;
602607
dm_source_names = omap4_dm_source_names;
603608
dm_source_clocks = omap4_dm_source_clocks;
609+
610+
pr_err("dmtimers disabled for omap4 until hwmod conversion\n");
611+
return -ENODEV;
604612
}
605613

606614
if (cpu_class_is_omap2())
@@ -630,8 +638,12 @@ static int __init omap_dm_timer_init(void)
630638
if (sys_timer_reserved & (1 << i)) {
631639
timer->reserved = 1;
632640
timer->posted = 1;
641+
continue;
633642
}
634643
#endif
644+
omap_dm_timer_enable(timer);
645+
__omap_dm_timer_init_regs(timer);
646+
omap_dm_timer_disable(timer);
635647
}
636648

637649
return 0;

0 commit comments

Comments
 (0)