Jesper Nilsson | 48c87a4 | 2008-01-25 17:31:38 +0100 | [diff] [blame] | 1 | /* |
| 2 | * Precise Delay Loops for ETRAX FS |
| 3 | * |
| 4 | * Copyright (C) 2006 Axis Communications AB. |
| 5 | * |
| 6 | */ |
| 7 | |
| 8 | #include <hwregs/reg_map.h> |
| 9 | #include <hwregs/reg_rdwr.h> |
| 10 | #include <hwregs/timer_defs.h> |
| 11 | #include <linux/types.h> |
| 12 | #include <linux/delay.h> |
| 13 | #include <linux/module.h> |
| 14 | |
| 15 | /* |
| 16 | * On ETRAX FS, we can check the free-running read-only 100MHz timer |
| 17 | * getting 32-bit 10ns precision, theoretically good for 42.94967295 |
| 18 | * seconds. Unsigned arithmetic and careful expression handles |
| 19 | * wrapping. |
| 20 | */ |
| 21 | |
| 22 | void cris_delay10ns(u32 n10ns) |
| 23 | { |
| 24 | u32 t0 = REG_RD(timer, regi_timer0, r_time); |
| 25 | while (REG_RD(timer, regi_timer0, r_time) - t0 < n10ns) |
| 26 | ; |
| 27 | } |
| 28 | EXPORT_SYMBOL(cris_delay10ns); |