Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
via-ircc.h
Go to the documentation of this file.
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 {
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 */
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 */
117  int index; /* Instance index */
118 
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  }
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 */