aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/plat-omap/dmtimer.c31
-rw-r--r--arch/arm/plat-omap/include/plat/dmtimer.h3
2 files changed, 33 insertions, 1 deletions
diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c
index a38e8964c820..b4e6634380e5 100644
--- a/arch/arm/plat-omap/dmtimer.c
+++ b/arch/arm/plat-omap/dmtimer.c
@@ -661,6 +661,37 @@ int omap_dm_timer_set_int_enable(struct omap_dm_timer *timer,
661} 661}
662EXPORT_SYMBOL_GPL(omap_dm_timer_set_int_enable); 662EXPORT_SYMBOL_GPL(omap_dm_timer_set_int_enable);
663 663
664/**
665 * omap_dm_timer_set_int_disable - disable timer interrupts
666 * @timer: pointer to timer handle
667 * @mask: bit mask of interrupts to be disabled
668 *
669 * Disables the specified timer interrupts for a timer.
670 */
671int omap_dm_timer_set_int_disable(struct omap_dm_timer *timer, u32 mask)
672{
673 u32 l = mask;
674
675 if (unlikely(!timer))
676 return -EINVAL;
677
678 omap_dm_timer_enable(timer);
679
680 if (timer->revision == 1)
681 l = __raw_readl(timer->irq_ena) & ~mask;
682
683 __raw_writel(l, timer->irq_dis);
684 l = omap_dm_timer_read_reg(timer, OMAP_TIMER_WAKEUP_EN_REG) & ~mask;
685 omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG, l);
686
687 /* Save the context */
688 timer->context.tier &= ~mask;
689 timer->context.twer &= ~mask;
690 omap_dm_timer_disable(timer);
691 return 0;
692}
693EXPORT_SYMBOL_GPL(omap_dm_timer_set_int_disable);
694
664unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer) 695unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer)
665{ 696{
666 unsigned int l; 697 unsigned int l;
diff --git a/arch/arm/plat-omap/include/plat/dmtimer.h b/arch/arm/plat-omap/include/plat/dmtimer.h
index 0c07e3753470..769efb6f30d5 100644
--- a/arch/arm/plat-omap/include/plat/dmtimer.h
+++ b/arch/arm/plat-omap/include/plat/dmtimer.h
@@ -135,6 +135,7 @@ int omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on, int toggle, i
135int omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler); 135int omap_dm_timer_set_prescaler(struct omap_dm_timer *timer, int prescaler);
136 136
137int omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, unsigned int value); 137int omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, unsigned int value);
138int omap_dm_timer_set_int_disable(struct omap_dm_timer *timer, u32 mask);
138 139
139unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer); 140unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer);
140int omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value); 141int omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value);
@@ -321,7 +322,7 @@ static inline void __omap_dm_timer_init_regs(struct omap_dm_timer *timer)
321 OMAP_TIMER_V1_SYS_STAT_OFFSET; 322 OMAP_TIMER_V1_SYS_STAT_OFFSET;
322 timer->irq_stat = timer->io_base + OMAP_TIMER_V1_STAT_OFFSET; 323 timer->irq_stat = timer->io_base + OMAP_TIMER_V1_STAT_OFFSET;
323 timer->irq_ena = timer->io_base + OMAP_TIMER_V1_INT_EN_OFFSET; 324 timer->irq_ena = timer->io_base + OMAP_TIMER_V1_INT_EN_OFFSET;
324 timer->irq_dis = NULL; 325 timer->irq_dis = timer->io_base + OMAP_TIMER_V1_INT_EN_OFFSET;
325 timer->pend = timer->io_base + _OMAP_TIMER_WRITE_PEND_OFFSET; 326 timer->pend = timer->io_base + _OMAP_TIMER_WRITE_PEND_OFFSET;
326 timer->func_base = timer->io_base; 327 timer->func_base = timer->io_base;
327 } else { 328 } else {