xref: /OK3568_Linux_fs/kernel/drivers/scsi/pcmcia/nsp_io.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun   NinjaSCSI I/O funtions
3*4882a593Smuzhiyun       By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun   This software may be used and distributed according to the terms of
6*4882a593Smuzhiyun   the GNU General Public License.
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun   */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun /* $Id: nsp_io.h,v 1.3 2003/08/04 21:15:26 elca Exp $ */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #ifndef __NSP_IO_H__
13*4882a593Smuzhiyun #define __NSP_IO_H__
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun static inline          void nsp_write(unsigned int base,
16*4882a593Smuzhiyun 				      unsigned int index,
17*4882a593Smuzhiyun 				      unsigned char val);
18*4882a593Smuzhiyun static inline unsigned char nsp_read(unsigned int base,
19*4882a593Smuzhiyun 				     unsigned int index);
20*4882a593Smuzhiyun static inline          void nsp_index_write(unsigned int BaseAddr,
21*4882a593Smuzhiyun 					    unsigned int Register,
22*4882a593Smuzhiyun 					    unsigned char Value);
23*4882a593Smuzhiyun static inline unsigned char nsp_index_read(unsigned int BaseAddr,
24*4882a593Smuzhiyun 					   unsigned int Register);
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun /*******************************************************************
27*4882a593Smuzhiyun  * Basic IO
28*4882a593Smuzhiyun  */
29*4882a593Smuzhiyun 
nsp_write(unsigned int base,unsigned int index,unsigned char val)30*4882a593Smuzhiyun static inline void nsp_write(unsigned int  base,
31*4882a593Smuzhiyun 			     unsigned int  index,
32*4882a593Smuzhiyun 			     unsigned char val)
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun 	outb(val, (base + index));
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun 
nsp_read(unsigned int base,unsigned int index)37*4882a593Smuzhiyun static inline unsigned char nsp_read(unsigned int base,
38*4882a593Smuzhiyun 				     unsigned int index)
39*4882a593Smuzhiyun {
40*4882a593Smuzhiyun 	return inb(base + index);
41*4882a593Smuzhiyun }
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun /**********************************************************************
45*4882a593Smuzhiyun  * Indexed IO
46*4882a593Smuzhiyun  */
nsp_index_read(unsigned int BaseAddr,unsigned int Register)47*4882a593Smuzhiyun static inline unsigned char nsp_index_read(unsigned int BaseAddr,
48*4882a593Smuzhiyun 					   unsigned int Register)
49*4882a593Smuzhiyun {
50*4882a593Smuzhiyun 	outb(Register, BaseAddr + INDEXREG);
51*4882a593Smuzhiyun 	return inb(BaseAddr + DATAREG);
52*4882a593Smuzhiyun }
53*4882a593Smuzhiyun 
nsp_index_write(unsigned int BaseAddr,unsigned int Register,unsigned char Value)54*4882a593Smuzhiyun static inline void nsp_index_write(unsigned int  BaseAddr,
55*4882a593Smuzhiyun 				   unsigned int  Register,
56*4882a593Smuzhiyun 				   unsigned char Value)
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun 	outb(Register, BaseAddr + INDEXREG);
59*4882a593Smuzhiyun 	outb(Value, BaseAddr + DATAREG);
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun /*********************************************************************
63*4882a593Smuzhiyun  * fifo func
64*4882a593Smuzhiyun  */
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun /* read 8 bit FIFO */
nsp_multi_read_1(unsigned int BaseAddr,unsigned int Register,void * buf,unsigned long count)67*4882a593Smuzhiyun static inline void nsp_multi_read_1(unsigned int   BaseAddr,
68*4882a593Smuzhiyun 				    unsigned int   Register,
69*4882a593Smuzhiyun 				    void          *buf,
70*4882a593Smuzhiyun 				    unsigned long  count)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun 	insb(BaseAddr + Register, buf, count);
73*4882a593Smuzhiyun }
74*4882a593Smuzhiyun 
nsp_fifo8_read(unsigned int base,void * buf,unsigned long count)75*4882a593Smuzhiyun static inline void nsp_fifo8_read(unsigned int   base,
76*4882a593Smuzhiyun 				  void          *buf,
77*4882a593Smuzhiyun 				  unsigned long  count)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun 	/*nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx", buf, count);*/
80*4882a593Smuzhiyun 	nsp_multi_read_1(base, FIFODATA, buf, count);
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun /*--------------------------------------------------------------*/
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun /* read 16 bit FIFO */
nsp_multi_read_2(unsigned int BaseAddr,unsigned int Register,void * buf,unsigned long count)86*4882a593Smuzhiyun static inline void nsp_multi_read_2(unsigned int   BaseAddr,
87*4882a593Smuzhiyun 				    unsigned int   Register,
88*4882a593Smuzhiyun 				    void          *buf,
89*4882a593Smuzhiyun 				    unsigned long  count)
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun 	insw(BaseAddr + Register, buf, count);
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun 
nsp_fifo16_read(unsigned int base,void * buf,unsigned long count)94*4882a593Smuzhiyun static inline void nsp_fifo16_read(unsigned int   base,
95*4882a593Smuzhiyun 				   void          *buf,
96*4882a593Smuzhiyun 				   unsigned long  count)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun 	//nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*2", buf, count);
99*4882a593Smuzhiyun 	nsp_multi_read_2(base, FIFODATA, buf, count);
100*4882a593Smuzhiyun }
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun /*--------------------------------------------------------------*/
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun /* read 32bit FIFO */
nsp_multi_read_4(unsigned int BaseAddr,unsigned int Register,void * buf,unsigned long count)105*4882a593Smuzhiyun static inline void nsp_multi_read_4(unsigned int   BaseAddr,
106*4882a593Smuzhiyun 				    unsigned int   Register,
107*4882a593Smuzhiyun 				    void          *buf,
108*4882a593Smuzhiyun 				    unsigned long  count)
109*4882a593Smuzhiyun {
110*4882a593Smuzhiyun 	insl(BaseAddr + Register, buf, count);
111*4882a593Smuzhiyun }
112*4882a593Smuzhiyun 
nsp_fifo32_read(unsigned int base,void * buf,unsigned long count)113*4882a593Smuzhiyun static inline void nsp_fifo32_read(unsigned int   base,
114*4882a593Smuzhiyun 				   void          *buf,
115*4882a593Smuzhiyun 				   unsigned long  count)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun 	//nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*4", buf, count);
118*4882a593Smuzhiyun 	nsp_multi_read_4(base, FIFODATA, buf, count);
119*4882a593Smuzhiyun }
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun /*----------------------------------------------------------*/
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun /* write 8bit FIFO */
nsp_multi_write_1(unsigned int BaseAddr,unsigned int Register,void * buf,unsigned long count)124*4882a593Smuzhiyun static inline void nsp_multi_write_1(unsigned int   BaseAddr,
125*4882a593Smuzhiyun 				     unsigned int   Register,
126*4882a593Smuzhiyun 				     void          *buf,
127*4882a593Smuzhiyun 				     unsigned long  count)
128*4882a593Smuzhiyun {
129*4882a593Smuzhiyun 	outsb(BaseAddr + Register, buf, count);
130*4882a593Smuzhiyun }
131*4882a593Smuzhiyun 
nsp_fifo8_write(unsigned int base,void * buf,unsigned long count)132*4882a593Smuzhiyun static inline void nsp_fifo8_write(unsigned int   base,
133*4882a593Smuzhiyun 				   void          *buf,
134*4882a593Smuzhiyun 				   unsigned long  count)
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun 	nsp_multi_write_1(base, FIFODATA, buf, count);
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun /*---------------------------------------------------------*/
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun /* write 16bit FIFO */
nsp_multi_write_2(unsigned int BaseAddr,unsigned int Register,void * buf,unsigned long count)142*4882a593Smuzhiyun static inline void nsp_multi_write_2(unsigned int   BaseAddr,
143*4882a593Smuzhiyun 				     unsigned int   Register,
144*4882a593Smuzhiyun 				     void          *buf,
145*4882a593Smuzhiyun 				     unsigned long  count)
146*4882a593Smuzhiyun {
147*4882a593Smuzhiyun 	outsw(BaseAddr + Register, buf, count);
148*4882a593Smuzhiyun }
149*4882a593Smuzhiyun 
nsp_fifo16_write(unsigned int base,void * buf,unsigned long count)150*4882a593Smuzhiyun static inline void nsp_fifo16_write(unsigned int   base,
151*4882a593Smuzhiyun 				    void          *buf,
152*4882a593Smuzhiyun 				    unsigned long  count)
153*4882a593Smuzhiyun {
154*4882a593Smuzhiyun 	nsp_multi_write_2(base, FIFODATA, buf, count);
155*4882a593Smuzhiyun }
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun /*---------------------------------------------------------*/
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun /* write 32bit FIFO */
nsp_multi_write_4(unsigned int BaseAddr,unsigned int Register,void * buf,unsigned long count)160*4882a593Smuzhiyun static inline void nsp_multi_write_4(unsigned int   BaseAddr,
161*4882a593Smuzhiyun 				     unsigned int   Register,
162*4882a593Smuzhiyun 				     void          *buf,
163*4882a593Smuzhiyun 				     unsigned long  count)
164*4882a593Smuzhiyun {
165*4882a593Smuzhiyun 	outsl(BaseAddr + Register, buf, count);
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun 
nsp_fifo32_write(unsigned int base,void * buf,unsigned long count)168*4882a593Smuzhiyun static inline void nsp_fifo32_write(unsigned int   base,
169*4882a593Smuzhiyun 				    void          *buf,
170*4882a593Smuzhiyun 				    unsigned long  count)
171*4882a593Smuzhiyun {
172*4882a593Smuzhiyun 	nsp_multi_write_4(base, FIFODATA, buf, count);
173*4882a593Smuzhiyun }
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun /*====================================================================*/
177*4882a593Smuzhiyun 
nsp_mmio_write(unsigned long base,unsigned int index,unsigned char val)178*4882a593Smuzhiyun static inline void nsp_mmio_write(unsigned long base,
179*4882a593Smuzhiyun 				  unsigned int  index,
180*4882a593Smuzhiyun 				  unsigned char val)
181*4882a593Smuzhiyun {
182*4882a593Smuzhiyun 	unsigned char *ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + index);
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun 	writeb(val, ptr);
185*4882a593Smuzhiyun }
186*4882a593Smuzhiyun 
nsp_mmio_read(unsigned long base,unsigned int index)187*4882a593Smuzhiyun static inline unsigned char nsp_mmio_read(unsigned long base,
188*4882a593Smuzhiyun 					  unsigned int  index)
189*4882a593Smuzhiyun {
190*4882a593Smuzhiyun 	unsigned char *ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + index);
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun 	return readb(ptr);
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun /*-----------*/
196*4882a593Smuzhiyun 
nsp_mmio_index_read(unsigned long base,unsigned int reg)197*4882a593Smuzhiyun static inline unsigned char nsp_mmio_index_read(unsigned long base,
198*4882a593Smuzhiyun 						unsigned int  reg)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun 	unsigned char *index_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + INDEXREG);
201*4882a593Smuzhiyun 	unsigned char *data_ptr  = (unsigned char *)(base + NSP_MMIO_OFFSET + DATAREG);
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun 	writeb((unsigned char)reg, index_ptr);
204*4882a593Smuzhiyun 	return readb(data_ptr);
205*4882a593Smuzhiyun }
206*4882a593Smuzhiyun 
nsp_mmio_index_write(unsigned long base,unsigned int reg,unsigned char val)207*4882a593Smuzhiyun static inline void nsp_mmio_index_write(unsigned long base,
208*4882a593Smuzhiyun 					unsigned int  reg,
209*4882a593Smuzhiyun 					unsigned char val)
210*4882a593Smuzhiyun {
211*4882a593Smuzhiyun 	unsigned char *index_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + INDEXREG);
212*4882a593Smuzhiyun 	unsigned char *data_ptr  = (unsigned char *)(base + NSP_MMIO_OFFSET + DATAREG);
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun 	writeb((unsigned char)reg, index_ptr);
215*4882a593Smuzhiyun 	writeb(val,                data_ptr);
216*4882a593Smuzhiyun }
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun /* read 32bit FIFO */
nsp_mmio_multi_read_4(unsigned long base,unsigned int Register,void * buf,unsigned long count)219*4882a593Smuzhiyun static inline void nsp_mmio_multi_read_4(unsigned long  base,
220*4882a593Smuzhiyun 					 unsigned int   Register,
221*4882a593Smuzhiyun 					 void          *buf,
222*4882a593Smuzhiyun 					 unsigned long  count)
223*4882a593Smuzhiyun {
224*4882a593Smuzhiyun 	unsigned long *ptr = (unsigned long *)(base + Register);
225*4882a593Smuzhiyun 	unsigned long *tmp = (unsigned long *)buf;
226*4882a593Smuzhiyun 	int i;
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun 	//nsp_dbg(NSP_DEBUG_DATA_IO, "base 0x%0lx ptr 0x%p",base,ptr);
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 	for (i = 0; i < count; i++) {
231*4882a593Smuzhiyun 		*tmp = readl(ptr);
232*4882a593Smuzhiyun 		//nsp_dbg(NSP_DEBUG_DATA_IO, "<%d,%p,%p,%lx>", i, ptr, tmp, *tmp);
233*4882a593Smuzhiyun 		tmp++;
234*4882a593Smuzhiyun 	}
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun 
nsp_mmio_fifo32_read(unsigned int base,void * buf,unsigned long count)237*4882a593Smuzhiyun static inline void nsp_mmio_fifo32_read(unsigned int   base,
238*4882a593Smuzhiyun 					void          *buf,
239*4882a593Smuzhiyun 					unsigned long  count)
240*4882a593Smuzhiyun {
241*4882a593Smuzhiyun 	//nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*4", buf, count);
242*4882a593Smuzhiyun 	nsp_mmio_multi_read_4(base, FIFODATA, buf, count);
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun 
nsp_mmio_multi_write_4(unsigned long base,unsigned int Register,void * buf,unsigned long count)245*4882a593Smuzhiyun static inline void nsp_mmio_multi_write_4(unsigned long  base,
246*4882a593Smuzhiyun 					  unsigned int   Register,
247*4882a593Smuzhiyun 					  void          *buf,
248*4882a593Smuzhiyun 					  unsigned long  count)
249*4882a593Smuzhiyun {
250*4882a593Smuzhiyun 	unsigned long *ptr = (unsigned long *)(base + Register);
251*4882a593Smuzhiyun 	unsigned long *tmp = (unsigned long *)buf;
252*4882a593Smuzhiyun 	int i;
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun 	//nsp_dbg(NSP_DEBUG_DATA_IO, "base 0x%0lx ptr 0x%p",base,ptr);
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	for (i = 0; i < count; i++) {
257*4882a593Smuzhiyun 		writel(*tmp, ptr);
258*4882a593Smuzhiyun 		//nsp_dbg(NSP_DEBUG_DATA_IO, "<%d,%p,%p,%lx>", i, ptr, tmp, *tmp);
259*4882a593Smuzhiyun 		tmp++;
260*4882a593Smuzhiyun 	}
261*4882a593Smuzhiyun }
262*4882a593Smuzhiyun 
nsp_mmio_fifo32_write(unsigned int base,void * buf,unsigned long count)263*4882a593Smuzhiyun static inline void nsp_mmio_fifo32_write(unsigned int   base,
264*4882a593Smuzhiyun 					 void          *buf,
265*4882a593Smuzhiyun 					 unsigned long  count)
266*4882a593Smuzhiyun {
267*4882a593Smuzhiyun 	//nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*4", buf, count);
268*4882a593Smuzhiyun 	nsp_mmio_multi_write_4(base, FIFODATA, buf, count);
269*4882a593Smuzhiyun }
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun #endif
274*4882a593Smuzhiyun /* end */
275