hotplug.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  2. * Copyright (C) 2002 ARM Ltd.
  3. * All Rights Reserved
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 as
  7. * published by the Free Software Foundation.
  8. */
  9. #include <linux/kernel.h>
  10. #include <linux/errno.h>
  11. #include <linux/smp.h>
  12. #include <asm/cacheflush.h>
  13. #include <asm/smp_plat.h>
  14. #include "common.h"
  15. static inline void cpu_enter_lowpower(void)
  16. {
  17. /* Just flush the cache. Changing the coherency is not yet
  18. * available on msm. */
  19. flush_cache_all();
  20. }
  21. static inline void cpu_leave_lowpower(void)
  22. {
  23. }
  24. static inline void platform_do_lowpower(unsigned int cpu)
  25. {
  26. /* Just enter wfi for now. TODO: Properly shut off the cpu. */
  27. for (;;) {
  28. /*
  29. * here's the WFI
  30. */
  31. asm("wfi"
  32. :
  33. :
  34. : "memory", "cc");
  35. if (pen_release == cpu_logical_map(cpu)) {
  36. /*
  37. * OK, proper wakeup, we're done
  38. */
  39. break;
  40. }
  41. /*
  42. * getting here, means that we have come out of WFI without
  43. * having been woken up - this shouldn't happen
  44. *
  45. * The trouble is, letting people know about this is not really
  46. * possible, since we are currently running incoherently, and
  47. * therefore cannot safely call printk() or anything else
  48. */
  49. pr_debug("CPU%u: spurious wakeup call\n", cpu);
  50. }
  51. }
  52. /*
  53. * platform-specific code to shutdown a CPU
  54. *
  55. * Called with IRQs disabled
  56. */
  57. void __ref msm_cpu_die(unsigned int cpu)
  58. {
  59. /*
  60. * we're ready for shutdown now, so do it
  61. */
  62. cpu_enter_lowpower();
  63. platform_do_lowpower(cpu);
  64. /*
  65. * bring this CPU back into the world of cache
  66. * coherency, and then restore interrupts
  67. */
  68. cpu_leave_lowpower();
  69. }