diff options
Diffstat (limited to 'firmware/target/arm/imx233/timrot-imx233.c')
-rw-r--r-- | firmware/target/arm/imx233/timrot-imx233.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/firmware/target/arm/imx233/timrot-imx233.c b/firmware/target/arm/imx233/timrot-imx233.c index 848f640b5c..14b9bdca7b 100644 --- a/firmware/target/arm/imx233/timrot-imx233.c +++ b/firmware/target/arm/imx233/timrot-imx233.c | |||
@@ -20,8 +20,9 @@ | |||
20 | ****************************************************************************/ | 20 | ****************************************************************************/ |
21 | #include "timrot-imx233.h" | 21 | #include "timrot-imx233.h" |
22 | #include "clkctrl-imx233.h" | 22 | #include "clkctrl-imx233.h" |
23 | #include "string.h" | ||
23 | 24 | ||
24 | imx233_timer_fn_t timer_fns[4]; | 25 | static imx233_timer_fn_t timer_fns[4]; |
25 | 26 | ||
26 | #define define_timer_irq(nr) \ | 27 | #define define_timer_irq(nr) \ |
27 | void INT_TIMER##nr(void) \ | 28 | void INT_TIMER##nr(void) \ |
@@ -36,28 +37,37 @@ define_timer_irq(1) | |||
36 | define_timer_irq(2) | 37 | define_timer_irq(2) |
37 | define_timer_irq(3) | 38 | define_timer_irq(3) |
38 | 39 | ||
39 | void imx233_setup_timer(unsigned timer_nr, bool reload, unsigned count, | 40 | void imx233_timrot_setup(unsigned timer_nr, bool reload, unsigned count, |
40 | unsigned src, unsigned prescale, bool polarity, imx233_timer_fn_t fn) | 41 | unsigned src, unsigned prescale, bool polarity, imx233_timer_fn_t fn) |
41 | { | 42 | { |
42 | int oldstatus = disable_interrupt_save(IRQ_FIQ_STATUS); | 43 | int oldstatus = disable_interrupt_save(IRQ_FIQ_STATUS); |
43 | /* only enable interrupt if function is set */ | 44 | /* only enable interrupt if function is set */ |
44 | bool irq = fn != NULL; | 45 | bool irq = fn != NULL; |
45 | |||
46 | timer_fns[timer_nr] = fn; | 46 | timer_fns[timer_nr] = fn; |
47 | 47 | ||
48 | HW_TIMROT_TIMCTRLn(timer_nr) = BF_OR6(TIMROT_TIMCTRLn, SELECT(src), | ||
49 | PRESCALE(prescale), POLARITY(polarity), RELOAD(reload), IRQ(irq), | ||
50 | IRQ_EN(irq)); | ||
51 | |||
52 | /* manual says count - 1 for reload timers */ | 48 | /* manual says count - 1 for reload timers */ |
53 | HW_TIMROT_TIMCOUNTn(timer_nr) = reload ? count - 1 : reload; | 49 | HW_TIMROT_TIMCTRLn(timer_nr) = BF_OR7(TIMROT_TIMCTRLn, SELECT(src), |
50 | PRESCALE(prescale), POLARITY(polarity), RELOAD(reload), IRQ(irq), | ||
51 | IRQ_EN(irq), UPDATE(1)); | ||
54 | imx233_icoll_enable_interrupt(INT_SRC_TIMER(timer_nr), irq); | 52 | imx233_icoll_enable_interrupt(INT_SRC_TIMER(timer_nr), irq); |
55 | /* finally update */ | 53 | HW_TIMROT_TIMCOUNTn(timer_nr) = reload ? count - 1 : count; |
56 | BF_SETn(TIMROT_TIMCTRLn, timer_nr, UPDATE); | ||
57 | 54 | ||
58 | restore_interrupt(oldstatus); | 55 | restore_interrupt(oldstatus); |
59 | } | 56 | } |
60 | 57 | ||
58 | struct imx233_timrot_info_t imx233_timrot_get_info(unsigned timer_nr) | ||
59 | { | ||
60 | struct imx233_timrot_info_t info; | ||
61 | memset(&info, 0, sizeof(info)); | ||
62 | info.src = BF_RDn(TIMROT_TIMCTRLn, timer_nr, SELECT); | ||
63 | info.prescale = BF_RDn(TIMROT_TIMCTRLn, timer_nr, PRESCALE); | ||
64 | info.reload = BF_RDn(TIMROT_TIMCTRLn, timer_nr, RELOAD); | ||
65 | info.polarity = BF_RDn(TIMROT_TIMCTRLn, timer_nr, POLARITY); | ||
66 | info.fixed_count = BF_RDn(TIMROT_TIMCOUNTn, timer_nr, FIXED_COUNT); | ||
67 | info.run_count = BF_RDn(TIMROT_TIMCOUNTn, timer_nr, RUNNING_COUNT); | ||
68 | return info; | ||
69 | } | ||
70 | |||
61 | void imx233_timrot_init(void) | 71 | void imx233_timrot_init(void) |
62 | { | 72 | { |
63 | imx233_reset_block(&HW_TIMROT_ROTCTRL); | 73 | imx233_reset_block(&HW_TIMROT_ROTCTRL); |