|
@@ -625,6 +625,54 @@ static void clocksource_enqueue(struct clocksource *cs)
|
|
|
list_add(&cs->list, entry);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+/*
|
|
|
+ * Maximum time we expect to go between ticks. This includes idle
|
|
|
+ * tickless time. It provides the trade off between selecting a
|
|
|
+ * mult/shift pair that is very precise but can only handle a short
|
|
|
+ * period of time, vs. a mult/shift pair that can handle long periods
|
|
|
+ * of time but isn't as precise.
|
|
|
+ *
|
|
|
+ * This is a subsystem constant, and actual hardware limitations
|
|
|
+ * may override it (ie: clocksources that wrap every 3 seconds).
|
|
|
+ */
|
|
|
+#define MAX_UPDATE_LENGTH 5 /* Seconds */
|
|
|
+
|
|
|
+/**
|
|
|
+ * __clocksource_register_scale - Used to install new clocksources
|
|
|
+ * @t: clocksource to be registered
|
|
|
+ * @scale: Scale factor multiplied against freq to get clocksource hz
|
|
|
+ * @freq: clocksource frequency (cycles per second) divided by scale
|
|
|
+ *
|
|
|
+ * Returns -EBUSY if registration fails, zero otherwise.
|
|
|
+ *
|
|
|
+ * This *SHOULD NOT* be called directly! Please use the
|
|
|
+ * clocksource_register_hz() or clocksource_register_khz helper functions.
|
|
|
+ */
|
|
|
+int __clocksource_register_scale(struct clocksource *cs, u32 scale, u32 freq)
|
|
|
+{
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Ideally we want to use some of the limits used in
|
|
|
+ * clocksource_max_deferment, to provide a more informed
|
|
|
+ * MAX_UPDATE_LENGTH. But for now this just gets the
|
|
|
+ * register interface working properly.
|
|
|
+ */
|
|
|
+ clocks_calc_mult_shift(&cs->mult, &cs->shift, freq,
|
|
|
+ NSEC_PER_SEC/scale,
|
|
|
+ MAX_UPDATE_LENGTH*scale);
|
|
|
+ cs->max_idle_ns = clocksource_max_deferment(cs);
|
|
|
+
|
|
|
+ mutex_lock(&clocksource_mutex);
|
|
|
+ clocksource_enqueue(cs);
|
|
|
+ clocksource_select();
|
|
|
+ clocksource_enqueue_watchdog(cs);
|
|
|
+ mutex_unlock(&clocksource_mutex);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(__clocksource_register_scale);
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* clocksource_register - Used to install new clocksources
|
|
|
* @t: clocksource to be registered
|