Merge branch 'timers-for-linus-cleanups' of git://git.kernel.org/pub/scm/linux/kernel...
Linus Torvalds [Thu, 20 May 2010 00:10:06 +0000 (17:10 -0700)]
* 'timers-for-linus-cleanups' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  avr32: Fix typo in read_persistent_clock()
  sparc: Convert sparc to use read/update_persistent_clock
  cris: Convert cris to use read/update_persistent_clock
  m68k: Convert m68k to use read/update_persistent_clock
  m32r: Convert m32r to use read/update_peristent_clock
  blackfin: Convert blackfin to use read/update_persistent_clock
  ia64: Convert ia64 to use read/update_persistent_clock
  avr32: Convert avr32 to use read/update_persistent_clock
  h8300: Convert h8300 to use read/update_persistent_clock
  frv: Convert frv to use read/update_persistent_clock
  mn10300: Convert mn10300 to use read/update_persistent_clock
  alpha: Convert alpha to use read/update_persistent_clock
  xtensa: Fix unnecessary setting of xtime
  time: Clean up direct xtime usage in xen

1  2 
arch/alpha/Kconfig
arch/blackfin/kernel/time-ts.c
arch/sparc/Kconfig
arch/x86/xen/time.c

diff --combined arch/alpha/Kconfig
@@@ -10,7 -10,6 +10,7 @@@ config ALPH
        select HAVE_OPROFILE
        select HAVE_SYSCALL_WRAPPERS
        select HAVE_PERF_EVENTS
 +      select HAVE_DMA_ATTRS
        help
          The Alpha is a 64-bit general-purpose processor designed and
          marketed by the Digital Equipment Corporation of blessed memory,
@@@ -55,13 -54,13 +55,16 @@@ config ARCH_USES_GETTIMEOFFSE
        bool
        default y
  
+ config GENERIC_CMOS_UPDATE
+         def_bool y
  config ZONE_DMA
        bool
        default y
  
 +config NEED_DMA_MAP_STATE
 +       def_bool y
 +
  config GENERIC_ISA_DMA
        bool
        default y
@@@ -21,7 -21,6 +21,7 @@@
  #include <asm/blackfin.h>
  #include <asm/time.h>
  #include <asm/gptimers.h>
 +#include <asm/nmi.h>
  
  /* Accelerators for sched_clock()
   * convert from cycles(64bits) => nanoseconds (64bits)
  
  static notrace cycle_t bfin_read_cycles(struct clocksource *cs)
  {
 +#ifdef CONFIG_CPU_FREQ
        return __bfin_cycles_off + (get_cycles() << __bfin_cycles_mod);
 +#else
 +      return get_cycles();
 +#endif
  }
  
  static struct clocksource bfin_cs_cycles = {
@@@ -137,6 -132,7 +137,6 @@@ static int __init bfin_cs_gptimer0_init
  # define bfin_cs_gptimer0_init()
  #endif
  
 -
  #if defined(CONFIG_GPTMR0_CLOCKSOURCE) || defined(CONFIG_CYCLES_CLOCKSOURCE)
  /* prefer to use cycles since it has higher rating */
  notrace unsigned long long sched_clock(void)
  }
  #endif
  
 -#ifdef CONFIG_CORE_TIMER_IRQ_L1
 -__attribute__((l1_text))
 -#endif
 -irqreturn_t timer_interrupt(int irq, void *dev_id);
 -
 -static int bfin_timer_set_next_event(unsigned long, \
 -              struct clock_event_device *);
 -
 -static void bfin_timer_set_mode(enum clock_event_mode, \
 -              struct clock_event_device *);
 -
 -static struct clock_event_device clockevent_bfin = {
 -#if defined(CONFIG_TICKSOURCE_GPTMR0)
 -      .name           = "bfin_gptimer0",
 -      .rating         = 300,
 -      .irq            = IRQ_TIMER0,
 -#else
 -      .name           = "bfin_core_timer",
 -      .rating         = 350,
 -      .irq            = IRQ_CORETMR,
 -#endif
 -      .shift          = 32,
 -      .features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
 -      .set_next_event = bfin_timer_set_next_event,
 -      .set_mode       = bfin_timer_set_mode,
 -};
 -
 -static struct irqaction bfin_timer_irq = {
 -#if defined(CONFIG_TICKSOURCE_GPTMR0)
 -      .name           = "Blackfin GPTimer0",
 -#else
 -      .name           = "Blackfin CoreTimer",
 -#endif
 -      .flags          = IRQF_DISABLED | IRQF_TIMER | \
 -                        IRQF_IRQPOLL | IRQF_PERCPU,
 -      .handler        = timer_interrupt,
 -      .dev_id         = &clockevent_bfin,
 -};
 -
  #if defined(CONFIG_TICKSOURCE_GPTMR0)
 -static int bfin_timer_set_next_event(unsigned long cycles,
 +static int bfin_gptmr0_set_next_event(unsigned long cycles,
                                       struct clock_event_device *evt)
  {
        disable_gptimers(TIMER0bit);
        return 0;
  }
  
 -static void bfin_timer_set_mode(enum clock_event_mode mode,
 +static void bfin_gptmr0_set_mode(enum clock_event_mode mode,
                                struct clock_event_device *evt)
  {
        switch (mode) {
        }
  }
  
 -static void bfin_timer_ack(void)
 +static void bfin_gptmr0_ack(void)
  {
        set_gptimer_status(TIMER_GROUP1, TIMER_STATUS_TIMIL0);
  }
  
 -static void __init bfin_timer_init(void)
 +static void __init bfin_gptmr0_init(void)
  {
        disable_gptimers(TIMER0bit);
  }
  
 -static unsigned long  __init bfin_clockevent_check(void)
 +#ifdef CONFIG_CORE_TIMER_IRQ_L1
 +__attribute__((l1_text))
 +#endif
 +irqreturn_t bfin_gptmr0_interrupt(int irq, void *dev_id)
  {
 -      setup_irq(IRQ_TIMER0, &bfin_timer_irq);
 -      return get_sclk();
 +      struct clock_event_device *evt = dev_id;
 +      smp_mb();
 +      evt->event_handler(evt);
 +      bfin_gptmr0_ack();
 +      return IRQ_HANDLED;
  }
  
 -#else /* CONFIG_TICKSOURCE_CORETMR */
 +static struct irqaction gptmr0_irq = {
 +      .name           = "Blackfin GPTimer0",
 +      .flags          = IRQF_DISABLED | IRQF_TIMER | \
 +                        IRQF_IRQPOLL | IRQF_PERCPU,
 +      .handler        = bfin_gptmr0_interrupt,
 +};
  
 -static int bfin_timer_set_next_event(unsigned long cycles,
 +static struct clock_event_device clockevent_gptmr0 = {
 +      .name           = "bfin_gptimer0",
 +      .rating         = 300,
 +      .irq            = IRQ_TIMER0,
 +      .shift          = 32,
 +      .features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
 +      .set_next_event = bfin_gptmr0_set_next_event,
 +      .set_mode       = bfin_gptmr0_set_mode,
 +};
 +
 +static void __init bfin_gptmr0_clockevent_init(struct clock_event_device *evt)
 +{
 +      unsigned long clock_tick;
 +
 +      clock_tick = get_sclk();
 +      evt->mult = div_sc(clock_tick, NSEC_PER_SEC, evt->shift);
 +      evt->max_delta_ns = clockevent_delta2ns(-1, evt);
 +      evt->min_delta_ns = clockevent_delta2ns(100, evt);
 +
 +      evt->cpumask = cpumask_of(0);
 +
 +      clockevents_register_device(evt);
 +}
 +#endif /* CONFIG_TICKSOURCE_GPTMR0 */
 +
 +#if defined(CONFIG_TICKSOURCE_CORETMR)
 +/* per-cpu local core timer */
 +static DEFINE_PER_CPU(struct clock_event_device, coretmr_events);
 +
 +static int bfin_coretmr_set_next_event(unsigned long cycles,
                                struct clock_event_device *evt)
  {
        bfin_write_TCNTL(TMPWR);
        return 0;
  }
  
 -static void bfin_timer_set_mode(enum clock_event_mode mode,
 +static void bfin_coretmr_set_mode(enum clock_event_mode mode,
                                struct clock_event_device *evt)
  {
        switch (mode) {
        }
  }
  
 -static void bfin_timer_ack(void)
 -{
 -}
 -
 -static void __init bfin_timer_init(void)
 +void bfin_coretmr_init(void)
  {
        /* power up the timer, but don't enable it just yet */
        bfin_write_TCNTL(TMPWR);
        CSYNC();
  
 -      /*
 -       * the TSCALE prescaler counter.
 -       */
 +      /* the TSCALE prescaler counter. */
        bfin_write_TSCALE(TIME_SCALE - 1);
        bfin_write_TPERIOD(0);
        bfin_write_TCOUNT(0);
        CSYNC();
  }
  
 -static unsigned long  __init bfin_clockevent_check(void)
 -{
 -      setup_irq(IRQ_CORETMR, &bfin_timer_irq);
 -      return get_cclk() / TIME_SCALE;
 -}
 -
 -void __init setup_core_timer(void)
 +#ifdef CONFIG_CORE_TIMER_IRQ_L1
 +__attribute__((l1_text))
 +#endif
 +irqreturn_t bfin_coretmr_interrupt(int irq, void *dev_id)
  {
 -      bfin_timer_init();
 -      bfin_timer_set_mode(CLOCK_EVT_MODE_PERIODIC, NULL);
 -}
 -#endif /* CONFIG_TICKSOURCE_GPTMR0 */
 +      int cpu = smp_processor_id();
 +      struct clock_event_device *evt = &per_cpu(coretmr_events, cpu);
  
 -/*
 - * timer_interrupt() needs to keep up the real-time clock,
 - * as well as call the "do_timer()" routine every clocktick
 - */
 -irqreturn_t timer_interrupt(int irq, void *dev_id)
 -{
 -      struct clock_event_device *evt = dev_id;
        smp_mb();
        evt->event_handler(evt);
 -      bfin_timer_ack();
 -      return IRQ_HANDLED;
 -}
 -
 -static int __init bfin_clockevent_init(void)
 -{
 -      unsigned long timer_clk;
  
 -      timer_clk = bfin_clockevent_check();
 +      touch_nmi_watchdog();
  
 -      bfin_timer_init();
 +      return IRQ_HANDLED;
 +}
  
 -      clockevent_bfin.mult = div_sc(timer_clk, NSEC_PER_SEC, clockevent_bfin.shift);
 -      clockevent_bfin.max_delta_ns = clockevent_delta2ns(-1, &clockevent_bfin);
 -      clockevent_bfin.min_delta_ns = clockevent_delta2ns(100, &clockevent_bfin);
 -      clockevent_bfin.cpumask = cpumask_of(0);
 -      clockevents_register_device(&clockevent_bfin);
 +static struct irqaction coretmr_irq = {
 +      .name           = "Blackfin CoreTimer",
 +      .flags          = IRQF_DISABLED | IRQF_TIMER | \
 +                        IRQF_IRQPOLL | IRQF_PERCPU,
 +      .handler        = bfin_coretmr_interrupt,
 +};
  
 -      return 0;
 +void bfin_coretmr_clockevent_init(void)
 +{
 +      unsigned long clock_tick;
 +      unsigned int cpu = smp_processor_id();
 +      struct clock_event_device *evt = &per_cpu(coretmr_events, cpu);
 +
 +      evt->name = "bfin_core_timer";
 +      evt->rating = 350;
 +      evt->irq = -1;
 +      evt->shift = 32;
 +      evt->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
 +      evt->set_next_event = bfin_coretmr_set_next_event;
 +      evt->set_mode = bfin_coretmr_set_mode;
 +
 +      clock_tick = get_cclk() / TIME_SCALE;
 +      evt->mult = div_sc(clock_tick, NSEC_PER_SEC, evt->shift);
 +      evt->max_delta_ns = clockevent_delta2ns(-1, evt);
 +      evt->min_delta_ns = clockevent_delta2ns(100, evt);
 +
 +      evt->cpumask = cpumask_of(cpu);
 +
 +      clockevents_register_device(evt);
  }
 +#endif /* CONFIG_TICKSOURCE_CORETMR */
 +
  
- void __init time_init(void)
+ void read_persistent_clock(struct timespec *ts)
  {
        time_t secs_since_1970 = (365 * 37 + 9) * 24 * 60 * 60; /* 1 Jan 2007 */
+       ts->tv_sec = secs_since_1970;
+       ts->tv_nsec = 0;
+ }
+ void __init time_init(void)
+ {
  
  #ifdef CONFIG_RTC_DRV_BFIN
        /* [#2663] hack to filter junk RTC values that would cause
        }
  #endif
  
-       /* Initialize xtime. From now on, xtime is updated with timer interrupts */
-       xtime.tv_sec = secs_since_1970;
-       xtime.tv_nsec = 0;
-       set_normalized_timespec(&wall_to_monotonic, -xtime.tv_sec, -xtime.tv_nsec);
        bfin_cs_cycles_init();
        bfin_cs_gptimer0_init();
 -      bfin_clockevent_init();
 +
 +#if defined(CONFIG_TICKSOURCE_CORETMR)
 +      bfin_coretmr_init();
 +      setup_irq(IRQ_CORETMR, &coretmr_irq);
 +      bfin_coretmr_clockevent_init();
 +#endif
 +
 +#if defined(CONFIG_TICKSOURCE_GPTMR0)
 +      bfin_gptmr0_init();
 +      setup_irq(IRQ_TIMER0, &gptmr0_irq);
 +      gptmr0_irq.dev_id = &clockevent_gptmr0;
 +      bfin_gptmr0_clockevent_init(&clockevent_gptmr0);
 +#endif
 +
 +#if !defined(CONFIG_TICKSOURCE_CORETMR) && !defined(CONFIG_TICKSOURCE_GPTMR0)
 +# error at least one clock event device is required
 +#endif
  }
diff --combined arch/sparc/Kconfig
@@@ -37,9 -37,6 +37,9 @@@ config SPARC6
        def_bool 64BIT
        select ARCH_SUPPORTS_MSI
        select HAVE_FUNCTION_TRACER
 +      select HAVE_FUNCTION_GRAPH_TRACER
 +      select HAVE_FUNCTION_GRAPH_FP_TEST
 +      select HAVE_FUNCTION_TRACE_MCOUNT_TEST
        select HAVE_KRETPROBES
        select HAVE_KPROBES
        select HAVE_LMB
@@@ -75,7 -72,7 +75,7 @@@ config ARCH_USES_GETTIMEOFFSE
  
  config GENERIC_CMOS_UPDATE
        bool
-       default y if SPARC64
+       default y
  
  config GENERIC_CLOCKEVENTS
        bool
@@@ -130,9 -127,6 +130,9 @@@ config ZONE_DM
        bool
        default y if SPARC32
  
 +config NEED_DMA_MAP_STATE
 +      def_bool y
 +
  config GENERIC_ISA_DMA
        bool
        default y if SPARC32
diff --combined arch/x86/xen/time.c
@@@ -13,7 -13,6 +13,7 @@@
  #include <linux/clockchips.h>
  #include <linux/kernel_stat.h>
  #include <linux/math64.h>
 +#include <linux/gfp.h>
  
  #include <asm/pvclock.h>
  #include <asm/xen/hypervisor.h>
@@@ -476,6 -475,7 +476,7 @@@ void xen_timer_resume(void
  __init void xen_time_init(void)
  {
        int cpu = smp_processor_id();
+       struct timespec tp;
  
        clocksource_register(&xen_clocksource);
  
        }
  
        /* Set initial system time with full resolution */
-       xen_read_wallclock(&xtime);
-       set_normalized_timespec(&wall_to_monotonic,
-                               -xtime.tv_sec, -xtime.tv_nsec);
+       xen_read_wallclock(&tp);
+       do_settimeofday(&tp);
  
        setup_force_cpu_cap(X86_FEATURE_TSC);