/******************************************************************************
 *    ixj.h
 *
 *    Device Driver for the Internet PhoneJACK and
 *    Internet LineJACK Telephony Cards.
 *
 *    (c) Copyright 1999 Quicknet Technologies, Inc.
 *
 *    This program is free software; you can redistribute it and/or
 *    modify it under the terms of the GNU General Public License
 *    as published by the Free Software Foundation; either version
 *    2 of the License, or (at your option) any later version.
 *
 * Author:          Ed Okerson, <eokerson@quicknet.net>
 *    
 * Contributors:    Greg Herlein, <gherlein@quicknet.net>
 *                  David W. Erhart, <derhart@quicknet.net>
 *                  John Sellers, <jsellers@quicknet.net>
 *                  Mike Preston, <mpreston@quicknet.net>
 *
 * More information about the hardware related to this driver can be found
 * at our website:    http://www.quicknet.net
 *
 * Fixes:
 *
 * IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
 * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET
 * TECHNOLOGIES, INC.HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
 * ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION 
 * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 *
 *****************************************************************************/
static char ixj_h_rcsid[] = "$Id: ixj.h,v 3.14 2000/03/30 22:06:48 eokerson Exp $";

#ifndef _I386_TYPES_H
#include <asm/types.h>
#endif

#include <linux/ixjuser.h>
#include <linux/phonedev.h>

typedef __u16 WORD;
typedef __u32 DWORD;
typedef __u8 BYTE;
typedef __u8 BOOL;

#define IXJMAX 16

#define TRUE 1
#define FALSE 0

#ifndef min
#define min(a,b) (((a)<(b))?(a):(b))
#endif
#ifndef max
#define max(a,b) (((a)>(b))?(a):(b))
#endif

/******************************************************************************
*
*  This structure when unioned with the structures below makes simple byte
*  access to the registers easier.
*
******************************************************************************/
typedef struct {
	unsigned char low;
	unsigned char high;
} BYTES;

typedef union {
        BYTES bytes;
        short word;
} IXJ_WORD;

typedef struct{
	unsigned int b0:1;
	unsigned int b1:1;
	unsigned int b2:1;
	unsigned int b3:1;
	unsigned int b4:1;
	unsigned int b5:1;
	unsigned int b6:1;
	unsigned int b7:1;
} IXJ_CBITS;

typedef union{
	IXJ_CBITS cbits;
	  char  cbyte;
} IXJ_CBYTE;

int ixj_WriteDSPCommand(unsigned short, int board);

/******************************************************************************
*
*  This structure represents the Hardware Control Register of the CT8020/8021
*  The CT8020 is used in the Internet PhoneJACK, and the 8021 in the
*  Internet LineJACK
*
******************************************************************************/
typedef struct {
	unsigned int rxrdy:1;
	unsigned int txrdy:1;
	unsigned int status:1;
	unsigned int auxstatus:1;
	unsigned int rxdma:1;
	unsigned int txdma:1;
	unsigned int rxburst:1;
	unsigned int txburst:1;
	unsigned int dmadir:1;
	unsigned int cont:1;
	unsigned int irqn:1;
	unsigned int t:5;
} HCRBIT;

typedef union {
	HCRBIT bits;
	BYTES bytes;
} HCR;

/******************************************************************************
*
*  This structure represents the Hardware Status Register of the CT8020/8021
*  The CT8020 is used in the Internet PhoneJACK, and the 8021 in the
*  Internet LineJACK
*
******************************************************************************/
typedef struct {
	unsigned int controlrdy:1;
	unsigned int auxctlrdy:1;
	unsigned int statusrdy:1;
	unsigned int auxstatusrdy:1;
	unsigned int rxrdy:1;
	unsigned int txrdy:1;
	unsigned int restart:1;
	unsigned int irqn:1;
	unsigned int rxdma:1;
	unsigned int txdma:1;
	unsigned int cohostshutdown:1;
	unsigned int t:5;
} HSRBIT;

typedef union {
	HSRBIT bits;
	BYTES bytes;
} HSR;

/******************************************************************************
*
*  This structure represents the General Purpose IO Register of the CT8020/8021
*  The CT8020 is used in the Internet PhoneJACK, and the 8021 in the
*  Internet LineJACK
*
******************************************************************************/
typedef struct {
	unsigned int x:1;
	unsigned int gpio1:1;
	unsigned int gpio2:1;
	unsigned int gpio3:1;
	unsigned int gpio4:1;
	unsigned int gpio5:1;
	unsigned int gpio6:1;
	unsigned int gpio7:1;
	unsigned int xread:1;
	unsigned int gpio1read:1;
	unsigned int gpio2read:1;
	unsigned int gpio3read:1;
	unsigned int gpio4read:1;
	unsigned int gpio5read:1;
	unsigned int gpio6read:1;
	unsigned int gpio7read:1;
} GPIOBIT;

typedef union {
	GPIOBIT bits;
	BYTES bytes;
	unsigned short word;
} GPIO;

/******************************************************************************
*
*  This structure represents the Line Monitor status response
*
******************************************************************************/
typedef struct {
	unsigned int digit:4;
	unsigned int cpf_valid:1;
	unsigned int dtmf_valid:1;
	unsigned int peak:1;
	unsigned int z:1;
	unsigned int f0:1;
	unsigned int f1:1;
	unsigned int f2:1;
	unsigned int f3:1;
	unsigned int frame:4;
} LMON;

typedef union {
	LMON bits;
	BYTES bytes;
} DTMF;

typedef struct {
	unsigned int z:7;
	unsigned int dtmf_en:1;
	unsigned int y:4;
	unsigned int F3:1;
	unsigned int F2:1;
	unsigned int F1:1;
	unsigned int F0:1;
} CP;

typedef union {
	CP bits;
	BYTES bytes;
} CPTF;

/******************************************************************************
*
*  This structure represents the Status Control Register on the Internet
*  LineJACK
*
******************************************************************************/
typedef struct {
	unsigned int c0:1;
	unsigned int c1:1;
	unsigned int stereo:1;
	unsigned int daafsyncen:1;
	unsigned int led1:1;
	unsigned int led2:1;
	unsigned int led3:1;
	unsigned int led4:1;
} PSCRWI;			// Internet LineJACK and Internet PhoneJACK Lite

typedef struct {
	unsigned int eidp:1;
	unsigned int eisd:1;
	unsigned int x:6;
} PSCRWP;			// Internet PhoneJACK PCI

typedef union {
	PSCRWI bits;
	PSCRWP pcib;
	char byte;
} PLD_SCRW;

typedef struct {
	unsigned int c0:1;
	unsigned int c1:1;
	unsigned int x:1;
	unsigned int d0ee:1;
	unsigned int mixerbusy:1;
	unsigned int sci:1;
	unsigned int dspflag:1;
	unsigned int daaflag:1;
} PSCRRI;

typedef struct {
	unsigned int eidp:1;
	unsigned int eisd:1;
	unsigned int x:4;
	unsigned int dspflag:1;
	unsigned int det:1;
} PSCRRP;

typedef union {
	PSCRRI bits;
	PSCRRP pcib;
	char byte;
} PLD_SCRR;

/******************************************************************************
*
*  These structures represents the SLIC Control Register on the
*  Internet LineJACK
*
******************************************************************************/
typedef struct {
	unsigned int c1:1;
	unsigned int c2:1;
	unsigned int c3:1;
	unsigned int b2en:1;
	unsigned int spken:1;
	unsigned int rly1:1;
	unsigned int rly2:1;
	unsigned int rly3:1;
} PSLICWRITE;

typedef struct {
	unsigned int state:3;
	unsigned int b2en:1;
	unsigned int spken:1;
	unsigned int c3:1;
	unsigned int potspstn:1;
	unsigned int det:1;
} PSLICREAD;

typedef struct {
	unsigned int c1:1;
	unsigned int c2:1;
	unsigned int c3:1;
	unsigned int b2en:1;
	unsigned int e1:1;
	unsigned int mic:1;
	unsigned int spk:1;
	unsigned int x:1;
} PSLICPCI;

typedef union {
	PSLICPCI pcib;
	PSLICWRITE bits;
	PSLICREAD slic;
	char byte;
} PLD_SLICW;

typedef union {
	PSLICPCI pcib;
	PSLICREAD bits;
	char byte;
} PLD_SLICR;

/******************************************************************************
*
*  These structures represents the Clock Control Register on the
*  Internet LineJACK
*
******************************************************************************/
typedef struct {
	unsigned int clk0:1;
	unsigned int clk1:1;
	unsigned int clk2:1;
	unsigned int x0:1;
	unsigned int slic_e1:1;
	unsigned int x1:1;
	unsigned int x2:1;
	unsigned int x3:1;
} PCLOCK;

typedef union {
	PCLOCK bits;
	char byte;
} PLD_CLOCK;

/******************************************************************************
*
*  These structures deal with the mixer on the Internet LineJACK
*
******************************************************************************/

typedef struct {
	unsigned short vol[10];
	unsigned int recsrc;
	unsigned int modcnt;
	unsigned short micpreamp;
} MIX;

/******************************************************************************
*
*  These structures deal with the control logic on the Internet PhoneCARD
*
******************************************************************************/
typedef struct {
	unsigned int x0:4;	// unused bits

	unsigned int ed:1;	// Event Detect

	unsigned int drf:1;	// Smart Cable Removal Flag 1=no cable

	unsigned int dspf:1;	// DSP Flag 1=DSP Ready

	unsigned int crr:1;	// Control Register Ready

} COMMAND_REG1;

typedef union {
	COMMAND_REG1 bits;
	unsigned char byte;
} PCMCIA_CR1;

typedef struct {
	unsigned int x0:4;	// unused bits

	unsigned int rstc:1;	// Smart Cable Reset

	unsigned int pwr:1;	// Smart Cable Power

	unsigned int x1:2;	// unused bits

} COMMAND_REG2;

typedef union {
	COMMAND_REG2 bits;
	unsigned char byte;
} PCMCIA_CR2;

typedef struct {
	unsigned int addr:5;	// R/W Smart Cable Register Address

	unsigned int rw:1;	// Read / Write flag

	unsigned int dev:2;	// 2 bit Smart Cable Device Address

} CONTROL_REG;

typedef union {
	CONTROL_REG bits;
	unsigned char byte;
} PCMCIA_SCCR;

typedef struct {
	unsigned int hsw:1;
	unsigned int det:1;
	unsigned int led2:1;
	unsigned int led1:1;
	unsigned int ring1:1;
	unsigned int ring0:1;
	unsigned int x:1;
	unsigned int powerdown:1;
} PCMCIA_SLIC_REG;

typedef union {
	PCMCIA_SLIC_REG bits;
	unsigned char byte;
} PCMCIA_SLIC;

typedef struct {
	unsigned int cpd:1;	// Chip Power Down

	unsigned int mpd:1;	// MIC Bias Power Down

	unsigned int hpd:1;	// Handset Drive Power Down

	unsigned int lpd:1;	// Line Drive Power Down

	unsigned int spd:1;	// Speaker Drive Power Down

	unsigned int x:2;	// unused bits

	unsigned int sr:1;	// Software Reset

} Si3CONTROL1;

typedef union {
	Si3CONTROL1 bits;
	unsigned char byte;
} Si3C1;

typedef struct {
	unsigned int al:1;	// Analog Loopback DAC analog -> ADC analog

	unsigned int dl2:1;	// Digital Loopback DAC -> ADC one bit

	unsigned int dl1:1;	// Digital Loopback ADC -> DAC one bit

	unsigned int pll:1;	// 1 = div 10, 0 = div 5

	unsigned int hpd:1;	// HPF disable

	unsigned int x:3;	// unused bits

} Si3CONTROL2;

typedef union {
	Si3CONTROL2 bits;
	unsigned char byte;
} Si3C2;

typedef struct {
	unsigned int iir:1;	// 1 enables IIR, 0 enables FIR

	unsigned int him:1;	// Handset Input Mute

	unsigned int mcm:1;	// MIC In Mute

	unsigned int mcg:2;	// MIC In Gain

	unsigned int lim:1;	// Line In Mute

	unsigned int lig:2;	// Line In Gain

} Si3RXGAIN;

typedef union {
	Si3RXGAIN bits;
	unsigned char byte;
} Si3RXG;

typedef struct {
	unsigned int hom:1;	// Handset Out Mute

	unsigned int lom:1;	// Line Out Mute

	unsigned int rxg:5;	// RX PGA Gain

	unsigned int x:1;	// unused bit

} Si3ADCVOLUME;

typedef union {
	Si3ADCVOLUME bits;
	unsigned char byte;
} Si3ADC;

typedef struct {
	unsigned int srm:1;	// Speaker Right Mute

	unsigned int slm:1;	// Speaker Left Mute

	unsigned int txg:5;	// TX PGA Gain

	unsigned int x:1;	// unused bit

} Si3DACVOLUME;

typedef union {
	Si3DACVOLUME bits;
	unsigned char byte;
} Si3DAC;

typedef struct {
	unsigned int x:5;	// unused bit

	unsigned int losc:1;	// Line Out Short Circuit

	unsigned int srsc:1;	// Speaker Right Short Circuit

	unsigned int slsc:1;	// Speaker Left Short Circuit

} Si3STATUSREPORT;

typedef union {
	Si3STATUSREPORT bits;
	unsigned char byte;
} Si3STAT;

typedef struct {
	unsigned int sot:2;	// Speaker Out Attenuation

	unsigned int lot:2;	// Line Out Attenuation

	unsigned int x:4;	// unused bits

} Si3ANALOGATTN;

typedef union {
	Si3ANALOGATTN bits;
	unsigned char byte;
} Si3AATT;

/******************************************************************************
*
*  These structures deal with the DAA on the Internet LineJACK
*
******************************************************************************/

typedef struct _DAA_REGS {
	//-----------------------------------------------
	// SOP Registers
	//
	BYTE bySOP;

	union _SOP_REGS {
		struct _SOP {
			union	// SOP - CR0 Register
			 {
				BYTE reg;
				struct _CR0_BITREGS {
					BYTE CLK_EXT:1;		// cr0[0:0]

					BYTE RIP:1;	// cr0[1:1]

					BYTE AR:1;	// cr0[2:2]

					BYTE AX:1;	// cr0[3:3]

					BYTE FRR:1;	// cr0[4:4]

					BYTE FRX:1;	// cr0[5:5]

					BYTE IM:1;	// cr0[6:6]

					BYTE TH:1;	// cr0[7:7]

				} bitreg;
			} cr0;

			union	// SOP - CR1 Register
			 {
				BYTE reg;
				struct _CR1_REGS {
					BYTE RM:1;	// cr1[0:0]

					BYTE RMR:1;	// cr1[1:1]

					BYTE No_auto:1;		// cr1[2:2]

					BYTE Pulse:1;	// cr1[3:3]

					BYTE P_Tone1:1;		// cr1[4:4]

					BYTE P_Tone2:1;		// cr1[5:5]

					BYTE E_Tone1:1;		// cr1[6:6]

					BYTE E_Tone2:1;		// cr1[7:7]

				} bitreg;
			} cr1;

			union	// SOP - CR2 Register
			 {
				BYTE reg;
				struct _CR2_REGS {
					BYTE Call_II:1;		// CR2[0:0]

					BYTE Call_I:1;	// CR2[1:1]

					BYTE Call_en:1;		// CR2[2:2]

					BYTE Call_pon:1;	// CR2[3:3]

					BYTE IDR:1;	// CR2[4:4]

					BYTE COT_R:3;	// CR2[5:7]

				} bitreg;
			} cr2;

			union	// SOP - CR3 Register
			 {
				BYTE reg;
				struct _CR3_REGS {
					BYTE DHP_X:1;	// CR3[0:0]

					BYTE DHP_R:1;	// CR3[1:1]

					BYTE Cal_pctl:1;	// CR3[2:2]

					BYTE SEL:1;	// CR3[3:3]

					BYTE TestLoops:4;	// CR3[4:7]

				} bitreg;
			} cr3;

			union	// SOP - CR4 Register
			 {
				BYTE reg;
				struct _CR4_REGS {
					BYTE Fsc_en:1;	// CR4[0:0]

					BYTE Int_en:1;	// CR4[1:1]

					BYTE AGX:2;	// CR4[2:3]

					BYTE AGR_R:2;	// CR4[4:5]

					BYTE AGR_Z:2;	// CR4[6:7]

				} bitreg;
			} cr4;

			union	// SOP - CR5 Register
			 {
				BYTE reg;
				struct _CR5_REGS {
					BYTE V_0:1;	// CR5[0:0]

					BYTE V_1:1;	// CR5[1:1]

					BYTE V_2:1;	// CR5[2:2]

					BYTE V_3:1;	// CR5[3:3]

					BYTE V_4:1;	// CR5[4:4]

					BYTE V_5:1;	// CR5[5:5]

					BYTE V_6:1;	// CR5[6:6]

					BYTE V_7:1;	// CR5[7:7]

				} bitreg;
			} cr5;

			union	// SOP - CR6 Register
			 {
				BYTE reg;
				struct _CR6_REGS {
					BYTE reserved:8;	// CR6[0:7]

				} bitreg;
			} cr6;

			union	// SOP - CR7 Register
			 {
				BYTE reg;
				struct _CR7_REGS {
					BYTE reserved:8;	// CR7[0:7]

				} bitreg;
			} cr7;
		} SOP;

		BYTE ByteRegs[sizeof(struct _SOP)];

	} SOP_REGS;

	// DAA_REGS.SOP_REGS.SOP.CR5.reg
	// DAA_REGS.SOP_REGS.SOP.CR5.bitreg
	// DAA_REGS.SOP_REGS.SOP.CR5.bitreg.V_2
	// DAA_REGS.SOP_REGS.ByteRegs[5]

	//-----------------------------------------------
	// XOP Registers
	//
	BYTE byXOP;

	union _XOP_REGS {
		struct _XOP {
			union	// XOP - XR0 Register - Read values
			 {
				BYTE reg;
				struct _XR0_BITREGS {
					BYTE SI_0:1;	// XR0[0:0] - Read

					BYTE SI_1:1;	// XR0[1:1] - Read

					BYTE VDD_OK:1;	// XR0[2:2] - Read

					BYTE Caller_ID:1;	// XR0[3:3] - Read

					BYTE RING:1;	// XR0[4:4] - Read

					BYTE Cadence:1;		// XR0[5:5] - Read

					BYTE Wake_up:1;		// XR0[6:6] - Read

					BYTE unused:1;	// XR0[7:7] - Read

				} bitreg;
			} xr0;

			union	// XOP - XR1 Register
			 {
				BYTE reg;
				struct _XR1_BITREGS {
					BYTE M_SI_0:1;	// XR1[0:0]

					BYTE M_SI_1:1;	// XR1[1:1]

					BYTE M_VDD_OK:1;	// XR1[2:2]

					BYTE M_Caller_ID:1;	// XR1[3:3]

					BYTE M_RING:1;	// XR1[4:4]

					BYTE M_Cadence:1;	// XR1[5:5]

					BYTE M_Wake_up:1;	// XR1[6:6]

					BYTE unused:1;	// XR1[7:7]

				} bitreg;
			} xr1;

			union	// XOP - XR2 Register
			 {
				BYTE reg;
				struct _XR2_BITREGS {
					BYTE CTO0:1;	// XR2[0:0]

					BYTE CTO1:1;	// XR2[1:1]

					BYTE CTO2:1;	// XR2[2:2]

					BYTE CTO3:1;	// XR2[3:3]

					BYTE CTO4:1;	// XR2[4:4]

					BYTE CTO5:1;	// XR2[5:5]

					BYTE CTO6:1;	// XR2[6:6]

					BYTE CTO7:1;	// XR2[7:7]

				} bitreg;
			} xr2;

			union	// XOP - XR3 Register
			 {
				BYTE reg;
				struct _XR3_BITREGS {
					BYTE DCR0:1;	// XR3[0:0]

					BYTE DCR1:1;	// XR3[1:1]

					BYTE DCI:1;	// XR3[2:2]

					BYTE DCU0:1;	// XR3[3:3]

					BYTE DCU1:1;	// XR3[4:4]

					BYTE B_off:1;	// XR3[5:5]

					BYTE AGB0:1;	// XR3[6:6]

					BYTE AGB1:1;	// XR3[7:7]

				} bitreg;
			} xr3;

			union	// XOP - XR4 Register
			 {
				BYTE reg;
				struct _XR4_BITREGS {
					BYTE C_0:1;	// XR4[0:0]

					BYTE C_1:1;	// XR4[1:1]

					BYTE C_2:1;	// XR4[2:2]

					BYTE C_3:1;	// XR4[3:3]

					BYTE C_4:1;	// XR4[4:4]

					BYTE C_5:1;	// XR4[5:5]

					BYTE C_6:1;	// XR4[6:6]

					BYTE C_7:1;	// XR4[7:7]

				} bitreg;
			} xr4;

			union	// XOP - XR5 Register
			 {
				BYTE reg;
				struct _XR5_BITREGS {
					BYTE T_0:1;	// XR5[0:0]

					BYTE T_1:1;	// XR5[1:1]

					BYTE T_2:1;	// XR5[2:2]

					BYTE T_3:1;	// XR5[3:3]

					BYTE T_4:1;	// XR5[4:4]

					BYTE T_5:1;	// XR5[5:5]

					BYTE T_6:1;	// XR5[6:6]

					BYTE T_7:1;	// XR5[7:7]

				} bitreg;
			} xr5;

			union	// XOP - XR6 Register - Read Values
			 {
				BYTE reg;
				struct _XR6_BITREGS {
					BYTE CPS0:1;	// XR6[0:0]

					BYTE CPS1:1;	// XR6[1:1]

					BYTE unused1:2;		// XR6[2:3]

					BYTE CLK_OFF:1;		// XR6[4:4]

					BYTE unused2:3;		// XR6[5:7]

				} bitreg;
			} xr6;

			union	// XOP - XR7 Register
			 {
				BYTE reg;
				struct _XR7_BITREGS {
					BYTE unused1:1;		// XR7[0:0]

					BYTE Vdd0:1;	// XR7[1:1]

					BYTE Vdd1:1;	// XR7[2:2]

					BYTE unused2:5;		// XR7[3:7]

				} bitreg;
			} xr7;
		} XOP;

		BYTE ByteRegs[sizeof(struct _XOP)];

	} XOP_REGS;

	// DAA_REGS.XOP_REGS.XOP.XR7.reg
	// DAA_REGS.XOP_REGS.XOP.XR7.bitreg
	// DAA_REGS.XOP_REGS.XOP.XR7.bitreg.Vdd0
	// DAA_REGS.XOP_REGS.ByteRegs[7]

	//-----------------------------------------------
	// COP Registers
	//
	BYTE byCOP;

	union _COP_REGS {
		struct _COP {
			BYTE THFilterCoeff_1[8];	// COP - TH Filter Coefficients,      CODE=0, Part 1

			BYTE THFilterCoeff_2[8];	// COP - TH Filter Coefficients,      CODE=1, Part 2

			BYTE THFilterCoeff_3[8];	// COP - TH Filter Coefficients,      CODE=2, Part 3

			BYTE RingerImpendance_1[8];	// COP - Ringer Impendance Coefficients,  CODE=3, Part 1

			BYTE IMFilterCoeff_1[8];	// COP - IM Filter Coefficients,      CODE=4, Part 1

			BYTE IMFilterCoeff_2[8];	// COP - IM Filter Coefficients,      CODE=5, Part 2

			BYTE RingerImpendance_2[8];	// COP - Ringer Impendance Coefficients,  CODE=6, Part 2

			BYTE FRRFilterCoeff[8];		// COP - FRR Filter Coefficients,      CODE=7

			BYTE FRXFilterCoeff[8];		// COP - FRX Filter Coefficients,      CODE=8

			BYTE ARFilterCoeff[4];	// COP - AR Filter Coefficients,      CODE=9

			BYTE AXFilterCoeff[4];	// COP - AX Filter Coefficients,      CODE=10 

			BYTE Tone1Coeff[4];	// COP - Tone1 Coefficients,        CODE=11

			BYTE Tone2Coeff[4];	// COP - Tone2 Coefficients,        CODE=12

			BYTE LevelmeteringRinging[4];	// COP - Levelmetering Ringing,        CODE=13

			BYTE CallerID1stTone[8];	// COP - Caller ID 1st Tone,        CODE=14

			BYTE CallerID2ndTone[8];	// COP - Caller ID 2nd Tone,        CODE=15

		} COP;

		BYTE ByteRegs[sizeof(struct _COP)];

	} COP_REGS;

	// DAA_REGS.COP_REGS.COP.XR7.Tone1Coeff[3]
	// DAA_REGS.COP_REGS.COP.XR7.bitreg
	// DAA_REGS.COP_REGS.COP.XR7.bitreg.Vdd0
	// DAA_REGS.COP_REGS.ByteRegs[57]

	//-----------------------------------------------
	// CAO Registers
	//
	BYTE byCAO;

	union _CAO_REGS {
		struct _CAO {
			BYTE CallerID[512];	// CAO - Caller ID Bytes

		} CAO;

		BYTE ByteRegs[sizeof(struct _CAO)];
	} CAO_REGS;

	union			// XOP - XR0 Register - Write values
	 {
		BYTE reg;
		struct _XR0_BITREGSW {
			BYTE SO_0:1;	// XR1[0:0] - Write

			BYTE SO_1:1;	// XR1[1:1] - Write

			BYTE SO_2:1;	// XR1[2:2] - Write

			BYTE unused:5;	// XR1[3:7] - Write

		} bitreg;
	} XOP_xr0_W;

	union			// XOP - XR6 Register - Write values
	 {
		BYTE reg;
		struct _XR6_BITREGSW {
			BYTE unused1:4;		// XR6[0:3]

			BYTE CLK_OFF:1;		// XR6[4:4]

			BYTE unused2:3;		// XR6[5:7]

		} bitreg;
	} XOP_xr6_W;

} DAA_REGS;

#define ALISDAA_ID_BYTE      0x81
#define ALISDAA_CALLERID_SIZE  512

//------------------------------
//
//  Misc definitions
//

// Power Up Operation
#define SOP_PU_SLEEP    0
#define SOP_PU_RINGING    1
#define SOP_PU_CONVERSATION  2
#define SOP_PU_PULSEDIALING  3

#define ALISDAA_CALLERID_SIZE 512

#define PLAYBACK_MODE_COMPRESSED	0	//        Selects: Compressed modes, TrueSpeech 8.5-4.1, G.723.1, G.722, G.728, G.729
#define PLAYBACK_MODE_TRUESPEECH_V40	0	//        Selects: TrueSpeech 8.5, 6.3, 5.3, 4.8 or 4.1 Kbps
#define PLAYBACK_MODE_TRUESPEECH	8	//        Selects: TrueSpeech 8.5, 6.3, 5.3, 4.8 or 4.1 Kbps Version 5.1
#define PLAYBACK_MODE_ULAW		2	//        Selects: 64 Kbit/sec MuA-law PCM
#define PLAYBACK_MODE_ALAW		10	//        Selects: 64 Kbit/sec A-law PCM
#define PLAYBACK_MODE_16LINEAR		6	//        Selects: 128 Kbit/sec 16-bit linear
#define PLAYBACK_MODE_8LINEAR		4	//        Selects: 64 Kbit/sec 8-bit signed linear
#define PLAYBACK_MODE_8LINEAR_WSS	5	//        Selects: 64 Kbit/sec WSS 8-bit unsigned linear

#define RECORD_MODE_COMPRESSED		0	//        Selects: Compressed modes, TrueSpeech 8.5-4.1, G.723.1, G.722, G.728, G.729
#define RECORD_MODE_TRUESPEECH		0	//        Selects: TrueSpeech 8.5, 6.3, 5.3, 4.8 or 4.1 Kbps
#define RECORD_MODE_ULAW		4	//        Selects: 64 Kbit/sec Mu-law PCM
#define RECORD_MODE_ALAW		12	//        Selects: 64 Kbit/sec A-law PCM
#define RECORD_MODE_16LINEAR		5	//        Selects: 128 Kbit/sec 16-bit linear
#define RECORD_MODE_8LINEAR		6	//        Selects: 64 Kbit/sec 8-bit signed linear
#define RECORD_MODE_8LINEAR_WSS		7	//        Selects: 64 Kbit/sec WSS 8-bit unsigned linear

enum SLIC_STATES {
	PLD_SLIC_STATE_OC = 0,
	PLD_SLIC_STATE_RINGING,
	PLD_SLIC_STATE_ACTIVE,
	PLD_SLIC_STATE_OHT,
	PLD_SLIC_STATE_TIPOPEN,
	PLD_SLIC_STATE_STANDBY,
	PLD_SLIC_STATE_APR,
	PLD_SLIC_STATE_OHTPR
};

enum SCI_CONTROL {
	SCI_End = 0,
	SCI_Enable_DAA,
	SCI_Enable_Mixer,
	SCI_Enable_EEPROM
};

enum Mode {
	T63, T53, T48, T40
};
enum Dir {
	V3_TO_V4, V4_TO_V3, V4_TO_V5, V5_TO_V4
};

typedef struct Proc_Info_Tag {
	enum Mode convert_mode;
	enum Dir convert_dir;
	int Prev_Frame_Type;
	int Current_Frame_Type;
} Proc_Info_Type;

enum PREVAL {
	NORMAL = 0,
	NOPOST,
	POSTONLY,
	PREERROR
};

enum IXJ_EXTENSIONS {
	G729LOADER = 0,
	TS85LOADER,
	PRE_READ,
	POST_READ,
	PRE_WRITE,
	POST_WRITE,
	PRE_IOCTL,
	POST_IOCTL
};

typedef struct {
	char enable;
	char en_filter;
	unsigned int filter;
	unsigned int state;	// State 0 when cadence has not started.

	unsigned int on1;	// State 1

	unsigned long on1min;	// State 1 - 10% + jiffies
 	unsigned long on1dot;	// State 1 + jiffies

	unsigned long on1max;	// State 1 + 10% + jiffies

	unsigned int off1;	// State 2

	unsigned long off1min;
	unsigned long off1max;
	unsigned int on2;	// State 3

	unsigned long on2min;
	unsigned long on2dot;
	unsigned long on2max;
	unsigned int off2;	// State 4

	unsigned long off2min;
	unsigned long off2max;
	unsigned int on3;	// State 5

	unsigned long on3min;
	unsigned long on3dot;
	unsigned long on3max;
	unsigned int off3;	// State 6

	unsigned long off3min;
	unsigned long off3max;
} IXJ_CADENCE_F;

typedef struct {
	unsigned int busytone:1;
	unsigned int dialtone:1;
	unsigned int ringback:1;
	unsigned int ringing:1;
	unsigned int playing:1;
	unsigned int recording:1;
	unsigned int cringing:1;
	unsigned int play_first_frame:1;
	unsigned int pstn_present:1;
	unsigned int pstn_ringing:1;
	unsigned int pots_correct:1;
	unsigned int pots_pstn:1;
	unsigned int g729_loaded:1;
	unsigned int ts85_loaded:1;
	unsigned int dtmf_oob:1;	// DTMF Out-Of-Band

	unsigned int pcmciascp:1;	// Smart Cable Present

	unsigned int pcmciasct:2;	// Smart Cable Type

	unsigned int pcmciastate:3;	// Smart Cable Init State

	unsigned int inwrite:1;	// Currently writing

	unsigned int inread:1;	// Currently reading

	unsigned int incheck:1;	// Currently checking the smart cable

	unsigned int cidplay:1; // Currently playing Caller ID

	unsigned int cidring:1; // This is the ring for Caller ID

	unsigned int cidsent:1; // Caller ID has been sent

	unsigned int cidcw_ack:1; // Caller ID CW ACK (from CPE)

	unsigned int x:6;	// unsed bits

} IXJ_FLAGS;

/******************************************************************************
*
*  This structure represents the Internet PhoneJACK and Internet LineJACK
*
******************************************************************************/

typedef struct {
	struct phone_device p;
	unsigned int board;
	unsigned int DSPbase;
	unsigned int XILINXbase;
	unsigned int serial;
	struct phone_capability caplist[30];
	unsigned int caps;
	unsigned int country;
	struct pnp_dev *dev;
	unsigned int cardtype;
	unsigned int rec_codec;
	char rec_mode;
	unsigned int play_codec;
	unsigned int cid_play_codec;
	char play_mode;
	IXJ_FLAGS flags;
	unsigned int rec_frame_size;
	unsigned int play_frame_size;
	unsigned int cid_base_frame_size;
	unsigned long cidcw_wait;
	int aec_level;
	int readers, writers;
	struct wait_queue *poll_q;
	struct wait_queue *read_q;
	char *read_buffer, *read_buffer_end;
	char *read_convert_buffer;
	unsigned int read_buffer_size;
	unsigned int read_buffer_ready;
	struct wait_queue *write_q;
	char *write_buffer, *write_buffer_end;
	char *write_convert_buffer;
	unsigned int write_buffer_size;
	unsigned int write_buffers_empty;
	unsigned long drybuffer;
	char *write_buffer_rp, *write_buffer_wp;
	char dtmfbuffer[80];
	char dtmf_current;
	int dtmf_wp, dtmf_rp, dtmf_state, dtmf_proc;
	int tone_off_time, tone_on_time;
	struct fasync_struct *async_queue;
	unsigned long tone_start_jif;
	char tone_index;
	char tone_state;
	char maxrings;
	IXJ_CADENCE *cadence_t;
	int tone_cadence_state;
	IXJ_CADENCE_F cadence_f[4];
	DTMF dtmf;
	CPTF cptf;
	BYTES dsp;
	BYTES ver;
	BYTES scr;
	BYTES ssr;
	BYTES baseframe;
	HSR hsr;
	GPIO gpio;
	PLD_SCRR pld_scrr;
	PLD_SCRW pld_scrw;
	PLD_SLICW pld_slicw;
	PLD_SLICR pld_slicr;
	PLD_CLOCK pld_clock;
	PCMCIA_CR1 pccr1;
	PCMCIA_CR2 pccr2;
	PCMCIA_SCCR psccr;
	PCMCIA_SLIC pslic;
	char pscdd;
	Si3C1 sic1;
	Si3C2 sic2;
	Si3RXG sirxg;
	Si3ADC siadc;
	Si3DAC sidac;
	Si3STAT sistat;
	Si3AATT siaatt;
	MIX mix;
	unsigned short ring_cadence;
	int ring_cadence_t;
	unsigned long ring_cadence_jif;
	unsigned long checkwait;
	int intercom;
	int m_hook;
	int r_hook;
	char pstn_envelope;
	char pstn_cid_intr;
	unsigned char fskz;
	unsigned char fskphase;
	unsigned char fskcnt;
	unsigned pstn_cid_received;
	PHONE_CID cid;
	PHONE_CID cid_send;
	unsigned long pstn_ring_start;
	unsigned long pstn_ring_stop;
	unsigned long pstn_winkstart;
	unsigned int winktime;
	unsigned long flash_end;
	char port;
	union telephony_exception ex;
	char daa_mode;
	char daa_country;
	unsigned long pstn_sleeptil;
	DAA_REGS m_DAAShadowRegs;
	Proc_Info_Type Info_read;
	Proc_Info_Type Info_write;
	unsigned short frame_count;
	unsigned int filter_hist[4];
	unsigned char filter_en[4];
	unsigned short proc_load;
	unsigned long framesread;
	unsigned long frameswritten;
	unsigned long read_wait;
	unsigned long write_wait;
	unsigned long timerchecks;
	unsigned long txreadycheck;
	unsigned long rxreadycheck;
	short fskdata[8000];
	int fskdcnt;
} IXJ;

typedef int (*IXJ_REGFUNC) (IXJ * j, unsigned long arg);

int ixj_register(int index, IXJ_REGFUNC regfunc);
int ixj_unregister(int index);
