delay-loop.S 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * linux/arch/arm/lib/delay.S
  4. *
  5. * Copyright (C) 1995, 1996 Russell King
  6. */
  7. #include <linux/linkage.h>
  8. #include <linux/cfi_types.h>
  9. #include <asm/assembler.h>
  10. #include <asm/delay.h>
  11. #ifdef CONFIG_ARCH_RPC
  12. .arch armv4
  13. #endif
  14. .text
  15. .LC0: .word loops_per_jiffy
  16. .LC1: .word UDELAY_MULT
  17. /*
  18. * loops = r0 * HZ * loops_per_jiffy / 1000000
  19. *
  20. * r0 <= 2000
  21. * HZ <= 1000
  22. */
  23. SYM_TYPED_FUNC_START(__loop_udelay)
  24. ldr r2, .LC1
  25. mul r0, r2, r0 @ r0 = delay_us * UDELAY_MULT
  26. b __loop_const_udelay
  27. SYM_FUNC_END(__loop_udelay)
  28. SYM_TYPED_FUNC_START(__loop_const_udelay) @ 0 <= r0 <= 0xfffffaf0
  29. ldr r2, .LC0
  30. ldr r2, [r2]
  31. umull r1, r0, r2, r0 @ r0-r1 = r0 * loops_per_jiffy
  32. adds r1, r1, #0xffffffff @ rounding up ...
  33. adcs r0, r0, r0 @ and right shift by 31
  34. reteq lr
  35. b __loop_delay
  36. SYM_FUNC_END(__loop_const_udelay)
  37. .align 3
  38. @ Delay routine
  39. SYM_TYPED_FUNC_START(__loop_delay)
  40. subs r0, r0, #1
  41. #if 0
  42. retls lr
  43. subs r0, r0, #1
  44. retls lr
  45. subs r0, r0, #1
  46. retls lr
  47. subs r0, r0, #1
  48. retls lr
  49. subs r0, r0, #1
  50. retls lr
  51. subs r0, r0, #1
  52. retls lr
  53. subs r0, r0, #1
  54. retls lr
  55. subs r0, r0, #1
  56. #endif
  57. bhi __loop_delay
  58. ret lr
  59. SYM_FUNC_END(__loop_delay)