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