Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6
[linux-2.6] / arch / xtensa / kernel / io.c
1 /*
2  * arch/xtensa/io.c
3  *
4  * IO primitives
5  *
6  * This program is free software; you can redistribute  it and/or modify it
7  * under  the terms of  the GNU General  Public License as published by the
8  * Free Software Foundation;  either version 2 of the  License, or (at your
9  * option) any later version.
10  *
11  * Copied from sparc.
12  *
13  * Chris Zankel <chris@zankel.net>
14  *
15  */
16
17 #include <asm/io.h>
18 #include <asm/byteorder.h>
19
20 void outsb(unsigned long addr, const void *src, unsigned long count) {
21         while (count) {
22                 count -= 1;
23                 writeb(*(const char *)src, addr);
24                 src += 1;
25                 addr += 1;
26         }
27 }
28
29 void outsw(unsigned long addr, const void *src, unsigned long count) {
30         while (count) {
31                 count -= 2;
32                 writew(*(const short *)src, addr);
33                 src += 2;
34                 addr += 2;
35         }
36 }
37
38 void outsl(unsigned long addr, const void *src, unsigned long count) {
39         while (count) {
40                 count -= 4;
41                 writel(*(const long *)src, addr);
42                 src += 4;
43                 addr += 4;
44         }
45 }
46
47 void insb(unsigned long addr, void *dst, unsigned long count) {
48         while (count) {
49                 count -= 1;
50                 *(unsigned char *)dst = readb(addr);
51                 dst += 1;
52                 addr += 1;
53         }
54 }
55
56 void insw(unsigned long addr, void *dst, unsigned long count) {
57         while (count) {
58                 count -= 2;
59                 *(unsigned short *)dst = readw(addr);
60                 dst += 2;
61                 addr += 2;
62         }
63 }
64
65 void insl(unsigned long addr, void *dst, unsigned long count) {
66         while (count) {
67                 count -= 4;
68                 /*
69                  * XXX I am sure we are in for an unaligned trap here.
70                  */
71                 *(unsigned long *)dst = readl(addr);
72                 dst += 4;
73                 addr += 4;
74         }
75 }