static int __exit omap_32k_sync_remove(struct platform_device *pdev) { struct omap_32k_sync_device *omap = platform_get_drvdata(pdev); clocksource_unregister(&omap->cs); clk_disable(omap->ick); clk_put(omap->ick); iounmap(omap->base); kfree(omap); platform_set_drvdata(pdev, NULL); return 0; }
static int sun5i_rate_cb_clksrc(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_clksrc *cs = container_of(timer, struct sun5i_timer_clksrc, timer); switch (event) { case PRE_RATE_CHANGE: clocksource_unregister(&cs->clksrc); break; case POST_RATE_CHANGE: clocksource_register_hz(&cs->clksrc, ndata->new_rate); break; default: break; } return NOTIFY_DONE; }
static int ttc_rate_change_clocksource_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_clocksource *ttccs = container_of(ttc, struct ttc_timer_clocksource, ttc); switch (event) { case POST_RATE_CHANGE: /* * Do whatever is necessary to maintain a proper time base * * I cannot find a way to adjust the currently used clocksource * to the new frequency. __clocksource_updatefreq_hz() sounds * good, but does not work. Not sure what's that missing. * * This approach works, but triggers two clocksource switches. * The first after unregister to clocksource jiffies. And * another one after the register to the newly registered timer. * * Alternatively we could 'waste' another HW timer to ping pong * between clock sources. That would also use one register and * one unregister call, but only trigger one clocksource switch * for the cost of another HW timer used by the OS. */ clocksource_unregister(&ttccs->cs); clocksource_register_hz(&ttccs->cs, ndata->new_rate / PRESCALE); /* fall through */ case PRE_RATE_CHANGE: case ABORT_RATE_CHANGE: default: return NOTIFY_DONE; } }
/** * dw_apb_clocksource_unregister() - unregister and free a clocksource. * * @dw_cs: The clocksource to unregister/free. */ void dw_apb_clocksource_unregister(struct dw_apb_clocksource *dw_cs) { clocksource_unregister(&dw_cs->cs); kfree(dw_cs); }