diff options
author | Jisheng Zhang <jszhang@marvell.com> | 2015-11-25 10:42:49 -0500 |
---|---|---|
committer | Daniel Lezcano <daniel.lezcano@linaro.org> | 2015-12-16 03:45:10 -0500 |
commit | 272a25a247ce6d31315856721014635469500e96 (patch) | |
tree | 8048afdbd8078cd6b5075584656ae66040d638e5 | |
parent | 08e4b44852626f3549c8bd45308431d9c9e0ee6d (diff) |
clocksource/drivers/pistachio: Fix wrong calculated clocksource read value
Let's assume the counter value is 0xf0000000, the pistachio clocksource
read cycles function should return ~0x0fffffff but actually it returns
0xffffffff0fffffff.
That occurs because:
~(cycle_t)value is different from (cycle_t)~value.
unsigned long val = ~(unsigned long)0xf0000000;
40049a: 48 b8 ff ff ff 0f ff movabs $0xffffffff0fffffff,%rax
unsigned long val = (unsigned long)~0xf0000000;
40049a: 48 c7 45 f8 ff ff ff movq $0xfffffff,-0x8(%rbp)
We fix this issue by calculating bitwise-not counter, then cast to
cycle_t.
Signed-off-by: Jisheng Zhang <jszhang@marvell.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
-rw-r--r-- | drivers/clocksource/time-pistachio.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/clocksource/time-pistachio.c b/drivers/clocksource/time-pistachio.c index bba679900054..3269d9ef7a18 100644 --- a/drivers/clocksource/time-pistachio.c +++ b/drivers/clocksource/time-pistachio.c | |||
@@ -84,7 +84,7 @@ pistachio_clocksource_read_cycles(struct clocksource *cs) | |||
84 | counter = gpt_readl(pcs->base, TIMER_CURRENT_VALUE, 0); | 84 | counter = gpt_readl(pcs->base, TIMER_CURRENT_VALUE, 0); |
85 | raw_spin_unlock_irqrestore(&pcs->lock, flags); | 85 | raw_spin_unlock_irqrestore(&pcs->lock, flags); |
86 | 86 | ||
87 | return ~(cycle_t)counter; | 87 | return (cycle_t)~counter; |
88 | } | 88 | } |
89 | 89 | ||
90 | static u64 notrace pistachio_read_sched_clock(void) | 90 | static u64 notrace pistachio_read_sched_clock(void) |