sleep-tegra20.S 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. * Copyright (c) 2010-2012, NVIDIA Corporation. All rights reserved.
  3. * Copyright (c) 2011, Google, Inc.
  4. *
  5. * Author: Colin Cross <ccross@android.com>
  6. * Gary King <gking@nvidia.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify it
  9. * under the terms and conditions of the GNU General Public License,
  10. * version 2, as published by the Free Software Foundation.
  11. *
  12. * This program is distributed in the hope it will be useful, but WITHOUT
  13. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  14. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  15. * more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  19. */
  20. #include <linux/linkage.h>
  21. #include <asm/assembler.h>
  22. #include "sleep.h"
  23. #include "flowctrl.h"
  24. #if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_PM_SLEEP)
  25. /*
  26. * tegra20_hotplug_shutdown(void)
  27. *
  28. * puts the current cpu in reset
  29. * should never return
  30. */
  31. ENTRY(tegra20_hotplug_shutdown)
  32. /* Turn off SMP coherency */
  33. exit_smp r4, r5
  34. /* Put this CPU down */
  35. cpu_id r0
  36. bl tegra20_cpu_shutdown
  37. mov pc, lr @ should never get here
  38. ENDPROC(tegra20_hotplug_shutdown)
  39. /*
  40. * tegra20_cpu_shutdown(int cpu)
  41. *
  42. * r0 is cpu to reset
  43. *
  44. * puts the specified CPU in wait-for-event mode on the flow controller
  45. * and puts the CPU in reset
  46. * can be called on the current cpu or another cpu
  47. * if called on the current cpu, does not return
  48. * MUST NOT BE CALLED FOR CPU 0.
  49. *
  50. * corrupts r0-r3, r12
  51. */
  52. ENTRY(tegra20_cpu_shutdown)
  53. cmp r0, #0
  54. moveq pc, lr @ must not be called for CPU 0
  55. cpu_to_halt_reg r1, r0
  56. ldr r3, =TEGRA_FLOW_CTRL_VIRT
  57. mov r2, #FLOW_CTRL_WAITEVENT | FLOW_CTRL_JTAG_RESUME
  58. str r2, [r3, r1] @ put flow controller in wait event mode
  59. ldr r2, [r3, r1]
  60. isb
  61. dsb
  62. movw r1, 0x1011
  63. mov r1, r1, lsl r0
  64. ldr r3, =TEGRA_CLK_RESET_VIRT
  65. str r1, [r3, #0x340] @ put slave CPU in reset
  66. isb
  67. dsb
  68. cpu_id r3
  69. cmp r3, r0
  70. beq .
  71. mov pc, lr
  72. ENDPROC(tegra20_cpu_shutdown)
  73. #endif