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/io.h>
  13. #include <mach/hardware.h>
  14. #include "iomap.h"
  15. .text
  16. /*
  17. * Reprograms ULPD and CKCTL.
  18. */
  19. .align 3
  20. ENTRY(omap1_sram_reprogram_clock)
  21. stmfd sp!, {r0 - r12, lr} @ save registers on stack
  22. mov r2, #OMAP1_IO_ADDRESS(DPLL_CTL) & 0xff000000
  23. orr r2, r2, #OMAP1_IO_ADDRESS(DPLL_CTL) & 0x00ff0000
  24. orr r2, r2, #OMAP1_IO_ADDRESS(DPLL_CTL) & 0x0000ff00
  25. mov r3, #OMAP1_IO_ADDRESS(ARM_CKCTL) & 0xff000000
  26. orr r3, r3, #OMAP1_IO_ADDRESS(ARM_CKCTL) & 0x00ff0000
  27. orr r3, r3, #OMAP1_IO_ADDRESS(ARM_CKCTL) & 0x0000ff00
  28. tst r0, #1 << 4 @ want lock mode?
  29. beq newck @ nope
  30. bic r0, r0, #1 << 4 @ else clear lock bit
  31. strh r0, [r2] @ set dpll into bypass mode
  32. orr r0, r0, #1 << 4 @ set lock bit again
  33. newck:
  34. strh r1, [r3] @ write new ckctl value
  35. strh r0, [r2] @ write new dpll value
  36. mov r4, #0x0700 @ let the clocks settle
  37. orr r4, r4, #0x00ff
  38. delay: sub r4, r4, #1
  39. cmp r4, #0
  40. bne delay
  41. lock: ldrh r4, [r2], #0 @ read back dpll value
  42. tst r0, #1 << 4 @ want lock mode?
  43. beq out @ nope
  44. tst r4, #1 << 0 @ dpll rate locked?
  45. beq lock @ try again
  46. out:
  47. ldmfd sp!, {r0 - r12, pc} @ restore regs and return
  48. ENTRY(omap1_sram_reprogram_clock_sz)
  49. .word . - omap1_sram_reprogram_clock