Merge branch 'clockevents/3.13-fixes' of git://git.linaro.org/people/daniel.lezcano/linux into timers/urgent

Pull clock driver fix from Daniel Lezcano:

" * Soren Brinkmann fixed the cadence_ttc driver where a call to
clk_get_rate happens in an interrupt context. More precisely in an IPI
when the broadcast timer is initialized for each cpu in the cpuidle
driver. "

Signed-off-by: Ingo Molnar <mingo@kernel.org>

+13 -8
+13 -8
drivers/clocksource/cadence_ttc_timer.c
··· 67 67 * struct ttc_timer - This definition defines local timer structure 68 68 * 69 69 * @base_addr: Base address of timer 70 + * @freq: Timer input clock frequency 70 71 * @clk: Associated clock source 71 72 * @clk_rate_change_nb Notifier block for clock rate changes 72 73 */ 73 74 struct ttc_timer { 74 75 void __iomem *base_addr; 76 + unsigned long freq; 75 77 struct clk *clk; 76 78 struct notifier_block clk_rate_change_nb; 77 79 }; ··· 198 196 199 197 switch (mode) { 200 198 case CLOCK_EVT_MODE_PERIODIC: 201 - ttc_set_interval(timer, 202 - DIV_ROUND_CLOSEST(clk_get_rate(ttce->ttc.clk), 203 - PRESCALE * HZ)); 199 + ttc_set_interval(timer, DIV_ROUND_CLOSEST(ttce->ttc.freq, 200 + PRESCALE * HZ)); 204 201 break; 205 202 case CLOCK_EVT_MODE_ONESHOT: 206 203 case CLOCK_EVT_MODE_UNUSED: ··· 274 273 return; 275 274 } 276 275 276 + ttccs->ttc.freq = clk_get_rate(ttccs->ttc.clk); 277 + 277 278 ttccs->ttc.clk_rate_change_nb.notifier_call = 278 279 ttc_rate_change_clocksource_cb; 279 280 ttccs->ttc.clk_rate_change_nb.next = NULL; ··· 301 298 __raw_writel(CNT_CNTRL_RESET, 302 299 ttccs->ttc.base_addr + TTC_CNT_CNTRL_OFFSET); 303 300 304 - err = clocksource_register_hz(&ttccs->cs, 305 - clk_get_rate(ttccs->ttc.clk) / PRESCALE); 301 + err = clocksource_register_hz(&ttccs->cs, ttccs->ttc.freq / PRESCALE); 306 302 if (WARN_ON(err)) { 307 303 kfree(ttccs); 308 304 return; 309 305 } 310 306 311 307 ttc_sched_clock_val_reg = base + TTC_COUNT_VAL_OFFSET; 312 - setup_sched_clock(ttc_sched_clock_read, 16, 313 - clk_get_rate(ttccs->ttc.clk) / PRESCALE); 308 + setup_sched_clock(ttc_sched_clock_read, 16, ttccs->ttc.freq / PRESCALE); 314 309 } 315 310 316 311 static int ttc_rate_change_clockevent_cb(struct notifier_block *nb, ··· 334 333 clockevents_update_freq(&ttcce->ce, 335 334 ndata->new_rate / PRESCALE); 336 335 local_irq_restore(flags); 336 + 337 + /* update cached frequency */ 338 + ttc->freq = ndata->new_rate; 337 339 338 340 /* fall through */ 339 341 } ··· 371 367 if (clk_notifier_register(ttcce->ttc.clk, 372 368 &ttcce->ttc.clk_rate_change_nb)) 373 369 pr_warn("Unable to register clock notifier.\n"); 370 + ttcce->ttc.freq = clk_get_rate(ttcce->ttc.clk); 374 371 375 372 ttcce->ttc.base_addr = base; 376 373 ttcce->ce.name = "ttc_clockevent"; ··· 401 396 } 402 397 403 398 clockevents_config_and_register(&ttcce->ce, 404 - clk_get_rate(ttcce->ttc.clk) / PRESCALE, 1, 0xfffe); 399 + ttcce->ttc.freq / PRESCALE, 1, 0xfffe); 405 400 } 406 401 407 402 /**