[PATCH 08/13] clocksource: convert ARM 32-bit down counting clocksources
Nicolas Pitre
nico at fluxnic.net
Tue May 10 08:39:58 EDT 2011
On Tue, 10 May 2011, Russell King - ARM Linux wrote:
> Convert MXC, Nomadik and Orion 32-bit down-counting clocksources to
> generic mmio clocksource infrastructure.
>
> Cc: Sascha Hauer <kernel at pengutronix.de>
> Cc: Alessandro Rubini <rubini at unipv.it>
> Cc: Linus Walleij <linus.walleij at stericsson.com>
> Cc: Lennert Buytenhek <kernel at wantstofly.org>
> Cc: Nicolas Pitre <nico at fluxnic.net>
> Signed-off-by: Russell King <rmk+kernel at arm.linux.org.uk>
Acked-by: Nicolas Pitre <nico at fluxnic.net>
> ---
> arch/arm/Kconfig | 2 ++
> arch/arm/common/timer-sp.c | 22 ++--------------------
> arch/arm/plat-mxc/epit.c | 18 ++----------------
> arch/arm/plat-nomadik/Kconfig | 1 +
> arch/arm/plat-nomadik/timer.c | 31 +++----------------------------
> arch/arm/plat-orion/time.c | 21 ++-------------------
> 6 files changed, 12 insertions(+), 83 deletions(-)
>
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index 9aa5514..0a05a57 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -1042,6 +1042,7 @@ config PLAT_IOP
>
> config PLAT_ORION
> bool
> + select CLKSRC_MMIO
> select HAVE_SCHED_CLOCK
>
> config PLAT_PXA
> @@ -1052,6 +1053,7 @@ config PLAT_VERSATILE
>
> config ARM_TIMER_SP804
> bool
> + select CLKSRC_MMIO
>
> source arch/arm/mm/Kconfig
>
> diff --git a/arch/arm/common/timer-sp.c b/arch/arm/common/timer-sp.c
> index 6ef3342..27f7c22 100644
> --- a/arch/arm/common/timer-sp.c
> +++ b/arch/arm/common/timer-sp.c
> @@ -32,27 +32,8 @@
> #define TIMER_FREQ_KHZ (1000)
> #define TIMER_RELOAD (TIMER_FREQ_KHZ * 1000 / HZ)
>
> -static void __iomem *clksrc_base;
> -
> -static cycle_t sp804_read(struct clocksource *cs)
> -{
> - return ~readl(clksrc_base + TIMER_VALUE);
> -}
> -
> -static struct clocksource clocksource_sp804 = {
> - .name = "timer3",
> - .rating = 200,
> - .read = sp804_read,
> - .mask = CLOCKSOURCE_MASK(32),
> - .flags = CLOCK_SOURCE_IS_CONTINUOUS,
> -};
> -
> void __init sp804_clocksource_init(void __iomem *base)
> {
> - struct clocksource *cs = &clocksource_sp804;
> -
> - clksrc_base = base;
> -
> /* setup timer 0 as free-running clocksource */
> writel(0, clksrc_base + TIMER_CTRL);
> writel(0xffffffff, clksrc_base + TIMER_LOAD);
> @@ -60,7 +41,8 @@ void __init sp804_clocksource_init(void __iomem *base)
> writel(TIMER_CTRL_32BIT | TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC,
> clksrc_base + TIMER_CTRL);
>
> - clocksource_register_khz(cs, TIMER_FREQ_KHZ);
> + clocksource_mmio_init(base + TIMER_VALUE, "timer3",
> + TIMER_FREQ_KHZ * 1000, 200, 32, clocksource_mmio_readl_down);
> }
>
>
> diff --git a/arch/arm/plat-mxc/epit.c b/arch/arm/plat-mxc/epit.c
> index d69d343..d3467f8 100644
> --- a/arch/arm/plat-mxc/epit.c
> +++ b/arch/arm/plat-mxc/epit.c
> @@ -83,26 +83,12 @@ static void epit_irq_acknowledge(void)
> __raw_writel(EPITSR_OCIF, timer_base + EPITSR);
> }
>
> -static cycle_t epit_read(struct clocksource *cs)
> -{
> - return 0 - __raw_readl(timer_base + EPITCNR);
> -}
> -
> -static struct clocksource clocksource_epit = {
> - .name = "epit",
> - .rating = 200,
> - .read = epit_read,
> - .mask = CLOCKSOURCE_MASK(32),
> - .flags = CLOCK_SOURCE_IS_CONTINUOUS,
> -};
> -
> static int __init epit_clocksource_init(struct clk *timer_clk)
> {
> unsigned int c = clk_get_rate(timer_clk);
>
> - clocksource_register_hz(&clocksource_epit, c);
> -
> - return 0;
> + return clocksource_mmio_init(timer_base + EPITCNR, "epit", c, 200, 32,
> + clocksource_mmio_readl_down);
> }
>
> /* clock event */
> diff --git a/arch/arm/plat-nomadik/Kconfig b/arch/arm/plat-nomadik/Kconfig
> index 187f4e8..18296ee 100644
> --- a/arch/arm/plat-nomadik/Kconfig
> +++ b/arch/arm/plat-nomadik/Kconfig
> @@ -5,6 +5,7 @@
> config PLAT_NOMADIK
> bool
> depends on ARCH_NOMADIK || ARCH_U8500
> + select CLKSRC_MMIO
> default y
> help
> Common platform code for Nomadik and other ST-Ericsson
> diff --git a/arch/arm/plat-nomadik/timer.c b/arch/arm/plat-nomadik/timer.c
> index 4172340..6ec1dea 100644
> --- a/arch/arm/plat-nomadik/timer.c
> +++ b/arch/arm/plat-nomadik/timer.c
> @@ -26,29 +26,6 @@
> void __iomem *mtu_base; /* Assigned by machine code */
>
> /*
> - * Kernel assumes that sched_clock can be called early
> - * but the MTU may not yet be initialized.
> - */
> -static cycle_t nmdk_read_timer_dummy(struct clocksource *cs)
> -{
> - return 0;
> -}
> -
> -/* clocksource: MTU decrements, so we negate the value being read. */
> -static cycle_t nmdk_read_timer(struct clocksource *cs)
> -{
> - return -readl(mtu_base + MTU_VAL(0));
> -}
> -
> -static struct clocksource nmdk_clksrc = {
> - .name = "mtu_0",
> - .rating = 200,
> - .read = nmdk_read_timer_dummy,
> - .mask = CLOCKSOURCE_MASK(32),
> - .flags = CLOCK_SOURCE_IS_CONTINUOUS,
> -};
> -
> -/*
> * Override the global weak sched_clock symbol with this
> * local implementation which uses the clocksource to get some
> * better resolution when scheduling the kernel.
> @@ -172,12 +149,10 @@ void __init nmdk_timer_init(void)
> writel(0, mtu_base + MTU_BGLR(0));
> writel(cr | MTU_CRn_ENA, mtu_base + MTU_CR(0));
>
> - /* Now the clock source is ready */
> - nmdk_clksrc.read = nmdk_read_timer;
> -
> - if (clocksource_register_hz(&nmdk_clksrc, rate))
> + if (clocksource_mmio_init(mti_base + MTU_VAL(0), "mtu_0",
> + rate, 200, 32, clocksource_mmio_readl_down))
> pr_err("timer: failed to initialize clock source %s\n",
> - nmdk_clksrc.name);
> + "mtu_0");
>
> init_sched_clock(&cd, nomadik_update_sched_clock, 32, rate);
>
> diff --git a/arch/arm/plat-orion/time.c b/arch/arm/plat-orion/time.c
> index 742b032..69a6136 100644
> --- a/arch/arm/plat-orion/time.c
> +++ b/arch/arm/plat-orion/time.c
> @@ -81,24 +81,6 @@ static void __init setup_sched_clock(unsigned long tclk)
> }
>
> /*
> - * Clocksource handling.
> - */
> -static cycle_t orion_clksrc_read(struct clocksource *cs)
> -{
> - return 0xffffffff - readl(timer_base + TIMER0_VAL_OFF);
> -}
> -
> -static struct clocksource orion_clksrc = {
> - .name = "orion_clocksource",
> - .rating = 300,
> - .read = orion_clksrc_read,
> - .mask = CLOCKSOURCE_MASK(32),
> - .flags = CLOCK_SOURCE_IS_CONTINUOUS,
> -};
> -
> -
> -
> -/*
> * Clockevent handling.
> */
> static int
> @@ -247,7 +229,8 @@ orion_time_init(u32 _bridge_base, u32 _bridge_timer1_clr_mask,
> writel(u & ~BRIDGE_INT_TIMER0, bridge_base + BRIDGE_MASK_OFF);
> u = readl(timer_base + TIMER_CTRL_OFF);
> writel(u | TIMER0_EN | TIMER0_RELOAD_EN, timer_base + TIMER_CTRL_OFF);
> - clocksource_register_hz(&orion_clksrc, tclk);
> + clocksource_mmio_init(timer_base + TIMER0_VAL_OFF, "orion_clocksource",
> + tclk, 300, 32, clocksource_mmio_readl_down);
>
> /*
> * Setup clockevent timer (interrupt-driven).
> --
> 1.7.4.4
>
More information about the linux-arm-kernel
mailing list