xref: /haiku/src/system/kernel/arch/arm/arch_timer.cpp (revision bdce546c9f1e9339cf11a0d1999042bcc2656f46)
123eafdafSFrançois Revol /*
2*bdce546cSDavid Karoly  * Copyright 2007-2022, 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 
22a52dd58dSIthamar R. Adema #include <drivers/bus/FDT.h>
23*bdce546cSDavid Karoly #include "arch_timer_generic.h"
24a52dd58dSIthamar R. Adema #include "soc.h"
25a52dd58dSIthamar R. Adema 
26a52dd58dSIthamar R. Adema #include "soc_pxa.h"
27a52dd58dSIthamar R. Adema #include "soc_omap3.h"
28f86b5828SIthamar R. Adema 
29f86b5828SIthamar R. Adema //#define TRACE_ARCH_TIMER
30f86b5828SIthamar R. Adema #ifdef TRACE_ARCH_TIMER
31*bdce546cSDavid Karoly #	define TRACE(x...) dprintf(x)
32f86b5828SIthamar R. Adema #else
33*bdce546cSDavid Karoly #	define TRACE(x...) ;
34f86b5828SIthamar R. Adema #endif
35f86b5828SIthamar R. Adema 
36f86b5828SIthamar R. Adema 
37d5bac4fdSDavid Karoly #if 0
38a52dd58dSIthamar R. Adema static struct fdt_device_info intc_table[] = {
39be7195d0SIthamar R. Adema 	{
40a52dd58dSIthamar R. Adema 		.compatible = "marvell,pxa-timers",	// XXX not in FDT (also not in upstream!)
41a52dd58dSIthamar R. Adema 		.init = PXATimer::Init,
42a52dd58dSIthamar R. Adema 	}, {
43a52dd58dSIthamar R. Adema 		.compatible = "ti,omap3430-timer",
44a52dd58dSIthamar R. Adema 		.init = OMAP3Timer::Init,
45be7195d0SIthamar R. Adema 	}
46a52dd58dSIthamar R. Adema };
47a52dd58dSIthamar R. Adema static int intc_count = sizeof(intc_table) / sizeof(struct fdt_device_info);
48d5bac4fdSDavid Karoly #endif
4923eafdafSFrançois Revol 
5023eafdafSFrançois Revol 
5123eafdafSFrançois Revol void
5223eafdafSFrançois Revol arch_timer_set_hardware_timer(bigtime_t timeout)
5323eafdafSFrançois Revol {
54a52dd58dSIthamar R. Adema 	HardwareTimer *timer = HardwareTimer::Get();
55a52dd58dSIthamar R. Adema 	if (timer != NULL)
56a52dd58dSIthamar R. Adema 		timer->SetTimeout(timeout);
57af1c0b55SIthamar R. Adema }
58af1c0b55SIthamar R. Adema 
5923eafdafSFrançois Revol 
6023eafdafSFrançois Revol void
6123eafdafSFrançois Revol arch_timer_clear_hardware_timer()
6223eafdafSFrançois Revol {
63a52dd58dSIthamar R. Adema 	HardwareTimer *timer = HardwareTimer::Get();
64a52dd58dSIthamar R. Adema 	if (timer != NULL)
65a52dd58dSIthamar R. Adema 		timer->Clear();
66be7195d0SIthamar R. Adema }
6723eafdafSFrançois Revol 
6823eafdafSFrançois Revol int
6923eafdafSFrançois Revol arch_init_timer(kernel_args *args)
7023eafdafSFrançois Revol {
71*bdce546cSDavid Karoly 	TRACE("%s\n", __func__);
72*bdce546cSDavid Karoly 
73*bdce546cSDavid Karoly 	if (ARMGenericTimer::IsAvailable()) {
74*bdce546cSDavid Karoly 		TRACE("init ARMv7 generic timer\n");
75*bdce546cSDavid Karoly 		ARMGenericTimer::Init();
76*bdce546cSDavid Karoly 	}
77*bdce546cSDavid Karoly 
78*bdce546cSDavid Karoly 	//TODO: use SoC-specific timer as a fallback
79*bdce546cSDavid Karoly 	//if the generic timer is not available
8023eafdafSFrançois Revol 
81d5bac4fdSDavid Karoly #if 0
82a52dd58dSIthamar R. Adema 	status_t rc = get_module(B_FDT_MODULE_NAME, (module_info**)&sFdtModule);
83a52dd58dSIthamar R. Adema 	if (rc != B_OK)
84a52dd58dSIthamar R. Adema 		panic("Unable to get FDT module: %08lx!\n", rc);
85be7195d0SIthamar R. Adema 
86a52dd58dSIthamar R. Adema 	rc = sFdtModule->setup_devices(intc_table, intc_count, NULL);
87a52dd58dSIthamar R. Adema 	if (rc != B_OK)
88*bdce546cSDavid Karoly 		panic("No hardware timer found!\n");
89d5bac4fdSDavid Karoly #endif
90be7195d0SIthamar R. Adema 
91be7195d0SIthamar R. Adema 	return B_OK;
92be7195d0SIthamar R. Adema }
93af1c0b55SIthamar R. Adema 
94*bdce546cSDavid Karoly 
95af1c0b55SIthamar R. Adema bigtime_t
96af1c0b55SIthamar R. Adema system_time(void)
97af1c0b55SIthamar R. Adema {
98a52dd58dSIthamar R. Adema 	HardwareTimer *timer = HardwareTimer::Get();
99a52dd58dSIthamar R. Adema 	if (timer != NULL)
100a52dd58dSIthamar R. Adema 		return timer->Time();
10134ed0fe7SIthamar R. Adema 
102a52dd58dSIthamar R. Adema 	return 0;
103af1c0b55SIthamar R. Adema }
104