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