PageRenderTime 43ms CodeModel.GetById 14ms app.highlight 25ms RepoModel.GetById 1ms app.codeStats 0ms

/arch/m32r/kernel/io_mappi2.c

https://bitbucket.org/evzijst/gittest
C | 461 lines | 400 code | 50 blank | 11 comment | 168 complexity | 34533eed0ddc69c63e94fe891c95fd38 MD5 | raw file
  1/*
  2 *  linux/arch/m32r/kernel/io_mappi2.c
  3 *
  4 *  Typical I/O routines for Mappi2 board.
  5 *
  6 *  Copyright (c) 2001-2003  Hiroyuki Kondo, Hirokazu Takata,
  7 *                           Hitoshi Yamamoto, Mamoru Sakugawa
  8 */
  9
 10#include <linux/config.h>
 11#include <asm/m32r.h>
 12#include <asm/page.h>
 13#include <asm/io.h>
 14#include <asm/byteorder.h>
 15
 16#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
 17#include <linux/types.h>
 18
 19#define M32R_PCC_IOMAP_SIZE 0x1000
 20
 21#define M32R_PCC_IOSTART0 0x1000
 22#define M32R_PCC_IOEND0   (M32R_PCC_IOSTART0 + M32R_PCC_IOMAP_SIZE - 1)
 23
 24extern void pcc_ioread_byte(int, unsigned long, void *, size_t, size_t, int);
 25extern void pcc_ioread_word(int, unsigned long, void *, size_t, size_t, int);
 26extern void pcc_iowrite_byte(int, unsigned long, void *, size_t, size_t, int);
 27extern void pcc_iowrite_word(int, unsigned long, void *, size_t, size_t, int);
 28#endif /* CONFIG_PCMCIA && CONFIG_MAPPI2_CFC */
 29
 30#define PORT2ADDR(port)      _port2addr(port)
 31#define PORT2ADDR_NE(port)   _port2addr_ne(port)
 32#define PORT2ADDR_USB(port)  _port2addr_usb(port)
 33
 34static inline void *_port2addr(unsigned long port)
 35{
 36	return (void *)(port + NONCACHE_OFFSET);
 37}
 38
 39#define LAN_IOSTART	0x300
 40#define LAN_IOEND	0x320
 41
 42#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
 43static inline void *__port2addr_ata(unsigned long port)
 44{
 45	static int	dummy_reg;
 46
 47	switch (port) {
 48	case 0x1f0:	return (void *)0xac002000;
 49	case 0x1f1:	return (void *)0xac012800;
 50	case 0x1f2:	return (void *)0xac012002;
 51	case 0x1f3:	return (void *)0xac012802;
 52	case 0x1f4:	return (void *)0xac012004;
 53	case 0x1f5:	return (void *)0xac012804;
 54	case 0x1f6:	return (void *)0xac012006;
 55	case 0x1f7:	return (void *)0xac012806;
 56	case 0x3f6:	return (void *)0xac01200e;
 57	default: 	return (void *)&dummy_reg;
 58	}
 59}
 60#endif
 61
 62#ifdef CONFIG_CHIP_OPSP
 63static inline void *_port2addr_ne(unsigned long port)
 64{
 65	return (void *)(port + NONCACHE_OFFSET + 0x10000000);
 66}
 67#else
 68static inline void *_port2addr_ne(unsigned long port)
 69{
 70	return (void *)(port + NONCACHE_OFFSET + 0x04000000);
 71}
 72#endif
 73static inline void *_port2addr_usb(unsigned long port)
 74{
 75	return (void *)(port + NONCACHE_OFFSET + 0x14000000);
 76}
 77static inline void delay(void)
 78{
 79	__asm__ __volatile__ ("push r0; \n\t pop r0;" : : :"memory");
 80}
 81
 82/*
 83 * NIC I/O function
 84 */
 85
 86static inline unsigned char _ne_inb(void *portp)
 87{
 88	return (unsigned char) *(volatile unsigned char *)portp;
 89}
 90
 91static inline unsigned short _ne_inw(void *portp)
 92{
 93	return (unsigned short)le16_to_cpu(*(volatile unsigned short *)portp);
 94}
 95
 96static inline void _ne_insb(void *portp, void * addr, unsigned long count)
 97{
 98	unsigned char *buf = addr;
 99
100	while (count--)
101		*buf++ = *(volatile unsigned char *)portp;
102}
103
104static inline void _ne_outb(unsigned char b, void *portp)
105{
106	*(volatile unsigned char *)portp = (unsigned char)b;
107}
108
109static inline void _ne_outw(unsigned short w, void *portp)
110{
111	*(volatile unsigned short *)portp = cpu_to_le16(w);
112}
113
114unsigned char _inb(unsigned long port)
115{
116	if (port >= LAN_IOSTART && port < LAN_IOEND)
117		return _ne_inb(PORT2ADDR_NE(port));
118#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
119	else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
120		return *(volatile unsigned char *)__port2addr_ata(port);
121	}
122#endif
123#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
124	else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
125		unsigned char b;
126		pcc_ioread_byte(0, port, &b, sizeof(b), 1, 0);
127		return b;
128	} else
129#endif
130
131	return *(volatile unsigned char *)PORT2ADDR(port);
132}
133
134unsigned short _inw(unsigned long port)
135{
136	if (port >= LAN_IOSTART && port < LAN_IOEND)
137		return _ne_inw(PORT2ADDR_NE(port));
138#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
139	else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
140		return *(volatile unsigned short *)__port2addr_ata(port);
141	}
142#endif
143#if defined(CONFIG_USB)
144	else if (port >= 0x340 && port < 0x3a0)
145		return *(volatile unsigned short *)PORT2ADDR_USB(port);
146#endif
147
148#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
149	else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
150		unsigned short w;
151		pcc_ioread_word(0, port, &w, sizeof(w), 1, 0);
152		return w;
153	} else
154#endif
155	return *(volatile unsigned short *)PORT2ADDR(port);
156}
157
158unsigned long _inl(unsigned long port)
159{
160#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
161	if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
162		unsigned long l;
163		pcc_ioread_word(0, port, &l, sizeof(l), 1, 0);
164		return l;
165	} else
166#endif
167	return *(volatile unsigned long *)PORT2ADDR(port);
168}
169
170unsigned char _inb_p(unsigned long port)
171{
172	unsigned char  v;
173
174	if (port >= LAN_IOSTART && port < LAN_IOEND)
175		v = _ne_inb(PORT2ADDR_NE(port));
176	else
177#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
178	if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
179		return *(volatile unsigned char *)__port2addr_ata(port);
180	} else
181#endif
182#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
183	if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
184		unsigned char b;
185		pcc_ioread_byte(0, port, &b, sizeof(b), 1, 0);
186		return b;
187	} else
188#endif
189		v = *(volatile unsigned char *)PORT2ADDR(port);
190
191	delay();
192	return (v);
193}
194
195unsigned short _inw_p(unsigned long port)
196{
197	unsigned short  v;
198
199	if (port >= LAN_IOSTART && port < LAN_IOEND)
200		v = _ne_inw(PORT2ADDR_NE(port));
201	else
202#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
203	if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
204		return *(volatile unsigned short *)__port2addr_ata(port);
205	} else
206#endif
207#if defined(CONFIG_USB)
208	if (port >= 0x340 && port < 0x3a0)
209		v = *(volatile unsigned short *)PORT2ADDR_USB(port);
210	else
211#endif
212#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
213	if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
214		unsigned short w;
215		pcc_ioread_word(0, port, &w, sizeof(w), 1, 0);
216		return w;
217	} else
218#endif
219		v = *(volatile unsigned short *)PORT2ADDR(port);
220
221	delay();
222	return (v);
223}
224
225unsigned long _inl_p(unsigned long port)
226{
227	unsigned long  v;
228
229	v = *(volatile unsigned long *)PORT2ADDR(port);
230	delay();
231	return (v);
232}
233
234void _outb(unsigned char b, unsigned long port)
235{
236	if (port >= LAN_IOSTART && port < LAN_IOEND)
237		_ne_outb(b, PORT2ADDR_NE(port));
238	else
239#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
240	if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
241		*(volatile unsigned char *)__port2addr_ata(port) = b;
242	} else
243#endif
244#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
245	if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
246		pcc_iowrite_byte(0, port, &b, sizeof(b), 1, 0);
247	} else
248#endif
249		*(volatile unsigned char *)PORT2ADDR(port) = b;
250}
251
252void _outw(unsigned short w, unsigned long port)
253{
254	if (port >= LAN_IOSTART && port < LAN_IOEND)
255		_ne_outw(w, PORT2ADDR_NE(port));
256	else
257#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
258	if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
259		*(volatile unsigned short *)__port2addr_ata(port) = w;
260	} else
261#endif
262#if defined(CONFIG_USB)
263	if (port >= 0x340 && port < 0x3a0)
264		*(volatile unsigned short *)PORT2ADDR_USB(port) = w;
265	else
266#endif
267#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
268	if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
269		pcc_iowrite_word(0, port, &w, sizeof(w), 1, 0);
270	} else
271#endif
272		*(volatile unsigned short *)PORT2ADDR(port) = w;
273}
274
275void _outl(unsigned long l, unsigned long port)
276{
277#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
278	if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
279		pcc_iowrite_word(0, port, &l, sizeof(l), 1, 0);
280	} else
281#endif
282	*(volatile unsigned long *)PORT2ADDR(port) = l;
283}
284
285void _outb_p(unsigned char b, unsigned long port)
286{
287	if (port >= LAN_IOSTART && port < LAN_IOEND)
288		_ne_outb(b, PORT2ADDR_NE(port));
289	else
290#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
291	if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
292		*(volatile unsigned char *)__port2addr_ata(port) = b;
293	} else
294#endif
295#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
296	if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
297		pcc_iowrite_byte(0, port, &b, sizeof(b), 1, 0);
298	} else
299#endif
300		*(volatile unsigned char *)PORT2ADDR(port) = b;
301
302	delay();
303}
304
305void _outw_p(unsigned short w, unsigned long port)
306{
307	if (port >= LAN_IOSTART && port < LAN_IOEND)
308		_ne_outw(w, PORT2ADDR_NE(port));
309	else
310#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
311	if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
312		*(volatile unsigned short *)__port2addr_ata(port) = w;
313	} else
314#endif
315#if defined(CONFIG_USB)
316	  if (port >= 0x340 && port < 0x3a0)
317		*(volatile unsigned short *)PORT2ADDR_USB(port) = w;
318	else
319#endif
320#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
321	if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
322		pcc_iowrite_word(0, port, &w, sizeof(w), 1, 0);
323	} else
324#endif
325		*(volatile unsigned short *)PORT2ADDR(port) = w;
326
327	delay();
328}
329
330void _outl_p(unsigned long l, unsigned long port)
331{
332	*(volatile unsigned long *)PORT2ADDR(port) = l;
333	delay();
334}
335
336void _insb(unsigned int port, void * addr, unsigned long count)
337{
338	if (port >= LAN_IOSTART && port < LAN_IOEND)
339		_ne_insb(PORT2ADDR_NE(port), addr, count);
340#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
341	else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
342		unsigned char *buf = addr;
343		unsigned char *portp = __port2addr_ata(port);
344		while (count--)
345			*buf++ = *(volatile unsigned char *)portp;
346	}
347#endif
348#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
349	else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
350		pcc_ioread_byte(0, port, (void *)addr, sizeof(unsigned char),
351				count, 1);
352	}
353#endif
354	else {
355		unsigned char *buf = addr;
356		unsigned char *portp = PORT2ADDR(port);
357		while (count--)
358			*buf++ = *(volatile unsigned char *)portp;
359	}
360}
361
362void _insw(unsigned int port, void * addr, unsigned long count)
363{
364	unsigned short *buf = addr;
365	unsigned short *portp;
366
367	if (port >= LAN_IOSTART && port < LAN_IOEND) {
368		portp = PORT2ADDR_NE(port);
369		while (count--)
370			*buf++ = *(volatile unsigned short *)portp;
371#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
372	} else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
373		pcc_ioread_word(9, port, (void *)addr, sizeof(unsigned short),
374				count, 1);
375#endif
376#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
377	} else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
378		portp = __port2addr_ata(port);
379		while (count--)
380			*buf++ = *(volatile unsigned short *)portp;
381#endif
382	} else {
383		portp = PORT2ADDR(port);
384		while (count--)
385			*buf++ = *(volatile unsigned short *)portp;
386	}
387}
388
389void _insl(unsigned int port, void * addr, unsigned long count)
390{
391	unsigned long *buf = addr;
392	unsigned long *portp;
393
394	portp = PORT2ADDR(port);
395	while (count--)
396		*buf++ = *(volatile unsigned long *)portp;
397}
398
399void _outsb(unsigned int port, const void * addr, unsigned long count)
400{
401	const unsigned char *buf = addr;
402	unsigned char *portp;
403
404	if (port >= LAN_IOSTART && port < LAN_IOEND) {
405		portp = PORT2ADDR_NE(port);
406		while (count--)
407			_ne_outb(*buf++, portp);
408#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
409	} else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
410		portp = __port2addr_ata(port);
411		while (count--)
412			*(volatile unsigned char *)portp = *buf++;
413#endif
414#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
415	} else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
416		pcc_iowrite_byte(0, port, (void *)addr, sizeof(unsigned char),
417				 count, 1);
418#endif
419	} else {
420		portp = PORT2ADDR(port);
421		while (count--)
422			*(volatile unsigned char *)portp = *buf++;
423	}
424}
425
426void _outsw(unsigned int port, const void * addr, unsigned long count)
427{
428	const unsigned short *buf = addr;
429	unsigned short *portp;
430
431	if (port >= LAN_IOSTART && port < LAN_IOEND) {
432		portp = PORT2ADDR_NE(port);
433		while (count--)
434			*(volatile unsigned short *)portp = *buf++;
435#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
436	} else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
437		portp = __port2addr_ata(port);
438		while (count--)
439			*(volatile unsigned short *)portp = *buf++;
440#endif
441#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
442	} else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
443		pcc_iowrite_word(9, port, (void *)addr, sizeof(unsigned short),
444				 count, 1);
445#endif
446	} else {
447		portp = PORT2ADDR(port);
448		while (count--)
449			*(volatile unsigned short *)portp = *buf++;
450	}
451}
452
453void _outsl(unsigned int port, const void * addr, unsigned long count)
454{
455	const unsigned long *buf = addr;
456	unsigned char *portp;
457
458	portp = PORT2ADDR(port);
459	while (count--)
460		*(volatile unsigned long *)portp = *buf++;
461}