sram.S 1.5 KB

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