Linux Audio

Check our new training course

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