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