On 05/21/2015 07:32 PM, Andrew Bresticker wrote: > On Thu, May 21, 2015 at 2:37 PM, Ezequiel Garcia > <ezequiel.garcia@xxxxxxxxxx> wrote: >> This commit introduces the clockevent frequency update, using >> a clock notifier. It will be used to support CPUFreq on platforms >> using MIPS GIC based clockevents. >> >> Signed-off-by: Ezequiel Garcia <ezequiel.garcia@xxxxxxxxxx> >> --- >> drivers/clocksource/mips-gic-timer.c | 31 ++++++++++++++++++++++++++++++- >> 1 file changed, 30 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/clocksource/mips-gic-timer.c b/drivers/clocksource/mips-gic-timer.c >> index 22a4daf..71bbd42 100644 >> --- a/drivers/clocksource/mips-gic-timer.c >> +++ b/drivers/clocksource/mips-gic-timer.c >> @@ -79,6 +79,13 @@ static void gic_clockevent_cpu_exit(struct clock_event_device *cd) >> disable_percpu_irq(gic_timer_irq); >> } >> >> +static void gic_update_frequency(void *data) >> +{ >> + unsigned long rate = (unsigned long)data; >> + >> + clockevents_update_freq(this_cpu_ptr(&gic_clockevent_device), rate); >> +} >> + >> static int gic_cpu_notifier(struct notifier_block *nb, unsigned long action, >> void *data) >> { >> @@ -94,10 +101,26 @@ static int gic_cpu_notifier(struct notifier_block *nb, unsigned long action, >> return NOTIFY_OK; >> } >> >> +static int gic_clk_notifier(struct notifier_block *nb, unsigned long action, >> + void *data) >> +{ >> + struct clk_notifier_data *cnd = data; >> + >> + if (action == POST_RATE_CHANGE) >> + on_each_cpu(gic_update_frequency, (void *)cnd->new_rate, 1); >> + >> + return NOTIFY_OK; >> +} >> + >> + >> static struct notifier_block gic_cpu_nb = { >> .notifier_call = gic_cpu_notifier, >> }; >> >> +static struct notifier_block gic_clk_nb = { >> + .notifier_call = gic_clk_notifier, >> +}; >> + >> static int gic_clockevent_init(void) >> { >> int ret; >> @@ -160,6 +183,7 @@ void __init gic_clocksource_init(unsigned int frequency) >> static void __init gic_clocksource_of_init(struct device_node *node) >> { >> struct clk *clk; >> + int ret; >> >> if (WARN_ON(!gic_present || !node->parent || >> !of_device_is_compatible(node->parent, "mti,gic"))) >> @@ -186,7 +210,12 @@ static void __init gic_clocksource_of_init(struct device_node *node) >> } >> >> __gic_clocksource_init(); >> - gic_clockevent_init(); >> + >> + ret = gic_clockevent_init(); >> + if (ret < 0 && !IS_ERR(clk)) { > > I think you mean ret == 0 here? > >> + if (clk_notifier_register(clk, &gic_clk_nb) < 0) >> + pr_warn("GIC: Unable to register clock notifier\n"); >> + } Ouch, certainly. -- Ezequiel