linux/drivers/net/irda/via-ircc.h
<<
>>
Prefs
   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, write to the Free Software Foundation, Inc.,
  2259 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
  42struct st_fifo_entry {
  43        int status;
  44        int len;
  45};
  46
  47struct 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
  55struct frame_cb {
  56        void *start;            /* Start of frame in DMA mem */
  57        int len;                /* Length of frame in DMA mem */
  58};
  59
  60struct 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
  69struct 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 */
  93struct 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
 187static 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
 216static 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
 229static 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
 239static __u8 ReadReg(unsigned int BaseAddr, int iRegNum)
 240{
 241        return ((__u8) inb(BaseAddr + iRegNum));
 242}
 243
 244static void WriteReg(unsigned int BaseAddr, int iRegNum, unsigned char iVal)
 245{
 246        outb(iVal, BaseAddr + iRegNum);
 247}
 248
 249static 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
 272static __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
 286static 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
 301static 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
 412static void SetTimer(__u16 iobase, __u8 count)
 413{
 414        EnTimerInt(iobase, OFF);
 415        WriteReg(iobase, TIMER, count);
 416        EnTimerInt(iobase, ON);
 417}
 418
 419
 420static 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
 432static void ResetChip(__u16 iobase, __u8 type)
 433{
 434        __u8 value;
 435
 436        value = (type + 2) << 4;
 437        WriteReg(iobase, RESET, type);
 438}
 439
 440static 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
 461static __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
 477static __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
 507static 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
 520static 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
 534static 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
 544static 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
 566static 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
 592static __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
 656static 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
 677static 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
 691static 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
 703static 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
 718static 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
 726static 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
 751static 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
 788static 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
 802static 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
 812static 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
 821static 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
 831static 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
 841static 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