idle.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /*
  2. * The idle loop for all SuperH platforms.
  3. *
  4. * Copyright (C) 2002 - 2009 Paul Mundt
  5. *
  6. * This file is subject to the terms and conditions of the GNU General Public
  7. * License. See the file "COPYING" in the main directory of this archive
  8. * for more details.
  9. */
  10. #include <linux/module.h>
  11. #include <linux/init.h>
  12. #include <linux/mm.h>
  13. #include <linux/pm.h>
  14. #include <linux/tick.h>
  15. #include <linux/preempt.h>
  16. #include <linux/thread_info.h>
  17. #include <linux/irqflags.h>
  18. #include <linux/smp.h>
  19. #include <linux/cpuidle.h>
  20. #include <linux/atomic.h>
  21. #include <asm/pgalloc.h>
  22. #include <asm/smp.h>
  23. #include <asm/bl_bit.h>
  24. static void (*sh_idle)(void);
  25. void default_idle(void)
  26. {
  27. set_bl_bit();
  28. local_irq_enable();
  29. /* Isn't this racy ? */
  30. cpu_sleep();
  31. clear_bl_bit();
  32. }
  33. void arch_cpu_idle_dead(void)
  34. {
  35. play_dead();
  36. }
  37. void arch_cpu_idle(void)
  38. {
  39. if (cpuidle_idle_call())
  40. sh_idle();
  41. }
  42. void __init select_idle_routine(void)
  43. {
  44. /*
  45. * If a platform has set its own idle routine, leave it alone.
  46. */
  47. if (!sh_idle)
  48. sh_idle = default_idle;
  49. }
  50. void stop_this_cpu(void *unused)
  51. {
  52. local_irq_disable();
  53. set_cpu_online(smp_processor_id(), false);
  54. for (;;)
  55. cpu_sleep();
  56. }