sram.S 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /*
  2. * linux/arch/arm/plat-omap/sram-fn.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/linkage.h>
  11. #include <asm/assembler.h>
  12. #include <mach/hardware.h>
  13. #include "iomap.h"
  14. .text
  15. /*
  16. * Reprograms ULPD and CKCTL.
  17. */
  18. .align 3
  19. ENTRY(omap1_sram_reprogram_clock)
  20. stmfd sp!, {r0 - r12, lr} @ save registers on stack
  21. mov r2, #OMAP1_IO_ADDRESS(DPLL_CTL) & 0xff000000
  22. orr r2, r2, #OMAP1_IO_ADDRESS(DPLL_CTL) & 0x00ff0000
  23. orr r2, r2, #OMAP1_IO_ADDRESS(DPLL_CTL) & 0x0000ff00
  24. mov r3, #OMAP1_IO_ADDRESS(ARM_CKCTL) & 0xff000000
  25. orr r3, r3, #OMAP1_IO_ADDRESS(ARM_CKCTL) & 0x00ff0000
  26. orr r3, r3, #OMAP1_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(omap1_sram_reprogram_clock_sz)
  48. .word . - omap1_sram_reprogram_clock