diff options
-rw-r--r-- | drivers/net/ethernet/amd/xgbe/xgbe.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/fec.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/e1000.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/igb/igb.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/ti/cpts.h | 1 | ||||
-rw-r--r-- | include/clocksource/arm_arch_timer.h | 2 | ||||
-rw-r--r-- | include/linux/clocksource.h | 102 | ||||
-rw-r--r-- | include/linux/mlx4/device.h | 2 | ||||
-rw-r--r-- | include/linux/timecounter.h | 122 | ||||
-rw-r--r-- | include/linux/types.h | 3 | ||||
-rw-r--r-- | kernel/time/Makefile | 2 | ||||
-rw-r--r-- | kernel/time/clocksource.c | 76 | ||||
-rw-r--r-- | kernel/time/timecounter.c | 95 | ||||
-rw-r--r-- | sound/pci/hda/hda_priv.h | 2 |
16 files changed, 231 insertions, 187 deletions
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h index f9ec762ac3f0..2af6affc35a7 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe.h +++ b/drivers/net/ethernet/amd/xgbe/xgbe.h | |||
@@ -124,7 +124,7 @@ | |||
124 | #include <linux/if_vlan.h> | 124 | #include <linux/if_vlan.h> |
125 | #include <linux/bitops.h> | 125 | #include <linux/bitops.h> |
126 | #include <linux/ptp_clock_kernel.h> | 126 | #include <linux/ptp_clock_kernel.h> |
127 | #include <linux/clocksource.h> | 127 | #include <linux/timecounter.h> |
128 | #include <linux/net_tstamp.h> | 128 | #include <linux/net_tstamp.h> |
129 | #include <net/dcbnl.h> | 129 | #include <net/dcbnl.h> |
130 | 130 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h index c3a6072134f5..792ba72fb5c8 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | |||
@@ -22,7 +22,7 @@ | |||
22 | 22 | ||
23 | #include <linux/ptp_clock_kernel.h> | 23 | #include <linux/ptp_clock_kernel.h> |
24 | #include <linux/net_tstamp.h> | 24 | #include <linux/net_tstamp.h> |
25 | #include <linux/clocksource.h> | 25 | #include <linux/timecounter.h> |
26 | 26 | ||
27 | /* compilation time flags */ | 27 | /* compilation time flags */ |
28 | 28 | ||
diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h index 469691ad4a1e..df8bbddaeb37 100644 --- a/drivers/net/ethernet/freescale/fec.h +++ b/drivers/net/ethernet/freescale/fec.h | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/clocksource.h> | 16 | #include <linux/clocksource.h> |
17 | #include <linux/net_tstamp.h> | 17 | #include <linux/net_tstamp.h> |
18 | #include <linux/ptp_clock_kernel.h> | 18 | #include <linux/ptp_clock_kernel.h> |
19 | #include <linux/timecounter.h> | ||
19 | 20 | ||
20 | #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ | 21 | #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ |
21 | defined(CONFIG_M520x) || defined(CONFIG_M532x) || \ | 22 | defined(CONFIG_M520x) || defined(CONFIG_M532x) || \ |
diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h index 7785240a0da1..9416e5a7e0c8 100644 --- a/drivers/net/ethernet/intel/e1000e/e1000.h +++ b/drivers/net/ethernet/intel/e1000e/e1000.h | |||
@@ -34,7 +34,7 @@ | |||
34 | #include <linux/pci-aspm.h> | 34 | #include <linux/pci-aspm.h> |
35 | #include <linux/crc32.h> | 35 | #include <linux/crc32.h> |
36 | #include <linux/if_vlan.h> | 36 | #include <linux/if_vlan.h> |
37 | #include <linux/clocksource.h> | 37 | #include <linux/timecounter.h> |
38 | #include <linux/net_tstamp.h> | 38 | #include <linux/net_tstamp.h> |
39 | #include <linux/ptp_clock_kernel.h> | 39 | #include <linux/ptp_clock_kernel.h> |
40 | #include <linux/ptp_classify.h> | 40 | #include <linux/ptp_classify.h> |
diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h index 82d891e183b1..ee22da391474 100644 --- a/drivers/net/ethernet/intel/igb/igb.h +++ b/drivers/net/ethernet/intel/igb/igb.h | |||
@@ -29,7 +29,7 @@ | |||
29 | #include "e1000_mac.h" | 29 | #include "e1000_mac.h" |
30 | #include "e1000_82575.h" | 30 | #include "e1000_82575.h" |
31 | 31 | ||
32 | #include <linux/clocksource.h> | 32 | #include <linux/timecounter.h> |
33 | #include <linux/net_tstamp.h> | 33 | #include <linux/net_tstamp.h> |
34 | #include <linux/ptp_clock_kernel.h> | 34 | #include <linux/ptp_clock_kernel.h> |
35 | #include <linux/bitops.h> | 35 | #include <linux/bitops.h> |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h index b6137be43920..38fc64cf5dca 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h | |||
@@ -38,7 +38,7 @@ | |||
38 | #include <linux/if_vlan.h> | 38 | #include <linux/if_vlan.h> |
39 | #include <linux/jiffies.h> | 39 | #include <linux/jiffies.h> |
40 | 40 | ||
41 | #include <linux/clocksource.h> | 41 | #include <linux/timecounter.h> |
42 | #include <linux/net_tstamp.h> | 42 | #include <linux/net_tstamp.h> |
43 | #include <linux/ptp_clock_kernel.h> | 43 | #include <linux/ptp_clock_kernel.h> |
44 | 44 | ||
diff --git a/drivers/net/ethernet/ti/cpts.h b/drivers/net/ethernet/ti/cpts.h index 1a581ef7eee8..69a46b92c7d6 100644 --- a/drivers/net/ethernet/ti/cpts.h +++ b/drivers/net/ethernet/ti/cpts.h | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/list.h> | 27 | #include <linux/list.h> |
28 | #include <linux/ptp_clock_kernel.h> | 28 | #include <linux/ptp_clock_kernel.h> |
29 | #include <linux/skbuff.h> | 29 | #include <linux/skbuff.h> |
30 | #include <linux/timecounter.h> | ||
30 | 31 | ||
31 | struct cpsw_cpts { | 32 | struct cpsw_cpts { |
32 | u32 idver; /* Identification and version */ | 33 | u32 idver; /* Identification and version */ |
diff --git a/include/clocksource/arm_arch_timer.h b/include/clocksource/arm_arch_timer.h index 6d26b40cbf5d..9916d0e4eff5 100644 --- a/include/clocksource/arm_arch_timer.h +++ b/include/clocksource/arm_arch_timer.h | |||
@@ -16,7 +16,7 @@ | |||
16 | #ifndef __CLKSOURCE_ARM_ARCH_TIMER_H | 16 | #ifndef __CLKSOURCE_ARM_ARCH_TIMER_H |
17 | #define __CLKSOURCE_ARM_ARCH_TIMER_H | 17 | #define __CLKSOURCE_ARM_ARCH_TIMER_H |
18 | 18 | ||
19 | #include <linux/clocksource.h> | 19 | #include <linux/timecounter.h> |
20 | #include <linux/types.h> | 20 | #include <linux/types.h> |
21 | 21 | ||
22 | #define ARCH_TIMER_CTRL_ENABLE (1 << 0) | 22 | #define ARCH_TIMER_CTRL_ENABLE (1 << 0) |
diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index abcafaa20b86..9c78d15d33e4 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h | |||
@@ -18,8 +18,6 @@ | |||
18 | #include <asm/div64.h> | 18 | #include <asm/div64.h> |
19 | #include <asm/io.h> | 19 | #include <asm/io.h> |
20 | 20 | ||
21 | /* clocksource cycle base type */ | ||
22 | typedef u64 cycle_t; | ||
23 | struct clocksource; | 21 | struct clocksource; |
24 | struct module; | 22 | struct module; |
25 | 23 | ||
@@ -28,106 +26,6 @@ struct module; | |||
28 | #endif | 26 | #endif |
29 | 27 | ||
30 | /** | 28 | /** |
31 | * struct cyclecounter - hardware abstraction for a free running counter | ||
32 | * Provides completely state-free accessors to the underlying hardware. | ||
33 | * Depending on which hardware it reads, the cycle counter may wrap | ||
34 | * around quickly. Locking rules (if necessary) have to be defined | ||
35 | * by the implementor and user of specific instances of this API. | ||
36 | * | ||
37 | * @read: returns the current cycle value | ||
38 | * @mask: bitmask for two's complement | ||
39 | * subtraction of non 64 bit counters, | ||
40 | * see CLOCKSOURCE_MASK() helper macro | ||
41 | * @mult: cycle to nanosecond multiplier | ||
42 | * @shift: cycle to nanosecond divisor (power of two) | ||
43 | */ | ||
44 | struct cyclecounter { | ||
45 | cycle_t (*read)(const struct cyclecounter *cc); | ||
46 | cycle_t mask; | ||
47 | u32 mult; | ||
48 | u32 shift; | ||
49 | }; | ||
50 | |||
51 | /** | ||
52 | * struct timecounter - layer above a %struct cyclecounter which counts nanoseconds | ||
53 | * Contains the state needed by timecounter_read() to detect | ||
54 | * cycle counter wrap around. Initialize with | ||
55 | * timecounter_init(). Also used to convert cycle counts into the | ||
56 | * corresponding nanosecond counts with timecounter_cyc2time(). Users | ||
57 | * of this code are responsible for initializing the underlying | ||
58 | * cycle counter hardware, locking issues and reading the time | ||
59 | * more often than the cycle counter wraps around. The nanosecond | ||
60 | * counter will only wrap around after ~585 years. | ||
61 | * | ||
62 | * @cc: the cycle counter used by this instance | ||
63 | * @cycle_last: most recent cycle counter value seen by | ||
64 | * timecounter_read() | ||
65 | * @nsec: continuously increasing count | ||
66 | */ | ||
67 | struct timecounter { | ||
68 | const struct cyclecounter *cc; | ||
69 | cycle_t cycle_last; | ||
70 | u64 nsec; | ||
71 | }; | ||
72 | |||
73 | /** | ||
74 | * cyclecounter_cyc2ns - converts cycle counter cycles to nanoseconds | ||
75 | * @cc: Pointer to cycle counter. | ||
76 | * @cycles: Cycles | ||
77 | * | ||
78 | * XXX - This could use some mult_lxl_ll() asm optimization. Same code | ||
79 | * as in cyc2ns, but with unsigned result. | ||
80 | */ | ||
81 | static inline u64 cyclecounter_cyc2ns(const struct cyclecounter *cc, | ||
82 | cycle_t cycles) | ||
83 | { | ||
84 | u64 ret = (u64)cycles; | ||
85 | ret = (ret * cc->mult) >> cc->shift; | ||
86 | return ret; | ||
87 | } | ||
88 | |||
89 | /** | ||
90 | * timecounter_init - initialize a time counter | ||
91 | * @tc: Pointer to time counter which is to be initialized/reset | ||
92 | * @cc: A cycle counter, ready to be used. | ||
93 | * @start_tstamp: Arbitrary initial time stamp. | ||
94 | * | ||
95 | * After this call the current cycle register (roughly) corresponds to | ||
96 | * the initial time stamp. Every call to timecounter_read() increments | ||
97 | * the time stamp counter by the number of elapsed nanoseconds. | ||
98 | */ | ||
99 | extern void timecounter_init(struct timecounter *tc, | ||
100 | const struct cyclecounter *cc, | ||
101 | u64 start_tstamp); | ||
102 | |||
103 | /** | ||
104 | * timecounter_read - return nanoseconds elapsed since timecounter_init() | ||
105 | * plus the initial time stamp | ||
106 | * @tc: Pointer to time counter. | ||
107 | * | ||
108 | * In other words, keeps track of time since the same epoch as | ||
109 | * the function which generated the initial time stamp. | ||
110 | */ | ||
111 | extern u64 timecounter_read(struct timecounter *tc); | ||
112 | |||
113 | /** | ||
114 | * timecounter_cyc2time - convert a cycle counter to same | ||
115 | * time base as values returned by | ||
116 | * timecounter_read() | ||
117 | * @tc: Pointer to time counter. | ||
118 | * @cycle_tstamp: a value returned by tc->cc->read() | ||
119 | * | ||
120 | * Cycle counts that are converted correctly as long as they | ||
121 | * fall into the interval [-1/2 max cycle count, +1/2 max cycle count], | ||
122 | * with "max cycle count" == cs->mask+1. | ||
123 | * | ||
124 | * This allows conversion of cycle counter values which were generated | ||
125 | * in the past. | ||
126 | */ | ||
127 | extern u64 timecounter_cyc2time(struct timecounter *tc, | ||
128 | cycle_t cycle_tstamp); | ||
129 | |||
130 | /** | ||
131 | * struct clocksource - hardware abstraction for a free running counter | 29 | * struct clocksource - hardware abstraction for a free running counter |
132 | * Provides mostly state-free accessors to the underlying hardware. | 30 | * Provides mostly state-free accessors to the underlying hardware. |
133 | * This is the structure used for system time. | 31 | * This is the structure used for system time. |
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index 25c791e295fd..f1e41b33462f 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h | |||
@@ -42,7 +42,7 @@ | |||
42 | 42 | ||
43 | #include <linux/atomic.h> | 43 | #include <linux/atomic.h> |
44 | 44 | ||
45 | #include <linux/clocksource.h> | 45 | #include <linux/timecounter.h> |
46 | 46 | ||
47 | #define MAX_MSIX_P_PORT 17 | 47 | #define MAX_MSIX_P_PORT 17 |
48 | #define MAX_MSIX 64 | 48 | #define MAX_MSIX 64 |
diff --git a/include/linux/timecounter.h b/include/linux/timecounter.h new file mode 100644 index 000000000000..146f07a6651b --- /dev/null +++ b/include/linux/timecounter.h | |||
@@ -0,0 +1,122 @@ | |||
1 | /* | ||
2 | * linux/include/linux/timecounter.h | ||
3 | * | ||
4 | * based on code that migrated away from | ||
5 | * linux/include/linux/clocksource.h | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | */ | ||
17 | #ifndef _LINUX_TIMECOUNTER_H | ||
18 | #define _LINUX_TIMECOUNTER_H | ||
19 | |||
20 | #include <linux/types.h> | ||
21 | |||
22 | /** | ||
23 | * struct cyclecounter - hardware abstraction for a free running counter | ||
24 | * Provides completely state-free accessors to the underlying hardware. | ||
25 | * Depending on which hardware it reads, the cycle counter may wrap | ||
26 | * around quickly. Locking rules (if necessary) have to be defined | ||
27 | * by the implementor and user of specific instances of this API. | ||
28 | * | ||
29 | * @read: returns the current cycle value | ||
30 | * @mask: bitmask for two's complement | ||
31 | * subtraction of non 64 bit counters, | ||
32 | * see CLOCKSOURCE_MASK() helper macro | ||
33 | * @mult: cycle to nanosecond multiplier | ||
34 | * @shift: cycle to nanosecond divisor (power of two) | ||
35 | */ | ||
36 | struct cyclecounter { | ||
37 | cycle_t (*read)(const struct cyclecounter *cc); | ||
38 | cycle_t mask; | ||
39 | u32 mult; | ||
40 | u32 shift; | ||
41 | }; | ||
42 | |||
43 | /** | ||
44 | * struct timecounter - layer above a %struct cyclecounter which counts nanoseconds | ||
45 | * Contains the state needed by timecounter_read() to detect | ||
46 | * cycle counter wrap around. Initialize with | ||
47 | * timecounter_init(). Also used to convert cycle counts into the | ||
48 | * corresponding nanosecond counts with timecounter_cyc2time(). Users | ||
49 | * of this code are responsible for initializing the underlying | ||
50 | * cycle counter hardware, locking issues and reading the time | ||
51 | * more often than the cycle counter wraps around. The nanosecond | ||
52 | * counter will only wrap around after ~585 years. | ||
53 | * | ||
54 | * @cc: the cycle counter used by this instance | ||
55 | * @cycle_last: most recent cycle counter value seen by | ||
56 | * timecounter_read() | ||
57 | * @nsec: continuously increasing count | ||
58 | */ | ||
59 | struct timecounter { | ||
60 | const struct cyclecounter *cc; | ||
61 | cycle_t cycle_last; | ||
62 | u64 nsec; | ||
63 | }; | ||
64 | |||
65 | /** | ||
66 | * cyclecounter_cyc2ns - converts cycle counter cycles to nanoseconds | ||
67 | * @cc: Pointer to cycle counter. | ||
68 | * @cycles: Cycles | ||
69 | * | ||
70 | * XXX - This could use some mult_lxl_ll() asm optimization. Same code | ||
71 | * as in cyc2ns, but with unsigned result. | ||
72 | */ | ||
73 | static inline u64 cyclecounter_cyc2ns(const struct cyclecounter *cc, | ||
74 | cycle_t cycles) | ||
75 | { | ||
76 | u64 ret = (u64)cycles; | ||
77 | ret = (ret * cc->mult) >> cc->shift; | ||
78 | return ret; | ||
79 | } | ||
80 | |||
81 | /** | ||
82 | * timecounter_init - initialize a time counter | ||
83 | * @tc: Pointer to time counter which is to be initialized/reset | ||
84 | * @cc: A cycle counter, ready to be used. | ||
85 | * @start_tstamp: Arbitrary initial time stamp. | ||
86 | * | ||
87 | * After this call the current cycle register (roughly) corresponds to | ||
88 | * the initial time stamp. Every call to timecounter_read() increments | ||
89 | * the time stamp counter by the number of elapsed nanoseconds. | ||
90 | */ | ||
91 | extern void timecounter_init(struct timecounter *tc, | ||
92 | const struct cyclecounter *cc, | ||
93 | u64 start_tstamp); | ||
94 | |||
95 | /** | ||
96 | * timecounter_read - return nanoseconds elapsed since timecounter_init() | ||
97 | * plus the initial time stamp | ||
98 | * @tc: Pointer to time counter. | ||
99 | * | ||
100 | * In other words, keeps track of time since the same epoch as | ||
101 | * the function which generated the initial time stamp. | ||
102 | */ | ||
103 | extern u64 timecounter_read(struct timecounter *tc); | ||
104 | |||
105 | /** | ||
106 | * timecounter_cyc2time - convert a cycle counter to same | ||
107 | * time base as values returned by | ||
108 | * timecounter_read() | ||
109 | * @tc: Pointer to time counter. | ||
110 | * @cycle_tstamp: a value returned by tc->cc->read() | ||
111 | * | ||
112 | * Cycle counts that are converted correctly as long as they | ||
113 | * fall into the interval [-1/2 max cycle count, +1/2 max cycle count], | ||
114 | * with "max cycle count" == cs->mask+1. | ||
115 | * | ||
116 | * This allows conversion of cycle counter values which were generated | ||
117 | * in the past. | ||
118 | */ | ||
119 | extern u64 timecounter_cyc2time(struct timecounter *tc, | ||
120 | cycle_t cycle_tstamp); | ||
121 | |||
122 | #endif | ||
diff --git a/include/linux/types.h b/include/linux/types.h index a0bb7048687f..62323825cff9 100644 --- a/include/linux/types.h +++ b/include/linux/types.h | |||
@@ -213,5 +213,8 @@ struct callback_head { | |||
213 | }; | 213 | }; |
214 | #define rcu_head callback_head | 214 | #define rcu_head callback_head |
215 | 215 | ||
216 | /* clocksource cycle base type */ | ||
217 | typedef u64 cycle_t; | ||
218 | |||
216 | #endif /* __ASSEMBLY__ */ | 219 | #endif /* __ASSEMBLY__ */ |
217 | #endif /* _LINUX_TYPES_H */ | 220 | #endif /* _LINUX_TYPES_H */ |
diff --git a/kernel/time/Makefile b/kernel/time/Makefile index f622cf28628a..c09c07817d7a 100644 --- a/kernel/time/Makefile +++ b/kernel/time/Makefile | |||
@@ -1,6 +1,6 @@ | |||
1 | obj-y += time.o timer.o hrtimer.o itimer.o posix-timers.o posix-cpu-timers.o | 1 | obj-y += time.o timer.o hrtimer.o itimer.o posix-timers.o posix-cpu-timers.o |
2 | obj-y += timekeeping.o ntp.o clocksource.o jiffies.o timer_list.o | 2 | obj-y += timekeeping.o ntp.o clocksource.o jiffies.o timer_list.o |
3 | obj-y += timeconv.o posix-clock.o alarmtimer.o | 3 | obj-y += timeconv.o timecounter.o posix-clock.o alarmtimer.o |
4 | 4 | ||
5 | obj-$(CONFIG_GENERIC_CLOCKEVENTS_BUILD) += clockevents.o | 5 | obj-$(CONFIG_GENERIC_CLOCKEVENTS_BUILD) += clockevents.o |
6 | obj-$(CONFIG_GENERIC_CLOCKEVENTS) += tick-common.o | 6 | obj-$(CONFIG_GENERIC_CLOCKEVENTS) += tick-common.o |
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index b79f39bda7e1..4892352f0e49 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c | |||
@@ -34,82 +34,6 @@ | |||
34 | #include "tick-internal.h" | 34 | #include "tick-internal.h" |
35 | #include "timekeeping_internal.h" | 35 | #include "timekeeping_internal.h" |
36 | 36 | ||
37 | void timecounter_init(struct timecounter *tc, | ||
38 | const struct cyclecounter *cc, | ||
39 | u64 start_tstamp) | ||
40 | { | ||
41 | tc->cc = cc; | ||
42 | tc->cycle_last = cc->read(cc); | ||
43 | tc->nsec = start_tstamp; | ||
44 | } | ||
45 | EXPORT_SYMBOL_GPL(timecounter_init); | ||
46 | |||
47 | /** | ||
48 | * timecounter_read_delta - get nanoseconds since last call of this function | ||
49 | * @tc: Pointer to time counter | ||
50 | * | ||
51 | * When the underlying cycle counter runs over, this will be handled | ||
52 | * correctly as long as it does not run over more than once between | ||
53 | * calls. | ||
54 | * | ||
55 | * The first call to this function for a new time counter initializes | ||
56 | * the time tracking and returns an undefined result. | ||
57 | */ | ||
58 | static u64 timecounter_read_delta(struct timecounter *tc) | ||
59 | { | ||
60 | cycle_t cycle_now, cycle_delta; | ||
61 | u64 ns_offset; | ||
62 | |||
63 | /* read cycle counter: */ | ||
64 | cycle_now = tc->cc->read(tc->cc); | ||
65 | |||
66 | /* calculate the delta since the last timecounter_read_delta(): */ | ||
67 | cycle_delta = (cycle_now - tc->cycle_last) & tc->cc->mask; | ||
68 | |||
69 | /* convert to nanoseconds: */ | ||
70 | ns_offset = cyclecounter_cyc2ns(tc->cc, cycle_delta); | ||
71 | |||
72 | /* update time stamp of timecounter_read_delta() call: */ | ||
73 | tc->cycle_last = cycle_now; | ||
74 | |||
75 | return ns_offset; | ||
76 | } | ||
77 | |||
78 | u64 timecounter_read(struct timecounter *tc) | ||
79 | { | ||
80 | u64 nsec; | ||
81 | |||
82 | /* increment time by nanoseconds since last call */ | ||
83 | nsec = timecounter_read_delta(tc); | ||
84 | nsec += tc->nsec; | ||
85 | tc->nsec = nsec; | ||
86 | |||
87 | return nsec; | ||
88 | } | ||
89 | EXPORT_SYMBOL_GPL(timecounter_read); | ||
90 | |||
91 | u64 timecounter_cyc2time(struct timecounter *tc, | ||
92 | cycle_t cycle_tstamp) | ||
93 | { | ||
94 | u64 cycle_delta = (cycle_tstamp - tc->cycle_last) & tc->cc->mask; | ||
95 | u64 nsec; | ||
96 | |||
97 | /* | ||
98 | * Instead of always treating cycle_tstamp as more recent | ||
99 | * than tc->cycle_last, detect when it is too far in the | ||
100 | * future and treat it as old time stamp instead. | ||
101 | */ | ||
102 | if (cycle_delta > tc->cc->mask / 2) { | ||
103 | cycle_delta = (tc->cycle_last - cycle_tstamp) & tc->cc->mask; | ||
104 | nsec = tc->nsec - cyclecounter_cyc2ns(tc->cc, cycle_delta); | ||
105 | } else { | ||
106 | nsec = cyclecounter_cyc2ns(tc->cc, cycle_delta) + tc->nsec; | ||
107 | } | ||
108 | |||
109 | return nsec; | ||
110 | } | ||
111 | EXPORT_SYMBOL_GPL(timecounter_cyc2time); | ||
112 | |||
113 | /** | 37 | /** |
114 | * clocks_calc_mult_shift - calculate mult/shift factors for scaled math of clocks | 38 | * clocks_calc_mult_shift - calculate mult/shift factors for scaled math of clocks |
115 | * @mult: pointer to mult variable | 39 | * @mult: pointer to mult variable |
diff --git a/kernel/time/timecounter.c b/kernel/time/timecounter.c new file mode 100644 index 000000000000..59a1ec3a57cb --- /dev/null +++ b/kernel/time/timecounter.c | |||
@@ -0,0 +1,95 @@ | |||
1 | /* | ||
2 | * linux/kernel/time/timecounter.c | ||
3 | * | ||
4 | * based on code that migrated away from | ||
5 | * linux/kernel/time/clocksource.c | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | */ | ||
17 | |||
18 | #include <linux/export.h> | ||
19 | #include <linux/timecounter.h> | ||
20 | |||
21 | void timecounter_init(struct timecounter *tc, | ||
22 | const struct cyclecounter *cc, | ||
23 | u64 start_tstamp) | ||
24 | { | ||
25 | tc->cc = cc; | ||
26 | tc->cycle_last = cc->read(cc); | ||
27 | tc->nsec = start_tstamp; | ||
28 | } | ||
29 | EXPORT_SYMBOL_GPL(timecounter_init); | ||
30 | |||
31 | /** | ||
32 | * timecounter_read_delta - get nanoseconds since last call of this function | ||
33 | * @tc: Pointer to time counter | ||
34 | * | ||
35 | * When the underlying cycle counter runs over, this will be handled | ||
36 | * correctly as long as it does not run over more than once between | ||
37 | * calls. | ||
38 | * | ||
39 | * The first call to this function for a new time counter initializes | ||
40 | * the time tracking and returns an undefined result. | ||
41 | */ | ||
42 | static u64 timecounter_read_delta(struct timecounter *tc) | ||
43 | { | ||
44 | cycle_t cycle_now, cycle_delta; | ||
45 | u64 ns_offset; | ||
46 | |||
47 | /* read cycle counter: */ | ||
48 | cycle_now = tc->cc->read(tc->cc); | ||
49 | |||
50 | /* calculate the delta since the last timecounter_read_delta(): */ | ||
51 | cycle_delta = (cycle_now - tc->cycle_last) & tc->cc->mask; | ||
52 | |||
53 | /* convert to nanoseconds: */ | ||
54 | ns_offset = cyclecounter_cyc2ns(tc->cc, cycle_delta); | ||
55 | |||
56 | /* update time stamp of timecounter_read_delta() call: */ | ||
57 | tc->cycle_last = cycle_now; | ||
58 | |||
59 | return ns_offset; | ||
60 | } | ||
61 | |||
62 | u64 timecounter_read(struct timecounter *tc) | ||
63 | { | ||
64 | u64 nsec; | ||
65 | |||
66 | /* increment time by nanoseconds since last call */ | ||
67 | nsec = timecounter_read_delta(tc); | ||
68 | nsec += tc->nsec; | ||
69 | tc->nsec = nsec; | ||
70 | |||
71 | return nsec; | ||
72 | } | ||
73 | EXPORT_SYMBOL_GPL(timecounter_read); | ||
74 | |||
75 | u64 timecounter_cyc2time(struct timecounter *tc, | ||
76 | cycle_t cycle_tstamp) | ||
77 | { | ||
78 | u64 cycle_delta = (cycle_tstamp - tc->cycle_last) & tc->cc->mask; | ||
79 | u64 nsec; | ||
80 | |||
81 | /* | ||
82 | * Instead of always treating cycle_tstamp as more recent | ||
83 | * than tc->cycle_last, detect when it is too far in the | ||
84 | * future and treat it as old time stamp instead. | ||
85 | */ | ||
86 | if (cycle_delta > tc->cc->mask / 2) { | ||
87 | cycle_delta = (tc->cycle_last - cycle_tstamp) & tc->cc->mask; | ||
88 | nsec = tc->nsec - cyclecounter_cyc2ns(tc->cc, cycle_delta); | ||
89 | } else { | ||
90 | nsec = cyclecounter_cyc2ns(tc->cc, cycle_delta) + tc->nsec; | ||
91 | } | ||
92 | |||
93 | return nsec; | ||
94 | } | ||
95 | EXPORT_SYMBOL_GPL(timecounter_cyc2time); | ||
diff --git a/sound/pci/hda/hda_priv.h b/sound/pci/hda/hda_priv.h index 166e3e84b963..daf458299753 100644 --- a/sound/pci/hda/hda_priv.h +++ b/sound/pci/hda/hda_priv.h | |||
@@ -15,7 +15,7 @@ | |||
15 | #ifndef __SOUND_HDA_PRIV_H | 15 | #ifndef __SOUND_HDA_PRIV_H |
16 | #define __SOUND_HDA_PRIV_H | 16 | #define __SOUND_HDA_PRIV_H |
17 | 17 | ||
18 | #include <linux/clocksource.h> | 18 | #include <linux/timecounter.h> |
19 | #include <sound/core.h> | 19 | #include <sound/core.h> |
20 | #include <sound/pcm.h> | 20 | #include <sound/pcm.h> |
21 | 21 | ||