[PATCH 2/2] ARM: move IOP to use common mult/shift calculation code
Mikael Pettersson
mikpe at it.uu.se
Tue Jun 1 07:23:39 EDT 2010
Linus Walleij writes:
> Since the infrastructure for determining shift/mult values from a
> clock rate and a minimum programmable rate is now in the kernel,
> lets remove this custom code.
>
> Cc: Mikael Pettersson <mikpe at it.uu.se>
> Cc: Deepak Saxena <dsaxena at plexity.net>
> Signed-off-by: Linus Walleij <linus.walleij at stericsson.com>
> ---
> Mikael: I cannot test this change, but I have compiled it against
> iop33x_defconfig. You'd have to test it and Acked-by: it before
> I do anything else with it. Try to think about what a minimum range
> would be for the generic IOP platform...
> ---
> arch/arm/plat-iop/time.c | 53 +++++++--------------------------------------
> 1 files changed, 9 insertions(+), 44 deletions(-)
This patch is equivalent to the one I sent on Dec 29
"[PATCH] iop: use generic clock mult/shift compute functions",
which RMK acked and Dan Williams then wrote he would handle via
xscaleiop.git. Then it ended up in a black hole somewhere. I was
going to re-send it if it wasn't in .35-rc1, but you beat me to it.
I've been using this since mid-December, so:
Acked-by: Mikael Pettersson <mikpe at it.uu.se>
The value of IOP_MIN_RANGE is a compromise between possibly longer
idle periods and timekeeping accuracy. The current value of 4s is
known to work and give the same mult/shift values as before the
clocksource/clockevents conversion. As I can't get even close to 4s
idle intervals, I see little point changing this value right now.
(Plus it seems kernel/time/clocksource.c wants a 5s upper bound on
this anyway.)
/Mikael
>
> diff --git a/arch/arm/plat-iop/time.c b/arch/arm/plat-iop/time.c
> index 6c8a02a..85d3e55 100644
> --- a/arch/arm/plat-iop/time.c
> +++ b/arch/arm/plat-iop/time.c
> @@ -29,6 +29,11 @@
> #include <mach/time.h>
>
> /*
> + * Minimum clocksource/clockevent timer range in seconds
> + */
> +#define IOP_MIN_RANGE 4
> +
> +/*
> * IOP clocksource (free-running timer 1).
> */
> static cycle_t iop_clocksource_read(struct clocksource *unused)
> @@ -44,27 +49,6 @@ static struct clocksource iop_clocksource = {
> .flags = CLOCK_SOURCE_IS_CONTINUOUS,
> };
>
> -static void __init iop_clocksource_set_hz(struct clocksource *cs, unsigned int hz)
> -{
> - u64 temp;
> - u32 shift;
> -
> - /* Find shift and mult values for hz. */
> - shift = 32;
> - do {
> - temp = (u64) NSEC_PER_SEC << shift;
> - do_div(temp, hz);
> - if ((temp >> 32) == 0)
> - break;
> - } while (--shift != 0);
> -
> - cs->shift = shift;
> - cs->mult = (u32) temp;
> -
> - printk(KERN_INFO "clocksource: %s uses shift %u mult %#x\n",
> - cs->name, cs->shift, cs->mult);
> -}
> -
> /*
> * IOP sched_clock() implementation via its clocksource.
> */
> @@ -130,27 +114,6 @@ static struct clock_event_device iop_clockevent = {
> .set_mode = iop_set_mode,
> };
>
> -static void __init iop_clockevent_set_hz(struct clock_event_device *ce, unsigned int hz)
> -{
> - u64 temp;
> - u32 shift;
> -
> - /* Find shift and mult values for hz. */
> - shift = 32;
> - do {
> - temp = (u64) hz << shift;
> - do_div(temp, NSEC_PER_SEC);
> - if ((temp >> 32) == 0)
> - break;
> - } while (--shift != 0);
> -
> - ce->shift = shift;
> - ce->mult = (u32) temp;
> -
> - printk(KERN_INFO "clockevent: %s uses shift %u mult %#lx\n",
> - ce->name, ce->shift, ce->mult);
> -}
> -
> static irqreturn_t
> iop_timer_interrupt(int irq, void *dev_id)
> {
> @@ -190,7 +153,8 @@ void __init iop_init_time(unsigned long tick_rate)
> */
> write_tmr0(timer_ctl & ~IOP_TMR_EN);
> setup_irq(IRQ_IOP_TIMER0, &iop_timer_irq);
> - iop_clockevent_set_hz(&iop_clockevent, tick_rate);
> + clockevents_calc_mult_shift(&iop_clockevent,
> + tick_rate, IOP_MIN_RANGE);
> iop_clockevent.max_delta_ns =
> clockevent_delta2ns(0xfffffffe, &iop_clockevent);
> iop_clockevent.min_delta_ns =
> @@ -207,6 +171,7 @@ void __init iop_init_time(unsigned long tick_rate)
> write_trr1(0xffffffff);
> write_tcr1(0xffffffff);
> write_tmr1(timer_ctl);
> - iop_clocksource_set_hz(&iop_clocksource, tick_rate);
> + clocksource_calc_mult_shift(&iop_clocksource, tick_rate,
> + IOP_MIN_RANGE);
> clocksource_register(&iop_clocksource);
> }
> --
> 1.6.3.3
>
More information about the linux-arm-kernel
mailing list