Commit 43809473 authored by Magnus Damm's avatar Magnus Damm Committed by Paul Mundt

clocksource: sh_cmt: One-off clockevent fix V2

Fix a one-off error in the CMT driver V2. The match register
should be programmed with the period minus one.

Many thanks to Eiraku-san for tracking down this issue.
Signed-off-by: default avatarMagnus Damm <damm@opensource.se>
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent 7b42176a
...@@ -308,7 +308,7 @@ static irqreturn_t sh_cmt_interrupt(int irq, void *dev_id) ...@@ -308,7 +308,7 @@ static irqreturn_t sh_cmt_interrupt(int irq, void *dev_id)
* isr before we end up here. * isr before we end up here.
*/ */
if (p->flags & FLAG_CLOCKSOURCE) if (p->flags & FLAG_CLOCKSOURCE)
p->total_cycles += p->match_value; p->total_cycles += p->match_value + 1;
if (!(p->flags & FLAG_REPROGRAM)) if (!(p->flags & FLAG_REPROGRAM))
p->next_match_value = p->max_match_value; p->next_match_value = p->max_match_value;
...@@ -403,7 +403,7 @@ static cycle_t sh_cmt_clocksource_read(struct clocksource *cs) ...@@ -403,7 +403,7 @@ static cycle_t sh_cmt_clocksource_read(struct clocksource *cs)
raw = sh_cmt_get_counter(p, &has_wrapped); raw = sh_cmt_get_counter(p, &has_wrapped);
if (unlikely(has_wrapped)) if (unlikely(has_wrapped))
raw += p->match_value; raw += p->match_value + 1;
spin_unlock_irqrestore(&p->lock, flags); spin_unlock_irqrestore(&p->lock, flags);
return value + raw; return value + raw;
...@@ -478,7 +478,7 @@ static void sh_cmt_clock_event_start(struct sh_cmt_priv *p, int periodic) ...@@ -478,7 +478,7 @@ static void sh_cmt_clock_event_start(struct sh_cmt_priv *p, int periodic)
ced->min_delta_ns = clockevent_delta2ns(0x1f, ced); ced->min_delta_ns = clockevent_delta2ns(0x1f, ced);
if (periodic) if (periodic)
sh_cmt_set_next(p, (p->rate + HZ/2) / HZ); sh_cmt_set_next(p, ((p->rate + HZ/2) / HZ) - 1);
else else
sh_cmt_set_next(p, p->max_match_value); sh_cmt_set_next(p, p->max_match_value);
} }
...@@ -523,9 +523,9 @@ static int sh_cmt_clock_event_next(unsigned long delta, ...@@ -523,9 +523,9 @@ static int sh_cmt_clock_event_next(unsigned long delta,
BUG_ON(ced->mode != CLOCK_EVT_MODE_ONESHOT); BUG_ON(ced->mode != CLOCK_EVT_MODE_ONESHOT);
if (likely(p->flags & FLAG_IRQCONTEXT)) if (likely(p->flags & FLAG_IRQCONTEXT))
p->next_match_value = delta; p->next_match_value = delta - 1;
else else
sh_cmt_set_next(p, delta); sh_cmt_set_next(p, delta - 1);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment