• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/net/irda/
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