xref: /OK3568_Linux_fs/kernel/drivers/media/pci/ngene/ngene.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * ngene.h: nGene PCIe bridge driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2005-2007 Micronas
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef _NGENE_H_
9*4882a593Smuzhiyun #define _NGENE_H_
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <linux/types.h>
12*4882a593Smuzhiyun #include <linux/sched.h>
13*4882a593Smuzhiyun #include <linux/interrupt.h>
14*4882a593Smuzhiyun #include <linux/i2c.h>
15*4882a593Smuzhiyun #include <asm/dma.h>
16*4882a593Smuzhiyun #include <linux/scatterlist.h>
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #include <linux/dvb/frontend.h>
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #include <media/dmxdev.h>
21*4882a593Smuzhiyun #include <media/dvbdev.h>
22*4882a593Smuzhiyun #include <media/dvb_demux.h>
23*4882a593Smuzhiyun #include <media/dvb_ca_en50221.h>
24*4882a593Smuzhiyun #include <media/dvb_frontend.h>
25*4882a593Smuzhiyun #include <media/dvb_ringbuffer.h>
26*4882a593Smuzhiyun #include <media/dvb_net.h>
27*4882a593Smuzhiyun #include "cxd2099.h"
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #define DEVICE_NAME "ngene"
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #define NGENE_VID       0x18c3
32*4882a593Smuzhiyun #define NGENE_PID       0x0720
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #ifndef VIDEO_CAP_VC1
35*4882a593Smuzhiyun #define VIDEO_CAP_AVC   128
36*4882a593Smuzhiyun #define VIDEO_CAP_H264  128
37*4882a593Smuzhiyun #define VIDEO_CAP_VC1   256
38*4882a593Smuzhiyun #define VIDEO_CAP_WMV9  256
39*4882a593Smuzhiyun #define VIDEO_CAP_MPEG4 512
40*4882a593Smuzhiyun #endif
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define DEMOD_TYPE_STV090X	0
43*4882a593Smuzhiyun #define DEMOD_TYPE_DRXK		1
44*4882a593Smuzhiyun #define DEMOD_TYPE_STV0367	2
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #define DEMOD_TYPE_XO2		32
47*4882a593Smuzhiyun #define DEMOD_TYPE_STV0910	(DEMOD_TYPE_XO2 + 0)
48*4882a593Smuzhiyun #define DEMOD_TYPE_SONY_CT2	(DEMOD_TYPE_XO2 + 1)
49*4882a593Smuzhiyun #define DEMOD_TYPE_SONY_ISDBT	(DEMOD_TYPE_XO2 + 2)
50*4882a593Smuzhiyun #define DEMOD_TYPE_SONY_C2T2	(DEMOD_TYPE_XO2 + 3)
51*4882a593Smuzhiyun #define DEMOD_TYPE_ST_ATSC	(DEMOD_TYPE_XO2 + 4)
52*4882a593Smuzhiyun #define DEMOD_TYPE_SONY_C2T2I	(DEMOD_TYPE_XO2 + 5)
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun #define NGENE_XO2_TYPE_NONE	0
55*4882a593Smuzhiyun #define NGENE_XO2_TYPE_DUOFLEX	1
56*4882a593Smuzhiyun #define NGENE_XO2_TYPE_CI	2
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun enum STREAM {
59*4882a593Smuzhiyun 	STREAM_VIDEOIN1 = 0,        /* ITU656 or TS Input */
60*4882a593Smuzhiyun 	STREAM_VIDEOIN2,
61*4882a593Smuzhiyun 	STREAM_AUDIOIN1,            /* I2S or SPI Input */
62*4882a593Smuzhiyun 	STREAM_AUDIOIN2,
63*4882a593Smuzhiyun 	STREAM_AUDIOOUT,
64*4882a593Smuzhiyun 	MAX_STREAM
65*4882a593Smuzhiyun };
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun enum SMODE_BITS {
68*4882a593Smuzhiyun 	SMODE_AUDIO_SPDIF = 0x20,
69*4882a593Smuzhiyun 	SMODE_AVSYNC = 0x10,
70*4882a593Smuzhiyun 	SMODE_TRANSPORT_STREAM = 0x08,
71*4882a593Smuzhiyun 	SMODE_AUDIO_CAPTURE = 0x04,
72*4882a593Smuzhiyun 	SMODE_VBI_CAPTURE = 0x02,
73*4882a593Smuzhiyun 	SMODE_VIDEO_CAPTURE = 0x01
74*4882a593Smuzhiyun };
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun enum STREAM_FLAG_BITS {
77*4882a593Smuzhiyun 	SFLAG_CHROMA_FORMAT_2COMP  = 0x01, /* Chroma Format : 2's complement */
78*4882a593Smuzhiyun 	SFLAG_CHROMA_FORMAT_OFFSET = 0x00, /* Chroma Format : Binary offset */
79*4882a593Smuzhiyun 	SFLAG_ORDER_LUMA_CHROMA    = 0x02, /* Byte order: Y,Cb,Y,Cr */
80*4882a593Smuzhiyun 	SFLAG_ORDER_CHROMA_LUMA    = 0x00, /* Byte order: Cb,Y,Cr,Y */
81*4882a593Smuzhiyun 	SFLAG_COLORBAR             = 0x04, /* Select colorbar */
82*4882a593Smuzhiyun };
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #define PROGRAM_ROM     0x0000
85*4882a593Smuzhiyun #define PROGRAM_SRAM    0x1000
86*4882a593Smuzhiyun #define PERIPHERALS0    0x8000
87*4882a593Smuzhiyun #define PERIPHERALS1    0x9000
88*4882a593Smuzhiyun #define SHARED_BUFFER   0xC000
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun #define HOST_TO_NGENE    (SHARED_BUFFER+0x0000)
91*4882a593Smuzhiyun #define NGENE_TO_HOST    (SHARED_BUFFER+0x0100)
92*4882a593Smuzhiyun #define NGENE_COMMAND    (SHARED_BUFFER+0x0200)
93*4882a593Smuzhiyun #define NGENE_COMMAND_HI (SHARED_BUFFER+0x0204)
94*4882a593Smuzhiyun #define NGENE_STATUS     (SHARED_BUFFER+0x0208)
95*4882a593Smuzhiyun #define NGENE_STATUS_HI  (SHARED_BUFFER+0x020C)
96*4882a593Smuzhiyun #define NGENE_EVENT      (SHARED_BUFFER+0x0210)
97*4882a593Smuzhiyun #define NGENE_EVENT_HI   (SHARED_BUFFER+0x0214)
98*4882a593Smuzhiyun #define VARIABLES        (SHARED_BUFFER+0x0210)
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun #define NGENE_INT_COUNTS       (SHARED_BUFFER+0x0260)
101*4882a593Smuzhiyun #define NGENE_INT_ENABLE       (SHARED_BUFFER+0x0264)
102*4882a593Smuzhiyun #define NGENE_VBI_LINE_COUNT   (SHARED_BUFFER+0x0268)
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun #define BUFFER_GP_XMIT  (SHARED_BUFFER+0x0800)
105*4882a593Smuzhiyun #define BUFFER_GP_RECV  (SHARED_BUFFER+0x0900)
106*4882a593Smuzhiyun #define EEPROM_AREA     (SHARED_BUFFER+0x0A00)
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun #define SG_V_IN_1       (SHARED_BUFFER+0x0A80)
109*4882a593Smuzhiyun #define SG_VBI_1        (SHARED_BUFFER+0x0B00)
110*4882a593Smuzhiyun #define SG_A_IN_1       (SHARED_BUFFER+0x0B80)
111*4882a593Smuzhiyun #define SG_V_IN_2       (SHARED_BUFFER+0x0C00)
112*4882a593Smuzhiyun #define SG_VBI_2        (SHARED_BUFFER+0x0C80)
113*4882a593Smuzhiyun #define SG_A_IN_2       (SHARED_BUFFER+0x0D00)
114*4882a593Smuzhiyun #define SG_V_OUT        (SHARED_BUFFER+0x0D80)
115*4882a593Smuzhiyun #define SG_A_OUT2       (SHARED_BUFFER+0x0E00)
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun #define DATA_A_IN_1     (SHARED_BUFFER+0x0E80)
118*4882a593Smuzhiyun #define DATA_A_IN_2     (SHARED_BUFFER+0x0F00)
119*4882a593Smuzhiyun #define DATA_A_OUT      (SHARED_BUFFER+0x0F80)
120*4882a593Smuzhiyun #define DATA_V_IN_1     (SHARED_BUFFER+0x1000)
121*4882a593Smuzhiyun #define DATA_V_IN_2     (SHARED_BUFFER+0x2000)
122*4882a593Smuzhiyun #define DATA_V_OUT      (SHARED_BUFFER+0x3000)
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun #define DATA_FIFO_AREA  (SHARED_BUFFER+0x1000)
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun #define TIMESTAMPS      0xA000
127*4882a593Smuzhiyun #define SCRATCHPAD      0xA080
128*4882a593Smuzhiyun #define FORCE_INT       0xA088
129*4882a593Smuzhiyun #define FORCE_NMI       0xA090
130*4882a593Smuzhiyun #define INT_STATUS      0xA0A0
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun #define DEV_VER         0x9004
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun #define FW_DEBUG_DEFAULT (PROGRAM_SRAM+0x00FF)
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun struct SG_ADDR {
137*4882a593Smuzhiyun 	u64 start;
138*4882a593Smuzhiyun 	u64 curr;
139*4882a593Smuzhiyun 	u16 curr_ptr;
140*4882a593Smuzhiyun 	u16 elements;
141*4882a593Smuzhiyun 	u32 pad[3];
142*4882a593Smuzhiyun } __attribute__ ((__packed__));
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun struct SHARED_MEMORY {
145*4882a593Smuzhiyun 	/* C000 */
146*4882a593Smuzhiyun 	u32 HostToNgene[64];
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun 	/* C100 */
149*4882a593Smuzhiyun 	u32 NgeneToHost[64];
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	/* C200 */
152*4882a593Smuzhiyun 	u64 NgeneCommand;
153*4882a593Smuzhiyun 	u64 NgeneStatus;
154*4882a593Smuzhiyun 	u64 NgeneEvent;
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun 	/* C210 */
157*4882a593Smuzhiyun 	u8 pad1[0xc260 - 0xc218];
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun 	/* C260 */
160*4882a593Smuzhiyun 	u32 IntCounts;
161*4882a593Smuzhiyun 	u32 IntEnable;
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 	/* C268 */
164*4882a593Smuzhiyun 	u8 pad2[0xd000 - 0xc268];
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun } __attribute__ ((__packed__));
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun struct BUFFER_STREAM_RESULTS {
169*4882a593Smuzhiyun 	u32 Clock;           /* Stream time in 100ns units */
170*4882a593Smuzhiyun 	u16 RemainingLines;  /* Remaining lines in this field.
171*4882a593Smuzhiyun 				0 for complete field */
172*4882a593Smuzhiyun 	u8  FieldCount;      /* Video field number */
173*4882a593Smuzhiyun 	u8  Flags;           /* Bit 7 = Done, Bit 6 = seen, Bit 5 = overflow,
174*4882a593Smuzhiyun 				Bit 0 = FieldID */
175*4882a593Smuzhiyun 	u16 BlockCount;      /* Audio block count (unused) */
176*4882a593Smuzhiyun 	u8  Reserved[2];
177*4882a593Smuzhiyun 	u32 DTOUpdate;
178*4882a593Smuzhiyun } __attribute__ ((__packed__));
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun struct HW_SCATTER_GATHER_ELEMENT {
181*4882a593Smuzhiyun 	u64 Address;
182*4882a593Smuzhiyun 	u32 Length;
183*4882a593Smuzhiyun 	u32 Reserved;
184*4882a593Smuzhiyun } __attribute__ ((__packed__));
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun struct BUFFER_HEADER {
187*4882a593Smuzhiyun 	u64    Next;
188*4882a593Smuzhiyun 	struct BUFFER_STREAM_RESULTS SR;
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 	u32    Number_of_entries_1;
191*4882a593Smuzhiyun 	u32    Reserved5;
192*4882a593Smuzhiyun 	u64    Address_of_first_entry_1;
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun 	u32    Number_of_entries_2;
195*4882a593Smuzhiyun 	u32    Reserved7;
196*4882a593Smuzhiyun 	u64    Address_of_first_entry_2;
197*4882a593Smuzhiyun } __attribute__ ((__packed__));
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun struct EVENT_BUFFER {
200*4882a593Smuzhiyun 	u32    TimeStamp;
201*4882a593Smuzhiyun 	u8     GPIOStatus;
202*4882a593Smuzhiyun 	u8     UARTStatus;
203*4882a593Smuzhiyun 	u8     RXCharacter;
204*4882a593Smuzhiyun 	u8     EventStatus;
205*4882a593Smuzhiyun 	u32    Reserved[2];
206*4882a593Smuzhiyun } __attribute__ ((__packed__));
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun /* Firmware commands. */
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun enum OPCODES {
211*4882a593Smuzhiyun 	CMD_NOP = 0,
212*4882a593Smuzhiyun 	CMD_FWLOAD_PREPARE  = 0x01,
213*4882a593Smuzhiyun 	CMD_FWLOAD_FINISH   = 0x02,
214*4882a593Smuzhiyun 	CMD_I2C_READ        = 0x03,
215*4882a593Smuzhiyun 	CMD_I2C_WRITE       = 0x04,
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	CMD_I2C_WRITE_NOSTOP = 0x05,
218*4882a593Smuzhiyun 	CMD_I2C_CONTINUE_WRITE = 0x06,
219*4882a593Smuzhiyun 	CMD_I2C_CONTINUE_WRITE_NOSTOP = 0x07,
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun 	CMD_DEBUG_OUTPUT    = 0x09,
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun 	CMD_CONTROL         = 0x10,
224*4882a593Smuzhiyun 	CMD_CONFIGURE_BUFFER = 0x11,
225*4882a593Smuzhiyun 	CMD_CONFIGURE_FREE_BUFFER = 0x12,
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 	CMD_SPI_READ        = 0x13,
228*4882a593Smuzhiyun 	CMD_SPI_WRITE       = 0x14,
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 	CMD_MEM_READ        = 0x20,
231*4882a593Smuzhiyun 	CMD_MEM_WRITE	    = 0x21,
232*4882a593Smuzhiyun 	CMD_SFR_READ	    = 0x22,
233*4882a593Smuzhiyun 	CMD_SFR_WRITE	    = 0x23,
234*4882a593Smuzhiyun 	CMD_IRAM_READ	    = 0x24,
235*4882a593Smuzhiyun 	CMD_IRAM_WRITE	    = 0x25,
236*4882a593Smuzhiyun 	CMD_SET_GPIO_PIN    = 0x26,
237*4882a593Smuzhiyun 	CMD_SET_GPIO_INT    = 0x27,
238*4882a593Smuzhiyun 	CMD_CONFIGURE_UART  = 0x28,
239*4882a593Smuzhiyun 	CMD_WRITE_UART      = 0x29,
240*4882a593Smuzhiyun 	MAX_CMD
241*4882a593Smuzhiyun };
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun enum RESPONSES {
244*4882a593Smuzhiyun 	OK = 0,
245*4882a593Smuzhiyun 	ERROR = 1
246*4882a593Smuzhiyun };
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun struct FW_HEADER {
249*4882a593Smuzhiyun 	u8 Opcode;
250*4882a593Smuzhiyun 	u8 Length;
251*4882a593Smuzhiyun } __attribute__ ((__packed__));
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun struct FW_I2C_WRITE {
254*4882a593Smuzhiyun 	struct FW_HEADER hdr;
255*4882a593Smuzhiyun 	u8 Device;
256*4882a593Smuzhiyun 	u8 Data[250];
257*4882a593Smuzhiyun } __attribute__ ((__packed__));
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun struct FW_I2C_CONTINUE_WRITE {
260*4882a593Smuzhiyun 	struct FW_HEADER hdr;
261*4882a593Smuzhiyun 	u8 Data[250];
262*4882a593Smuzhiyun } __attribute__ ((__packed__));
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun struct FW_I2C_READ {
265*4882a593Smuzhiyun 	struct FW_HEADER hdr;
266*4882a593Smuzhiyun 	u8 Device;
267*4882a593Smuzhiyun 	u8 Data[252];    /* followed by two bytes of read data count */
268*4882a593Smuzhiyun } __attribute__ ((__packed__));
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun struct FW_SPI_WRITE {
271*4882a593Smuzhiyun 	struct FW_HEADER hdr;
272*4882a593Smuzhiyun 	u8 ModeSelect;
273*4882a593Smuzhiyun 	u8 Data[250];
274*4882a593Smuzhiyun } __attribute__ ((__packed__));
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun struct FW_SPI_READ {
277*4882a593Smuzhiyun 	struct FW_HEADER hdr;
278*4882a593Smuzhiyun 	u8 ModeSelect;
279*4882a593Smuzhiyun 	u8 Data[252];    /* followed by two bytes of read data count */
280*4882a593Smuzhiyun } __attribute__ ((__packed__));
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun struct FW_FWLOAD_PREPARE {
283*4882a593Smuzhiyun 	struct FW_HEADER hdr;
284*4882a593Smuzhiyun } __attribute__ ((__packed__));
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun struct FW_FWLOAD_FINISH {
287*4882a593Smuzhiyun 	struct FW_HEADER hdr;
288*4882a593Smuzhiyun 	u16 Address;     /* address of final block */
289*4882a593Smuzhiyun 	u16 Length;
290*4882a593Smuzhiyun } __attribute__ ((__packed__));
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun /*
293*4882a593Smuzhiyun  * Meaning of FW_STREAM_CONTROL::Mode bits:
294*4882a593Smuzhiyun  *  Bit 7: Loopback PEXin to PEXout using TVOut channel
295*4882a593Smuzhiyun  *  Bit 6: AVLOOP
296*4882a593Smuzhiyun  *  Bit 5: Audio select; 0=I2S, 1=SPDIF
297*4882a593Smuzhiyun  *  Bit 4: AVSYNC
298*4882a593Smuzhiyun  *  Bit 3: Enable transport stream
299*4882a593Smuzhiyun  *  Bit 2: Enable audio capture
300*4882a593Smuzhiyun  *  Bit 1: Enable ITU-Video VBI capture
301*4882a593Smuzhiyun  *  Bit 0: Enable ITU-Video capture
302*4882a593Smuzhiyun  *
303*4882a593Smuzhiyun  * Meaning of FW_STREAM_CONTROL::Control bits (see UVI1_CTL)
304*4882a593Smuzhiyun  *  Bit 7: continuous capture
305*4882a593Smuzhiyun  *  Bit 6: capture one field
306*4882a593Smuzhiyun  *  Bit 5: capture one frame
307*4882a593Smuzhiyun  *  Bit 4: unused
308*4882a593Smuzhiyun  *  Bit 3: starting field; 0=odd, 1=even
309*4882a593Smuzhiyun  *  Bit 2: sample size; 0=8-bit, 1=10-bit
310*4882a593Smuzhiyun  *  Bit 1: data format; 0=UYVY, 1=YUY2
311*4882a593Smuzhiyun  *  Bit 0: resets buffer pointers
312*4882a593Smuzhiyun */
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun enum FSC_MODE_BITS {
315*4882a593Smuzhiyun 	SMODE_LOOPBACK          = 0x80,
316*4882a593Smuzhiyun 	SMODE_AVLOOP            = 0x40,
317*4882a593Smuzhiyun 	_SMODE_AUDIO_SPDIF      = 0x20,
318*4882a593Smuzhiyun 	_SMODE_AVSYNC           = 0x10,
319*4882a593Smuzhiyun 	_SMODE_TRANSPORT_STREAM = 0x08,
320*4882a593Smuzhiyun 	_SMODE_AUDIO_CAPTURE    = 0x04,
321*4882a593Smuzhiyun 	_SMODE_VBI_CAPTURE      = 0x02,
322*4882a593Smuzhiyun 	_SMODE_VIDEO_CAPTURE    = 0x01
323*4882a593Smuzhiyun };
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun /* Meaning of FW_STREAM_CONTROL::Stream bits:
327*4882a593Smuzhiyun  * Bit 3: Audio sample count:  0 = relative, 1 = absolute
328*4882a593Smuzhiyun  * Bit 2: color bar select; 1=color bars, 0=CV3 decoder
329*4882a593Smuzhiyun  * Bits 1-0: stream select, UVI1, UVI2, TVOUT
330*4882a593Smuzhiyun  */
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun struct FW_STREAM_CONTROL {
333*4882a593Smuzhiyun 	struct FW_HEADER hdr;
334*4882a593Smuzhiyun 	u8     Stream;             /* Stream number (UVI1, UVI2, TVOUT) */
335*4882a593Smuzhiyun 	u8     Control;            /* Value written to UVI1_CTL */
336*4882a593Smuzhiyun 	u8     Mode;               /* Controls clock source */
337*4882a593Smuzhiyun 	u8     SetupDataLen;	   /* Length of setup data, MSB=1 write
338*4882a593Smuzhiyun 				      backwards */
339*4882a593Smuzhiyun 	u16    CaptureBlockCount;  /* Blocks (a 256 Bytes) to capture per buffer
340*4882a593Smuzhiyun 				      for TS and Audio */
341*4882a593Smuzhiyun 	u64    Buffer_Address;	   /* Address of first buffer header */
342*4882a593Smuzhiyun 	u16    BytesPerVideoLine;
343*4882a593Smuzhiyun 	u16    MaxLinesPerField;
344*4882a593Smuzhiyun 	u16    MinLinesPerField;
345*4882a593Smuzhiyun 	u16    Reserved_1;
346*4882a593Smuzhiyun 	u16    BytesPerVBILine;
347*4882a593Smuzhiyun 	u16    MaxVBILinesPerField;
348*4882a593Smuzhiyun 	u16    MinVBILinesPerField;
349*4882a593Smuzhiyun 	u16    SetupDataAddr;      /* ngene relative address of setup data */
350*4882a593Smuzhiyun 	u8     SetupData[32];      /* setup data */
351*4882a593Smuzhiyun } __attribute__((__packed__));
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun #define AUDIO_BLOCK_SIZE    256
354*4882a593Smuzhiyun #define TS_BLOCK_SIZE       256
355*4882a593Smuzhiyun 
356*4882a593Smuzhiyun struct FW_MEM_READ {
357*4882a593Smuzhiyun 	struct FW_HEADER hdr;
358*4882a593Smuzhiyun 	u16   address;
359*4882a593Smuzhiyun } __attribute__ ((__packed__));
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun struct FW_MEM_WRITE {
362*4882a593Smuzhiyun 	struct FW_HEADER hdr;
363*4882a593Smuzhiyun 	u16   address;
364*4882a593Smuzhiyun 	u8    data;
365*4882a593Smuzhiyun } __attribute__ ((__packed__));
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun struct FW_SFR_IRAM_READ {
368*4882a593Smuzhiyun 	struct FW_HEADER hdr;
369*4882a593Smuzhiyun 	u8    address;
370*4882a593Smuzhiyun } __attribute__ ((__packed__));
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun struct FW_SFR_IRAM_WRITE {
373*4882a593Smuzhiyun 	struct FW_HEADER hdr;
374*4882a593Smuzhiyun 	u8    address;
375*4882a593Smuzhiyun 	u8    data;
376*4882a593Smuzhiyun } __attribute__ ((__packed__));
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun struct FW_SET_GPIO_PIN {
379*4882a593Smuzhiyun 	struct FW_HEADER hdr;
380*4882a593Smuzhiyun 	u8    select;
381*4882a593Smuzhiyun } __attribute__ ((__packed__));
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun struct FW_SET_GPIO_INT {
384*4882a593Smuzhiyun 	struct FW_HEADER hdr;
385*4882a593Smuzhiyun 	u8    select;
386*4882a593Smuzhiyun } __attribute__ ((__packed__));
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun struct FW_SET_DEBUGMODE {
389*4882a593Smuzhiyun 	struct FW_HEADER hdr;
390*4882a593Smuzhiyun 	u8   debug_flags;
391*4882a593Smuzhiyun } __attribute__ ((__packed__));
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun struct FW_CONFIGURE_BUFFERS {
394*4882a593Smuzhiyun 	struct FW_HEADER hdr;
395*4882a593Smuzhiyun 	u8   config;
396*4882a593Smuzhiyun } __attribute__ ((__packed__));
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun enum _BUFFER_CONFIGS {
399*4882a593Smuzhiyun 	/* 4k UVI1, 4k UVI2, 2k AUD1, 2k AUD2  (standard usage) */
400*4882a593Smuzhiyun 	BUFFER_CONFIG_4422 = 0,
401*4882a593Smuzhiyun 	/* 3k UVI1, 3k UVI2, 3k AUD1, 3k AUD2  (4x TS input usage) */
402*4882a593Smuzhiyun 	BUFFER_CONFIG_3333 = 1,
403*4882a593Smuzhiyun 	/* 8k UVI1, 0k UVI2, 2k AUD1, 2k I2SOut  (HDTV decoder usage) */
404*4882a593Smuzhiyun 	BUFFER_CONFIG_8022 = 2,
405*4882a593Smuzhiyun 	BUFFER_CONFIG_FW17 = 255, /* Use new FW 17 command */
406*4882a593Smuzhiyun };
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun struct FW_CONFIGURE_FREE_BUFFERS {
409*4882a593Smuzhiyun 	struct FW_HEADER hdr;
410*4882a593Smuzhiyun 	struct {
411*4882a593Smuzhiyun 		u8   UVI1_BufferLength;
412*4882a593Smuzhiyun 		u8   UVI2_BufferLength;
413*4882a593Smuzhiyun 		u8   TVO_BufferLength;
414*4882a593Smuzhiyun 		u8   AUD1_BufferLength;
415*4882a593Smuzhiyun 		u8   AUD2_BufferLength;
416*4882a593Smuzhiyun 		u8   TVA_BufferLength;
417*4882a593Smuzhiyun 	} __packed config;
418*4882a593Smuzhiyun } __attribute__ ((__packed__));
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun struct FW_CONFIGURE_UART {
421*4882a593Smuzhiyun 	struct FW_HEADER hdr;
422*4882a593Smuzhiyun 	u8 UartControl;
423*4882a593Smuzhiyun } __attribute__ ((__packed__));
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun enum _UART_CONFIG {
426*4882a593Smuzhiyun 	_UART_BAUDRATE_19200 = 0,
427*4882a593Smuzhiyun 	_UART_BAUDRATE_9600  = 1,
428*4882a593Smuzhiyun 	_UART_BAUDRATE_4800  = 2,
429*4882a593Smuzhiyun 	_UART_BAUDRATE_2400  = 3,
430*4882a593Smuzhiyun 	_UART_RX_ENABLE      = 0x40,
431*4882a593Smuzhiyun 	_UART_TX_ENABLE      = 0x80,
432*4882a593Smuzhiyun };
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun struct FW_WRITE_UART {
435*4882a593Smuzhiyun 	struct FW_HEADER hdr;
436*4882a593Smuzhiyun 	u8 Data[252];
437*4882a593Smuzhiyun } __attribute__ ((__packed__));
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun struct ngene_command {
441*4882a593Smuzhiyun 	u32 in_len;
442*4882a593Smuzhiyun 	u32 out_len;
443*4882a593Smuzhiyun 	union {
444*4882a593Smuzhiyun 		u32                              raw[64];
445*4882a593Smuzhiyun 		u8                               raw8[256];
446*4882a593Smuzhiyun 		struct FW_HEADER                 hdr;
447*4882a593Smuzhiyun 		struct FW_I2C_WRITE              I2CWrite;
448*4882a593Smuzhiyun 		struct FW_I2C_CONTINUE_WRITE     I2CContinueWrite;
449*4882a593Smuzhiyun 		struct FW_I2C_READ               I2CRead;
450*4882a593Smuzhiyun 		struct FW_STREAM_CONTROL         StreamControl;
451*4882a593Smuzhiyun 		struct FW_FWLOAD_PREPARE         FWLoadPrepare;
452*4882a593Smuzhiyun 		struct FW_FWLOAD_FINISH          FWLoadFinish;
453*4882a593Smuzhiyun 		struct FW_MEM_READ		 MemoryRead;
454*4882a593Smuzhiyun 		struct FW_MEM_WRITE		 MemoryWrite;
455*4882a593Smuzhiyun 		struct FW_SFR_IRAM_READ		 SfrIramRead;
456*4882a593Smuzhiyun 		struct FW_SFR_IRAM_WRITE         SfrIramWrite;
457*4882a593Smuzhiyun 		struct FW_SPI_WRITE              SPIWrite;
458*4882a593Smuzhiyun 		struct FW_SPI_READ               SPIRead;
459*4882a593Smuzhiyun 		struct FW_SET_GPIO_PIN           SetGpioPin;
460*4882a593Smuzhiyun 		struct FW_SET_GPIO_INT           SetGpioInt;
461*4882a593Smuzhiyun 		struct FW_SET_DEBUGMODE          SetDebugMode;
462*4882a593Smuzhiyun 		struct FW_CONFIGURE_BUFFERS      ConfigureBuffers;
463*4882a593Smuzhiyun 		struct FW_CONFIGURE_FREE_BUFFERS ConfigureFreeBuffers;
464*4882a593Smuzhiyun 		struct FW_CONFIGURE_UART         ConfigureUart;
465*4882a593Smuzhiyun 		struct FW_WRITE_UART             WriteUart;
466*4882a593Smuzhiyun 	} cmd;
467*4882a593Smuzhiyun } __attribute__ ((__packed__));
468*4882a593Smuzhiyun 
469*4882a593Smuzhiyun #define NGENE_INTERFACE_VERSION 0x103
470*4882a593Smuzhiyun #define MAX_VIDEO_BUFFER_SIZE   (417792) /* 288*1440 rounded up to next page */
471*4882a593Smuzhiyun #define MAX_AUDIO_BUFFER_SIZE     (8192) /* Gives room for about 23msec@48KHz */
472*4882a593Smuzhiyun #define MAX_VBI_BUFFER_SIZE      (28672) /* 1144*18 rounded up to next page */
473*4882a593Smuzhiyun #define MAX_TS_BUFFER_SIZE       (98304) /* 512*188 rounded up to next page */
474*4882a593Smuzhiyun #define MAX_HDTV_BUFFER_SIZE   (2080768) /* 541*1920*2 rounded up to next page
475*4882a593Smuzhiyun 					    Max: (1920x1080i60) */
476*4882a593Smuzhiyun 
477*4882a593Smuzhiyun #define OVERFLOW_BUFFER_SIZE    (8192)
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun #define RING_SIZE_VIDEO     4
480*4882a593Smuzhiyun #define RING_SIZE_AUDIO     8
481*4882a593Smuzhiyun #define RING_SIZE_TS        8
482*4882a593Smuzhiyun 
483*4882a593Smuzhiyun #define NUM_SCATTER_GATHER_ENTRIES  8
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun #define MAX_DMA_LENGTH (((MAX_VIDEO_BUFFER_SIZE + MAX_VBI_BUFFER_SIZE) * \
486*4882a593Smuzhiyun 			RING_SIZE_VIDEO * 2) + \
487*4882a593Smuzhiyun 			(MAX_AUDIO_BUFFER_SIZE * RING_SIZE_AUDIO * 2) + \
488*4882a593Smuzhiyun 			(MAX_TS_BUFFER_SIZE * RING_SIZE_TS * 4) + \
489*4882a593Smuzhiyun 			(RING_SIZE_VIDEO * PAGE_SIZE * 2) + \
490*4882a593Smuzhiyun 			(RING_SIZE_AUDIO * PAGE_SIZE * 2) + \
491*4882a593Smuzhiyun 			(RING_SIZE_TS    * PAGE_SIZE * 4) + \
492*4882a593Smuzhiyun 			 8 * PAGE_SIZE + OVERFLOW_BUFFER_SIZE + PAGE_SIZE)
493*4882a593Smuzhiyun 
494*4882a593Smuzhiyun #define EVENT_QUEUE_SIZE    16
495*4882a593Smuzhiyun 
496*4882a593Smuzhiyun /* Gathers the current state of a single channel. */
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun struct SBufferHeader {
499*4882a593Smuzhiyun 	struct BUFFER_HEADER   ngeneBuffer; /* Physical descriptor */
500*4882a593Smuzhiyun 	struct SBufferHeader  *Next;
501*4882a593Smuzhiyun 	void                  *Buffer1;
502*4882a593Smuzhiyun 	struct HW_SCATTER_GATHER_ELEMENT *scList1;
503*4882a593Smuzhiyun 	void                  *Buffer2;
504*4882a593Smuzhiyun 	struct HW_SCATTER_GATHER_ELEMENT *scList2;
505*4882a593Smuzhiyun };
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun /* Sizeof SBufferHeader aligned to next 64 Bit boundary (hw restriction) */
508*4882a593Smuzhiyun #define SIZEOF_SBufferHeader ((sizeof(struct SBufferHeader) + 63) & ~63)
509*4882a593Smuzhiyun 
510*4882a593Smuzhiyun enum HWSTATE {
511*4882a593Smuzhiyun 	HWSTATE_STOP,
512*4882a593Smuzhiyun 	HWSTATE_STARTUP,
513*4882a593Smuzhiyun 	HWSTATE_RUN,
514*4882a593Smuzhiyun 	HWSTATE_PAUSE,
515*4882a593Smuzhiyun };
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun enum KSSTATE {
518*4882a593Smuzhiyun 	KSSTATE_STOP,
519*4882a593Smuzhiyun 	KSSTATE_ACQUIRE,
520*4882a593Smuzhiyun 	KSSTATE_PAUSE,
521*4882a593Smuzhiyun 	KSSTATE_RUN,
522*4882a593Smuzhiyun };
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun struct SRingBufferDescriptor {
525*4882a593Smuzhiyun 	struct SBufferHeader *Head; /* Points to first buffer in ring buffer
526*4882a593Smuzhiyun 				       structure*/
527*4882a593Smuzhiyun 	u64   PAHead;         /* Physical address of first buffer */
528*4882a593Smuzhiyun 	u32   MemSize;        /* Memory size of allocated ring buffers
529*4882a593Smuzhiyun 				 (needed for freeing) */
530*4882a593Smuzhiyun 	u32   NumBuffers;     /* Number of buffers in the ring */
531*4882a593Smuzhiyun 	u32   Buffer1Length;  /* Allocated length of Buffer 1 */
532*4882a593Smuzhiyun 	u32   Buffer2Length;  /* Allocated length of Buffer 2 */
533*4882a593Smuzhiyun 	void *SCListMem;      /* Memory to hold scatter gather lists for this
534*4882a593Smuzhiyun 				 ring */
535*4882a593Smuzhiyun 	u64   PASCListMem;    /* Physical address  .. */
536*4882a593Smuzhiyun 	u32   SCListMemSize;  /* Size of this memory */
537*4882a593Smuzhiyun };
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun enum STREAMMODEFLAGS {
540*4882a593Smuzhiyun 	StreamMode_NONE   = 0, /* Stream not used */
541*4882a593Smuzhiyun 	StreamMode_ANALOG = 1, /* Analog: Stream 0,1 = Video, 2,3 = Audio */
542*4882a593Smuzhiyun 	StreamMode_TSIN   = 2, /* Transport stream input (all) */
543*4882a593Smuzhiyun 	StreamMode_HDTV   = 4, /* HDTV: Maximum 1920x1080p30,1920x1080i60
544*4882a593Smuzhiyun 				  (only stream 0) */
545*4882a593Smuzhiyun 	StreamMode_TSOUT  = 8, /* Transport stream output (only stream 3) */
546*4882a593Smuzhiyun };
547*4882a593Smuzhiyun 
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun enum BufferExchangeFlags {
550*4882a593Smuzhiyun 	BEF_EVEN_FIELD   = 0x00000001,
551*4882a593Smuzhiyun 	BEF_CONTINUATION = 0x00000002,
552*4882a593Smuzhiyun 	BEF_MORE_DATA    = 0x00000004,
553*4882a593Smuzhiyun 	BEF_OVERFLOW     = 0x00000008,
554*4882a593Smuzhiyun 	DF_SWAP32        = 0x00010000,
555*4882a593Smuzhiyun };
556*4882a593Smuzhiyun 
557*4882a593Smuzhiyun typedef void *(IBufferExchange)(void *, void *, u32, u32, u32);
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun struct MICI_STREAMINFO {
560*4882a593Smuzhiyun 	IBufferExchange    *pExchange;
561*4882a593Smuzhiyun 	IBufferExchange    *pExchangeVBI;     /* Secondary (VBI, ancillary) */
562*4882a593Smuzhiyun 	u8  Stream;
563*4882a593Smuzhiyun 	u8  Flags;
564*4882a593Smuzhiyun 	u8  Mode;
565*4882a593Smuzhiyun 	u8  Reserved;
566*4882a593Smuzhiyun 	u16 nLinesVideo;
567*4882a593Smuzhiyun 	u16 nBytesPerLineVideo;
568*4882a593Smuzhiyun 	u16 nLinesVBI;
569*4882a593Smuzhiyun 	u16 nBytesPerLineVBI;
570*4882a593Smuzhiyun 	u32 CaptureLength;    /* Used for audio and transport stream */
571*4882a593Smuzhiyun };
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun /****************************************************************************/
574*4882a593Smuzhiyun /* STRUCTS ******************************************************************/
575*4882a593Smuzhiyun /****************************************************************************/
576*4882a593Smuzhiyun 
577*4882a593Smuzhiyun /* sound hardware definition */
578*4882a593Smuzhiyun #define MIXER_ADDR_TVTUNER      0
579*4882a593Smuzhiyun #define MIXER_ADDR_LAST         0
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun struct ngene_channel;
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun /*struct sound chip*/
584*4882a593Smuzhiyun 
585*4882a593Smuzhiyun struct mychip {
586*4882a593Smuzhiyun 	struct ngene_channel *chan;
587*4882a593Smuzhiyun 	struct snd_card *card;
588*4882a593Smuzhiyun 	struct pci_dev *pci;
589*4882a593Smuzhiyun 	struct snd_pcm_substream *substream;
590*4882a593Smuzhiyun 	struct snd_pcm *pcm;
591*4882a593Smuzhiyun 	unsigned long port;
592*4882a593Smuzhiyun 	int irq;
593*4882a593Smuzhiyun 	spinlock_t mixer_lock;
594*4882a593Smuzhiyun 	spinlock_t lock;
595*4882a593Smuzhiyun 	int mixer_volume[MIXER_ADDR_LAST + 1][2];
596*4882a593Smuzhiyun 	int capture_source[MIXER_ADDR_LAST + 1][2];
597*4882a593Smuzhiyun };
598*4882a593Smuzhiyun 
599*4882a593Smuzhiyun #ifdef NGENE_V4L
600*4882a593Smuzhiyun struct ngene_overlay {
601*4882a593Smuzhiyun 	int                    tvnorm;
602*4882a593Smuzhiyun 	struct v4l2_rect       w;
603*4882a593Smuzhiyun 	enum v4l2_field        field;
604*4882a593Smuzhiyun 	struct v4l2_clip       *clips;
605*4882a593Smuzhiyun 	int                    nclips;
606*4882a593Smuzhiyun 	int                    setup_ok;
607*4882a593Smuzhiyun };
608*4882a593Smuzhiyun 
609*4882a593Smuzhiyun struct ngene_tvnorm {
610*4882a593Smuzhiyun 	int   v4l2_id;
611*4882a593Smuzhiyun 	char  *name;
612*4882a593Smuzhiyun 	u16   swidth, sheight; /* scaled standard width, height */
613*4882a593Smuzhiyun 	int   tuner_norm;
614*4882a593Smuzhiyun 	int   soundstd;
615*4882a593Smuzhiyun };
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun struct ngene_vopen {
618*4882a593Smuzhiyun 	struct ngene_channel      *ch;
619*4882a593Smuzhiyun 	enum v4l2_priority         prio;
620*4882a593Smuzhiyun 	int                        width;
621*4882a593Smuzhiyun 	int                        height;
622*4882a593Smuzhiyun 	int                        depth;
623*4882a593Smuzhiyun 	struct videobuf_queue      vbuf_q;
624*4882a593Smuzhiyun 	struct videobuf_queue      vbi;
625*4882a593Smuzhiyun 	int                        fourcc;
626*4882a593Smuzhiyun 	int                        picxcount;
627*4882a593Smuzhiyun 	int                        resources;
628*4882a593Smuzhiyun 	enum v4l2_buf_type         type;
629*4882a593Smuzhiyun 	const struct ngene_format *fmt;
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun 	const struct ngene_format *ovfmt;
632*4882a593Smuzhiyun 	struct ngene_overlay       ov;
633*4882a593Smuzhiyun };
634*4882a593Smuzhiyun #endif
635*4882a593Smuzhiyun 
636*4882a593Smuzhiyun struct ngene_channel {
637*4882a593Smuzhiyun 	struct device         device;
638*4882a593Smuzhiyun 	struct i2c_adapter    i2c_adapter;
639*4882a593Smuzhiyun 	struct i2c_client    *i2c_client[1];
640*4882a593Smuzhiyun 	int                   i2c_client_fe;
641*4882a593Smuzhiyun 
642*4882a593Smuzhiyun 	struct ngene         *dev;
643*4882a593Smuzhiyun 	int                   number;
644*4882a593Smuzhiyun 	int                   type;
645*4882a593Smuzhiyun 	int                   mode;
646*4882a593Smuzhiyun 	bool                  has_adapter;
647*4882a593Smuzhiyun 	bool                  has_demux;
648*4882a593Smuzhiyun 	int                   demod_type;
649*4882a593Smuzhiyun 	int (*gate_ctrl)(struct dvb_frontend *, int);
650*4882a593Smuzhiyun 
651*4882a593Smuzhiyun 	struct dvb_frontend  *fe;
652*4882a593Smuzhiyun 	struct dvb_frontend  *fe2;
653*4882a593Smuzhiyun 	struct dmxdev         dmxdev;
654*4882a593Smuzhiyun 	struct dvb_demux      demux;
655*4882a593Smuzhiyun 	struct dvb_net        dvbnet;
656*4882a593Smuzhiyun 	struct dmx_frontend   hw_frontend;
657*4882a593Smuzhiyun 	struct dmx_frontend   mem_frontend;
658*4882a593Smuzhiyun 	int                   users;
659*4882a593Smuzhiyun 	struct video_device  *v4l_dev;
660*4882a593Smuzhiyun 	struct dvb_device    *ci_dev;
661*4882a593Smuzhiyun 	struct tasklet_struct demux_tasklet;
662*4882a593Smuzhiyun 
663*4882a593Smuzhiyun 	struct SBufferHeader *nextBuffer;
664*4882a593Smuzhiyun 	enum KSSTATE          State;
665*4882a593Smuzhiyun 	enum HWSTATE          HWState;
666*4882a593Smuzhiyun 	u8                    Stream;
667*4882a593Smuzhiyun 	u8                    Flags;
668*4882a593Smuzhiyun 	u8                    Mode;
669*4882a593Smuzhiyun 	IBufferExchange      *pBufferExchange;
670*4882a593Smuzhiyun 	IBufferExchange      *pBufferExchange2;
671*4882a593Smuzhiyun 
672*4882a593Smuzhiyun 	spinlock_t            state_lock;
673*4882a593Smuzhiyun 	u16                   nLines;
674*4882a593Smuzhiyun 	u16                   nBytesPerLine;
675*4882a593Smuzhiyun 	u16                   nVBILines;
676*4882a593Smuzhiyun 	u16                   nBytesPerVBILine;
677*4882a593Smuzhiyun 	u16                   itumode;
678*4882a593Smuzhiyun 	u32                   Capture1Length;
679*4882a593Smuzhiyun 	u32                   Capture2Length;
680*4882a593Smuzhiyun 	struct SRingBufferDescriptor RingBuffer;
681*4882a593Smuzhiyun 	struct SRingBufferDescriptor TSRingBuffer;
682*4882a593Smuzhiyun 	struct SRingBufferDescriptor TSIdleBuffer;
683*4882a593Smuzhiyun 
684*4882a593Smuzhiyun 	u32                   DataFormatFlags;
685*4882a593Smuzhiyun 
686*4882a593Smuzhiyun 	int                   AudioDTOUpdated;
687*4882a593Smuzhiyun 	u32                   AudioDTOValue;
688*4882a593Smuzhiyun 
689*4882a593Smuzhiyun 	int (*set_tone)(struct dvb_frontend *, enum fe_sec_tone_mode);
690*4882a593Smuzhiyun 	u8 lnbh;
691*4882a593Smuzhiyun 
692*4882a593Smuzhiyun 	/* stuff from analog driver */
693*4882a593Smuzhiyun 
694*4882a593Smuzhiyun 	int minor;
695*4882a593Smuzhiyun 	struct mychip        *mychip;
696*4882a593Smuzhiyun 	struct snd_card      *soundcard;
697*4882a593Smuzhiyun 	u8                   *evenbuffer;
698*4882a593Smuzhiyun 	u8                    dma_on;
699*4882a593Smuzhiyun 	int                   soundstreamon;
700*4882a593Smuzhiyun 	int                   audiomute;
701*4882a593Smuzhiyun 	int                   soundbuffisallocated;
702*4882a593Smuzhiyun 	int                   sndbuffflag;
703*4882a593Smuzhiyun 	int                   tun_rdy;
704*4882a593Smuzhiyun 	int                   dec_rdy;
705*4882a593Smuzhiyun 	int                   tun_dec_rdy;
706*4882a593Smuzhiyun 	int                   lastbufferflag;
707*4882a593Smuzhiyun 
708*4882a593Smuzhiyun 	struct ngene_tvnorm  *tvnorms;
709*4882a593Smuzhiyun 	int                   tvnorm_num;
710*4882a593Smuzhiyun 	int                   tvnorm;
711*4882a593Smuzhiyun 
712*4882a593Smuzhiyun #ifdef NGENE_V4L
713*4882a593Smuzhiyun 	int                   videousers;
714*4882a593Smuzhiyun 	struct v4l2_prio_state prio;
715*4882a593Smuzhiyun 	struct ngene_vopen    init;
716*4882a593Smuzhiyun 	int                   resources;
717*4882a593Smuzhiyun 	struct v4l2_framebuffer fbuf;
718*4882a593Smuzhiyun 	struct ngene_buffer  *screen;     /* overlay             */
719*4882a593Smuzhiyun 	struct list_head      capture;    /* video capture queue */
720*4882a593Smuzhiyun 	spinlock_t s_lock;
721*4882a593Smuzhiyun 	struct semaphore reslock;
722*4882a593Smuzhiyun #endif
723*4882a593Smuzhiyun 
724*4882a593Smuzhiyun 	int running;
725*4882a593Smuzhiyun 
726*4882a593Smuzhiyun 	int tsin_offset;
727*4882a593Smuzhiyun 	u8  tsin_buffer[188];
728*4882a593Smuzhiyun };
729*4882a593Smuzhiyun 
730*4882a593Smuzhiyun 
731*4882a593Smuzhiyun struct ngene_ci {
732*4882a593Smuzhiyun 	struct device         device;
733*4882a593Smuzhiyun 	struct i2c_adapter    i2c_adapter;
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun 	struct ngene         *dev;
736*4882a593Smuzhiyun 	struct dvb_ca_en50221 *en;
737*4882a593Smuzhiyun };
738*4882a593Smuzhiyun 
739*4882a593Smuzhiyun struct ngene;
740*4882a593Smuzhiyun 
741*4882a593Smuzhiyun typedef void (rx_cb_t)(struct ngene *, u32, u8);
742*4882a593Smuzhiyun typedef void (tx_cb_t)(struct ngene *, u32);
743*4882a593Smuzhiyun 
744*4882a593Smuzhiyun struct ngene {
745*4882a593Smuzhiyun 	int                   nr;
746*4882a593Smuzhiyun 	struct pci_dev       *pci_dev;
747*4882a593Smuzhiyun 	unsigned char __iomem *iomem;
748*4882a593Smuzhiyun 
749*4882a593Smuzhiyun 	/*struct i2c_adapter  i2c_adapter;*/
750*4882a593Smuzhiyun 
751*4882a593Smuzhiyun 	u32                   device_version;
752*4882a593Smuzhiyun 	u32                   fw_interface_version;
753*4882a593Smuzhiyun 	u32                   icounts;
754*4882a593Smuzhiyun 	bool                  msi_enabled;
755*4882a593Smuzhiyun 	bool                  cmd_timeout_workaround;
756*4882a593Smuzhiyun 
757*4882a593Smuzhiyun 	u8                   *CmdDoneByte;
758*4882a593Smuzhiyun 	int                   BootFirmware;
759*4882a593Smuzhiyun 	void                 *OverflowBuffer;
760*4882a593Smuzhiyun 	dma_addr_t            PAOverflowBuffer;
761*4882a593Smuzhiyun 	void                 *FWInterfaceBuffer;
762*4882a593Smuzhiyun 	dma_addr_t            PAFWInterfaceBuffer;
763*4882a593Smuzhiyun 	u8                   *ngenetohost;
764*4882a593Smuzhiyun 	u8                   *hosttongene;
765*4882a593Smuzhiyun 
766*4882a593Smuzhiyun 	struct EVENT_BUFFER   EventQueue[EVENT_QUEUE_SIZE];
767*4882a593Smuzhiyun 	int                   EventQueueOverflowCount;
768*4882a593Smuzhiyun 	int                   EventQueueOverflowFlag;
769*4882a593Smuzhiyun 	struct tasklet_struct event_tasklet;
770*4882a593Smuzhiyun 	struct EVENT_BUFFER  *EventBuffer;
771*4882a593Smuzhiyun 	int                   EventQueueWriteIndex;
772*4882a593Smuzhiyun 	int                   EventQueueReadIndex;
773*4882a593Smuzhiyun 
774*4882a593Smuzhiyun 	wait_queue_head_t     cmd_wq;
775*4882a593Smuzhiyun 	int                   cmd_done;
776*4882a593Smuzhiyun 	struct mutex          cmd_mutex;
777*4882a593Smuzhiyun 	struct mutex          stream_mutex;
778*4882a593Smuzhiyun 	struct semaphore      pll_mutex;
779*4882a593Smuzhiyun 	struct mutex          i2c_switch_mutex;
780*4882a593Smuzhiyun 	int                   i2c_current_channel;
781*4882a593Smuzhiyun 	int                   i2c_current_bus;
782*4882a593Smuzhiyun 	spinlock_t            cmd_lock;
783*4882a593Smuzhiyun 
784*4882a593Smuzhiyun 	struct dvb_adapter    adapter[MAX_STREAM];
785*4882a593Smuzhiyun 	struct dvb_adapter    *first_adapter; /* "one_adapter" modprobe opt */
786*4882a593Smuzhiyun 	struct ngene_channel  channel[MAX_STREAM];
787*4882a593Smuzhiyun 
788*4882a593Smuzhiyun 	struct ngene_info    *card_info;
789*4882a593Smuzhiyun 
790*4882a593Smuzhiyun 	tx_cb_t              *TxEventNotify;
791*4882a593Smuzhiyun 	rx_cb_t              *RxEventNotify;
792*4882a593Smuzhiyun 	int                   tx_busy;
793*4882a593Smuzhiyun 	wait_queue_head_t     tx_wq;
794*4882a593Smuzhiyun 	wait_queue_head_t     rx_wq;
795*4882a593Smuzhiyun #define UART_RBUF_LEN 4096
796*4882a593Smuzhiyun 	u8                    uart_rbuf[UART_RBUF_LEN];
797*4882a593Smuzhiyun 	int                   uart_rp, uart_wp;
798*4882a593Smuzhiyun 
799*4882a593Smuzhiyun #define TS_FILLER  0x6f
800*4882a593Smuzhiyun 
801*4882a593Smuzhiyun 	u8                   *tsout_buf;
802*4882a593Smuzhiyun #define TSOUT_BUF_SIZE (512*188*8)
803*4882a593Smuzhiyun 	struct dvb_ringbuffer tsout_rbuf;
804*4882a593Smuzhiyun 
805*4882a593Smuzhiyun 	u8                   *tsin_buf;
806*4882a593Smuzhiyun #define TSIN_BUF_SIZE (512*188*8)
807*4882a593Smuzhiyun 	struct dvb_ringbuffer tsin_rbuf;
808*4882a593Smuzhiyun 
809*4882a593Smuzhiyun 	u8                   *ain_buf;
810*4882a593Smuzhiyun #define AIN_BUF_SIZE (128*1024)
811*4882a593Smuzhiyun 	struct dvb_ringbuffer ain_rbuf;
812*4882a593Smuzhiyun 
813*4882a593Smuzhiyun 
814*4882a593Smuzhiyun 	u8                   *vin_buf;
815*4882a593Smuzhiyun #define VIN_BUF_SIZE (4*1920*1080)
816*4882a593Smuzhiyun 	struct dvb_ringbuffer vin_rbuf;
817*4882a593Smuzhiyun 
818*4882a593Smuzhiyun 	unsigned long         exp_val;
819*4882a593Smuzhiyun 	int prev_cmd;
820*4882a593Smuzhiyun 
821*4882a593Smuzhiyun 	struct ngene_ci       ci;
822*4882a593Smuzhiyun };
823*4882a593Smuzhiyun 
824*4882a593Smuzhiyun struct ngene_info {
825*4882a593Smuzhiyun 	int   type;
826*4882a593Smuzhiyun #define NGENE_APP        0
827*4882a593Smuzhiyun #define NGENE_TERRATEC   1
828*4882a593Smuzhiyun #define NGENE_SIDEWINDER 2
829*4882a593Smuzhiyun #define NGENE_RACER      3
830*4882a593Smuzhiyun #define NGENE_VIPER      4
831*4882a593Smuzhiyun #define NGENE_PYTHON     5
832*4882a593Smuzhiyun #define NGENE_VBOX_V1	 6
833*4882a593Smuzhiyun #define NGENE_VBOX_V2	 7
834*4882a593Smuzhiyun 
835*4882a593Smuzhiyun 	int   fw_version;
836*4882a593Smuzhiyun 	bool  msi_supported;
837*4882a593Smuzhiyun 	char *name;
838*4882a593Smuzhiyun 
839*4882a593Smuzhiyun 	int   io_type[MAX_STREAM];
840*4882a593Smuzhiyun #define NGENE_IO_NONE    0
841*4882a593Smuzhiyun #define NGENE_IO_TV      1
842*4882a593Smuzhiyun #define NGENE_IO_HDTV    2
843*4882a593Smuzhiyun #define NGENE_IO_TSIN    4
844*4882a593Smuzhiyun #define NGENE_IO_TSOUT   8
845*4882a593Smuzhiyun #define NGENE_IO_AIN     16
846*4882a593Smuzhiyun 
847*4882a593Smuzhiyun 	void *fe_config[4];
848*4882a593Smuzhiyun 	void *tuner_config[4];
849*4882a593Smuzhiyun 
850*4882a593Smuzhiyun 	int (*demod_attach[4])(struct ngene_channel *);
851*4882a593Smuzhiyun 	int (*tuner_attach[4])(struct ngene_channel *);
852*4882a593Smuzhiyun 
853*4882a593Smuzhiyun 	u8    avf[4];
854*4882a593Smuzhiyun 	u8    msp[4];
855*4882a593Smuzhiyun 	u8    demoda[4];
856*4882a593Smuzhiyun 	u8    lnb[4];
857*4882a593Smuzhiyun 	int   i2c_access;
858*4882a593Smuzhiyun 	u8    ntsc;
859*4882a593Smuzhiyun 	u8    tsf[4];
860*4882a593Smuzhiyun 	u8    i2s[4];
861*4882a593Smuzhiyun 
862*4882a593Smuzhiyun 	int (*gate_ctrl)(struct dvb_frontend *, int);
863*4882a593Smuzhiyun 	int (*switch_ctrl)(struct ngene_channel *, int, int);
864*4882a593Smuzhiyun };
865*4882a593Smuzhiyun 
866*4882a593Smuzhiyun #ifdef NGENE_V4L
867*4882a593Smuzhiyun struct ngene_format {
868*4882a593Smuzhiyun 	char *name;
869*4882a593Smuzhiyun 	int   fourcc;          /* video4linux 2      */
870*4882a593Smuzhiyun 	int   btformat;        /* BT848_COLOR_FMT_*  */
871*4882a593Smuzhiyun 	int   format;
872*4882a593Smuzhiyun 	int   btswap;          /* BT848_COLOR_CTL_*  */
873*4882a593Smuzhiyun 	int   depth;           /* bit/pixel          */
874*4882a593Smuzhiyun 	int   flags;
875*4882a593Smuzhiyun 	int   hshift, vshift;  /* for planar modes   */
876*4882a593Smuzhiyun 	int   palette;
877*4882a593Smuzhiyun };
878*4882a593Smuzhiyun 
879*4882a593Smuzhiyun #define RESOURCE_OVERLAY       1
880*4882a593Smuzhiyun #define RESOURCE_VIDEO         2
881*4882a593Smuzhiyun #define RESOURCE_VBI           4
882*4882a593Smuzhiyun 
883*4882a593Smuzhiyun struct ngene_buffer {
884*4882a593Smuzhiyun 	/* common v4l buffer stuff -- must be first */
885*4882a593Smuzhiyun 	struct videobuf_buffer     vb;
886*4882a593Smuzhiyun 
887*4882a593Smuzhiyun 	/* ngene specific */
888*4882a593Smuzhiyun 	const struct ngene_format *fmt;
889*4882a593Smuzhiyun 	int                        tvnorm;
890*4882a593Smuzhiyun 	int                        btformat;
891*4882a593Smuzhiyun 	int                        btswap;
892*4882a593Smuzhiyun };
893*4882a593Smuzhiyun #endif
894*4882a593Smuzhiyun 
895*4882a593Smuzhiyun 
896*4882a593Smuzhiyun /* Provided by ngene-core.c */
897*4882a593Smuzhiyun int ngene_probe(struct pci_dev *pci_dev, const struct pci_device_id *id);
898*4882a593Smuzhiyun void ngene_remove(struct pci_dev *pdev);
899*4882a593Smuzhiyun void ngene_shutdown(struct pci_dev *pdev);
900*4882a593Smuzhiyun int ngene_command(struct ngene *dev, struct ngene_command *com);
901*4882a593Smuzhiyun int ngene_command_gpio_set(struct ngene *dev, u8 select, u8 level);
902*4882a593Smuzhiyun void set_transfer(struct ngene_channel *chan, int state);
903*4882a593Smuzhiyun void FillTSBuffer(void *Buffer, int Length, u32 Flags);
904*4882a593Smuzhiyun 
905*4882a593Smuzhiyun /* Provided by ngene-cards.c */
906*4882a593Smuzhiyun int ngene_port_has_cxd2099(struct i2c_adapter *i2c, u8 *type);
907*4882a593Smuzhiyun 
908*4882a593Smuzhiyun /* Provided by ngene-i2c.c */
909*4882a593Smuzhiyun int ngene_i2c_init(struct ngene *dev, int dev_nr);
910*4882a593Smuzhiyun 
911*4882a593Smuzhiyun /* Provided by ngene-dvb.c */
912*4882a593Smuzhiyun extern struct dvb_device ngene_dvbdev_ci;
913*4882a593Smuzhiyun void *tsout_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags);
914*4882a593Smuzhiyun void *tsin_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags);
915*4882a593Smuzhiyun int ngene_start_feed(struct dvb_demux_feed *dvbdmxfeed);
916*4882a593Smuzhiyun int ngene_stop_feed(struct dvb_demux_feed *dvbdmxfeed);
917*4882a593Smuzhiyun int my_dvb_dmx_ts_card_init(struct dvb_demux *dvbdemux, char *id,
918*4882a593Smuzhiyun 			    int (*start_feed)(struct dvb_demux_feed *),
919*4882a593Smuzhiyun 			    int (*stop_feed)(struct dvb_demux_feed *),
920*4882a593Smuzhiyun 			    void *priv);
921*4882a593Smuzhiyun int my_dvb_dmxdev_ts_card_init(struct dmxdev *dmxdev,
922*4882a593Smuzhiyun 			       struct dvb_demux *dvbdemux,
923*4882a593Smuzhiyun 			       struct dmx_frontend *hw_frontend,
924*4882a593Smuzhiyun 			       struct dmx_frontend *mem_frontend,
925*4882a593Smuzhiyun 			       struct dvb_adapter *dvb_adapter);
926*4882a593Smuzhiyun 
927*4882a593Smuzhiyun #endif
928*4882a593Smuzhiyun 
929*4882a593Smuzhiyun /*  LocalWords:  Endif
930*4882a593Smuzhiyun  */
931