static int ttc_rate_change_clockevent_cb(struct notifier_block *nb, unsigned long event, void *data) { struct clk_notifier_data *ndata = data; struct ttc_timer *ttc = to_ttc_timer(nb); struct ttc_timer_clockevent *ttcce = container_of(ttc, struct ttc_timer_clockevent, ttc); switch (event) { case POST_RATE_CHANGE: { unsigned long flags; /* * clockevents_update_freq should be called with IRQ disabled on * the CPU the timer provides events for. The timer we use is * common to both CPUs, not sure if we need to run on both * cores. */ local_irq_save(flags); clockevents_update_freq(&ttcce->ce, ndata->new_rate / PRESCALE); local_irq_restore(flags); /* fall through */ } case PRE_RATE_CHANGE: case ABORT_RATE_CHANGE: default: return NOTIFY_DONE; } }
static int sun5i_rate_cb_clkevt(struct notifier_block *nb, unsigned long event, void *data) { struct clk_notifier_data *ndata = data; struct sun5i_timer *timer = to_sun5i_timer(nb); struct sun5i_timer_clkevt *ce = container_of(timer, struct sun5i_timer_clkevt, timer); if (event == POST_RATE_CHANGE) { clockevents_update_freq(&ce->clkevt, ndata->new_rate); ce->timer.ticks_per_jiffy = DIV_ROUND_UP(ndata->new_rate, HZ); } return NOTIFY_DONE; }
static void gt_clockevent_update_freq(void *info) { unsigned long *clk_rate = info; clockevents_update_freq(this_cpu_ptr(gt_evt), *clk_rate); }
/* * Updates clockevent frequency when the cpu frequency changes. * Called on the cpu that is changing frequency with interrupts disabled. */ static void twd_update_frequency(void *data) { twd_timer_rate = clk_get_rate(twd_clk); clockevents_update_freq(*__this_cpu_ptr(twd_evt), twd_timer_rate); }
/* * Updates clockevent frequency when the cpu frequency changes. * Called on the cpu that is changing frequency with interrupts disabled. */ static void twd_update_frequency(void *data) { twd_timer_rate = clk_get_rate(twd_clk); clockevents_update_freq(__get_cpu_var(twd_ce), twd_timer_rate); }
/* * Updates clockevent frequency when the cpu frequency changes. * Called on the cpu that is changing frequency with interrupts disabled. */ static void twd_update_frequency(void *new_rate) { twd_timer_rate = *((unsigned long *) new_rate); clockevents_update_freq(*__this_cpu_ptr(twd_evt), twd_timer_rate); }
static void gic_update_frequency(void *data) { unsigned long rate = (unsigned long)data; clockevents_update_freq(this_cpu_ptr(&gic_clockevent_device), rate); }