xref: /haiku/src/system/kernel/arch/arm/arch_timer.cpp (revision a52dd58d2da9adad93ad49b33181da57849c8ad5)
123eafdafSFrançois Revol /*
2be7195d0SIthamar R. Adema  * Copyright 2007-2012, Haiku Inc. All rights reserved.
323eafdafSFrançois Revol  * Distributed under the terms of the MIT License.
423eafdafSFrançois Revol  *
523eafdafSFrançois Revol  * Authors:
623eafdafSFrançois Revol  * 		François Revol <revol@free.fr>
7be7195d0SIthamar R. Adema  *              Ithamar R. Adema <ithamar@upgrade-android.com>
823eafdafSFrançois Revol  *
923eafdafSFrançois Revol  * Copyright 2001, Travis Geiselbrecht. All rights reserved.
1023eafdafSFrançois Revol  * Distributed under the terms of the NewOS License.
1123eafdafSFrançois Revol  */
1223eafdafSFrançois Revol 
1323eafdafSFrançois Revol 
1423eafdafSFrançois Revol #include <boot/stage2.h>
1523eafdafSFrançois Revol #include <kernel.h>
1623eafdafSFrançois Revol #include <debug.h>
1723eafdafSFrançois Revol 
1823eafdafSFrançois Revol #include <timer.h>
1923eafdafSFrançois Revol #include <arch/timer.h>
20be7195d0SIthamar R. Adema #include <arch/cpu.h>
21be7195d0SIthamar R. Adema 
22*a52dd58dSIthamar R. Adema #include <drivers/bus/FDT.h>
23*a52dd58dSIthamar R. Adema #include "soc.h"
24*a52dd58dSIthamar R. Adema 
25*a52dd58dSIthamar R. Adema #include "soc_pxa.h"
26*a52dd58dSIthamar R. Adema #include "soc_omap3.h"
27f86b5828SIthamar R. Adema 
28f86b5828SIthamar R. Adema //#define TRACE_ARCH_TIMER
29f86b5828SIthamar R. Adema #ifdef TRACE_ARCH_TIMER
30f86b5828SIthamar R. Adema #	define TRACE(x) dprintf x
31f86b5828SIthamar R. Adema #else
32f86b5828SIthamar R. Adema #	define TRACE(x) ;
33f86b5828SIthamar R. Adema #endif
34f86b5828SIthamar R. Adema 
35*a52dd58dSIthamar R. Adema static fdt_module_info *sFdtModule;
36f86b5828SIthamar R. Adema 
37*a52dd58dSIthamar R. Adema static struct fdt_device_info intc_table[] = {
38be7195d0SIthamar R. Adema 	{
39*a52dd58dSIthamar R. Adema 		.compatible = "marvell,pxa-timers",	// XXX not in FDT (also not in upstream!)
40*a52dd58dSIthamar R. Adema 		.init = PXATimer::Init,
41*a52dd58dSIthamar R. Adema 	}, {
42*a52dd58dSIthamar R. Adema 		.compatible = "ti,omap3430-timer",
43*a52dd58dSIthamar R. Adema 		.init = OMAP3Timer::Init,
44be7195d0SIthamar R. Adema 	}
45*a52dd58dSIthamar R. Adema };
46*a52dd58dSIthamar R. Adema static int intc_count = sizeof(intc_table) / sizeof(struct fdt_device_info);
4723eafdafSFrançois Revol 
4823eafdafSFrançois Revol 
4923eafdafSFrançois Revol void
5023eafdafSFrançois Revol arch_timer_set_hardware_timer(bigtime_t timeout)
5123eafdafSFrançois Revol {
52*a52dd58dSIthamar R. Adema 	HardwareTimer *timer = HardwareTimer::Get();
53*a52dd58dSIthamar R. Adema 	if (timer != NULL)
54*a52dd58dSIthamar R. Adema 		timer->SetTimeout(timeout);
55af1c0b55SIthamar R. Adema }
56af1c0b55SIthamar R. Adema 
5723eafdafSFrançois Revol 
5823eafdafSFrançois Revol void
5923eafdafSFrançois Revol arch_timer_clear_hardware_timer()
6023eafdafSFrançois Revol {
61*a52dd58dSIthamar R. Adema 	HardwareTimer *timer = HardwareTimer::Get();
62*a52dd58dSIthamar R. Adema 	if (timer != NULL)
63*a52dd58dSIthamar R. Adema 		timer->Clear();
64be7195d0SIthamar R. Adema }
6523eafdafSFrançois Revol 
6623eafdafSFrançois Revol int
6723eafdafSFrançois Revol arch_init_timer(kernel_args *args)
6823eafdafSFrançois Revol {
6934ed0fe7SIthamar R. Adema 	TRACE(("%s\n", __func__));
7023eafdafSFrançois Revol 
71*a52dd58dSIthamar R. Adema 	status_t rc = get_module(B_FDT_MODULE_NAME, (module_info**)&sFdtModule);
72*a52dd58dSIthamar R. Adema 	if (rc != B_OK)
73*a52dd58dSIthamar R. Adema 		panic("Unable to get FDT module: %08lx!\n", rc);
74be7195d0SIthamar R. Adema 
75*a52dd58dSIthamar R. Adema 	rc = sFdtModule->setup_devices(intc_table, intc_count, NULL);
76*a52dd58dSIthamar R. Adema 	if (rc != B_OK)
77*a52dd58dSIthamar R. Adema 		panic("No interrupt controllers found!\n");
78be7195d0SIthamar R. Adema 
79be7195d0SIthamar R. Adema 	return B_OK;
80be7195d0SIthamar R. Adema }
81af1c0b55SIthamar R. Adema 
82af1c0b55SIthamar R. Adema bigtime_t
83af1c0b55SIthamar R. Adema system_time(void)
84af1c0b55SIthamar R. Adema {
85*a52dd58dSIthamar R. Adema 	HardwareTimer *timer = HardwareTimer::Get();
86*a52dd58dSIthamar R. Adema 	if (timer != NULL)
87*a52dd58dSIthamar R. Adema 		return timer->Time();
8834ed0fe7SIthamar R. Adema 
89*a52dd58dSIthamar R. Adema 	return 0;
90af1c0b55SIthamar R. Adema }
91