clocksource: sh_cmt: Remove nested spinlock fix

There are control flow that sh_cmt_set_next() does double
spin-lock. The callers sh_cmt_{start,stop}() already have
lock. But another callers sh_cmt_clock_event_{start,next}()
does not.

Now sh_cmt_set_next() does not lock by itself. All the
callers should hold spin-lock before calling it.

[damm@opensource.se: use __sh_cmt_set_next() to simplify code]
[damm@opensource.se: added stable, suitable for v2.6.35 + v2.6.36]
Cc: stable@kernel.org
Signed-off-by: Takashi YOSHII <takashi.yoshii.zj@renesas.com>
Signed-off-by: Magnus Damm <damm@opensource.se>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>

authored by Takashi YOSHII and committed by Paul Mundt 65ada547 b3444d16

+12 -7
+12 -7
drivers/clocksource/sh_cmt.c
··· 283 283 } while (delay); 284 284 } 285 285 286 + static void __sh_cmt_set_next(struct sh_cmt_priv *p, unsigned long delta) 287 + { 288 + if (delta > p->max_match_value) 289 + dev_warn(&p->pdev->dev, "delta out of range\n"); 290 + 291 + p->next_match_value = delta; 292 + sh_cmt_clock_event_program_verify(p, 0); 293 + } 294 + 286 295 static void sh_cmt_set_next(struct sh_cmt_priv *p, unsigned long delta) 287 296 { 288 297 unsigned long flags; 289 298 290 - if (delta > p->max_match_value) 291 - dev_warn(&p->pdev->dev, "delta out of range\n"); 292 - 293 299 spin_lock_irqsave(&p->lock, flags); 294 - p->next_match_value = delta; 295 - sh_cmt_clock_event_program_verify(p, 0); 300 + __sh_cmt_set_next(p, delta); 296 301 spin_unlock_irqrestore(&p->lock, flags); 297 302 } 298 303 ··· 364 359 365 360 /* setup timeout if no clockevent */ 366 361 if ((flag == FLAG_CLOCKSOURCE) && (!(p->flags & FLAG_CLOCKEVENT))) 367 - sh_cmt_set_next(p, p->max_match_value); 362 + __sh_cmt_set_next(p, p->max_match_value); 368 363 out: 369 364 spin_unlock_irqrestore(&p->lock, flags); 370 365 ··· 386 381 387 382 /* adjust the timeout to maximum if only clocksource left */ 388 383 if ((flag == FLAG_CLOCKEVENT) && (p->flags & FLAG_CLOCKSOURCE)) 389 - sh_cmt_set_next(p, p->max_match_value); 384 + __sh_cmt_set_next(p, p->max_match_value); 390 385 391 386 spin_unlock_irqrestore(&p->lock, flags); 392 387 }