sleep.S 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /*
  2. * arch/sh/kernel/cpu/sh4a/sleep-sh_mobile.S
  3. *
  4. * Sleep mode and Standby modes support for SuperH Mobile
  5. *
  6. * Copyright (C) 2009 Magnus Damm
  7. *
  8. * This file is subject to the terms and conditions of the GNU General Public
  9. * License. See the file "COPYING" in the main directory of this archive
  10. * for more details.
  11. */
  12. #include <linux/sys.h>
  13. #include <linux/errno.h>
  14. #include <linux/linkage.h>
  15. #include <asm/asm-offsets.h>
  16. #include <asm/suspend.h>
  17. /* manage self-refresh and enter standby mode.
  18. * this code will be copied to on-chip memory and executed from there.
  19. */
  20. .balign 4096,0,4096
  21. ENTRY(sh_mobile_standby)
  22. mov r4, r0
  23. tst #SUSP_SH_SF, r0
  24. bt skip_set_sf
  25. /* SDRAM: disable power down and put in self-refresh mode */
  26. mov.l 1f, r4
  27. mov.l 2f, r1
  28. mov.l @r4, r2
  29. or r1, r2
  30. mov.l 3f, r3
  31. and r3, r2
  32. mov.l r2, @r4
  33. skip_set_sf:
  34. tst #SUSP_SH_SLEEP, r0
  35. bt test_standby
  36. /* set mode to "sleep mode" */
  37. bra do_sleep
  38. mov #0x00, r1
  39. test_standby:
  40. tst #SUSP_SH_STANDBY, r0
  41. bt test_rstandby
  42. /* set mode to "software standby mode" */
  43. bra do_sleep
  44. mov #0x80, r1
  45. test_rstandby:
  46. tst #SUSP_SH_RSTANDBY, r0
  47. bt test_ustandby
  48. /* set mode to "r-standby mode" */
  49. bra do_sleep
  50. mov #0x20, r1
  51. test_ustandby:
  52. tst #SUSP_SH_USTANDBY, r0
  53. bt done_sleep
  54. /* set mode to "u-standby mode" */
  55. mov #0x10, r1
  56. /* fall-through */
  57. do_sleep:
  58. /* setup and enter selected standby mode */
  59. mov.l 5f, r4
  60. mov.l r1, @r4
  61. sleep
  62. done_sleep:
  63. /* reset standby mode to sleep mode */
  64. mov.l 5f, r4
  65. mov #0x00, r1
  66. mov.l r1, @r4
  67. tst #SUSP_SH_SF, r0
  68. bt skip_restore_sf
  69. /* SDRAM: set auto-refresh mode */
  70. mov.l 1f, r4
  71. mov.l @r4, r2
  72. mov.l 4f, r3
  73. and r3, r2
  74. mov.l r2, @r4
  75. mov.l 6f, r4
  76. mov.l 7f, r1
  77. mov.l 8f, r2
  78. mov.l @r4, r3
  79. mov #-1, r4
  80. add r4, r3
  81. or r2, r3
  82. mov.l r3, @r1
  83. skip_restore_sf:
  84. rts
  85. nop
  86. .balign 4
  87. 1: .long 0xfe400008 /* SDCR0 */
  88. 2: .long 0x00000400
  89. 3: .long 0xffff7fff
  90. 4: .long 0xfffffbff
  91. 5: .long 0xa4150020 /* STBCR */
  92. 6: .long 0xfe40001c /* RTCOR */
  93. 7: .long 0xfe400018 /* RTCNT */
  94. 8: .long 0xa55a0000
  95. /* interrupt vector @ 0x600 */
  96. .balign 0x400,0,0x400
  97. .long 0xdeadbeef
  98. .balign 0x200,0,0x200
  99. /* sh7722 will end up here in sleep mode */
  100. rte
  101. nop
  102. sh_mobile_standby_end:
  103. ENTRY(sh_mobile_standby_size)
  104. .long sh_mobile_standby_end - sh_mobile_standby