Path: blob/master/arch/mn10300/unit-asb2303/include/unit/timex.h
10820 views
/* ASB2303-specific timer specifications1*2* Copyright (C) 2007, 2010 Red Hat, Inc. All Rights Reserved.3* Written by David Howells ([email protected])4*5* This program is free software; you can redistribute it and/or6* modify it under the terms of the GNU General Public Licence7* as published by the Free Software Foundation; either version8* 2 of the Licence, or (at your option) any later version.9*/10#ifndef _ASM_UNIT_TIMEX_H11#define _ASM_UNIT_TIMEX_H1213#ifndef __ASSEMBLY__14#include <linux/irq.h>15#endif /* __ASSEMBLY__ */1617#include <asm/timer-regs.h>18#include <unit/clock.h>19#include <asm/param.h>2021/*22* jiffies counter specifications23*/2425#define TMJCBR_MAX 0xffff26#define TMJCIRQ TM1IRQ27#define TMJCICR TM1ICR2829#ifndef __ASSEMBLY__3031#define MN10300_SRC_IOCLK MN10300_IOCLK3233#ifndef HZ34# error HZ undeclared.35#endif /* !HZ */36/* use as little prescaling as possible to avoid losing accuracy */37#if (MN10300_SRC_IOCLK + HZ / 2) / HZ - 1 <= TMJCBR_MAX38# define IOCLK_PRESCALE 139# define JC_TIMER_CLKSRC TM0MD_SRC_IOCLK40# define TSC_TIMER_CLKSRC TM4MD_SRC_IOCLK41#elif (MN10300_SRC_IOCLK / 8 + HZ / 2) / HZ - 1 <= TMJCBR_MAX42# define IOCLK_PRESCALE 843# define JC_TIMER_CLKSRC TM0MD_SRC_IOCLK_844# define TSC_TIMER_CLKSRC TM4MD_SRC_IOCLK_845#elif (MN10300_SRC_IOCLK / 32 + HZ / 2) / HZ - 1 <= TMJCBR_MAX46# define IOCLK_PRESCALE 3247# define JC_TIMER_CLKSRC TM0MD_SRC_IOCLK_3248# define TSC_TIMER_CLKSRC TM4MD_SRC_IOCLK_3249#else50# error You lose.51#endif5253#define MN10300_JCCLK (MN10300_SRC_IOCLK / IOCLK_PRESCALE)54#define MN10300_TSCCLK (MN10300_SRC_IOCLK / IOCLK_PRESCALE)5556#define MN10300_JC_PER_HZ ((MN10300_JCCLK + HZ / 2) / HZ)57#define MN10300_TSC_PER_HZ ((MN10300_TSCCLK + HZ / 2) / HZ)5859static inline void stop_jiffies_counter(void)60{61u16 tmp;62TM01MD = JC_TIMER_CLKSRC | TM1MD_SRC_TM0CASCADE << 8;63tmp = TM01MD;64}6566static inline void reload_jiffies_counter(u32 cnt)67{68u32 tmp;6970TM01BR = cnt;71tmp = TM01BR;7273TM01MD = JC_TIMER_CLKSRC | \74TM1MD_SRC_TM0CASCADE << 8 | \75TM0MD_INIT_COUNTER | \76TM1MD_INIT_COUNTER << 8;777879TM01MD = JC_TIMER_CLKSRC | \80TM1MD_SRC_TM0CASCADE << 8 | \81TM0MD_COUNT_ENABLE | \82TM1MD_COUNT_ENABLE << 8;8384tmp = TM01MD;85}8687#endif /* !__ASSEMBLY__ */888990/*91* timestamp counter specifications92*/9394#define TMTSCBR_MAX 0xffffffff95#define TMTSCBC TM45BC9697#ifndef __ASSEMBLY__9899static inline void startup_timestamp_counter(void)100{101u32 t32;102103/* set up timer 4 & 5 cascaded as a 32-bit counter to count real time104* - count down from 4Gig-1 to 0 and wrap at IOCLK rate105*/106TM45BR = TMTSCBR_MAX;107t32 = TM45BR;108109TM4MD = TSC_TIMER_CLKSRC;110TM4MD |= TM4MD_INIT_COUNTER;111TM4MD &= ~TM4MD_INIT_COUNTER;112TM4ICR = 0;113t32 = TM4ICR;114115TM5MD = TM5MD_SRC_TM4CASCADE;116TM5MD |= TM5MD_INIT_COUNTER;117TM5MD &= ~TM5MD_INIT_COUNTER;118TM5ICR = 0;119t32 = TM5ICR;120121TM5MD |= TM5MD_COUNT_ENABLE;122TM4MD |= TM4MD_COUNT_ENABLE;123t32 = TM5MD;124t32 = TM4MD;125}126127static inline void shutdown_timestamp_counter(void)128{129u8 t8;130TM4MD = 0;131TM5MD = 0;132t8 = TM4MD;133t8 = TM5MD;134}135136/*137* we use a cascaded pair of 16-bit down-counting timers to count I/O138* clock cycles for the purposes of time keeping139*/140typedef unsigned long cycles_t;141142static inline cycles_t read_timestamp_counter(void)143{144return (cycles_t)~TMTSCBC;145}146147#endif /* !__ASSEMBLY__ */148149#endif /* _ASM_UNIT_TIMEX_H */150151152