Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  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 */
852 
  This page was automatically generated by the LXR engine.