1#ifndef ARCH_ARM_SOC_H
2#define ARCH_ARM_SOC_H
3
4class InterruptController;
5
6#include <drivers/bus/FDT.h>
7#include <private/kernel/int.h>
8#include <private/kernel/timer.h>
9
10// ------------------------------------------------------ InterruptController
11
12class InterruptController {
13public:
14	virtual void EnableInterrupt(int irq) = 0;
15	virtual void DisableInterrupt(int irq) = 0;
16
17	virtual void HandleInterrupt() = 0;
18
19	static InterruptController* Get() {
20		return sInstance;
21	}
22
23protected:
24	InterruptController(fdt_module_info *fdtModule, fdt_device_node node)
25		: fFDT(fdtModule), fNode(node) {
26		if (sInstance) {
27			panic("Multiple InterruptController objects created; that is currently unsupported!");
28		}
29		sInstance = this;
30	}
31
32	// Keep our node around as we might want to grab attributes from it
33	fdt_module_info *fFDT;
34	fdt_device_node fNode;
35
36	static InterruptController *sInstance;
37};
38
39
40// ------------------------------------------------------ HardwareTimer
41
42class HardwareTimer {
43public:
44	virtual void SetTimeout(bigtime_t timeout) = 0;
45	virtual bigtime_t Time() = 0;
46	virtual void Clear() = 0;
47
48	static HardwareTimer* Get() {
49		return sInstance;
50	}
51
52protected:
53	HardwareTimer(fdt_module_info *fdtModule, fdt_device_node node)
54		: fFDT(fdtModule), fNode(node) {
55		if (sInstance) {
56			panic("Multiple HardwareTimer objects created; that is currently unsupported!");
57		}
58		sInstance = this;
59	}
60
61	// Keep our node around as we might want to grab attributes from it
62	fdt_module_info *fFDT;
63	fdt_device_node fNode;
64
65	static HardwareTimer *sInstance;
66};
67
68#endif // ARCH_ARM_SOC_H
69