diff options
Diffstat (limited to 'arch/sh/boards/mach-edosk7705/io.c')
-rw-r--r-- | arch/sh/boards/mach-edosk7705/io.c | 61 |
1 files changed, 19 insertions, 42 deletions
diff --git a/arch/sh/boards/mach-edosk7705/io.c b/arch/sh/boards/mach-edosk7705/io.c index 7d153e50a01b..5b9c57c43241 100644 --- a/arch/sh/boards/mach-edosk7705/io.c +++ b/arch/sh/boards/mach-edosk7705/io.c | |||
@@ -10,28 +10,24 @@ | |||
10 | 10 | ||
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/types.h> | 12 | #include <linux/types.h> |
13 | #include <asm/io.h> | 13 | #include <linux/io.h> |
14 | #include <mach/edosk7705.h> | 14 | #include <mach/edosk7705.h> |
15 | #include <asm/addrspace.h> | 15 | #include <asm/addrspace.h> |
16 | 16 | ||
17 | #define SMC_IOADDR 0xA2000000 | 17 | #define SMC_IOADDR 0xA2000000 |
18 | 18 | ||
19 | #define maybebadio(name,port) \ | ||
20 | printk("bad PC-like io %s for port 0x%lx at 0x%08x\n", \ | ||
21 | #name, (port), (__u32) __builtin_return_address(0)) | ||
22 | |||
23 | /* Map the Ethernet addresses as if it is at 0x300 - 0x320 */ | 19 | /* Map the Ethernet addresses as if it is at 0x300 - 0x320 */ |
24 | unsigned long sh_edosk7705_isa_port2addr(unsigned long port) | 20 | static unsigned long sh_edosk7705_isa_port2addr(unsigned long port) |
25 | { | 21 | { |
26 | if (port >= 0x300 && port < 0x320) { | 22 | /* |
27 | /* SMC91C96 registers are 4 byte aligned rather than the | 23 | * SMC91C96 registers are 4 byte aligned rather than the |
28 | * usual 2 byte! | 24 | * usual 2 byte! |
29 | */ | 25 | */ |
30 | return SMC_IOADDR + ( (port - 0x300) * 2); | 26 | if (port >= 0x300 && port < 0x320) |
31 | } | 27 | return SMC_IOADDR + ((port - 0x300) * 2); |
32 | 28 | ||
33 | maybebadio(sh_edosk7705_isa_port2addr, port); | 29 | maybebadio(port); |
34 | return port; | 30 | return port; |
35 | } | 31 | } |
36 | 32 | ||
37 | /* Trying to read / write bytes on odd-byte boundaries to the Ethernet | 33 | /* Trying to read / write bytes on odd-byte boundaries to the Ethernet |
@@ -42,53 +38,34 @@ unsigned long sh_edosk7705_isa_port2addr(unsigned long port) | |||
42 | */ | 38 | */ |
43 | unsigned char sh_edosk7705_inb(unsigned long port) | 39 | unsigned char sh_edosk7705_inb(unsigned long port) |
44 | { | 40 | { |
45 | if (port >= 0x300 && port < 0x320 && port & 0x01) { | 41 | if (port >= 0x300 && port < 0x320 && port & 0x01) |
46 | return (volatile unsigned char)(generic_inw(port -1) >> 8); | 42 | return __raw_readw(port - 1) >> 8; |
47 | } | ||
48 | return *(volatile unsigned char *)sh_edosk7705_isa_port2addr(port); | ||
49 | } | ||
50 | 43 | ||
51 | unsigned int sh_edosk7705_inl(unsigned long port) | 44 | return __raw_readb(sh_edosk7705_isa_port2addr(port)); |
52 | { | ||
53 | return *(volatile unsigned long *)port; | ||
54 | } | 45 | } |
55 | 46 | ||
56 | void sh_edosk7705_outb(unsigned char value, unsigned long port) | 47 | void sh_edosk7705_outb(unsigned char value, unsigned long port) |
57 | { | 48 | { |
58 | if (port >= 0x300 && port < 0x320 && port & 0x01) { | 49 | if (port >= 0x300 && port < 0x320 && port & 0x01) { |
59 | generic_outw(((unsigned short)value << 8), port -1); | 50 | __raw_writew(((unsigned short)value << 8), port - 1); |
60 | return; | 51 | return; |
61 | } | 52 | } |
62 | *(volatile unsigned char *)sh_edosk7705_isa_port2addr(port) = value; | ||
63 | } | ||
64 | 53 | ||
65 | void sh_edosk7705_outl(unsigned int value, unsigned long port) | 54 | __raw_writeb(value, sh_edosk7705_isa_port2addr(port)); |
66 | { | ||
67 | *(volatile unsigned long *)port = value; | ||
68 | } | 55 | } |
69 | 56 | ||
70 | void sh_edosk7705_insb(unsigned long port, void *addr, unsigned long count) | 57 | void sh_edosk7705_insb(unsigned long port, void *addr, unsigned long count) |
71 | { | 58 | { |
72 | unsigned char *p = addr; | 59 | unsigned char *p = addr; |
73 | while (count--) *p++ = sh_edosk7705_inb(port); | ||
74 | } | ||
75 | 60 | ||
76 | void sh_edosk7705_insl(unsigned long port, void *addr, unsigned long count) | ||
77 | { | ||
78 | unsigned long *p = (unsigned long*)addr; | ||
79 | while (count--) | 61 | while (count--) |
80 | *p++ = *(volatile unsigned long *)port; | 62 | *p++ = sh_edosk7705_inb(port); |
81 | } | 63 | } |
82 | 64 | ||
83 | void sh_edosk7705_outsb(unsigned long port, const void *addr, unsigned long count) | 65 | void sh_edosk7705_outsb(unsigned long port, const void *addr, unsigned long count) |
84 | { | 66 | { |
85 | unsigned char *p = (unsigned char*)addr; | 67 | unsigned char *p = (unsigned char *)addr; |
86 | while (count--) sh_edosk7705_outb(*p++, port); | ||
87 | } | ||
88 | 68 | ||
89 | void sh_edosk7705_outsl(unsigned long port, const void *addr, unsigned long count) | 69 | while (count--) |
90 | { | 70 | sh_edosk7705_outb(*p++, port); |
91 | unsigned long *p = (unsigned long*)addr; | ||
92 | while (count--) sh_edosk7705_outl(*p++, port); | ||
93 | } | 71 | } |
94 | |||