drivers/net: return operator cleanup
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / net / irda / via-ircc.h
1 /*********************************************************************
2 *
3 * Filename: via-ircc.h
4 * Version: 1.0
5 * Description: Driver for the VIA VT8231/VT8233 IrDA chipsets
6 * Author: VIA Technologies, inc
7 * Date : 08/06/2003
8
9 Copyright (c) 1998-2003 VIA Technologies, Inc.
10
11 This program is free software; you can redistribute it and/or modify it under
12 the terms of the GNU General Public License as published by the Free Software
13 Foundation; either version 2, or (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful, but WITHOUT
16 ANY WARRANTIES OR REPRESENTATIONS; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License along with
21 this program; if not, write to the Free Software Foundation, Inc.,
22 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23
24 * Comment:
25 * jul/08/2002 : Rx buffer length should use Rx ring ptr.
26 * Oct/28/2002 : Add SB id for 3147 and 3177.
27 * jul/09/2002 : only implement two kind of dongle currently.
28 * Oct/02/2002 : work on VT8231 and VT8233 .
29 * Aug/06/2003 : change driver format to pci driver .
30 ********************************************************************/
31 #ifndef via_IRCC_H
32 #define via_IRCC_H
33 #include <linux/time.h>
34 #include <linux/spinlock.h>
35 #include <linux/pm.h>
36 #include <linux/types.h>
37 #include <asm/io.h>
38
39 #define MAX_TX_WINDOW 7
40 #define MAX_RX_WINDOW 7
41
42 struct st_fifo_entry {
43 int status;
44 int len;
45 };
46
47 struct st_fifo {
48 struct st_fifo_entry entries[MAX_RX_WINDOW + 2];
49 int pending_bytes;
50 int head;
51 int tail;
52 int len;
53 };
54
55 struct frame_cb {
56 void *start; /* Start of frame in DMA mem */
57 int len; /* Length of frame in DMA mem */
58 };
59
60 struct tx_fifo {
61 struct frame_cb queue[MAX_TX_WINDOW + 2]; /* Info about frames in queue */
62 int ptr; /* Currently being sent */
63 int len; /* Length of queue */
64 int free; /* Next free slot */
65 void *tail; /* Next free start in DMA mem */
66 };
67
68
69 struct eventflag // for keeping track of Interrupt Events
70 {
71 //--------tx part
72 unsigned char TxFIFOUnderRun;
73 unsigned char EOMessage;
74 unsigned char TxFIFOReady;
75 unsigned char EarlyEOM;
76 //--------rx part
77 unsigned char PHYErr;
78 unsigned char CRCErr;
79 unsigned char RxFIFOOverRun;
80 unsigned char EOPacket;
81 unsigned char RxAvail;
82 unsigned char TooLargePacket;
83 unsigned char SIRBad;
84 //--------unknown
85 unsigned char Unknown;
86 //----------
87 unsigned char TimeOut;
88 unsigned char RxDMATC;
89 unsigned char TxDMATC;
90 };
91
92 /* Private data for each instance */
93 struct via_ircc_cb {
94 struct st_fifo st_fifo; /* Info about received frames */
95 struct tx_fifo tx_fifo; /* Info about frames to be transmitted */
96
97 struct net_device *netdev; /* Yes! we are some kind of netdevice */
98
99 struct irlap_cb *irlap; /* The link layer we are binded to */
100 struct qos_info qos; /* QoS capabilities for this device */
101
102 chipio_t io; /* IrDA controller information */
103 iobuff_t tx_buff; /* Transmit buffer */
104 iobuff_t rx_buff; /* Receive buffer */
105 dma_addr_t tx_buff_dma;
106 dma_addr_t rx_buff_dma;
107
108 __u8 ier; /* Interrupt enable register */
109
110 struct timeval stamp;
111 struct timeval now;
112
113 spinlock_t lock; /* For serializing operations */
114
115 __u32 flags; /* Interface flags */
116 __u32 new_speed;
117 int index; /* Instance index */
118
119 struct eventflag EventFlag;
120 unsigned int chip_id; /* to remember chip id */
121 unsigned int RetryCount;
122 unsigned int RxDataReady;
123 unsigned int RxLastCount;
124 };
125
126
127 //---------I=Infrared, H=Host, M=Misc, T=Tx, R=Rx, ST=Status,
128 // CF=Config, CT=Control, L=Low, H=High, C=Count
129 #define I_CF_L_0 0x10
130 #define I_CF_H_0 0x11
131 #define I_SIR_BOF 0x12
132 #define I_SIR_EOF 0x13
133 #define I_ST_CT_0 0x15
134 #define I_ST_L_1 0x16
135 #define I_ST_H_1 0x17
136 #define I_CF_L_1 0x18
137 #define I_CF_H_1 0x19
138 #define I_CF_L_2 0x1a
139 #define I_CF_H_2 0x1b
140 #define I_CF_3 0x1e
141 #define H_CT 0x20
142 #define H_ST 0x21
143 #define M_CT 0x22
144 #define TX_CT_1 0x23
145 #define TX_CT_2 0x24
146 #define TX_ST 0x25
147 #define RX_CT 0x26
148 #define RX_ST 0x27
149 #define RESET 0x28
150 #define P_ADDR 0x29
151 #define RX_C_L 0x2a
152 #define RX_C_H 0x2b
153 #define RX_P_L 0x2c
154 #define RX_P_H 0x2d
155 #define TX_C_L 0x2e
156 #define TX_C_H 0x2f
157 #define TIMER 0x32
158 #define I_CF_4 0x33
159 #define I_T_C_L 0x34
160 #define I_T_C_H 0x35
161 #define VERSION 0x3f
162 //-------------------------------
163 #define StartAddr 0x10 // the first register address
164 #define EndAddr 0x3f // the last register address
165 #define GetBit(val,bit) val = (unsigned char) ((val>>bit) & 0x1)
166 // Returns the bit
167 #define SetBit(val,bit) val= (unsigned char ) (val | (0x1 << bit))
168 // Sets bit to 1
169 #define ResetBit(val,bit) val= (unsigned char ) (val & ~(0x1 << bit))
170 // Sets bit to 0
171
172 #define OFF 0
173 #define ON 1
174 #define DMA_TX_MODE 0x08
175 #define DMA_RX_MODE 0x04
176
177 #define DMA1 0
178 #define DMA2 0xc0
179 #define MASK1 DMA1+0x0a
180 #define MASK2 DMA2+0x14
181
182 #define Clk_bit 0x40
183 #define Tx_bit 0x01
184 #define Rd_Valid 0x08
185 #define RxBit 0x08
186
187 static void DisableDmaChannel(unsigned int channel)
188 {
189 switch (channel) { // 8 Bit DMA channels DMAC1
190 case 0:
191 outb(4, MASK1); //mask channel 0
192 break;
193 case 1:
194 outb(5, MASK1); //Mask channel 1
195 break;
196 case 2:
197 outb(6, MASK1); //Mask channel 2
198 break;
199 case 3:
200 outb(7, MASK1); //Mask channel 3
201 break;
202 case 5:
203 outb(5, MASK2); //Mask channel 5
204 break;
205 case 6:
206 outb(6, MASK2); //Mask channel 6
207 break;
208 case 7:
209 outb(7, MASK2); //Mask channel 7
210 break;
211 default:
212 break;
213 }; //Switch
214 }
215
216 static unsigned char ReadLPCReg(int iRegNum)
217 {
218 unsigned char iVal;
219
220 outb(0x87, 0x2e);
221 outb(0x87, 0x2e);
222 outb(iRegNum, 0x2e);
223 iVal = inb(0x2f);
224 outb(0xaa, 0x2e);
225
226 return iVal;
227 }
228
229 static void WriteLPCReg(int iRegNum, unsigned char iVal)
230 {
231
232 outb(0x87, 0x2e);
233 outb(0x87, 0x2e);
234 outb(iRegNum, 0x2e);
235 outb(iVal, 0x2f);
236 outb(0xAA, 0x2e);
237 }
238
239 static __u8 ReadReg(unsigned int BaseAddr, int iRegNum)
240 {
241 return (__u8) inb(BaseAddr + iRegNum);
242 }
243
244 static void WriteReg(unsigned int BaseAddr, int iRegNum, unsigned char iVal)
245 {
246 outb(iVal, BaseAddr + iRegNum);
247 }
248
249 static int WriteRegBit(unsigned int BaseAddr, unsigned char RegNum,
250 unsigned char BitPos, unsigned char value)
251 {
252 __u8 Rtemp, Wtemp;
253
254 if (BitPos > 7) {
255 return -1;
256 }
257 if ((RegNum < StartAddr) || (RegNum > EndAddr))
258 return -1;
259 Rtemp = ReadReg(BaseAddr, RegNum);
260 if (value == 0)
261 Wtemp = ResetBit(Rtemp, BitPos);
262 else {
263 if (value == 1)
264 Wtemp = SetBit(Rtemp, BitPos);
265 else
266 return -1;
267 }
268 WriteReg(BaseAddr, RegNum, Wtemp);
269 return 0;
270 }
271
272 static __u8 CheckRegBit(unsigned int BaseAddr, unsigned char RegNum,
273 unsigned char BitPos)
274 {
275 __u8 temp;
276
277 if (BitPos > 7)
278 return 0xff;
279 if ((RegNum < StartAddr) || (RegNum > EndAddr)) {
280 // printf("what is the register %x!\n",RegNum);
281 }
282 temp = ReadReg(BaseAddr, RegNum);
283 return GetBit(temp, BitPos);
284 }
285
286 static void SetMaxRxPacketSize(__u16 iobase, __u16 size)
287 {
288 __u16 low, high;
289 if ((size & 0xe000) == 0) {
290 low = size & 0x00ff;
291 high = (size & 0x1f00) >> 8;
292 WriteReg(iobase, I_CF_L_2, low);
293 WriteReg(iobase, I_CF_H_2, high);
294
295 }
296
297 }
298
299 //for both Rx and Tx
300
301 static void SetFIFO(__u16 iobase, __u16 value)
302 {
303 switch (value) {
304 case 128:
305 WriteRegBit(iobase, 0x11, 0, 0);
306 WriteRegBit(iobase, 0x11, 7, 1);
307 break;
308 case 64:
309 WriteRegBit(iobase, 0x11, 0, 0);
310 WriteRegBit(iobase, 0x11, 7, 0);
311 break;
312 case 32:
313 WriteRegBit(iobase, 0x11, 0, 1);
314 WriteRegBit(iobase, 0x11, 7, 0);
315 break;
316 default:
317 WriteRegBit(iobase, 0x11, 0, 0);
318 WriteRegBit(iobase, 0x11, 7, 0);
319 }
320
321 }
322
323 #define CRC16(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_L_0,7,val) //0 for 32 CRC
324 /*
325 #define SetVFIR(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_H_0,5,val)
326 #define SetFIR(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_L_0,6,val)
327 #define SetMIR(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_L_0,5,val)
328 #define SetSIR(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_L_0,4,val)
329 */
330 #define SIRFilter(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_L_0,3,val)
331 #define Filter(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_L_0,2,val)
332 #define InvertTX(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_L_0,1,val)
333 #define InvertRX(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_L_0,0,val)
334 //****************************I_CF_H_0
335 #define EnableTX(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_H_0,4,val)
336 #define EnableRX(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_H_0,3,val)
337 #define EnableDMA(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_H_0,2,val)
338 #define SIRRecvAny(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_H_0,1,val)
339 #define DiableTrans(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_H_0,0,val)
340 //***************************I_SIR_BOF,I_SIR_EOF
341 #define SetSIRBOF(BaseAddr,val) WriteReg(BaseAddr,I_SIR_BOF,val)
342 #define SetSIREOF(BaseAddr,val) WriteReg(BaseAddr,I_SIR_EOF,val)
343 #define GetSIRBOF(BaseAddr) ReadReg(BaseAddr,I_SIR_BOF)
344 #define GetSIREOF(BaseAddr) ReadReg(BaseAddr,I_SIR_EOF)
345 //*******************I_ST_CT_0
346 #define EnPhys(BaseAddr,val) WriteRegBit(BaseAddr,I_ST_CT_0,7,val)
347 #define IsModeError(BaseAddr) CheckRegBit(BaseAddr,I_ST_CT_0,6) //RO
348 #define IsVFIROn(BaseAddr) CheckRegBit(BaseAddr,0x14,0) //RO for VT1211 only
349 #define IsFIROn(BaseAddr) CheckRegBit(BaseAddr,I_ST_CT_0,5) //RO
350 #define IsMIROn(BaseAddr) CheckRegBit(BaseAddr,I_ST_CT_0,4) //RO
351 #define IsSIROn(BaseAddr) CheckRegBit(BaseAddr,I_ST_CT_0,3) //RO
352 #define IsEnableTX(BaseAddr) CheckRegBit(BaseAddr,I_ST_CT_0,2) //RO
353 #define IsEnableRX(BaseAddr) CheckRegBit(BaseAddr,I_ST_CT_0,1) //RO
354 #define Is16CRC(BaseAddr) CheckRegBit(BaseAddr,I_ST_CT_0,0) //RO
355 //***************************I_CF_3
356 #define DisableAdjacentPulseWidth(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_3,5,val) //1 disable
357 #define DisablePulseWidthAdjust(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_3,4,val) //1 disable
358 #define UseOneRX(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_3,1,val) //0 use two RX
359 #define SlowIRRXLowActive(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_3,0,val) //0 show RX high=1 in SIR
360 //***************************H_CT
361 #define EnAllInt(BaseAddr,val) WriteRegBit(BaseAddr,H_CT,7,val)
362 #define TXStart(BaseAddr,val) WriteRegBit(BaseAddr,H_CT,6,val)
363 #define RXStart(BaseAddr,val) WriteRegBit(BaseAddr,H_CT,5,val)
364 #define ClearRXInt(BaseAddr,val) WriteRegBit(BaseAddr,H_CT,4,val) // 1 clear
365 //*****************H_ST
366 #define IsRXInt(BaseAddr) CheckRegBit(BaseAddr,H_ST,4)
367 #define GetIntIndentify(BaseAddr) ((ReadReg(BaseAddr,H_ST)&0xf1) >>1)
368 #define IsHostBusy(BaseAddr) CheckRegBit(BaseAddr,H_ST,0)
369 #define GetHostStatus(BaseAddr) ReadReg(BaseAddr,H_ST) //RO
370 //**************************M_CT
371 #define EnTXDMA(BaseAddr,val) WriteRegBit(BaseAddr,M_CT,7,val)
372 #define EnRXDMA(BaseAddr,val) WriteRegBit(BaseAddr,M_CT,6,val)
373 #define SwapDMA(BaseAddr,val) WriteRegBit(BaseAddr,M_CT,5,val)
374 #define EnInternalLoop(BaseAddr,val) WriteRegBit(BaseAddr,M_CT,4,val)
375 #define EnExternalLoop(BaseAddr,val) WriteRegBit(BaseAddr,M_CT,3,val)
376 //**************************TX_CT_1
377 #define EnTXFIFOHalfLevelInt(BaseAddr,val) WriteRegBit(BaseAddr,TX_CT_1,4,val) //half empty int (1 half)
378 #define EnTXFIFOUnderrunEOMInt(BaseAddr,val) WriteRegBit(BaseAddr,TX_CT_1,5,val)
379 #define EnTXFIFOReadyInt(BaseAddr,val) WriteRegBit(BaseAddr,TX_CT_1,6,val) //int when reach it threshold (setting by bit 4)
380 //**************************TX_CT_2
381 #define ForceUnderrun(BaseAddr,val) WriteRegBit(BaseAddr,TX_CT_2,7,val) // force an underrun int
382 #define EnTXCRC(BaseAddr,val) WriteRegBit(BaseAddr,TX_CT_2,6,val) //1 for FIR,MIR...0 (not SIR)
383 #define ForceBADCRC(BaseAddr,val) WriteRegBit(BaseAddr,TX_CT_2,5,val) //force an bad CRC
384 #define SendSIP(BaseAddr,val) WriteRegBit(BaseAddr,TX_CT_2,4,val) //send indication pulse for prevent SIR disturb
385 #define ClearEnTX(BaseAddr,val) WriteRegBit(BaseAddr,TX_CT_2,3,val) // opposite to EnTX
386 //*****************TX_ST
387 #define GetTXStatus(BaseAddr) ReadReg(BaseAddr,TX_ST) //RO
388 //**************************RX_CT
389 #define EnRXSpecInt(BaseAddr,val) WriteRegBit(BaseAddr,RX_CT,0,val)
390 #define EnRXFIFOReadyInt(BaseAddr,val) WriteRegBit(BaseAddr,RX_CT,1,val) //enable int when reach it threshold (setting by bit 7)
391 #define EnRXFIFOHalfLevelInt(BaseAddr,val) WriteRegBit(BaseAddr,RX_CT,7,val) //enable int when (1) half full...or (0) just not full
392 //*****************RX_ST
393 #define GetRXStatus(BaseAddr) ReadReg(BaseAddr,RX_ST) //RO
394 //***********************P_ADDR
395 #define SetPacketAddr(BaseAddr,addr) WriteReg(BaseAddr,P_ADDR,addr)
396 //***********************I_CF_4
397 #define EnGPIOtoRX2(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_4,7,val)
398 #define EnTimerInt(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_4,1,val)
399 #define ClearTimerInt(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_4,0,val)
400 //***********************I_T_C_L
401 #define WriteGIO(BaseAddr,val) WriteRegBit(BaseAddr,I_T_C_L,7,val)
402 #define ReadGIO(BaseAddr) CheckRegBit(BaseAddr,I_T_C_L,7)
403 #define ReadRX(BaseAddr) CheckRegBit(BaseAddr,I_T_C_L,3) //RO
404 #define WriteTX(BaseAddr,val) WriteRegBit(BaseAddr,I_T_C_L,0,val)
405 //***********************I_T_C_H
406 #define EnRX2(BaseAddr,val) WriteRegBit(BaseAddr,I_T_C_H,7,val)
407 #define ReadRX2(BaseAddr) CheckRegBit(BaseAddr,I_T_C_H,7)
408 //**********************Version
409 #define GetFIRVersion(BaseAddr) ReadReg(BaseAddr,VERSION)
410
411
412 static void SetTimer(__u16 iobase, __u8 count)
413 {
414 EnTimerInt(iobase, OFF);
415 WriteReg(iobase, TIMER, count);
416 EnTimerInt(iobase, ON);
417 }
418
419
420 static void SetSendByte(__u16 iobase, __u32 count)
421 {
422 __u32 low, high;
423
424 if ((count & 0xf000) == 0) {
425 low = count & 0x00ff;
426 high = (count & 0x0f00) >> 8;
427 WriteReg(iobase, TX_C_L, low);
428 WriteReg(iobase, TX_C_H, high);
429 }
430 }
431
432 static void ResetChip(__u16 iobase, __u8 type)
433 {
434 __u8 value;
435
436 value = (type + 2) << 4;
437 WriteReg(iobase, RESET, type);
438 }
439
440 static int CkRxRecv(__u16 iobase, struct via_ircc_cb *self)
441 {
442 __u8 low, high;
443 __u16 wTmp = 0, wTmp1 = 0, wTmp_new = 0;
444
445 low = ReadReg(iobase, RX_C_L);
446 high = ReadReg(iobase, RX_C_H);
447 wTmp1 = high;
448 wTmp = (wTmp1 << 8) | low;
449 udelay(10);
450 low = ReadReg(iobase, RX_C_L);
451 high = ReadReg(iobase, RX_C_H);
452 wTmp1 = high;
453 wTmp_new = (wTmp1 << 8) | low;
454 if (wTmp_new != wTmp)
455 return 1;
456 else
457 return 0;
458
459 }
460
461 static __u16 RxCurCount(__u16 iobase, struct via_ircc_cb * self)
462 {
463 __u8 low, high;
464 __u16 wTmp = 0, wTmp1 = 0;
465
466 low = ReadReg(iobase, RX_P_L);
467 high = ReadReg(iobase, RX_P_H);
468 wTmp1 = high;
469 wTmp = (wTmp1 << 8) | low;
470 return wTmp;
471 }
472
473 /* This Routine can only use in recevie_complete
474 * for it will update last count.
475 */
476
477 static __u16 GetRecvByte(__u16 iobase, struct via_ircc_cb * self)
478 {
479 __u8 low, high;
480 __u16 wTmp, wTmp1, ret;
481
482 low = ReadReg(iobase, RX_P_L);
483 high = ReadReg(iobase, RX_P_H);
484 wTmp1 = high;
485 wTmp = (wTmp1 << 8) | low;
486
487
488 if (wTmp >= self->RxLastCount)
489 ret = wTmp - self->RxLastCount;
490 else
491 ret = (0x8000 - self->RxLastCount) + wTmp;
492 self->RxLastCount = wTmp;
493
494 /* RX_P is more actually the RX_C
495 low=ReadReg(iobase,RX_C_L);
496 high=ReadReg(iobase,RX_C_H);
497
498 if(!(high&0xe000)) {
499 temp=(high<<8)+low;
500 return temp;
501 }
502 else return 0;
503 */
504 return ret;
505 }
506
507 static void Sdelay(__u16 scale)
508 {
509 __u8 bTmp;
510 int i, j;
511
512 for (j = 0; j < scale; j++) {
513 for (i = 0; i < 0x20; i++) {
514 bTmp = inb(0xeb);
515 outb(bTmp, 0xeb);
516 }
517 }
518 }
519
520 static void Tdelay(__u16 scale)
521 {
522 __u8 bTmp;
523 int i, j;
524
525 for (j = 0; j < scale; j++) {
526 for (i = 0; i < 0x50; i++) {
527 bTmp = inb(0xeb);
528 outb(bTmp, 0xeb);
529 }
530 }
531 }
532
533
534 static void ActClk(__u16 iobase, __u8 value)
535 {
536 __u8 bTmp;
537 bTmp = ReadReg(iobase, 0x34);
538 if (value)
539 WriteReg(iobase, 0x34, bTmp | Clk_bit);
540 else
541 WriteReg(iobase, 0x34, bTmp & ~Clk_bit);
542 }
543
544 static void ClkTx(__u16 iobase, __u8 Clk, __u8 Tx)
545 {
546 __u8 bTmp;
547
548 bTmp = ReadReg(iobase, 0x34);
549 if (Clk == 0)
550 bTmp &= ~Clk_bit;
551 else {
552 if (Clk == 1)
553 bTmp |= Clk_bit;
554 }
555 WriteReg(iobase, 0x34, bTmp);
556 Sdelay(1);
557 if (Tx == 0)
558 bTmp &= ~Tx_bit;
559 else {
560 if (Tx == 1)
561 bTmp |= Tx_bit;
562 }
563 WriteReg(iobase, 0x34, bTmp);
564 }
565
566 static void Wr_Byte(__u16 iobase, __u8 data)
567 {
568 __u8 bData = data;
569 // __u8 btmp;
570 int i;
571
572 ClkTx(iobase, 0, 1);
573
574 Tdelay(2);
575 ActClk(iobase, 1);
576 Tdelay(1);
577
578 for (i = 0; i < 8; i++) { //LDN
579
580 if ((bData >> i) & 0x01) {
581 ClkTx(iobase, 0, 1); //bit data = 1;
582 } else {
583 ClkTx(iobase, 0, 0); //bit data = 1;
584 }
585 Tdelay(2);
586 Sdelay(1);
587 ActClk(iobase, 1); //clk hi
588 Tdelay(1);
589 }
590 }
591
592 static __u8 Rd_Indx(__u16 iobase, __u8 addr, __u8 index)
593 {
594 __u8 data = 0, bTmp, data_bit;
595 int i;
596
597 bTmp = addr | (index << 1) | 0;
598 ClkTx(iobase, 0, 0);
599 Tdelay(2);
600 ActClk(iobase, 1);
601 udelay(1);
602 Wr_Byte(iobase, bTmp);
603 Sdelay(1);
604 ClkTx(iobase, 0, 0);
605 Tdelay(2);
606 for (i = 0; i < 10; i++) {
607 ActClk(iobase, 1);
608 Tdelay(1);
609 ActClk(iobase, 0);
610 Tdelay(1);
611 ClkTx(iobase, 0, 1);
612 Tdelay(1);
613 bTmp = ReadReg(iobase, 0x34);
614 if (!(bTmp & Rd_Valid))
615 break;
616 }
617 if (!(bTmp & Rd_Valid)) {
618 for (i = 0; i < 8; i++) {
619 ActClk(iobase, 1);
620 Tdelay(1);
621 ActClk(iobase, 0);
622 bTmp = ReadReg(iobase, 0x34);
623 data_bit = 1 << i;
624 if (bTmp & RxBit)
625 data |= data_bit;
626 else
627 data &= ~data_bit;
628 Tdelay(2);
629 }
630 } else {
631 for (i = 0; i < 2; i++) {
632 ActClk(iobase, 1);
633 Tdelay(1);
634 ActClk(iobase, 0);
635 Tdelay(2);
636 }
637 bTmp = ReadReg(iobase, 0x34);
638 }
639 for (i = 0; i < 1; i++) {
640 ActClk(iobase, 1);
641 Tdelay(1);
642 ActClk(iobase, 0);
643 Tdelay(2);
644 }
645 ClkTx(iobase, 0, 0);
646 Tdelay(1);
647 for (i = 0; i < 3; i++) {
648 ActClk(iobase, 1);
649 Tdelay(1);
650 ActClk(iobase, 0);
651 Tdelay(2);
652 }
653 return data;
654 }
655
656 static void Wr_Indx(__u16 iobase, __u8 addr, __u8 index, __u8 data)
657 {
658 int i;
659 __u8 bTmp;
660
661 ClkTx(iobase, 0, 0);
662 udelay(2);
663 ActClk(iobase, 1);
664 udelay(1);
665 bTmp = addr | (index << 1) | 1;
666 Wr_Byte(iobase, bTmp);
667 Wr_Byte(iobase, data);
668 for (i = 0; i < 2; i++) {
669 ClkTx(iobase, 0, 0);
670 Tdelay(2);
671 ActClk(iobase, 1);
672 Tdelay(1);
673 }
674 ActClk(iobase, 0);
675 }
676
677 static void ResetDongle(__u16 iobase)
678 {
679 int i;
680 ClkTx(iobase, 0, 0);
681 Tdelay(1);
682 for (i = 0; i < 30; i++) {
683 ActClk(iobase, 1);
684 Tdelay(1);
685 ActClk(iobase, 0);
686 Tdelay(1);
687 }
688 ActClk(iobase, 0);
689 }
690
691 static void SetSITmode(__u16 iobase)
692 {
693
694 __u8 bTmp;
695
696 bTmp = ReadLPCReg(0x28);
697 WriteLPCReg(0x28, bTmp | 0x10); //select ITMOFF
698 bTmp = ReadReg(iobase, 0x35);
699 WriteReg(iobase, 0x35, bTmp | 0x40); // Driver ITMOFF
700 WriteReg(iobase, 0x28, bTmp | 0x80); // enable All interrupt
701 }
702
703 static void SI_SetMode(__u16 iobase, int mode)
704 {
705 //__u32 dTmp;
706 __u8 bTmp;
707
708 WriteLPCReg(0x28, 0x70); // S/W Reset
709 SetSITmode(iobase);
710 ResetDongle(iobase);
711 udelay(10);
712 Wr_Indx(iobase, 0x40, 0x0, 0x17); //RX ,APEN enable,Normal power
713 Wr_Indx(iobase, 0x40, 0x1, mode); //Set Mode
714 Wr_Indx(iobase, 0x40, 0x2, 0xff); //Set power to FIR VFIR > 1m
715 bTmp = Rd_Indx(iobase, 0x40, 1);
716 }
717
718 static void InitCard(__u16 iobase)
719 {
720 ResetChip(iobase, 5);
721 WriteReg(iobase, I_ST_CT_0, 0x00); // open CHIP on
722 SetSIRBOF(iobase, 0xc0); // hardware default value
723 SetSIREOF(iobase, 0xc1);
724 }
725
726 static void CommonInit(__u16 iobase)
727 {
728 // EnTXCRC(iobase,0);
729 SwapDMA(iobase, OFF);
730 SetMaxRxPacketSize(iobase, 0x0fff); //set to max:4095
731 EnRXFIFOReadyInt(iobase, OFF);
732 EnRXFIFOHalfLevelInt(iobase, OFF);
733 EnTXFIFOHalfLevelInt(iobase, OFF);
734 EnTXFIFOUnderrunEOMInt(iobase, ON);
735 // EnTXFIFOReadyInt(iobase,ON);
736 InvertTX(iobase, OFF);
737 InvertRX(iobase, OFF);
738 // WriteLPCReg(0xF0,0); //(if VT1211 then do this)
739 if (IsSIROn(iobase)) {
740 SIRFilter(iobase, ON);
741 SIRRecvAny(iobase, ON);
742 } else {
743 SIRFilter(iobase, OFF);
744 SIRRecvAny(iobase, OFF);
745 }
746 EnRXSpecInt(iobase, ON);
747 WriteReg(iobase, I_ST_CT_0, 0x80);
748 EnableDMA(iobase, ON);
749 }
750
751 static void SetBaudRate(__u16 iobase, __u32 rate)
752 {
753 __u8 value = 11, temp;
754
755 if (IsSIROn(iobase)) {
756 switch (rate) {
757 case (__u32) (2400L):
758 value = 47;
759 break;
760 case (__u32) (9600L):
761 value = 11;
762 break;
763 case (__u32) (19200L):
764 value = 5;
765 break;
766 case (__u32) (38400L):
767 value = 2;
768 break;
769 case (__u32) (57600L):
770 value = 1;
771 break;
772 case (__u32) (115200L):
773 value = 0;
774 break;
775 default:
776 break;
777 }
778 } else if (IsMIROn(iobase)) {
779 value = 0; // will automatically be fixed in 1.152M
780 } else if (IsFIROn(iobase)) {
781 value = 0; // will automatically be fixed in 4M
782 }
783 temp = (ReadReg(iobase, I_CF_H_1) & 0x03);
784 temp |= value << 2;
785 WriteReg(iobase, I_CF_H_1, temp);
786 }
787
788 static void SetPulseWidth(__u16 iobase, __u8 width)
789 {
790 __u8 temp, temp1, temp2;
791
792 temp = (ReadReg(iobase, I_CF_L_1) & 0x1f);
793 temp1 = (ReadReg(iobase, I_CF_H_1) & 0xfc);
794 temp2 = (width & 0x07) << 5;
795 temp |= temp2;
796 temp2 = (width & 0x18) >> 3;
797 temp1 |= temp2;
798 WriteReg(iobase, I_CF_L_1, temp);
799 WriteReg(iobase, I_CF_H_1, temp1);
800 }
801
802 static void SetSendPreambleCount(__u16 iobase, __u8 count)
803 {
804 __u8 temp;
805
806 temp = ReadReg(iobase, I_CF_L_1) & 0xe0;
807 temp |= count;
808 WriteReg(iobase, I_CF_L_1, temp);
809
810 }
811
812 static void SetVFIR(__u16 BaseAddr, __u8 val)
813 {
814 __u8 tmp;
815
816 tmp = ReadReg(BaseAddr, I_CF_L_0);
817 WriteReg(BaseAddr, I_CF_L_0, tmp & 0x8f);
818 WriteRegBit(BaseAddr, I_CF_H_0, 5, val);
819 }
820
821 static void SetFIR(__u16 BaseAddr, __u8 val)
822 {
823 __u8 tmp;
824
825 WriteRegBit(BaseAddr, I_CF_H_0, 5, 0);
826 tmp = ReadReg(BaseAddr, I_CF_L_0);
827 WriteReg(BaseAddr, I_CF_L_0, tmp & 0x8f);
828 WriteRegBit(BaseAddr, I_CF_L_0, 6, val);
829 }
830
831 static void SetMIR(__u16 BaseAddr, __u8 val)
832 {
833 __u8 tmp;
834
835 WriteRegBit(BaseAddr, I_CF_H_0, 5, 0);
836 tmp = ReadReg(BaseAddr, I_CF_L_0);
837 WriteReg(BaseAddr, I_CF_L_0, tmp & 0x8f);
838 WriteRegBit(BaseAddr, I_CF_L_0, 5, val);
839 }
840
841 static void SetSIR(__u16 BaseAddr, __u8 val)
842 {
843 __u8 tmp;
844
845 WriteRegBit(BaseAddr, I_CF_H_0, 5, 0);
846 tmp = ReadReg(BaseAddr, I_CF_L_0);
847 WriteReg(BaseAddr, I_CF_L_0, tmp & 0x8f);
848 WriteRegBit(BaseAddr, I_CF_L_0, 4, val);
849 }
850
851 #endif /* via_IRCC_H */