1 // SPDX-License-Identifier: GPL-2.0-only
3 * Port on Texas Instruments TMS320C6x architecture
5 * Copyright (C) 2004, 2009, 2010, 2011 Texas Instruments Incorporated
6 * Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com)
9 #include <linux/kernel.h>
10 #include <linux/clocksource.h>
11 #include <linux/errno.h>
12 #include <linux/sched.h>
13 #include <linux/param.h>
14 #include <linux/string.h>
16 #include <linux/interrupt.h>
17 #include <linux/timex.h>
18 #include <linux/profile.h>
20 #include <asm/special_insns.h>
21 #include <asm/timer64.h>
23 static u32 sched_clock_multiplier
;
24 #define SCHED_CLOCK_SHIFT 16
26 static u64
tsc_read(struct clocksource
*cs
)
31 static struct clocksource clocksource_tsc
= {
35 .mask
= CLOCKSOURCE_MASK(64),
36 .flags
= CLOCK_SOURCE_IS_CONTINUOUS
,
40 * scheduler clock - returns current time in nanoseconds.
44 u64 tsc
= get_cycles();
46 return (tsc
* sched_clock_multiplier
) >> SCHED_CLOCK_SHIFT
;
49 void __init
time_init(void)
51 u64 tmp
= (u64
)NSEC_PER_SEC
<< SCHED_CLOCK_SHIFT
;
53 do_div(tmp
, c6x_core_freq
);
54 sched_clock_multiplier
= tmp
;
56 clocksource_register_hz(&clocksource_tsc
, c6x_core_freq
);
58 /* write anything into TSCL to enable counting */
61 /* probe for timer64 event timer */