1 /* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 5 * 6 * Copyright (C) 2001 - 2013 Tensilica Inc. 7 */ 8 9 #ifndef _XTENSA_TIMEX_H 10 #define _XTENSA_TIMEX_H 11 12 #include <asm/processor.h> 13 14 #if XCHAL_NUM_TIMERS > 0 && \ 15 XTENSA_INT_LEVEL(XCHAL_TIMER0_INTERRUPT) <= XCHAL_EXCM_LEVEL 16 # define LINUX_TIMER 0 17 # define LINUX_TIMER_INT XCHAL_TIMER0_INTERRUPT 18 #elif XCHAL_NUM_TIMERS > 1 && \ 19 XTENSA_INT_LEVEL(XCHAL_TIMER1_INTERRUPT) <= XCHAL_EXCM_LEVEL 20 # define LINUX_TIMER 1 21 # define LINUX_TIMER_INT XCHAL_TIMER1_INTERRUPT 22 #elif XCHAL_NUM_TIMERS > 2 && \ 23 XTENSA_INT_LEVEL(XCHAL_TIMER2_INTERRUPT) <= XCHAL_EXCM_LEVEL 24 # define LINUX_TIMER 2 25 # define LINUX_TIMER_INT XCHAL_TIMER2_INTERRUPT 26 #else 27 # error "Bad timer number for Linux configurations!" 28 #endif 29 30 extern unsigned long ccount_freq; 31 32 typedef unsigned long long cycles_t; 33 34 #define get_cycles() (0) 35 36 void local_timer_setup(unsigned cpu); 37 38 /* 39 * Register access. 40 */ 41 42 static inline unsigned long get_ccount (void) 43 { 44 return xtensa_get_sr(ccount); 45 } 46 47 static inline void set_ccount (unsigned long ccount) 48 { 49 xtensa_set_sr(ccount, ccount); 50 } 51 52 static inline unsigned long get_linux_timer (void) 53 { 54 return xtensa_get_sr(SREG_CCOMPARE + LINUX_TIMER); 55 } 56 57 static inline void set_linux_timer (unsigned long ccompare) 58 { 59 xtensa_set_sr(ccompare, SREG_CCOMPARE + LINUX_TIMER); 60 } 61 62 #endif /* _XTENSA_TIMEX_H */ 63