1 /* 2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. 3 * All rights reserved. 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * File: upc.h 20 * 21 * Purpose: Macros to access device 22 * 23 * Author: Tevin Chen 24 * 25 * Date: Mar 17, 1997 26 * 27 */ 28 29 #ifndef __UPC_H__ 30 #define __UPC_H__ 31 32 #include "device.h" 33 #include "ttype.h" 34 35 /*--------------------- Export Definitions -------------------------*/ 36 37 38 // 39 // For IO mapped 40 // 41 42 #ifdef IO_MAP 43 44 #define VNSvInPortB(dwIOAddress, pbyData) { \ 45 *(pbyData) = inb(dwIOAddress); \ 46 } 47 48 49 #define VNSvInPortW(dwIOAddress, pwData) { \ 50 *(pwData) = inw(dwIOAddress); \ 51 } 52 53 #define VNSvInPortD(dwIOAddress, pdwData) { \ 54 *(pdwData) = inl(dwIOAddress); \ 55 } 56 57 58 #define VNSvOutPortB(dwIOAddress, byData) { \ 59 outb(byData, dwIOAddress); \ 60 } 61 62 63 #define VNSvOutPortW(dwIOAddress, wData) { \ 64 outw(wData, dwIOAddress); \ 65 } 66 67 #define VNSvOutPortD(dwIOAddress, dwData) { \ 68 outl(dwData, dwIOAddress); \ 69 } 70 71 #else 72 73 // 74 // For memory mapped IO 75 // 76 77 78 #define VNSvInPortB(dwIOAddress, pbyData) { \ 79 volatile BYTE* pbyAddr = ((PBYTE)(dwIOAddress)); \ 80 *(pbyData) = readb(pbyAddr); \ 81 } 82 83 84 #define VNSvInPortW(dwIOAddress, pwData) { \ 85 volatile WORD* pwAddr = ((PWORD)(dwIOAddress)); \ 86 *(pwData) = readw(pwAddr); \ 87 } 88 89 #define VNSvInPortD(dwIOAddress, pdwData) { \ 90 volatile DWORD* pdwAddr = ((PDWORD)(dwIOAddress)); \ 91 *(pdwData) = readl(pdwAddr); \ 92 } 93 94 95 #define VNSvOutPortB(dwIOAddress, byData) { \ 96 volatile BYTE* pbyAddr = ((PBYTE)(dwIOAddress)); \ 97 writeb((BYTE)byData, pbyAddr); \ 98 } 99 100 101 #define VNSvOutPortW(dwIOAddress, wData) { \ 102 volatile WORD* pwAddr = ((PWORD)(dwIOAddress)); \ 103 writew((WORD)wData, pwAddr); \ 104 } 105 106 #define VNSvOutPortD(dwIOAddress, dwData) { \ 107 volatile DWORD* pdwAddr = ((PDWORD)(dwIOAddress)); \ 108 writel((DWORD)dwData, pdwAddr); \ 109 } 110 111 #endif 112 113 114 // 115 // ALWAYS IO-Mapped IO when in 16-bit/32-bit environment 116 // 117 #define PCBvInPortB(dwIOAddress, pbyData) { \ 118 *(pbyData) = inb(dwIOAddress); \ 119 } 120 121 #define PCBvInPortW(dwIOAddress, pwData) { \ 122 *(pwData) = inw(dwIOAddress); \ 123 } 124 125 #define PCBvInPortD(dwIOAddress, pdwData) { \ 126 *(pdwData) = inl(dwIOAddress); \ 127 } 128 129 #define PCBvOutPortB(dwIOAddress, byData) { \ 130 outb(byData, dwIOAddress); \ 131 } 132 133 #define PCBvOutPortW(dwIOAddress, wData) { \ 134 outw(wData, dwIOAddress); \ 135 } 136 137 #define PCBvOutPortD(dwIOAddress, dwData) { \ 138 outl(dwData, dwIOAddress); \ 139 } 140 141 142 #define PCAvDelayByIO(uDelayUnit) { \ 143 BYTE byData; \ 144 unsigned long ii; \ 145 \ 146 if (uDelayUnit <= 50) { \ 147 udelay(uDelayUnit); \ 148 } \ 149 else { \ 150 for (ii = 0; ii < (uDelayUnit); ii++) \ 151 byData = inb(0x61); \ 152 } \ 153 } 154 155 156 /*--------------------- Export Classes ----------------------------*/ 157 158 /*--------------------- Export Variables --------------------------*/ 159 160 /*--------------------- Export Functions --------------------------*/ 161 162 #endif /* __UPC_H__ */ 163