dummy_timer.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. static DEFINE_PER_CPU(struct clock_event_device, dummy_timer_evt);
  17. static void dummy_timer_set_mode(enum clock_event_mode mode,
  18. struct clock_event_device *evt)
  19. {
  20. /*
  21. * Core clockevents code will call this when exchanging timer devices.
  22. * We don't need to do anything here.
  23. */
  24. }
  25. static void dummy_timer_setup(void)
  26. {
  27. int cpu = smp_processor_id();
  28. struct clock_event_device *evt = raw_cpu_ptr(&dummy_timer_evt);
  29. evt->name = "dummy_timer";
  30. evt->features = CLOCK_EVT_FEAT_PERIODIC |
  31. CLOCK_EVT_FEAT_ONESHOT |
  32. CLOCK_EVT_FEAT_DUMMY;
  33. evt->rating = 100;
  34. evt->set_mode = dummy_timer_set_mode;
  35. evt->cpumask = cpumask_of(cpu);
  36. clockevents_register_device(evt);
  37. }
  38. static int dummy_timer_cpu_notify(struct notifier_block *self,
  39. unsigned long action, void *hcpu)
  40. {
  41. if ((action & ~CPU_TASKS_FROZEN) == CPU_STARTING)
  42. dummy_timer_setup();
  43. return NOTIFY_OK;
  44. }
  45. static struct notifier_block dummy_timer_cpu_nb = {
  46. .notifier_call = dummy_timer_cpu_notify,
  47. };
  48. static int __init dummy_timer_register(void)
  49. {
  50. int err = 0;
  51. cpu_notifier_register_begin();
  52. err = __register_cpu_notifier(&dummy_timer_cpu_nb);
  53. if (err)
  54. goto out;
  55. /* We won't get a call on the boot CPU, so register immediately */
  56. if (num_possible_cpus() > 1)
  57. dummy_timer_setup();
  58. out:
  59. cpu_notifier_register_done();
  60. return err;
  61. }
  62. early_initcall(dummy_timer_register);