linux/drivers/clocksource/dummy_timer.c
<<
>>
Prefs
   1/*
   2 *  linux/drivers/clocksource/dummy_timer.c
   3 *
   4 *  Copyright (C) 2013 ARM Ltd.
   5 *  All Rights Reserved
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2 as
   9 * published by the Free Software Foundation.
  10 */
  11#include <linux/clockchips.h>
  12#include <linux/cpu.h>
  13#include <linux/init.h>
  14#include <linux/percpu.h>
  15#include <linux/cpumask.h>
  16
  17static DEFINE_PER_CPU(struct clock_event_device, dummy_timer_evt);
  18
  19static void dummy_timer_set_mode(enum clock_event_mode mode,
  20                           struct clock_event_device *evt)
  21{
  22        /*
  23         * Core clockevents code will call this when exchanging timer devices.
  24         * We don't need to do anything here.
  25         */
  26}
  27
  28static void dummy_timer_setup(void)
  29{
  30        int cpu = smp_processor_id();
  31        struct clock_event_device *evt = __this_cpu_ptr(&dummy_timer_evt);
  32
  33        evt->name       = "dummy_timer";
  34        evt->features   = CLOCK_EVT_FEAT_PERIODIC |
  35                          CLOCK_EVT_FEAT_ONESHOT |
  36                          CLOCK_EVT_FEAT_DUMMY;
  37        evt->rating     = 100;
  38        evt->set_mode   = dummy_timer_set_mode;
  39        evt->cpumask    = cpumask_of(cpu);
  40
  41        clockevents_register_device(evt);
  42}
  43
  44static int dummy_timer_cpu_notify(struct notifier_block *self,
  45                                      unsigned long action, void *hcpu)
  46{
  47        if ((action & ~CPU_TASKS_FROZEN) == CPU_STARTING)
  48                dummy_timer_setup();
  49
  50        return NOTIFY_OK;
  51}
  52
  53static struct notifier_block dummy_timer_cpu_nb = {
  54        .notifier_call = dummy_timer_cpu_notify,
  55};
  56
  57static int __init dummy_timer_register(void)
  58{
  59        int err = register_cpu_notifier(&dummy_timer_cpu_nb);
  60        if (err)
  61                return err;
  62
  63        /* We won't get a call on the boot CPU, so register immediately */
  64        if (num_possible_cpus() > 1)
  65                dummy_timer_setup();
  66
  67        return 0;
  68}
  69early_initcall(dummy_timer_register);
  70