• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/arch/sh/boards/mach-systemh/
1/*
2 * linux/arch/sh/boards/renesas/systemh/io.c
3 *
4 * Copyright (C) 2001  Ian da Silva, Jeremy Siegel
5 * Based largely on io_se.c.
6 *
7 * I/O routine for Hitachi 7751 Systemh.
8 */
9#include <linux/kernel.h>
10#include <linux/types.h>
11#include <linux/pci.h>
12#include <mach/systemh7751.h>
13#include <asm/addrspace.h>
14#include <asm/io.h>
15
16#define ETHER_IOMAP(adr) (0xB3000000 + (adr)) /*map to 16bits access area
17                                                of smc lan chip*/
18static inline volatile __u16 *
19port2adr(unsigned int port)
20{
21	if (port >= 0x2000)
22		return (volatile __u16 *) (PA_MRSHPC + (port - 0x2000));
23	maybebadio((unsigned long)port);
24	return (volatile __u16*)port;
25}
26
27/*
28 * General outline: remap really low stuff [eventually] to SuperIO,
29 * stuff in PCI IO space (at or above window at pci.h:PCIBIOS_MIN_IO)
30 * is mapped through the PCI IO window.  Stuff with high bits (PXSEG)
31 * should be way beyond the window, and is used  w/o translation for
32 * compatibility.
33 */
34unsigned char sh7751systemh_inb(unsigned long port)
35{
36	if (PXSEG(port))
37		return *(volatile unsigned char *)port;
38	else if (port <= 0x3F1)
39		return *(volatile unsigned char *)ETHER_IOMAP(port);
40	else
41		return (*port2adr(port))&0xff;
42}
43
44unsigned char sh7751systemh_inb_p(unsigned long port)
45{
46	unsigned char v;
47
48        if (PXSEG(port))
49                v = *(volatile unsigned char *)port;
50	else if (port <= 0x3F1)
51		v = *(volatile unsigned char *)ETHER_IOMAP(port);
52	else
53		v = (*port2adr(port))&0xff;
54	ctrl_delay();
55	return v;
56}
57
58unsigned short sh7751systemh_inw(unsigned long port)
59{
60        if (PXSEG(port))
61                return *(volatile unsigned short *)port;
62	else if (port >= 0x2000)
63		return *port2adr(port);
64	else if (port <= 0x3F1)
65		return *(volatile unsigned int *)ETHER_IOMAP(port);
66	else
67		maybebadio(port);
68	return 0;
69}
70
71unsigned int sh7751systemh_inl(unsigned long port)
72{
73        if (PXSEG(port))
74                return *(volatile unsigned long *)port;
75	else if (port >= 0x2000)
76		return *port2adr(port);
77	else if (port <= 0x3F1)
78		return *(volatile unsigned int *)ETHER_IOMAP(port);
79	else
80		maybebadio(port);
81	return 0;
82}
83
84void sh7751systemh_outb(unsigned char value, unsigned long port)
85{
86
87        if (PXSEG(port))
88                *(volatile unsigned char *)port = value;
89	else if (port <= 0x3F1)
90		*(volatile unsigned char *)ETHER_IOMAP(port) = value;
91	else
92		*(port2adr(port)) = value;
93}
94
95void sh7751systemh_outb_p(unsigned char value, unsigned long port)
96{
97        if (PXSEG(port))
98                *(volatile unsigned char *)port = value;
99	else if (port <= 0x3F1)
100		*(volatile unsigned char *)ETHER_IOMAP(port) = value;
101	else
102		*(port2adr(port)) = value;
103	ctrl_delay();
104}
105
106void sh7751systemh_outw(unsigned short value, unsigned long port)
107{
108        if (PXSEG(port))
109                *(volatile unsigned short *)port = value;
110	else if (port >= 0x2000)
111		*port2adr(port) = value;
112	else if (port <= 0x3F1)
113		*(volatile unsigned short *)ETHER_IOMAP(port) = value;
114	else
115		maybebadio(port);
116}
117
118void sh7751systemh_outl(unsigned int value, unsigned long port)
119{
120        if (PXSEG(port))
121                *(volatile unsigned long *)port = value;
122	else
123		maybebadio(port);
124}
125
126void sh7751systemh_insb(unsigned long port, void *addr, unsigned long count)
127{
128	unsigned char *p = addr;
129	while (count--) *p++ = sh7751systemh_inb(port);
130}
131
132void sh7751systemh_insw(unsigned long port, void *addr, unsigned long count)
133{
134	unsigned short *p = addr;
135	while (count--) *p++ = sh7751systemh_inw(port);
136}
137
138void sh7751systemh_insl(unsigned long port, void *addr, unsigned long count)
139{
140	maybebadio(port);
141}
142
143void sh7751systemh_outsb(unsigned long port, const void *addr, unsigned long count)
144{
145	unsigned char *p = (unsigned char*)addr;
146	while (count--) sh7751systemh_outb(*p++, port);
147}
148
149void sh7751systemh_outsw(unsigned long port, const void *addr, unsigned long count)
150{
151	unsigned short *p = (unsigned short*)addr;
152	while (count--) sh7751systemh_outw(*p++, port);
153}
154
155void sh7751systemh_outsl(unsigned long port, const void *addr, unsigned long count)
156{
157	maybebadio(port);
158}
159