summaryrefslogtreecommitdiff
path: root/firmware/target/arm/olympus/mrobe-500/timer-mr500.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/olympus/mrobe-500/timer-mr500.c')
-rw-r--r--firmware/target/arm/olympus/mrobe-500/timer-mr500.c58
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
34static void stop_timer(void) 35static 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
38bool __timer_set(long cycles, bool start) 44bool __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
87bool __timer_register(void) 83bool __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