Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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