standby.S 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * PXA27x standby mode
  4. *
  5. * Author: David Burrage
  6. *
  7. * 2005 (c) MontaVista Software, Inc.
  8. */
  9. #include <linux/linkage.h>
  10. #include <asm/assembler.h>
  11. #include "pxa2xx-regs.h"
  12. .text
  13. #ifdef CONFIG_PXA27x
  14. ENTRY(pxa_cpu_standby)
  15. ldr r0, =PSSR
  16. mov r1, #(PSSR_PH | PSSR_STS)
  17. mov r2, #PWRMODE_STANDBY
  18. mov r3, #UNCACHED_PHYS_0 @ Read mem context in.
  19. ldr ip, [r3]
  20. b 1f
  21. .align 5
  22. 1: mcr p14, 0, r2, c7, c0, 0 @ put the system into Standby
  23. str r1, [r0] @ make sure PSSR_PH/STS are clear
  24. ret lr
  25. #endif
  26. #ifdef CONFIG_PXA3xx
  27. #define PXA3_MDCNFG 0x0000
  28. #define PXA3_MDCNFG_DMCEN (1 << 30)
  29. #define PXA3_DDR_HCAL 0x0060
  30. #define PXA3_DDR_HCAL_HCRNG 0x1f
  31. #define PXA3_DDR_HCAL_HCPROG (1 << 28)
  32. #define PXA3_DDR_HCAL_HCEN (1 << 31)
  33. #define PXA3_DMCIER 0x0070
  34. #define PXA3_DMCIER_EDLP (1 << 29)
  35. #define PXA3_DMCISR 0x0078
  36. #define PXA3_RCOMP 0x0100
  37. #define PXA3_RCOMP_SWEVAL (1 << 31)
  38. ENTRY(pm_enter_standby_start)
  39. mov r1, #0xf6000000 @ DMEMC_REG_BASE (PXA3_MDCNFG)
  40. add r1, r1, #0x00100000
  41. /*
  42. * Preload the TLB entry for accessing the dynamic memory
  43. * controller registers. Note that page table lookups will
  44. * fail until the dynamic memory controller has been
  45. * reinitialised - and that includes MMU page table walks.
  46. * This also means that only the dynamic memory controller
  47. * can be reliably accessed in the code following standby.
  48. */
  49. ldr r2, [r1] @ Dummy read PXA3_MDCNFG
  50. mcr p14, 0, r0, c7, c0, 0
  51. .rept 8
  52. nop
  53. .endr
  54. ldr r0, [r1, #PXA3_DDR_HCAL] @ Clear (and wait for) HCEN
  55. bic r0, r0, #PXA3_DDR_HCAL_HCEN
  56. str r0, [r1, #PXA3_DDR_HCAL]
  57. 1: ldr r0, [r1, #PXA3_DDR_HCAL]
  58. tst r0, #PXA3_DDR_HCAL_HCEN
  59. bne 1b
  60. ldr r0, [r1, #PXA3_RCOMP] @ Initiate RCOMP
  61. orr r0, r0, #PXA3_RCOMP_SWEVAL
  62. str r0, [r1, #PXA3_RCOMP]
  63. mov r0, #~0 @ Clear interrupts
  64. str r0, [r1, #PXA3_DMCISR]
  65. ldr r0, [r1, #PXA3_DMCIER] @ set DMIER[EDLP]
  66. orr r0, r0, #PXA3_DMCIER_EDLP
  67. str r0, [r1, #PXA3_DMCIER]
  68. ldr r0, [r1, #PXA3_DDR_HCAL] @ clear HCRNG, set HCPROG, HCEN
  69. bic r0, r0, #PXA3_DDR_HCAL_HCRNG
  70. orr r0, r0, #PXA3_DDR_HCAL_HCEN | PXA3_DDR_HCAL_HCPROG
  71. str r0, [r1, #PXA3_DDR_HCAL]
  72. 1: ldr r0, [r1, #PXA3_DMCISR]
  73. tst r0, #PXA3_DMCIER_EDLP
  74. beq 1b
  75. ldr r0, [r1, #PXA3_MDCNFG] @ set PXA3_MDCNFG[DMCEN]
  76. orr r0, r0, #PXA3_MDCNFG_DMCEN
  77. str r0, [r1, #PXA3_MDCNFG]
  78. 1: ldr r0, [r1, #PXA3_MDCNFG]
  79. tst r0, #PXA3_MDCNFG_DMCEN
  80. beq 1b
  81. ldr r0, [r1, #PXA3_DDR_HCAL] @ set PXA3_DDR_HCAL[HCRNG]
  82. orr r0, r0, #2 @ HCRNG
  83. str r0, [r1, #PXA3_DDR_HCAL]
  84. ldr r0, [r1, #PXA3_DMCIER] @ Clear the interrupt
  85. bic r0, r0, #0x20000000
  86. str r0, [r1, #PXA3_DMCIER]
  87. ret lr
  88. ENTRY(pm_enter_standby_end)
  89. #endif