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