Blame view
arch/mn10300/lib/delay.c
1.06 KB
81f7e3824 Initial Release, ... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
/* MN10300 Short delay interpolation routines * * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. * Written by David Howells (dhowells@redhat.com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public Licence * as published by the Free Software Foundation; either version * 2 of the Licence, or (at your option) any later version. */ #include <linux/module.h> #include <linux/sched.h> #include <linux/delay.h> #include <asm/div64.h> /* * basic delay loop */ void __delay(unsigned long loops) { int d0; asm volatile( " bra 1f " " .align 4 " "1: bra 2f " " .align 4 " "2: add -1,%0 " " bne 2b " : "=&d" (d0) : "0" (loops) : "cc"); } EXPORT_SYMBOL(__delay); /* * handle a delay specified in terms of microseconds */ void __udelay(unsigned long usecs) { unsigned long start, stop, cnt; /* usecs * CLK / 1E6 */ stop = __muldiv64u(usecs, MN10300_TSCCLK, 1000000); start = TMTSCBC; do { cnt = start - TMTSCBC; } while (cnt < stop); } EXPORT_SYMBOL(__udelay); |