sram-fn.S 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. /*
  2. * linux/arch/arm/plat-omap/sram.S
  3. *
  4. * Functions that need to be run in internal SRAM
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License version 2 as
  8. * published by the Free Software Foundation.
  9. */
  10. #include <linux/config.h>
  11. #include <linux/linkage.h>
  12. #include <asm/assembler.h>
  13. #include <asm/arch/io.h>
  14. #include <asm/arch/hardware.h>
  15. .text
  16. /*
  17. * Reprograms ULPD and CKCTL.
  18. */
  19. ENTRY(sram_reprogram_clock)
  20. stmfd sp!, {r0 - r12, lr} @ save registers on stack
  21. mov r2, #IO_ADDRESS(DPLL_CTL) & 0xff000000
  22. orr r2, r2, #IO_ADDRESS(DPLL_CTL) & 0x00ff0000
  23. orr r2, r2, #IO_ADDRESS(DPLL_CTL) & 0x0000ff00
  24. mov r3, #IO_ADDRESS(ARM_CKCTL) & 0xff000000
  25. orr r3, r3, #IO_ADDRESS(ARM_CKCTL) & 0x00ff0000
  26. orr r3, r3, #IO_ADDRESS(ARM_CKCTL) & 0x0000ff00
  27. tst r0, #1 << 4 @ want lock mode?
  28. beq newck @ nope
  29. bic r0, r0, #1 << 4 @ else clear lock bit
  30. strh r0, [r2] @ set dpll into bypass mode
  31. orr r0, r0, #1 << 4 @ set lock bit again
  32. newck:
  33. strh r1, [r3] @ write new ckctl value
  34. strh r0, [r2] @ write new dpll value
  35. mov r4, #0x0700 @ let the clocks settle
  36. orr r4, r4, #0x00ff
  37. delay: sub r4, r4, #1
  38. cmp r4, #0
  39. bne delay
  40. lock: ldrh r4, [r2], #0 @ read back dpll value
  41. tst r0, #1 << 4 @ want lock mode?
  42. beq out @ nope
  43. tst r4, #1 << 0 @ dpll rate locked?
  44. beq lock @ try again
  45. out:
  46. ldmfd sp!, {r0 - r12, pc} @ restore regs and return
  47. ENTRY(sram_reprogram_clock_sz)
  48. .word . - sram_reprogram_clock