summaryrefslogtreecommitdiff
path: root/firmware/target/arm/imx233/timrot-imx233.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/imx233/timrot-imx233.c')
-rw-r--r--firmware/target/arm/imx233/timrot-imx233.c39
1 files changed, 13 insertions, 26 deletions
diff --git a/firmware/target/arm/imx233/timrot-imx233.c b/firmware/target/arm/imx233/timrot-imx233.c
index 327b1d16b1..723ecc31ab 100644
--- a/firmware/target/arm/imx233/timrot-imx233.c
+++ b/firmware/target/arm/imx233/timrot-imx233.c
@@ -28,7 +28,7 @@ void INT_TIMER##nr(void) \
28{ \ 28{ \
29 if(timer_fns[nr]) \ 29 if(timer_fns[nr]) \
30 timer_fns[nr](); \ 30 timer_fns[nr](); \
31 __REG_CLR(HW_TIMROT_TIMCTRL(nr)) = HW_TIMROT_TIMCTRL__IRQ; \ 31 BF_CLRn(TIMROT_TIMCTRLn, nr, IRQ); \
32} 32}
33 33
34define_timer_irq(0) 34define_timer_irq(0)
@@ -40,33 +40,20 @@ void imx233_setup_timer(unsigned timer_nr, bool reload, unsigned count,
40 unsigned src, unsigned prescale, bool polarity, imx233_timer_fn_t fn) 40 unsigned src, unsigned prescale, bool polarity, imx233_timer_fn_t fn)
41{ 41{
42 int oldstatus = disable_interrupt_save(IRQ_FIQ_STATUS); 42 int oldstatus = disable_interrupt_save(IRQ_FIQ_STATUS);
43
44 timer_fns[timer_nr] = fn;
45
46 HW_TIMROT_TIMCTRL(timer_nr) = src | prescale;
47 if(polarity)
48 __REG_SET(HW_TIMROT_TIMCTRL(timer_nr)) = HW_TIMROT_TIMCTRL__POLARITY;
49 if(reload)
50 {
51 __REG_SET(HW_TIMROT_TIMCTRL(timer_nr)) = HW_TIMROT_TIMCTRL__RELOAD;
52 /* manual says count - 1 for reload timers */
53 HW_TIMROT_TIMCOUNT(timer_nr) = count - 1;
54 }
55 else
56 HW_TIMROT_TIMCOUNT(timer_nr) = count;
57 /* only enable interrupt if function is set */ 43 /* only enable interrupt if function is set */
58 if(fn != NULL) 44 bool irq = fn != NULL;
59 { 45
60 /* enable interrupt */ 46 timer_fns[timer_nr] = fn;
61 imx233_icoll_enable_interrupt(INT_SRC_TIMER(timer_nr), true); 47
62 /* clear irq bit and enable */ 48 HW_TIMROT_TIMCTRLn(timer_nr) = BF_OR6(TIMROT_TIMCTRLn, SELECT(src),
63 __REG_CLR(HW_TIMROT_TIMCTRL(timer_nr)) = HW_TIMROT_TIMCTRL__IRQ; 49 PRESCALE(prescale), POLARITY(polarity), RELOAD(reload), IRQ(irq),
64 __REG_SET(HW_TIMROT_TIMCTRL(timer_nr)) = HW_TIMROT_TIMCTRL__IRQ_EN; 50 IRQ_EN(irq));
65 } 51
66 else 52 /* manual says count - 1 for reload timers */
67 imx233_icoll_enable_interrupt(INT_SRC_TIMER(timer_nr), false); 53 HW_TIMROT_TIMCOUNTn(timer_nr) = reload ? count - 1 : reload;
54 imx233_icoll_enable_interrupt(INT_SRC_TIMER(timer_nr), irq);
68 /* finally update */ 55 /* finally update */
69 __REG_SET(HW_TIMROT_TIMCTRL(timer_nr)) = HW_TIMROT_TIMCTRL__UPDATE; 56 BF_SETn(TIMROT_TIMCTRLn, timer_nr, UPDATE);
70 57
71 restore_interrupt(oldstatus); 58 restore_interrupt(oldstatus);
72} 59}