diff options
Diffstat (limited to 'firmware/target/arm/olympus/mrobe-500/timer-mr500.c')
-rw-r--r-- | firmware/target/arm/olympus/mrobe-500/timer-mr500.c | 58 |
1 files changed, 28 insertions, 30 deletions
diff --git a/firmware/target/arm/olympus/mrobe-500/timer-mr500.c b/firmware/target/arm/olympus/mrobe-500/timer-mr500.c index 846d83b3de..21449ed19f 100644 --- a/firmware/target/arm/olympus/mrobe-500/timer-mr500.c +++ b/firmware/target/arm/olympus/mrobe-500/timer-mr500.c | |||
@@ -29,59 +29,55 @@ void TIMER0(void) | |||
29 | { | 29 | { |
30 | if (pfn_timer != NULL) | 30 | if (pfn_timer != NULL) |
31 | pfn_timer(); | 31 | pfn_timer(); |
32 | IO_INTC_IRQ0 |= 1<<IRQ_TIMER0; | ||
32 | } | 33 | } |
33 | 34 | ||
34 | static void stop_timer(void) | 35 | static void stop_timer(void) |
35 | { | 36 | { |
37 | IO_INTC_EINT0 &= ~(1<<IRQ_TIMER0); | ||
38 | |||
39 | IO_INTC_IRQ0 |= 1<<IRQ_TIMER0; | ||
40 | |||
41 | IO_TIMER0_TMMD = CONFIG_TIMER0_TMMD_STOP; | ||
36 | } | 42 | } |
37 | 43 | ||
38 | bool __timer_set(long cycles, bool start) | 44 | bool __timer_set(long cycles, bool start) |
39 | { | 45 | { |
46 | int oldlevel; | ||
47 | unsigned int divider; | ||
40 | /* taken from linux/arch/arm/mach-itdm320-20/time.c and timer-meg-fx.c */ | 48 | /* taken from linux/arch/arm/mach-itdm320-20/time.c and timer-meg-fx.c */ |
41 | 49 | ||
42 | /* Turn off all timers */ | 50 | /* Turn off all timers */ |
43 | /* outw(CONFIG_TIMER0_TMMD_STOP, IO_TIMER0_TMMD); | 51 | IO_TIMER0_TMMD = CONFIG_TIMER0_TMMD_STOP; |
44 | outw(CONFIG_TIMER1_TMMD_STOP, IO_TIMER1_TMMD); | 52 | IO_TIMER1_TMMD = CONFIG_TIMER1_TMMD_STOP; |
45 | outw(CONFIG_TIMER2_TMMD_STOP, IO_TIMER2_TMMD); | 53 | IO_TIMER2_TMMD = CONFIG_TIMER2_TMMD_STOP; |
46 | outw(CONFIG_TIMER3_TMMD_STOP, IO_TIMER3_TMMD); | 54 | IO_TIMER3_TMMD = CONFIG_TIMER3_TMMD_STOP; |
47 | */ | ||
48 | /* Turn Timer0 to Free Run mode */ | ||
49 | // outw(CONFIG_TIMER0_TMMD_FREE_RUN, IO_TIMER0_TMMD); | ||
50 | |||
51 | bool retval = false; | ||
52 | 55 | ||
53 | /* Find the minimum factor that puts the counter in range 1-65535 */ | 56 | /* Find the minimum factor that puts the counter in range 1-65535 */ |
54 | unsigned int prescaler = (cycles + 65534) / 65535; | 57 | unsigned int prescaler = (cycles + 65534) / 65535; |
55 | 58 | ||
56 | /* Test this by writing 1's to registers to see how many bits we have */ | 59 | /* Test this by writing 1's to registers to see how many bits we have */ |
57 | /* Maximum divider setting is x / 1024 / 65536 = x / 67108864 */ | 60 | /* Maximum divider setting is x / 1024 / 65536 = x / 67108864 */ |
61 | if (start && pfn_unregister != NULL) | ||
58 | { | 62 | { |
59 | int oldlevel; | 63 | pfn_unregister(); |
60 | unsigned int divider; | 64 | pfn_unregister = NULL; |
61 | 65 | } | |
62 | if (start && pfn_unregister != NULL) | ||
63 | { | ||
64 | pfn_unregister(); | ||
65 | pfn_unregister = NULL; | ||
66 | } | ||
67 | |||
68 | oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL); | ||
69 | 66 | ||
70 | /* Max prescale is 1023+1 */ | 67 | oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL); |
71 | for (divider = 0; prescaler > 1024; prescaler >>= 1, divider++); | ||
72 | 68 | ||
73 | /* Setup the Prescalar */ | 69 | /* Max prescale is 1023+1 */ |
74 | outw(prescaler, IO_TIMER0_TMPRSCL); | 70 | for (divider = 0; prescaler > 1024; prescaler >>= 1, divider++); |
75 | 71 | ||
76 | /* Setup the Divisor */ | 72 | /* Setup the Prescalar */ |
77 | outw(divider, IO_TIMER0_TMDIV); | 73 | IO_TIMER0_TMPRSCL = prescaler; |
78 | 74 | ||
79 | set_irq_level(oldlevel); | 75 | /* Setup the Divisor */ |
76 | IO_TIMER0_TMDIV = divider; | ||
80 | 77 | ||
81 | retval = true; | 78 | set_irq_level(oldlevel); |
82 | } | ||
83 | 79 | ||
84 | return retval; | 80 | return true; |
85 | } | 81 | } |
86 | 82 | ||
87 | bool __timer_register(void) | 83 | bool __timer_register(void) |
@@ -93,7 +89,9 @@ bool __timer_register(void) | |||
93 | stop_timer(); | 89 | stop_timer(); |
94 | 90 | ||
95 | /* Turn Timer0 to Free Run mode */ | 91 | /* Turn Timer0 to Free Run mode */ |
96 | outw(0x0002, IO_TIMER0_TMMD); | 92 | IO_TIMER0_TMMD = CONFIG_TIMER0_TMMD_FREE_RUN; |
93 | |||
94 | IO_INTC_EINT0 |= 1<<IRQ_TIMER0; | ||
97 | 95 | ||
98 | set_interrupt_status(oldstatus, IRQ_FIQ_STATUS); | 96 | set_interrupt_status(oldstatus, IRQ_FIQ_STATUS); |
99 | 97 | ||