]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/bsp/kirkwood/timer-arm-kirkwood.cpp
bda558af77a7d0efae305b55703fda039d14dad3
[l4.git] / kernel / fiasco / src / kern / arm / bsp / kirkwood / timer-arm-kirkwood.cpp
1 // --------------------------------------------------------------------------
2 INTERFACE [arm && kirkwood]:
3
4 #include "kmem.h"
5
6 EXTENSION class Timer
7 {
8 public:
9   static unsigned irq() { return 1; }
10
11 private:
12   enum {
13     Control_Reg  = Mem_layout::Reset_map_base + 0x20300,
14     Reload0_Reg  = Mem_layout::Reset_map_base + 0x20310,
15     Timer0_Reg   = Mem_layout::Reset_map_base + 0x20314,
16     Reload1_Reg  = Mem_layout::Reset_map_base + 0x20318,
17     Timer1_Reg   = Mem_layout::Reset_map_base + 0x2031c,
18
19     Bridge_cause = Mem_layout::Reset_map_base + 0x20110,
20     Bridge_mask  = Mem_layout::Reset_map_base + 0x20114,
21
22     Timer0_enable = 1 << 0,
23     Timer0_auto   = 1 << 1,
24
25     Timer0_bridge_num = 1 << 1,
26     Timer1_bridge_num = 1 << 2,
27
28     Reload_value = 200000,
29   };
30 };
31
32 // ----------------------------------------------------------------------
33 IMPLEMENTATION [arm && kirkwood]:
34
35 #include "config.h"
36 #include "kip.h"
37 #include "io.h"
38
39 IMPLEMENT
40 void Timer::init(unsigned)
41 {
42   // Disable timer
43   Io::write(0, Control_Reg);
44
45   // Set current timer value and reload value
46   Io::write<Mword>(Reload_value, Timer0_Reg);
47   Io::write<Mword>(Reload_value, Reload0_Reg);
48
49   Io::set<Mword>(Timer0_enable | Timer0_auto, Control_Reg);
50
51   Io::set<Unsigned32>(Timer0_bridge_num, Bridge_mask);
52 }
53
54 static inline
55 Unsigned64
56 Timer::timer_to_us(Unsigned32 /*cr*/)
57 { return 0; }
58
59 static inline
60 Unsigned64
61 Timer::us_to_timer(Unsigned64 us)
62 { (void)us; return 0; }
63
64 PUBLIC static inline NEEDS["io.h"]
65 void
66 Timer::acknowledge()
67 {
68   Io::clear<Unsigned32>(Timer0_bridge_num, Bridge_cause);
69 }
70
71 IMPLEMENT inline
72 void
73 Timer::update_one_shot(Unsigned64 /*wakeup*/)
74 {
75 }
76
77 IMPLEMENT inline NEEDS["config.h", "kip.h"]
78 Unsigned64
79 Timer::system_clock()
80 {
81   if (Config::Scheduler_one_shot)
82     return 0;
83   return Kip::k()->clock;
84 }