1 /* $Id: io_generic.c,v 1.1.1.1.4.2.2.1 2003/01/10 17:26:56 lethal Exp $
3 * linux/arch/sh/kernel/io_generic.c
5 * Copyright (C) 2000 Niibe Yutaka
7 * Generic I/O routine. These can be used where a machine specific version
10 * This file is subject to the terms and conditions of the GNU General Public
11 * License. See the file "COPYING" in the main directory of this archive
17 #include <asm/machvec.h>
18 #include <linux/module.h>
20 #if defined(CONFIG_CPU_SH3)
21 /* I'm not sure SH7709 has this kind of bug */
22 #define SH3_PCMCIA_BUG_WORKAROUND 1
23 #define DUMMY_READ_AREA6 0xba000000
26 #define PORT2ADDR(x) (sh_mv.mv_isa_port2addr(x))
28 unsigned long generic_io_base;
30 static inline void delay(void)
35 unsigned char generic_inb(unsigned long port)
37 return *(volatile unsigned char*)PORT2ADDR(port);
40 unsigned short generic_inw(unsigned long port)
42 return *(volatile unsigned short*)PORT2ADDR(port);
45 unsigned int generic_inl(unsigned long port)
47 return *(volatile unsigned long*)PORT2ADDR(port);
50 unsigned char generic_inb_p(unsigned long port)
52 unsigned long v = *(volatile unsigned char*)PORT2ADDR(port);
58 unsigned short generic_inw_p(unsigned long port)
60 unsigned long v = *(volatile unsigned short*)PORT2ADDR(port);
66 unsigned int generic_inl_p(unsigned long port)
68 unsigned long v = *(volatile unsigned long*)PORT2ADDR(port);
74 void generic_insb(unsigned long port, void *buffer, unsigned long count)
76 unsigned char *buf=buffer;
77 while(count--) *buf++=inb(port);
80 void generic_insw(unsigned long port, void *buffer, unsigned long count)
82 unsigned short *buf=buffer;
83 while(count--) *buf++=inw(port);
84 #ifdef SH3_PCMCIA_BUG_WORKAROUND
85 ctrl_inb (DUMMY_READ_AREA6);
89 void generic_insl(unsigned long port, void *buffer, unsigned long count)
91 unsigned long *buf=buffer;
92 while(count--) *buf++=inl(port);
93 #ifdef SH3_PCMCIA_BUG_WORKAROUND
94 ctrl_inb (DUMMY_READ_AREA6);
98 void generic_outb(unsigned char b, unsigned long port)
100 *(volatile unsigned char*)PORT2ADDR(port) = b;
103 void generic_outw(unsigned short b, unsigned long port)
105 *(volatile unsigned short*)PORT2ADDR(port) = b;
108 void generic_outl(unsigned int b, unsigned long port)
110 *(volatile unsigned long*)PORT2ADDR(port) = b;
113 void generic_outb_p(unsigned char b, unsigned long port)
115 *(volatile unsigned char*)PORT2ADDR(port) = b;
119 void generic_outw_p(unsigned short b, unsigned long port)
121 *(volatile unsigned short*)PORT2ADDR(port) = b;
125 void generic_outl_p(unsigned int b, unsigned long port)
127 *(volatile unsigned long*)PORT2ADDR(port) = b;
131 void generic_outsb(unsigned long port, const void *buffer, unsigned long count)
133 const unsigned char *buf=buffer;
134 while(count--) outb(*buf++, port);
137 void generic_outsw(unsigned long port, const void *buffer, unsigned long count)
139 const unsigned short *buf=buffer;
140 while(count--) outw(*buf++, port);
141 #ifdef SH3_PCMCIA_BUG_WORKAROUND
142 ctrl_inb (DUMMY_READ_AREA6);
146 void generic_outsl(unsigned long port, const void *buffer, unsigned long count)
148 const unsigned long *buf=buffer;
149 while(count--) outl(*buf++, port);
150 #ifdef SH3_PCMCIA_BUG_WORKAROUND
151 ctrl_inb (DUMMY_READ_AREA6);
155 unsigned char generic_readb(unsigned long addr)
157 return *(volatile unsigned char*)addr;
160 unsigned short generic_readw(unsigned long addr)
162 return *(volatile unsigned short*)addr;
165 unsigned int generic_readl(unsigned long addr)
167 return *(volatile unsigned long*)addr;
170 void generic_writeb(unsigned char b, unsigned long addr)
172 *(volatile unsigned char*)addr = b;
175 void generic_writew(unsigned short b, unsigned long addr)
177 *(volatile unsigned short*)addr = b;
180 void generic_writel(unsigned int b, unsigned long addr)
182 *(volatile unsigned long*)addr = b;
185 void * generic_ioremap(unsigned long offset, unsigned long size)
187 return (void *) P2SEGADDR(offset);
189 EXPORT_SYMBOL(generic_ioremap);
191 void generic_iounmap(void *addr)
194 EXPORT_SYMBOL(generic_iounmap);
196 unsigned long generic_isa_port2addr(unsigned long offset)
198 return offset + generic_io_base;