ARM: 7205/2: sched_clock: allow sched_clock to be selected at runtime
sched_clock() is yet another blocker on the road to the single image. This patch implements an idea by Russell King: http://www.spinics.net/lists/linux-omap/msg49561.html Instead of asking the platform to implement both sched_clock() itself and the rollover callback, simply register a read() function, and let the ARM code care about sched_clock() itself, the conversion to ns and the rollover. sched_clock() uses this read() function as an indirection to the platform code. If the platform doesn't provide a read(), the code falls back to the jiffy counter (just like the default sched_clock). This allow some simplifications and possibly some footprint gain when multiple platforms are compiled in. Among the drawbacks, the removal of the *_fixed_sched_clock optimization which could negatively impact some platforms (sa1100, tegra, versatile and omap). Tested on 11MPCore, OMAP4 and Tegra. Cc: Imre Kaloz <kaloz@openwrt.org> Cc: Eric Miao <eric.y.miao@gmail.com> Cc: Colin Cross <ccross@android.com> Cc: Erik Gilling <konkers@android.com> Cc: Olof Johansson <olof@lixom.net> Cc: Sascha Hauer <kernel@pengutronix.de> Cc: Alessandro Rubini <rubini@unipv.it> Cc: STEricsson <STEricsson_nomadik_linux@list.st.com> Cc: Lennert Buytenhek <kernel@wantstofly.org> Cc: Ben Dooks <ben-linux@fluff.org> Tested-by: Jamie Iles <jamie@jamieiles.com> Tested-by: Tony Lindgren <tony@atomide.com> Tested-by: Kyungmin Park <kyungmin.park@samsung.com> Acked-by: Linus Walleij <linus.walleij@linaro.org> Acked-by: Nicolas Pitre <nico@linaro.org> Acked-by: Krzysztof Halasa <khc@pm.waw.pl> Acked-by: Kukjin Kim <kgene.kim@samsung.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:

committed by
Russell King

parent
3bdc3484e8
commit
2f0778afac
@@ -19,7 +19,6 @@
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
@@ -106,25 +105,9 @@ static struct clock_event_device tegra_clockevent = {
|
||||
.set_mode = tegra_timer_set_mode,
|
||||
};
|
||||
|
||||
static DEFINE_CLOCK_DATA(cd);
|
||||
|
||||
/*
|
||||
* Constants generated by clocks_calc_mult_shift(m, s, 1MHz, NSEC_PER_SEC, 60).
|
||||
* This gives a resolution of about 1us and a wrap period of about 1h11min.
|
||||
*/
|
||||
#define SC_MULT 4194304000u
|
||||
#define SC_SHIFT 22
|
||||
|
||||
unsigned long long notrace sched_clock(void)
|
||||
static u32 notrace tegra_read_sched_clock(void)
|
||||
{
|
||||
u32 cyc = timer_readl(TIMERUS_CNTR_1US);
|
||||
return cyc_to_fixed_sched_clock(&cd, cyc, (u32)~0, SC_MULT, SC_SHIFT);
|
||||
}
|
||||
|
||||
static void notrace tegra_update_sched_clock(void)
|
||||
{
|
||||
u32 cyc = timer_readl(TIMERUS_CNTR_1US);
|
||||
update_sched_clock(&cd, cyc, (u32)~0);
|
||||
return timer_readl(TIMERUS_CNTR_1US);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -218,8 +201,7 @@ static void __init tegra_init_timer(void)
|
||||
WARN(1, "Unknown clock rate");
|
||||
}
|
||||
|
||||
init_fixed_sched_clock(&cd, tegra_update_sched_clock, 32,
|
||||
1000000, SC_MULT, SC_SHIFT);
|
||||
setup_sched_clock(tegra_read_sched_clock, 32, 1000000);
|
||||
|
||||
if (clocksource_mmio_init(timer_reg_base + TIMERUS_CNTR_1US,
|
||||
"timer_us", 1000000, 300, 32, clocksource_mmio_readl_up)) {
|
||||
|
Reference in New Issue
Block a user