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"); > + }