diff options
Diffstat (limited to 'firmware/target/arm/imx233/timrot-imx233.c')
-rw-r--r-- | firmware/target/arm/imx233/timrot-imx233.c | 39 |
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 | ||
34 | define_timer_irq(0) | 34 | define_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 | } |