1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Workbit NinjaSCSI-32Bi/UDE PCI/CardBus SCSI Host Bus Adapter driver
3*4882a593Smuzhiyun * I/O routine
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 #ifndef _NSP32_IO_H
10*4882a593Smuzhiyun #define _NSP32_IO_H
11*4882a593Smuzhiyun
nsp32_write1(unsigned int base,unsigned int index,unsigned char val)12*4882a593Smuzhiyun static inline void nsp32_write1(unsigned int base,
13*4882a593Smuzhiyun unsigned int index,
14*4882a593Smuzhiyun unsigned char val)
15*4882a593Smuzhiyun {
16*4882a593Smuzhiyun outb(val, (base + index));
17*4882a593Smuzhiyun }
18*4882a593Smuzhiyun
nsp32_read1(unsigned int base,unsigned int index)19*4882a593Smuzhiyun static inline unsigned char nsp32_read1(unsigned int base,
20*4882a593Smuzhiyun unsigned int index)
21*4882a593Smuzhiyun {
22*4882a593Smuzhiyun return inb(base + index);
23*4882a593Smuzhiyun }
24*4882a593Smuzhiyun
nsp32_write2(unsigned int base,unsigned int index,unsigned short val)25*4882a593Smuzhiyun static inline void nsp32_write2(unsigned int base,
26*4882a593Smuzhiyun unsigned int index,
27*4882a593Smuzhiyun unsigned short val)
28*4882a593Smuzhiyun {
29*4882a593Smuzhiyun outw(val, (base + index));
30*4882a593Smuzhiyun }
31*4882a593Smuzhiyun
nsp32_read2(unsigned int base,unsigned int index)32*4882a593Smuzhiyun static inline unsigned short nsp32_read2(unsigned int base,
33*4882a593Smuzhiyun unsigned int index)
34*4882a593Smuzhiyun {
35*4882a593Smuzhiyun return inw(base + index);
36*4882a593Smuzhiyun }
37*4882a593Smuzhiyun
nsp32_write4(unsigned int base,unsigned int index,unsigned long val)38*4882a593Smuzhiyun static inline void nsp32_write4(unsigned int base,
39*4882a593Smuzhiyun unsigned int index,
40*4882a593Smuzhiyun unsigned long val)
41*4882a593Smuzhiyun {
42*4882a593Smuzhiyun outl(val, (base + index));
43*4882a593Smuzhiyun }
44*4882a593Smuzhiyun
nsp32_read4(unsigned int base,unsigned int index)45*4882a593Smuzhiyun static inline unsigned long nsp32_read4(unsigned int base,
46*4882a593Smuzhiyun unsigned int index)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun return inl(base + index);
49*4882a593Smuzhiyun }
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun /*==============================================*/
52*4882a593Smuzhiyun
nsp32_mmio_write1(unsigned long base,unsigned int index,unsigned char val)53*4882a593Smuzhiyun static inline void nsp32_mmio_write1(unsigned long base,
54*4882a593Smuzhiyun unsigned int index,
55*4882a593Smuzhiyun unsigned char val)
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun volatile unsigned char *ptr;
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun ptr = (unsigned char *)(base + NSP32_MMIO_OFFSET + index);
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun writeb(val, ptr);
62*4882a593Smuzhiyun }
63*4882a593Smuzhiyun
nsp32_mmio_read1(unsigned long base,unsigned int index)64*4882a593Smuzhiyun static inline unsigned char nsp32_mmio_read1(unsigned long base,
65*4882a593Smuzhiyun unsigned int index)
66*4882a593Smuzhiyun {
67*4882a593Smuzhiyun volatile unsigned char *ptr;
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun ptr = (unsigned char *)(base + NSP32_MMIO_OFFSET + index);
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun return readb(ptr);
72*4882a593Smuzhiyun }
73*4882a593Smuzhiyun
nsp32_mmio_write2(unsigned long base,unsigned int index,unsigned short val)74*4882a593Smuzhiyun static inline void nsp32_mmio_write2(unsigned long base,
75*4882a593Smuzhiyun unsigned int index,
76*4882a593Smuzhiyun unsigned short val)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun volatile unsigned short *ptr;
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + index);
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun writew(cpu_to_le16(val), ptr);
83*4882a593Smuzhiyun }
84*4882a593Smuzhiyun
nsp32_mmio_read2(unsigned long base,unsigned int index)85*4882a593Smuzhiyun static inline unsigned short nsp32_mmio_read2(unsigned long base,
86*4882a593Smuzhiyun unsigned int index)
87*4882a593Smuzhiyun {
88*4882a593Smuzhiyun volatile unsigned short *ptr;
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + index);
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun return le16_to_cpu(readw(ptr));
93*4882a593Smuzhiyun }
94*4882a593Smuzhiyun
nsp32_mmio_write4(unsigned long base,unsigned int index,unsigned long val)95*4882a593Smuzhiyun static inline void nsp32_mmio_write4(unsigned long base,
96*4882a593Smuzhiyun unsigned int index,
97*4882a593Smuzhiyun unsigned long val)
98*4882a593Smuzhiyun {
99*4882a593Smuzhiyun volatile unsigned long *ptr;
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun ptr = (unsigned long *)(base + NSP32_MMIO_OFFSET + index);
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun writel(cpu_to_le32(val), ptr);
104*4882a593Smuzhiyun }
105*4882a593Smuzhiyun
nsp32_mmio_read4(unsigned long base,unsigned int index)106*4882a593Smuzhiyun static inline unsigned long nsp32_mmio_read4(unsigned long base,
107*4882a593Smuzhiyun unsigned int index)
108*4882a593Smuzhiyun {
109*4882a593Smuzhiyun volatile unsigned long *ptr;
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun ptr = (unsigned long *)(base + NSP32_MMIO_OFFSET + index);
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun return le32_to_cpu(readl(ptr));
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun /*==============================================*/
117*4882a593Smuzhiyun
nsp32_index_read1(unsigned int base,unsigned int reg)118*4882a593Smuzhiyun static inline unsigned char nsp32_index_read1(unsigned int base,
119*4882a593Smuzhiyun unsigned int reg)
120*4882a593Smuzhiyun {
121*4882a593Smuzhiyun outb(reg, base + INDEX_REG);
122*4882a593Smuzhiyun return inb(base + DATA_REG_LOW);
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun
nsp32_index_write1(unsigned int base,unsigned int reg,unsigned char val)125*4882a593Smuzhiyun static inline void nsp32_index_write1(unsigned int base,
126*4882a593Smuzhiyun unsigned int reg,
127*4882a593Smuzhiyun unsigned char val)
128*4882a593Smuzhiyun {
129*4882a593Smuzhiyun outb(reg, base + INDEX_REG );
130*4882a593Smuzhiyun outb(val, base + DATA_REG_LOW);
131*4882a593Smuzhiyun }
132*4882a593Smuzhiyun
nsp32_index_read2(unsigned int base,unsigned int reg)133*4882a593Smuzhiyun static inline unsigned short nsp32_index_read2(unsigned int base,
134*4882a593Smuzhiyun unsigned int reg)
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun outb(reg, base + INDEX_REG);
137*4882a593Smuzhiyun return inw(base + DATA_REG_LOW);
138*4882a593Smuzhiyun }
139*4882a593Smuzhiyun
nsp32_index_write2(unsigned int base,unsigned int reg,unsigned short val)140*4882a593Smuzhiyun static inline void nsp32_index_write2(unsigned int base,
141*4882a593Smuzhiyun unsigned int reg,
142*4882a593Smuzhiyun unsigned short val)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun outb(reg, base + INDEX_REG );
145*4882a593Smuzhiyun outw(val, base + DATA_REG_LOW);
146*4882a593Smuzhiyun }
147*4882a593Smuzhiyun
nsp32_index_read4(unsigned int base,unsigned int reg)148*4882a593Smuzhiyun static inline unsigned long nsp32_index_read4(unsigned int base,
149*4882a593Smuzhiyun unsigned int reg)
150*4882a593Smuzhiyun {
151*4882a593Smuzhiyun unsigned long h,l;
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun outb(reg, base + INDEX_REG);
154*4882a593Smuzhiyun l = inw(base + DATA_REG_LOW);
155*4882a593Smuzhiyun h = inw(base + DATA_REG_HI );
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun return ((h << 16) | l);
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun
nsp32_index_write4(unsigned int base,unsigned int reg,unsigned long val)160*4882a593Smuzhiyun static inline void nsp32_index_write4(unsigned int base,
161*4882a593Smuzhiyun unsigned int reg,
162*4882a593Smuzhiyun unsigned long val)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun unsigned long h,l;
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun h = (val & 0xffff0000) >> 16;
167*4882a593Smuzhiyun l = (val & 0x0000ffff) >> 0;
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun outb(reg, base + INDEX_REG );
170*4882a593Smuzhiyun outw(l, base + DATA_REG_LOW);
171*4882a593Smuzhiyun outw(h, base + DATA_REG_HI );
172*4882a593Smuzhiyun }
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun /*==============================================*/
175*4882a593Smuzhiyun
nsp32_mmio_index_read1(unsigned long base,unsigned int reg)176*4882a593Smuzhiyun static inline unsigned char nsp32_mmio_index_read1(unsigned long base,
177*4882a593Smuzhiyun unsigned int reg)
178*4882a593Smuzhiyun {
179*4882a593Smuzhiyun volatile unsigned short *index_ptr, *data_ptr;
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun index_ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + INDEX_REG);
182*4882a593Smuzhiyun data_ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + DATA_REG_LOW);
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun writeb(reg, index_ptr);
185*4882a593Smuzhiyun return readb(data_ptr);
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun
nsp32_mmio_index_write1(unsigned long base,unsigned int reg,unsigned char val)188*4882a593Smuzhiyun static inline void nsp32_mmio_index_write1(unsigned long base,
189*4882a593Smuzhiyun unsigned int reg,
190*4882a593Smuzhiyun unsigned char val)
191*4882a593Smuzhiyun {
192*4882a593Smuzhiyun volatile unsigned short *index_ptr, *data_ptr;
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun index_ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + INDEX_REG);
195*4882a593Smuzhiyun data_ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + DATA_REG_LOW);
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun writeb(reg, index_ptr);
198*4882a593Smuzhiyun writeb(val, data_ptr );
199*4882a593Smuzhiyun }
200*4882a593Smuzhiyun
nsp32_mmio_index_read2(unsigned long base,unsigned int reg)201*4882a593Smuzhiyun static inline unsigned short nsp32_mmio_index_read2(unsigned long base,
202*4882a593Smuzhiyun unsigned int reg)
203*4882a593Smuzhiyun {
204*4882a593Smuzhiyun volatile unsigned short *index_ptr, *data_ptr;
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun index_ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + INDEX_REG);
207*4882a593Smuzhiyun data_ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + DATA_REG_LOW);
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun writeb(reg, index_ptr);
210*4882a593Smuzhiyun return le16_to_cpu(readw(data_ptr));
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun
nsp32_mmio_index_write2(unsigned long base,unsigned int reg,unsigned short val)213*4882a593Smuzhiyun static inline void nsp32_mmio_index_write2(unsigned long base,
214*4882a593Smuzhiyun unsigned int reg,
215*4882a593Smuzhiyun unsigned short val)
216*4882a593Smuzhiyun {
217*4882a593Smuzhiyun volatile unsigned short *index_ptr, *data_ptr;
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun index_ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + INDEX_REG);
220*4882a593Smuzhiyun data_ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + DATA_REG_LOW);
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun writeb(reg, index_ptr);
223*4882a593Smuzhiyun writew(cpu_to_le16(val), data_ptr );
224*4882a593Smuzhiyun }
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun /*==============================================*/
227*4882a593Smuzhiyun
nsp32_multi_read4(unsigned int base,unsigned int reg,void * buf,unsigned long count)228*4882a593Smuzhiyun static inline void nsp32_multi_read4(unsigned int base,
229*4882a593Smuzhiyun unsigned int reg,
230*4882a593Smuzhiyun void *buf,
231*4882a593Smuzhiyun unsigned long count)
232*4882a593Smuzhiyun {
233*4882a593Smuzhiyun insl(base + reg, buf, count);
234*4882a593Smuzhiyun }
235*4882a593Smuzhiyun
nsp32_fifo_read(unsigned int base,void * buf,unsigned long count)236*4882a593Smuzhiyun static inline void nsp32_fifo_read(unsigned int base,
237*4882a593Smuzhiyun void *buf,
238*4882a593Smuzhiyun unsigned long count)
239*4882a593Smuzhiyun {
240*4882a593Smuzhiyun nsp32_multi_read4(base, FIFO_DATA_LOW, buf, count);
241*4882a593Smuzhiyun }
242*4882a593Smuzhiyun
nsp32_multi_write4(unsigned int base,unsigned int reg,void * buf,unsigned long count)243*4882a593Smuzhiyun static inline void nsp32_multi_write4(unsigned int base,
244*4882a593Smuzhiyun unsigned int reg,
245*4882a593Smuzhiyun void *buf,
246*4882a593Smuzhiyun unsigned long count)
247*4882a593Smuzhiyun {
248*4882a593Smuzhiyun outsl(base + reg, buf, count);
249*4882a593Smuzhiyun }
250*4882a593Smuzhiyun
nsp32_fifo_write(unsigned int base,void * buf,unsigned long count)251*4882a593Smuzhiyun static inline void nsp32_fifo_write(unsigned int base,
252*4882a593Smuzhiyun void *buf,
253*4882a593Smuzhiyun unsigned long count)
254*4882a593Smuzhiyun {
255*4882a593Smuzhiyun nsp32_multi_write4(base, FIFO_DATA_LOW, buf, count);
256*4882a593Smuzhiyun }
257*4882a593Smuzhiyun
258*4882a593Smuzhiyun #endif /* _NSP32_IO_H */
259*4882a593Smuzhiyun /* end */
260