1/* 2 * Copyright (C) 2002 David McCullough <davidm@snapgear.com> 3 * Copyright (C) 2001 Ian da Silva, Jeremy Siegel 4 * Based largely on io_se.c. 5 * 6 * I/O routine for Hitachi 7751 SolutionEngine. 7 * 8 * Initial version only to support LAN access; some 9 * placeholder code from io_se.c left in with the 10 * expectation of later SuperIO and PCMCIA access. 11 */ 12#include <linux/kernel.h> 13#include <linux/types.h> 14#include <linux/pci.h> 15#include <asm/io.h> 16#include <asm/addrspace.h> 17 18#ifdef CONFIG_SH_SECUREEDGE5410 19unsigned short secureedge5410_ioport; 20#endif 21 22static inline volatile __u16 *port2adr(unsigned int port) 23{ 24 maybebadio((unsigned long)port); 25 return (volatile __u16*)port; 26} 27 28/* 29 * General outline: remap really low stuff [eventually] to SuperIO, 30 * stuff in PCI IO space (at or above window at pci.h:PCIBIOS_MIN_IO) 31 * is mapped through the PCI IO window. Stuff with high bits (PXSEG) 32 * should be way beyond the window, and is used w/o translation for 33 * compatibility. 34 */ 35unsigned char snapgear_inb(unsigned long port) 36{ 37 if (PXSEG(port)) 38 return *(volatile unsigned char *)port; 39 else if (is_pci_ioaddr(port)) 40 return *(volatile unsigned char *)pci_ioaddr(port); 41 else 42 return (*port2adr(port)) & 0xff; 43} 44 45unsigned char snapgear_inb_p(unsigned long port) 46{ 47 unsigned char v; 48 49 if (PXSEG(port)) 50 v = *(volatile unsigned char *)port; 51 else if (is_pci_ioaddr(port)) 52 v = *(volatile unsigned char *)pci_ioaddr(port); 53 else 54 v = (*port2adr(port))&0xff; 55 ctrl_delay(); 56 return v; 57} 58 59unsigned short snapgear_inw(unsigned long port) 60{ 61 if (PXSEG(port)) 62 return *(volatile unsigned short *)port; 63 else if (is_pci_ioaddr(port)) 64 return *(volatile unsigned short *)pci_ioaddr(port); 65 else if (port >= 0x2000) 66 return *port2adr(port); 67 else 68 maybebadio(port); 69 return 0; 70} 71 72unsigned int snapgear_inl(unsigned long port) 73{ 74 if (PXSEG(port)) 75 return *(volatile unsigned long *)port; 76 else if (is_pci_ioaddr(port)) 77 return *(volatile unsigned int *)pci_ioaddr(port); 78 else if (port >= 0x2000) 79 return *port2adr(port); 80 else 81 maybebadio(port); 82 return 0; 83} 84 85void snapgear_outb(unsigned char value, unsigned long port) 86{ 87 88 if (PXSEG(port)) 89 *(volatile unsigned char *)port = value; 90 else if (is_pci_ioaddr(port)) 91 *((unsigned char*)pci_ioaddr(port)) = value; 92 else 93 *(port2adr(port)) = value; 94} 95 96void snapgear_outb_p(unsigned char value, unsigned long port) 97{ 98 if (PXSEG(port)) 99 *(volatile unsigned char *)port = value; 100 else if (is_pci_ioaddr(port)) 101 *((unsigned char*)pci_ioaddr(port)) = value; 102 else 103 *(port2adr(port)) = value; 104 ctrl_delay(); 105} 106 107void snapgear_outw(unsigned short value, unsigned long port) 108{ 109 if (PXSEG(port)) 110 *(volatile unsigned short *)port = value; 111 else if (is_pci_ioaddr(port)) 112 *((unsigned short *)pci_ioaddr(port)) = value; 113 else if (port >= 0x2000) 114 *port2adr(port) = value; 115 else 116 maybebadio(port); 117} 118 119void snapgear_outl(unsigned int value, unsigned long port) 120{ 121 if (PXSEG(port)) 122 *(volatile unsigned long *)port = value; 123 else if (is_pci_ioaddr(port)) 124 *((unsigned long*)pci_ioaddr(port)) = value; 125 else 126 maybebadio(port); 127} 128 129void snapgear_insl(unsigned long port, void *addr, unsigned long count) 130{ 131 maybebadio(port); 132} 133 134void snapgear_outsl(unsigned long port, const void *addr, unsigned long count) 135{ 136 maybebadio(port); 137} 138