162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * ngene.h: nGene PCIe bridge driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2005-2007 Micronas
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef _NGENE_H_
962306a36Sopenharmony_ci#define _NGENE_H_
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/types.h>
1262306a36Sopenharmony_ci#include <linux/sched.h>
1362306a36Sopenharmony_ci#include <linux/interrupt.h>
1462306a36Sopenharmony_ci#include <linux/i2c.h>
1562306a36Sopenharmony_ci#include <asm/dma.h>
1662306a36Sopenharmony_ci#include <linux/scatterlist.h>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include <linux/dvb/frontend.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include <media/dmxdev.h>
2162306a36Sopenharmony_ci#include <media/dvbdev.h>
2262306a36Sopenharmony_ci#include <media/dvb_demux.h>
2362306a36Sopenharmony_ci#include <media/dvb_ca_en50221.h>
2462306a36Sopenharmony_ci#include <media/dvb_frontend.h>
2562306a36Sopenharmony_ci#include <media/dvb_ringbuffer.h>
2662306a36Sopenharmony_ci#include <media/dvb_net.h>
2762306a36Sopenharmony_ci#include "cxd2099.h"
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#define DEVICE_NAME "ngene"
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#define NGENE_VID       0x18c3
3262306a36Sopenharmony_ci#define NGENE_PID       0x0720
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#ifndef VIDEO_CAP_VC1
3562306a36Sopenharmony_ci#define VIDEO_CAP_AVC   128
3662306a36Sopenharmony_ci#define VIDEO_CAP_H264  128
3762306a36Sopenharmony_ci#define VIDEO_CAP_VC1   256
3862306a36Sopenharmony_ci#define VIDEO_CAP_WMV9  256
3962306a36Sopenharmony_ci#define VIDEO_CAP_MPEG4 512
4062306a36Sopenharmony_ci#endif
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#define DEMOD_TYPE_STV090X	0
4362306a36Sopenharmony_ci#define DEMOD_TYPE_DRXK		1
4462306a36Sopenharmony_ci#define DEMOD_TYPE_STV0367	2
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci#define DEMOD_TYPE_XO2		32
4762306a36Sopenharmony_ci#define DEMOD_TYPE_STV0910	(DEMOD_TYPE_XO2 + 0)
4862306a36Sopenharmony_ci#define DEMOD_TYPE_SONY_CT2	(DEMOD_TYPE_XO2 + 1)
4962306a36Sopenharmony_ci#define DEMOD_TYPE_SONY_ISDBT	(DEMOD_TYPE_XO2 + 2)
5062306a36Sopenharmony_ci#define DEMOD_TYPE_SONY_C2T2	(DEMOD_TYPE_XO2 + 3)
5162306a36Sopenharmony_ci#define DEMOD_TYPE_ST_ATSC	(DEMOD_TYPE_XO2 + 4)
5262306a36Sopenharmony_ci#define DEMOD_TYPE_SONY_C2T2I	(DEMOD_TYPE_XO2 + 5)
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci#define NGENE_XO2_TYPE_NONE	0
5562306a36Sopenharmony_ci#define NGENE_XO2_TYPE_DUOFLEX	1
5662306a36Sopenharmony_ci#define NGENE_XO2_TYPE_CI	2
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_cienum STREAM {
5962306a36Sopenharmony_ci	STREAM_VIDEOIN1 = 0,        /* ITU656 or TS Input */
6062306a36Sopenharmony_ci	STREAM_VIDEOIN2,
6162306a36Sopenharmony_ci	STREAM_AUDIOIN1,            /* I2S or SPI Input */
6262306a36Sopenharmony_ci	STREAM_AUDIOIN2,
6362306a36Sopenharmony_ci	STREAM_AUDIOOUT,
6462306a36Sopenharmony_ci	MAX_STREAM
6562306a36Sopenharmony_ci};
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cienum SMODE_BITS {
6862306a36Sopenharmony_ci	SMODE_AUDIO_SPDIF = 0x20,
6962306a36Sopenharmony_ci	SMODE_AVSYNC = 0x10,
7062306a36Sopenharmony_ci	SMODE_TRANSPORT_STREAM = 0x08,
7162306a36Sopenharmony_ci	SMODE_AUDIO_CAPTURE = 0x04,
7262306a36Sopenharmony_ci	SMODE_VBI_CAPTURE = 0x02,
7362306a36Sopenharmony_ci	SMODE_VIDEO_CAPTURE = 0x01
7462306a36Sopenharmony_ci};
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cienum STREAM_FLAG_BITS {
7762306a36Sopenharmony_ci	SFLAG_CHROMA_FORMAT_2COMP  = 0x01, /* Chroma Format : 2's complement */
7862306a36Sopenharmony_ci	SFLAG_CHROMA_FORMAT_OFFSET = 0x00, /* Chroma Format : Binary offset */
7962306a36Sopenharmony_ci	SFLAG_ORDER_LUMA_CHROMA    = 0x02, /* Byte order: Y,Cb,Y,Cr */
8062306a36Sopenharmony_ci	SFLAG_ORDER_CHROMA_LUMA    = 0x00, /* Byte order: Cb,Y,Cr,Y */
8162306a36Sopenharmony_ci	SFLAG_COLORBAR             = 0x04, /* Select colorbar */
8262306a36Sopenharmony_ci};
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci#define PROGRAM_ROM     0x0000
8562306a36Sopenharmony_ci#define PROGRAM_SRAM    0x1000
8662306a36Sopenharmony_ci#define PERIPHERALS0    0x8000
8762306a36Sopenharmony_ci#define PERIPHERALS1    0x9000
8862306a36Sopenharmony_ci#define SHARED_BUFFER   0xC000
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci#define HOST_TO_NGENE    (SHARED_BUFFER+0x0000)
9162306a36Sopenharmony_ci#define NGENE_TO_HOST    (SHARED_BUFFER+0x0100)
9262306a36Sopenharmony_ci#define NGENE_COMMAND    (SHARED_BUFFER+0x0200)
9362306a36Sopenharmony_ci#define NGENE_COMMAND_HI (SHARED_BUFFER+0x0204)
9462306a36Sopenharmony_ci#define NGENE_STATUS     (SHARED_BUFFER+0x0208)
9562306a36Sopenharmony_ci#define NGENE_STATUS_HI  (SHARED_BUFFER+0x020C)
9662306a36Sopenharmony_ci#define NGENE_EVENT      (SHARED_BUFFER+0x0210)
9762306a36Sopenharmony_ci#define NGENE_EVENT_HI   (SHARED_BUFFER+0x0214)
9862306a36Sopenharmony_ci#define VARIABLES        (SHARED_BUFFER+0x0210)
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci#define NGENE_INT_COUNTS       (SHARED_BUFFER+0x0260)
10162306a36Sopenharmony_ci#define NGENE_INT_ENABLE       (SHARED_BUFFER+0x0264)
10262306a36Sopenharmony_ci#define NGENE_VBI_LINE_COUNT   (SHARED_BUFFER+0x0268)
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci#define BUFFER_GP_XMIT  (SHARED_BUFFER+0x0800)
10562306a36Sopenharmony_ci#define BUFFER_GP_RECV  (SHARED_BUFFER+0x0900)
10662306a36Sopenharmony_ci#define EEPROM_AREA     (SHARED_BUFFER+0x0A00)
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci#define SG_V_IN_1       (SHARED_BUFFER+0x0A80)
10962306a36Sopenharmony_ci#define SG_VBI_1        (SHARED_BUFFER+0x0B00)
11062306a36Sopenharmony_ci#define SG_A_IN_1       (SHARED_BUFFER+0x0B80)
11162306a36Sopenharmony_ci#define SG_V_IN_2       (SHARED_BUFFER+0x0C00)
11262306a36Sopenharmony_ci#define SG_VBI_2        (SHARED_BUFFER+0x0C80)
11362306a36Sopenharmony_ci#define SG_A_IN_2       (SHARED_BUFFER+0x0D00)
11462306a36Sopenharmony_ci#define SG_V_OUT        (SHARED_BUFFER+0x0D80)
11562306a36Sopenharmony_ci#define SG_A_OUT2       (SHARED_BUFFER+0x0E00)
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci#define DATA_A_IN_1     (SHARED_BUFFER+0x0E80)
11862306a36Sopenharmony_ci#define DATA_A_IN_2     (SHARED_BUFFER+0x0F00)
11962306a36Sopenharmony_ci#define DATA_A_OUT      (SHARED_BUFFER+0x0F80)
12062306a36Sopenharmony_ci#define DATA_V_IN_1     (SHARED_BUFFER+0x1000)
12162306a36Sopenharmony_ci#define DATA_V_IN_2     (SHARED_BUFFER+0x2000)
12262306a36Sopenharmony_ci#define DATA_V_OUT      (SHARED_BUFFER+0x3000)
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci#define DATA_FIFO_AREA  (SHARED_BUFFER+0x1000)
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci#define TIMESTAMPS      0xA000
12762306a36Sopenharmony_ci#define SCRATCHPAD      0xA080
12862306a36Sopenharmony_ci#define FORCE_INT       0xA088
12962306a36Sopenharmony_ci#define FORCE_NMI       0xA090
13062306a36Sopenharmony_ci#define INT_STATUS      0xA0A0
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci#define DEV_VER         0x9004
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci#define FW_DEBUG_DEFAULT (PROGRAM_SRAM+0x00FF)
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_cistruct SG_ADDR {
13762306a36Sopenharmony_ci	u64 start;
13862306a36Sopenharmony_ci	u64 curr;
13962306a36Sopenharmony_ci	u16 curr_ptr;
14062306a36Sopenharmony_ci	u16 elements;
14162306a36Sopenharmony_ci	u32 pad[3];
14262306a36Sopenharmony_ci} __attribute__ ((__packed__));
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_cistruct SHARED_MEMORY {
14562306a36Sopenharmony_ci	/* C000 */
14662306a36Sopenharmony_ci	u32 HostToNgene[64];
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci	/* C100 */
14962306a36Sopenharmony_ci	u32 NgeneToHost[64];
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci	/* C200 */
15262306a36Sopenharmony_ci	u64 NgeneCommand;
15362306a36Sopenharmony_ci	u64 NgeneStatus;
15462306a36Sopenharmony_ci	u64 NgeneEvent;
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci	/* C210 */
15762306a36Sopenharmony_ci	u8 pad1[0xc260 - 0xc218];
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci	/* C260 */
16062306a36Sopenharmony_ci	u32 IntCounts;
16162306a36Sopenharmony_ci	u32 IntEnable;
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci	/* C268 */
16462306a36Sopenharmony_ci	u8 pad2[0xd000 - 0xc268];
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci} __attribute__ ((__packed__));
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_cistruct BUFFER_STREAM_RESULTS {
16962306a36Sopenharmony_ci	u32 Clock;           /* Stream time in 100ns units */
17062306a36Sopenharmony_ci	u16 RemainingLines;  /* Remaining lines in this field.
17162306a36Sopenharmony_ci				0 for complete field */
17262306a36Sopenharmony_ci	u8  FieldCount;      /* Video field number */
17362306a36Sopenharmony_ci	u8  Flags;           /* Bit 7 = Done, Bit 6 = seen, Bit 5 = overflow,
17462306a36Sopenharmony_ci				Bit 0 = FieldID */
17562306a36Sopenharmony_ci	u16 BlockCount;      /* Audio block count (unused) */
17662306a36Sopenharmony_ci	u8  Reserved[2];
17762306a36Sopenharmony_ci	u32 DTOUpdate;
17862306a36Sopenharmony_ci} __attribute__ ((__packed__));
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_cistruct HW_SCATTER_GATHER_ELEMENT {
18162306a36Sopenharmony_ci	u64 Address;
18262306a36Sopenharmony_ci	u32 Length;
18362306a36Sopenharmony_ci	u32 Reserved;
18462306a36Sopenharmony_ci} __attribute__ ((__packed__));
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_cistruct BUFFER_HEADER {
18762306a36Sopenharmony_ci	u64    Next;
18862306a36Sopenharmony_ci	struct BUFFER_STREAM_RESULTS SR;
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci	u32    Number_of_entries_1;
19162306a36Sopenharmony_ci	u32    Reserved5;
19262306a36Sopenharmony_ci	u64    Address_of_first_entry_1;
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci	u32    Number_of_entries_2;
19562306a36Sopenharmony_ci	u32    Reserved7;
19662306a36Sopenharmony_ci	u64    Address_of_first_entry_2;
19762306a36Sopenharmony_ci} __attribute__ ((__packed__));
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_cistruct EVENT_BUFFER {
20062306a36Sopenharmony_ci	u32    TimeStamp;
20162306a36Sopenharmony_ci	u8     GPIOStatus;
20262306a36Sopenharmony_ci	u8     UARTStatus;
20362306a36Sopenharmony_ci	u8     RXCharacter;
20462306a36Sopenharmony_ci	u8     EventStatus;
20562306a36Sopenharmony_ci	u32    Reserved[2];
20662306a36Sopenharmony_ci} __attribute__ ((__packed__));
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci/* Firmware commands. */
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_cienum OPCODES {
21162306a36Sopenharmony_ci	CMD_NOP = 0,
21262306a36Sopenharmony_ci	CMD_FWLOAD_PREPARE  = 0x01,
21362306a36Sopenharmony_ci	CMD_FWLOAD_FINISH   = 0x02,
21462306a36Sopenharmony_ci	CMD_I2C_READ        = 0x03,
21562306a36Sopenharmony_ci	CMD_I2C_WRITE       = 0x04,
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci	CMD_I2C_WRITE_NOSTOP = 0x05,
21862306a36Sopenharmony_ci	CMD_I2C_CONTINUE_WRITE = 0x06,
21962306a36Sopenharmony_ci	CMD_I2C_CONTINUE_WRITE_NOSTOP = 0x07,
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci	CMD_DEBUG_OUTPUT    = 0x09,
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci	CMD_CONTROL         = 0x10,
22462306a36Sopenharmony_ci	CMD_CONFIGURE_BUFFER = 0x11,
22562306a36Sopenharmony_ci	CMD_CONFIGURE_FREE_BUFFER = 0x12,
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_ci	CMD_SPI_READ        = 0x13,
22862306a36Sopenharmony_ci	CMD_SPI_WRITE       = 0x14,
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci	CMD_MEM_READ        = 0x20,
23162306a36Sopenharmony_ci	CMD_MEM_WRITE	    = 0x21,
23262306a36Sopenharmony_ci	CMD_SFR_READ	    = 0x22,
23362306a36Sopenharmony_ci	CMD_SFR_WRITE	    = 0x23,
23462306a36Sopenharmony_ci	CMD_IRAM_READ	    = 0x24,
23562306a36Sopenharmony_ci	CMD_IRAM_WRITE	    = 0x25,
23662306a36Sopenharmony_ci	CMD_SET_GPIO_PIN    = 0x26,
23762306a36Sopenharmony_ci	CMD_SET_GPIO_INT    = 0x27,
23862306a36Sopenharmony_ci	CMD_CONFIGURE_UART  = 0x28,
23962306a36Sopenharmony_ci	CMD_WRITE_UART      = 0x29,
24062306a36Sopenharmony_ci	MAX_CMD
24162306a36Sopenharmony_ci};
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_cienum RESPONSES {
24462306a36Sopenharmony_ci	OK = 0,
24562306a36Sopenharmony_ci	ERROR = 1
24662306a36Sopenharmony_ci};
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_cistruct FW_HEADER {
24962306a36Sopenharmony_ci	u8 Opcode;
25062306a36Sopenharmony_ci	u8 Length;
25162306a36Sopenharmony_ci} __attribute__ ((__packed__));
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_cistruct FW_I2C_WRITE {
25462306a36Sopenharmony_ci	struct FW_HEADER hdr;
25562306a36Sopenharmony_ci	u8 Device;
25662306a36Sopenharmony_ci	u8 Data[250];
25762306a36Sopenharmony_ci} __attribute__ ((__packed__));
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_cistruct FW_I2C_CONTINUE_WRITE {
26062306a36Sopenharmony_ci	struct FW_HEADER hdr;
26162306a36Sopenharmony_ci	u8 Data[250];
26262306a36Sopenharmony_ci} __attribute__ ((__packed__));
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_cistruct FW_I2C_READ {
26562306a36Sopenharmony_ci	struct FW_HEADER hdr;
26662306a36Sopenharmony_ci	u8 Device;
26762306a36Sopenharmony_ci	u8 Data[252];    /* followed by two bytes of read data count */
26862306a36Sopenharmony_ci} __attribute__ ((__packed__));
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_cistruct FW_SPI_WRITE {
27162306a36Sopenharmony_ci	struct FW_HEADER hdr;
27262306a36Sopenharmony_ci	u8 ModeSelect;
27362306a36Sopenharmony_ci	u8 Data[250];
27462306a36Sopenharmony_ci} __attribute__ ((__packed__));
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_cistruct FW_SPI_READ {
27762306a36Sopenharmony_ci	struct FW_HEADER hdr;
27862306a36Sopenharmony_ci	u8 ModeSelect;
27962306a36Sopenharmony_ci	u8 Data[252];    /* followed by two bytes of read data count */
28062306a36Sopenharmony_ci} __attribute__ ((__packed__));
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_cistruct FW_FWLOAD_PREPARE {
28362306a36Sopenharmony_ci	struct FW_HEADER hdr;
28462306a36Sopenharmony_ci} __attribute__ ((__packed__));
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_cistruct FW_FWLOAD_FINISH {
28762306a36Sopenharmony_ci	struct FW_HEADER hdr;
28862306a36Sopenharmony_ci	u16 Address;     /* address of final block */
28962306a36Sopenharmony_ci	u16 Length;
29062306a36Sopenharmony_ci} __attribute__ ((__packed__));
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci/*
29362306a36Sopenharmony_ci * Meaning of FW_STREAM_CONTROL::Mode bits:
29462306a36Sopenharmony_ci *  Bit 7: Loopback PEXin to PEXout using TVOut channel
29562306a36Sopenharmony_ci *  Bit 6: AVLOOP
29662306a36Sopenharmony_ci *  Bit 5: Audio select; 0=I2S, 1=SPDIF
29762306a36Sopenharmony_ci *  Bit 4: AVSYNC
29862306a36Sopenharmony_ci *  Bit 3: Enable transport stream
29962306a36Sopenharmony_ci *  Bit 2: Enable audio capture
30062306a36Sopenharmony_ci *  Bit 1: Enable ITU-Video VBI capture
30162306a36Sopenharmony_ci *  Bit 0: Enable ITU-Video capture
30262306a36Sopenharmony_ci *
30362306a36Sopenharmony_ci * Meaning of FW_STREAM_CONTROL::Control bits (see UVI1_CTL)
30462306a36Sopenharmony_ci *  Bit 7: continuous capture
30562306a36Sopenharmony_ci *  Bit 6: capture one field
30662306a36Sopenharmony_ci *  Bit 5: capture one frame
30762306a36Sopenharmony_ci *  Bit 4: unused
30862306a36Sopenharmony_ci *  Bit 3: starting field; 0=odd, 1=even
30962306a36Sopenharmony_ci *  Bit 2: sample size; 0=8-bit, 1=10-bit
31062306a36Sopenharmony_ci *  Bit 1: data format; 0=UYVY, 1=YUY2
31162306a36Sopenharmony_ci *  Bit 0: resets buffer pointers
31262306a36Sopenharmony_ci*/
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_cienum FSC_MODE_BITS {
31562306a36Sopenharmony_ci	SMODE_LOOPBACK          = 0x80,
31662306a36Sopenharmony_ci	SMODE_AVLOOP            = 0x40,
31762306a36Sopenharmony_ci	_SMODE_AUDIO_SPDIF      = 0x20,
31862306a36Sopenharmony_ci	_SMODE_AVSYNC           = 0x10,
31962306a36Sopenharmony_ci	_SMODE_TRANSPORT_STREAM = 0x08,
32062306a36Sopenharmony_ci	_SMODE_AUDIO_CAPTURE    = 0x04,
32162306a36Sopenharmony_ci	_SMODE_VBI_CAPTURE      = 0x02,
32262306a36Sopenharmony_ci	_SMODE_VIDEO_CAPTURE    = 0x01
32362306a36Sopenharmony_ci};
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_ci/* Meaning of FW_STREAM_CONTROL::Stream bits:
32762306a36Sopenharmony_ci * Bit 3: Audio sample count:  0 = relative, 1 = absolute
32862306a36Sopenharmony_ci * Bit 2: color bar select; 1=color bars, 0=CV3 decoder
32962306a36Sopenharmony_ci * Bits 1-0: stream select, UVI1, UVI2, TVOUT
33062306a36Sopenharmony_ci */
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_cistruct FW_STREAM_CONTROL {
33362306a36Sopenharmony_ci	struct FW_HEADER hdr;
33462306a36Sopenharmony_ci	u8     Stream;             /* Stream number (UVI1, UVI2, TVOUT) */
33562306a36Sopenharmony_ci	u8     Control;            /* Value written to UVI1_CTL */
33662306a36Sopenharmony_ci	u8     Mode;               /* Controls clock source */
33762306a36Sopenharmony_ci	u8     SetupDataLen;	   /* Length of setup data, MSB=1 write
33862306a36Sopenharmony_ci				      backwards */
33962306a36Sopenharmony_ci	u16    CaptureBlockCount;  /* Blocks (a 256 Bytes) to capture per buffer
34062306a36Sopenharmony_ci				      for TS and Audio */
34162306a36Sopenharmony_ci	u64    Buffer_Address;	   /* Address of first buffer header */
34262306a36Sopenharmony_ci	u16    BytesPerVideoLine;
34362306a36Sopenharmony_ci	u16    MaxLinesPerField;
34462306a36Sopenharmony_ci	u16    MinLinesPerField;
34562306a36Sopenharmony_ci	u16    Reserved_1;
34662306a36Sopenharmony_ci	u16    BytesPerVBILine;
34762306a36Sopenharmony_ci	u16    MaxVBILinesPerField;
34862306a36Sopenharmony_ci	u16    MinVBILinesPerField;
34962306a36Sopenharmony_ci	u16    SetupDataAddr;      /* ngene relative address of setup data */
35062306a36Sopenharmony_ci	u8     SetupData[32];      /* setup data */
35162306a36Sopenharmony_ci} __attribute__((__packed__));
35262306a36Sopenharmony_ci
35362306a36Sopenharmony_ci#define AUDIO_BLOCK_SIZE    256
35462306a36Sopenharmony_ci#define TS_BLOCK_SIZE       256
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_cistruct FW_MEM_READ {
35762306a36Sopenharmony_ci	struct FW_HEADER hdr;
35862306a36Sopenharmony_ci	u16   address;
35962306a36Sopenharmony_ci} __attribute__ ((__packed__));
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_cistruct FW_MEM_WRITE {
36262306a36Sopenharmony_ci	struct FW_HEADER hdr;
36362306a36Sopenharmony_ci	u16   address;
36462306a36Sopenharmony_ci	u8    data;
36562306a36Sopenharmony_ci} __attribute__ ((__packed__));
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_cistruct FW_SFR_IRAM_READ {
36862306a36Sopenharmony_ci	struct FW_HEADER hdr;
36962306a36Sopenharmony_ci	u8    address;
37062306a36Sopenharmony_ci} __attribute__ ((__packed__));
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_cistruct FW_SFR_IRAM_WRITE {
37362306a36Sopenharmony_ci	struct FW_HEADER hdr;
37462306a36Sopenharmony_ci	u8    address;
37562306a36Sopenharmony_ci	u8    data;
37662306a36Sopenharmony_ci} __attribute__ ((__packed__));
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_cistruct FW_SET_GPIO_PIN {
37962306a36Sopenharmony_ci	struct FW_HEADER hdr;
38062306a36Sopenharmony_ci	u8    select;
38162306a36Sopenharmony_ci} __attribute__ ((__packed__));
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_cistruct FW_SET_GPIO_INT {
38462306a36Sopenharmony_ci	struct FW_HEADER hdr;
38562306a36Sopenharmony_ci	u8    select;
38662306a36Sopenharmony_ci} __attribute__ ((__packed__));
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_cistruct FW_SET_DEBUGMODE {
38962306a36Sopenharmony_ci	struct FW_HEADER hdr;
39062306a36Sopenharmony_ci	u8   debug_flags;
39162306a36Sopenharmony_ci} __attribute__ ((__packed__));
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_cistruct FW_CONFIGURE_BUFFERS {
39462306a36Sopenharmony_ci	struct FW_HEADER hdr;
39562306a36Sopenharmony_ci	u8   config;
39662306a36Sopenharmony_ci} __attribute__ ((__packed__));
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_cienum _BUFFER_CONFIGS {
39962306a36Sopenharmony_ci	/* 4k UVI1, 4k UVI2, 2k AUD1, 2k AUD2  (standard usage) */
40062306a36Sopenharmony_ci	BUFFER_CONFIG_4422 = 0,
40162306a36Sopenharmony_ci	/* 3k UVI1, 3k UVI2, 3k AUD1, 3k AUD2  (4x TS input usage) */
40262306a36Sopenharmony_ci	BUFFER_CONFIG_3333 = 1,
40362306a36Sopenharmony_ci	/* 8k UVI1, 0k UVI2, 2k AUD1, 2k I2SOut  (HDTV decoder usage) */
40462306a36Sopenharmony_ci	BUFFER_CONFIG_8022 = 2,
40562306a36Sopenharmony_ci	BUFFER_CONFIG_FW17 = 255, /* Use new FW 17 command */
40662306a36Sopenharmony_ci};
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_cistruct FW_CONFIGURE_FREE_BUFFERS {
40962306a36Sopenharmony_ci	struct FW_HEADER hdr;
41062306a36Sopenharmony_ci	struct {
41162306a36Sopenharmony_ci		u8   UVI1_BufferLength;
41262306a36Sopenharmony_ci		u8   UVI2_BufferLength;
41362306a36Sopenharmony_ci		u8   TVO_BufferLength;
41462306a36Sopenharmony_ci		u8   AUD1_BufferLength;
41562306a36Sopenharmony_ci		u8   AUD2_BufferLength;
41662306a36Sopenharmony_ci		u8   TVA_BufferLength;
41762306a36Sopenharmony_ci	} __packed config;
41862306a36Sopenharmony_ci} __attribute__ ((__packed__));
41962306a36Sopenharmony_ci
42062306a36Sopenharmony_cistruct FW_CONFIGURE_UART {
42162306a36Sopenharmony_ci	struct FW_HEADER hdr;
42262306a36Sopenharmony_ci	u8 UartControl;
42362306a36Sopenharmony_ci} __attribute__ ((__packed__));
42462306a36Sopenharmony_ci
42562306a36Sopenharmony_cienum _UART_CONFIG {
42662306a36Sopenharmony_ci	_UART_BAUDRATE_19200 = 0,
42762306a36Sopenharmony_ci	_UART_BAUDRATE_9600  = 1,
42862306a36Sopenharmony_ci	_UART_BAUDRATE_4800  = 2,
42962306a36Sopenharmony_ci	_UART_BAUDRATE_2400  = 3,
43062306a36Sopenharmony_ci	_UART_RX_ENABLE      = 0x40,
43162306a36Sopenharmony_ci	_UART_TX_ENABLE      = 0x80,
43262306a36Sopenharmony_ci};
43362306a36Sopenharmony_ci
43462306a36Sopenharmony_cistruct FW_WRITE_UART {
43562306a36Sopenharmony_ci	struct FW_HEADER hdr;
43662306a36Sopenharmony_ci	u8 Data[252];
43762306a36Sopenharmony_ci} __attribute__ ((__packed__));
43862306a36Sopenharmony_ci
43962306a36Sopenharmony_ci
44062306a36Sopenharmony_cistruct ngene_command {
44162306a36Sopenharmony_ci	u32 in_len;
44262306a36Sopenharmony_ci	u32 out_len;
44362306a36Sopenharmony_ci	union {
44462306a36Sopenharmony_ci		u32                              raw[64];
44562306a36Sopenharmony_ci		u8                               raw8[256];
44662306a36Sopenharmony_ci		struct FW_HEADER                 hdr;
44762306a36Sopenharmony_ci		struct FW_I2C_WRITE              I2CWrite;
44862306a36Sopenharmony_ci		struct FW_I2C_CONTINUE_WRITE     I2CContinueWrite;
44962306a36Sopenharmony_ci		struct FW_I2C_READ               I2CRead;
45062306a36Sopenharmony_ci		struct FW_STREAM_CONTROL         StreamControl;
45162306a36Sopenharmony_ci		struct FW_FWLOAD_PREPARE         FWLoadPrepare;
45262306a36Sopenharmony_ci		struct FW_FWLOAD_FINISH          FWLoadFinish;
45362306a36Sopenharmony_ci		struct FW_MEM_READ		 MemoryRead;
45462306a36Sopenharmony_ci		struct FW_MEM_WRITE		 MemoryWrite;
45562306a36Sopenharmony_ci		struct FW_SFR_IRAM_READ		 SfrIramRead;
45662306a36Sopenharmony_ci		struct FW_SFR_IRAM_WRITE         SfrIramWrite;
45762306a36Sopenharmony_ci		struct FW_SPI_WRITE              SPIWrite;
45862306a36Sopenharmony_ci		struct FW_SPI_READ               SPIRead;
45962306a36Sopenharmony_ci		struct FW_SET_GPIO_PIN           SetGpioPin;
46062306a36Sopenharmony_ci		struct FW_SET_GPIO_INT           SetGpioInt;
46162306a36Sopenharmony_ci		struct FW_SET_DEBUGMODE          SetDebugMode;
46262306a36Sopenharmony_ci		struct FW_CONFIGURE_BUFFERS      ConfigureBuffers;
46362306a36Sopenharmony_ci		struct FW_CONFIGURE_FREE_BUFFERS ConfigureFreeBuffers;
46462306a36Sopenharmony_ci		struct FW_CONFIGURE_UART         ConfigureUart;
46562306a36Sopenharmony_ci		struct FW_WRITE_UART             WriteUart;
46662306a36Sopenharmony_ci	} cmd;
46762306a36Sopenharmony_ci} __attribute__ ((__packed__));
46862306a36Sopenharmony_ci
46962306a36Sopenharmony_ci#define NGENE_INTERFACE_VERSION 0x103
47062306a36Sopenharmony_ci#define MAX_VIDEO_BUFFER_SIZE   (417792) /* 288*1440 rounded up to next page */
47162306a36Sopenharmony_ci#define MAX_AUDIO_BUFFER_SIZE     (8192) /* Gives room for about 23msec@48KHz */
47262306a36Sopenharmony_ci#define MAX_VBI_BUFFER_SIZE      (28672) /* 1144*18 rounded up to next page */
47362306a36Sopenharmony_ci#define MAX_TS_BUFFER_SIZE       (98304) /* 512*188 rounded up to next page */
47462306a36Sopenharmony_ci#define MAX_HDTV_BUFFER_SIZE   (2080768) /* 541*1920*2 rounded up to next page
47562306a36Sopenharmony_ci					    Max: (1920x1080i60) */
47662306a36Sopenharmony_ci
47762306a36Sopenharmony_ci#define OVERFLOW_BUFFER_SIZE    (8192)
47862306a36Sopenharmony_ci
47962306a36Sopenharmony_ci#define RING_SIZE_VIDEO     4
48062306a36Sopenharmony_ci#define RING_SIZE_AUDIO     8
48162306a36Sopenharmony_ci#define RING_SIZE_TS        8
48262306a36Sopenharmony_ci
48362306a36Sopenharmony_ci#define NUM_SCATTER_GATHER_ENTRIES  8
48462306a36Sopenharmony_ci
48562306a36Sopenharmony_ci#define MAX_DMA_LENGTH (((MAX_VIDEO_BUFFER_SIZE + MAX_VBI_BUFFER_SIZE) * \
48662306a36Sopenharmony_ci			RING_SIZE_VIDEO * 2) + \
48762306a36Sopenharmony_ci			(MAX_AUDIO_BUFFER_SIZE * RING_SIZE_AUDIO * 2) + \
48862306a36Sopenharmony_ci			(MAX_TS_BUFFER_SIZE * RING_SIZE_TS * 4) + \
48962306a36Sopenharmony_ci			(RING_SIZE_VIDEO * PAGE_SIZE * 2) + \
49062306a36Sopenharmony_ci			(RING_SIZE_AUDIO * PAGE_SIZE * 2) + \
49162306a36Sopenharmony_ci			(RING_SIZE_TS    * PAGE_SIZE * 4) + \
49262306a36Sopenharmony_ci			 8 * PAGE_SIZE + OVERFLOW_BUFFER_SIZE + PAGE_SIZE)
49362306a36Sopenharmony_ci
49462306a36Sopenharmony_ci#define EVENT_QUEUE_SIZE    16
49562306a36Sopenharmony_ci
49662306a36Sopenharmony_ci/* Gathers the current state of a single channel. */
49762306a36Sopenharmony_ci
49862306a36Sopenharmony_cistruct SBufferHeader {
49962306a36Sopenharmony_ci	struct BUFFER_HEADER   ngeneBuffer; /* Physical descriptor */
50062306a36Sopenharmony_ci	struct SBufferHeader  *Next;
50162306a36Sopenharmony_ci	void                  *Buffer1;
50262306a36Sopenharmony_ci	struct HW_SCATTER_GATHER_ELEMENT *scList1;
50362306a36Sopenharmony_ci	void                  *Buffer2;
50462306a36Sopenharmony_ci	struct HW_SCATTER_GATHER_ELEMENT *scList2;
50562306a36Sopenharmony_ci};
50662306a36Sopenharmony_ci
50762306a36Sopenharmony_ci/* Sizeof SBufferHeader aligned to next 64 Bit boundary (hw restriction) */
50862306a36Sopenharmony_ci#define SIZEOF_SBufferHeader ((sizeof(struct SBufferHeader) + 63) & ~63)
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_cienum HWSTATE {
51162306a36Sopenharmony_ci	HWSTATE_STOP,
51262306a36Sopenharmony_ci	HWSTATE_STARTUP,
51362306a36Sopenharmony_ci	HWSTATE_RUN,
51462306a36Sopenharmony_ci	HWSTATE_PAUSE,
51562306a36Sopenharmony_ci};
51662306a36Sopenharmony_ci
51762306a36Sopenharmony_cienum KSSTATE {
51862306a36Sopenharmony_ci	KSSTATE_STOP,
51962306a36Sopenharmony_ci	KSSTATE_ACQUIRE,
52062306a36Sopenharmony_ci	KSSTATE_PAUSE,
52162306a36Sopenharmony_ci	KSSTATE_RUN,
52262306a36Sopenharmony_ci};
52362306a36Sopenharmony_ci
52462306a36Sopenharmony_cistruct SRingBufferDescriptor {
52562306a36Sopenharmony_ci	struct SBufferHeader *Head; /* Points to first buffer in ring buffer
52662306a36Sopenharmony_ci				       structure*/
52762306a36Sopenharmony_ci	u64   PAHead;         /* Physical address of first buffer */
52862306a36Sopenharmony_ci	u32   MemSize;        /* Memory size of allocated ring buffers
52962306a36Sopenharmony_ci				 (needed for freeing) */
53062306a36Sopenharmony_ci	u32   NumBuffers;     /* Number of buffers in the ring */
53162306a36Sopenharmony_ci	u32   Buffer1Length;  /* Allocated length of Buffer 1 */
53262306a36Sopenharmony_ci	u32   Buffer2Length;  /* Allocated length of Buffer 2 */
53362306a36Sopenharmony_ci	void *SCListMem;      /* Memory to hold scatter gather lists for this
53462306a36Sopenharmony_ci				 ring */
53562306a36Sopenharmony_ci	u64   PASCListMem;    /* Physical address  .. */
53662306a36Sopenharmony_ci	u32   SCListMemSize;  /* Size of this memory */
53762306a36Sopenharmony_ci};
53862306a36Sopenharmony_ci
53962306a36Sopenharmony_cienum STREAMMODEFLAGS {
54062306a36Sopenharmony_ci	StreamMode_NONE   = 0, /* Stream not used */
54162306a36Sopenharmony_ci	StreamMode_ANALOG = 1, /* Analog: Stream 0,1 = Video, 2,3 = Audio */
54262306a36Sopenharmony_ci	StreamMode_TSIN   = 2, /* Transport stream input (all) */
54362306a36Sopenharmony_ci	StreamMode_HDTV   = 4, /* HDTV: Maximum 1920x1080p30,1920x1080i60
54462306a36Sopenharmony_ci				  (only stream 0) */
54562306a36Sopenharmony_ci	StreamMode_TSOUT  = 8, /* Transport stream output (only stream 3) */
54662306a36Sopenharmony_ci};
54762306a36Sopenharmony_ci
54862306a36Sopenharmony_ci
54962306a36Sopenharmony_cienum BufferExchangeFlags {
55062306a36Sopenharmony_ci	BEF_EVEN_FIELD   = 0x00000001,
55162306a36Sopenharmony_ci	BEF_CONTINUATION = 0x00000002,
55262306a36Sopenharmony_ci	BEF_MORE_DATA    = 0x00000004,
55362306a36Sopenharmony_ci	BEF_OVERFLOW     = 0x00000008,
55462306a36Sopenharmony_ci	DF_SWAP32        = 0x00010000,
55562306a36Sopenharmony_ci};
55662306a36Sopenharmony_ci
55762306a36Sopenharmony_citypedef void *(IBufferExchange)(void *, void *, u32, u32, u32);
55862306a36Sopenharmony_ci
55962306a36Sopenharmony_cistruct MICI_STREAMINFO {
56062306a36Sopenharmony_ci	IBufferExchange    *pExchange;
56162306a36Sopenharmony_ci	IBufferExchange    *pExchangeVBI;     /* Secondary (VBI, ancillary) */
56262306a36Sopenharmony_ci	u8  Stream;
56362306a36Sopenharmony_ci	u8  Flags;
56462306a36Sopenharmony_ci	u8  Mode;
56562306a36Sopenharmony_ci	u8  Reserved;
56662306a36Sopenharmony_ci	u16 nLinesVideo;
56762306a36Sopenharmony_ci	u16 nBytesPerLineVideo;
56862306a36Sopenharmony_ci	u16 nLinesVBI;
56962306a36Sopenharmony_ci	u16 nBytesPerLineVBI;
57062306a36Sopenharmony_ci	u32 CaptureLength;    /* Used for audio and transport stream */
57162306a36Sopenharmony_ci};
57262306a36Sopenharmony_ci
57362306a36Sopenharmony_ci/****************************************************************************/
57462306a36Sopenharmony_ci/* STRUCTS ******************************************************************/
57562306a36Sopenharmony_ci/****************************************************************************/
57662306a36Sopenharmony_ci
57762306a36Sopenharmony_ci/* sound hardware definition */
57862306a36Sopenharmony_ci#define MIXER_ADDR_TVTUNER      0
57962306a36Sopenharmony_ci#define MIXER_ADDR_LAST         0
58062306a36Sopenharmony_ci
58162306a36Sopenharmony_cistruct ngene_channel;
58262306a36Sopenharmony_ci
58362306a36Sopenharmony_ci/*struct sound chip*/
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_cistruct mychip {
58662306a36Sopenharmony_ci	struct ngene_channel *chan;
58762306a36Sopenharmony_ci	struct snd_card *card;
58862306a36Sopenharmony_ci	struct pci_dev *pci;
58962306a36Sopenharmony_ci	struct snd_pcm_substream *substream;
59062306a36Sopenharmony_ci	struct snd_pcm *pcm;
59162306a36Sopenharmony_ci	unsigned long port;
59262306a36Sopenharmony_ci	int irq;
59362306a36Sopenharmony_ci	spinlock_t mixer_lock;
59462306a36Sopenharmony_ci	spinlock_t lock;
59562306a36Sopenharmony_ci	int mixer_volume[MIXER_ADDR_LAST + 1][2];
59662306a36Sopenharmony_ci	int capture_source[MIXER_ADDR_LAST + 1][2];
59762306a36Sopenharmony_ci};
59862306a36Sopenharmony_ci
59962306a36Sopenharmony_cistruct ngene_channel {
60062306a36Sopenharmony_ci	struct device         device;
60162306a36Sopenharmony_ci	struct i2c_adapter    i2c_adapter;
60262306a36Sopenharmony_ci	struct i2c_client    *i2c_client[1];
60362306a36Sopenharmony_ci	int                   i2c_client_fe;
60462306a36Sopenharmony_ci
60562306a36Sopenharmony_ci	struct ngene         *dev;
60662306a36Sopenharmony_ci	int                   number;
60762306a36Sopenharmony_ci	int                   type;
60862306a36Sopenharmony_ci	int                   mode;
60962306a36Sopenharmony_ci	bool                  has_adapter;
61062306a36Sopenharmony_ci	bool                  has_demux;
61162306a36Sopenharmony_ci	int                   demod_type;
61262306a36Sopenharmony_ci	int (*gate_ctrl)(struct dvb_frontend *, int);
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_ci	struct dvb_frontend  *fe;
61562306a36Sopenharmony_ci	struct dvb_frontend  *fe2;
61662306a36Sopenharmony_ci	struct dmxdev         dmxdev;
61762306a36Sopenharmony_ci	struct dvb_demux      demux;
61862306a36Sopenharmony_ci	struct dvb_net        dvbnet;
61962306a36Sopenharmony_ci	struct dmx_frontend   hw_frontend;
62062306a36Sopenharmony_ci	struct dmx_frontend   mem_frontend;
62162306a36Sopenharmony_ci	int                   users;
62262306a36Sopenharmony_ci	struct video_device  *v4l_dev;
62362306a36Sopenharmony_ci	struct dvb_device    *ci_dev;
62462306a36Sopenharmony_ci	struct tasklet_struct demux_tasklet;
62562306a36Sopenharmony_ci
62662306a36Sopenharmony_ci	struct SBufferHeader *nextBuffer;
62762306a36Sopenharmony_ci	enum KSSTATE          State;
62862306a36Sopenharmony_ci	enum HWSTATE          HWState;
62962306a36Sopenharmony_ci	u8                    Stream;
63062306a36Sopenharmony_ci	u8                    Flags;
63162306a36Sopenharmony_ci	u8                    Mode;
63262306a36Sopenharmony_ci	IBufferExchange      *pBufferExchange;
63362306a36Sopenharmony_ci	IBufferExchange      *pBufferExchange2;
63462306a36Sopenharmony_ci
63562306a36Sopenharmony_ci	spinlock_t            state_lock;
63662306a36Sopenharmony_ci	u16                   nLines;
63762306a36Sopenharmony_ci	u16                   nBytesPerLine;
63862306a36Sopenharmony_ci	u16                   nVBILines;
63962306a36Sopenharmony_ci	u16                   nBytesPerVBILine;
64062306a36Sopenharmony_ci	u16                   itumode;
64162306a36Sopenharmony_ci	u32                   Capture1Length;
64262306a36Sopenharmony_ci	u32                   Capture2Length;
64362306a36Sopenharmony_ci	struct SRingBufferDescriptor RingBuffer;
64462306a36Sopenharmony_ci	struct SRingBufferDescriptor TSRingBuffer;
64562306a36Sopenharmony_ci	struct SRingBufferDescriptor TSIdleBuffer;
64662306a36Sopenharmony_ci
64762306a36Sopenharmony_ci	u32                   DataFormatFlags;
64862306a36Sopenharmony_ci
64962306a36Sopenharmony_ci	int                   AudioDTOUpdated;
65062306a36Sopenharmony_ci	u32                   AudioDTOValue;
65162306a36Sopenharmony_ci
65262306a36Sopenharmony_ci	int (*set_tone)(struct dvb_frontend *, enum fe_sec_tone_mode);
65362306a36Sopenharmony_ci	u8 lnbh;
65462306a36Sopenharmony_ci
65562306a36Sopenharmony_ci	/* stuff from analog driver */
65662306a36Sopenharmony_ci
65762306a36Sopenharmony_ci	int minor;
65862306a36Sopenharmony_ci	struct mychip        *mychip;
65962306a36Sopenharmony_ci	struct snd_card      *soundcard;
66062306a36Sopenharmony_ci	u8                   *evenbuffer;
66162306a36Sopenharmony_ci	u8                    dma_on;
66262306a36Sopenharmony_ci	int                   soundstreamon;
66362306a36Sopenharmony_ci	int                   audiomute;
66462306a36Sopenharmony_ci	int                   soundbuffisallocated;
66562306a36Sopenharmony_ci	int                   sndbuffflag;
66662306a36Sopenharmony_ci	int                   tun_rdy;
66762306a36Sopenharmony_ci	int                   dec_rdy;
66862306a36Sopenharmony_ci	int                   tun_dec_rdy;
66962306a36Sopenharmony_ci	int                   lastbufferflag;
67062306a36Sopenharmony_ci
67162306a36Sopenharmony_ci	struct ngene_tvnorm  *tvnorms;
67262306a36Sopenharmony_ci	int                   tvnorm_num;
67362306a36Sopenharmony_ci	int                   tvnorm;
67462306a36Sopenharmony_ci
67562306a36Sopenharmony_ci	int running;
67662306a36Sopenharmony_ci
67762306a36Sopenharmony_ci	int tsin_offset;
67862306a36Sopenharmony_ci	u8  tsin_buffer[188];
67962306a36Sopenharmony_ci};
68062306a36Sopenharmony_ci
68162306a36Sopenharmony_ci
68262306a36Sopenharmony_cistruct ngene_ci {
68362306a36Sopenharmony_ci	struct device         device;
68462306a36Sopenharmony_ci	struct i2c_adapter    i2c_adapter;
68562306a36Sopenharmony_ci
68662306a36Sopenharmony_ci	struct ngene         *dev;
68762306a36Sopenharmony_ci	struct dvb_ca_en50221 *en;
68862306a36Sopenharmony_ci};
68962306a36Sopenharmony_ci
69062306a36Sopenharmony_cistruct ngene;
69162306a36Sopenharmony_ci
69262306a36Sopenharmony_citypedef void (rx_cb_t)(struct ngene *, u32, u8);
69362306a36Sopenharmony_citypedef void (tx_cb_t)(struct ngene *, u32);
69462306a36Sopenharmony_ci
69562306a36Sopenharmony_cistruct ngene {
69662306a36Sopenharmony_ci	int                   nr;
69762306a36Sopenharmony_ci	struct pci_dev       *pci_dev;
69862306a36Sopenharmony_ci	unsigned char __iomem *iomem;
69962306a36Sopenharmony_ci
70062306a36Sopenharmony_ci	/*struct i2c_adapter  i2c_adapter;*/
70162306a36Sopenharmony_ci
70262306a36Sopenharmony_ci	u32                   device_version;
70362306a36Sopenharmony_ci	u32                   fw_interface_version;
70462306a36Sopenharmony_ci	u32                   icounts;
70562306a36Sopenharmony_ci	bool                  msi_enabled;
70662306a36Sopenharmony_ci	bool                  cmd_timeout_workaround;
70762306a36Sopenharmony_ci
70862306a36Sopenharmony_ci	u8                   *CmdDoneByte;
70962306a36Sopenharmony_ci	int                   BootFirmware;
71062306a36Sopenharmony_ci	void                 *OverflowBuffer;
71162306a36Sopenharmony_ci	dma_addr_t            PAOverflowBuffer;
71262306a36Sopenharmony_ci	void                 *FWInterfaceBuffer;
71362306a36Sopenharmony_ci	dma_addr_t            PAFWInterfaceBuffer;
71462306a36Sopenharmony_ci	u8                   *ngenetohost;
71562306a36Sopenharmony_ci	u8                   *hosttongene;
71662306a36Sopenharmony_ci
71762306a36Sopenharmony_ci	struct EVENT_BUFFER   EventQueue[EVENT_QUEUE_SIZE];
71862306a36Sopenharmony_ci	int                   EventQueueOverflowCount;
71962306a36Sopenharmony_ci	int                   EventQueueOverflowFlag;
72062306a36Sopenharmony_ci	struct tasklet_struct event_tasklet;
72162306a36Sopenharmony_ci	struct EVENT_BUFFER  *EventBuffer;
72262306a36Sopenharmony_ci	int                   EventQueueWriteIndex;
72362306a36Sopenharmony_ci	int                   EventQueueReadIndex;
72462306a36Sopenharmony_ci
72562306a36Sopenharmony_ci	wait_queue_head_t     cmd_wq;
72662306a36Sopenharmony_ci	int                   cmd_done;
72762306a36Sopenharmony_ci	struct mutex          cmd_mutex;
72862306a36Sopenharmony_ci	struct mutex          stream_mutex;
72962306a36Sopenharmony_ci	struct semaphore      pll_mutex;
73062306a36Sopenharmony_ci	struct mutex          i2c_switch_mutex;
73162306a36Sopenharmony_ci	int                   i2c_current_channel;
73262306a36Sopenharmony_ci	int                   i2c_current_bus;
73362306a36Sopenharmony_ci	spinlock_t            cmd_lock;
73462306a36Sopenharmony_ci
73562306a36Sopenharmony_ci	struct dvb_adapter    adapter[MAX_STREAM];
73662306a36Sopenharmony_ci	struct dvb_adapter    *first_adapter; /* "one_adapter" modprobe opt */
73762306a36Sopenharmony_ci	struct ngene_channel  channel[MAX_STREAM];
73862306a36Sopenharmony_ci
73962306a36Sopenharmony_ci	struct ngene_info    *card_info;
74062306a36Sopenharmony_ci
74162306a36Sopenharmony_ci	tx_cb_t              *TxEventNotify;
74262306a36Sopenharmony_ci	rx_cb_t              *RxEventNotify;
74362306a36Sopenharmony_ci	int                   tx_busy;
74462306a36Sopenharmony_ci	wait_queue_head_t     tx_wq;
74562306a36Sopenharmony_ci	wait_queue_head_t     rx_wq;
74662306a36Sopenharmony_ci#define UART_RBUF_LEN 4096
74762306a36Sopenharmony_ci	u8                    uart_rbuf[UART_RBUF_LEN];
74862306a36Sopenharmony_ci	int                   uart_rp, uart_wp;
74962306a36Sopenharmony_ci
75062306a36Sopenharmony_ci#define TS_FILLER  0x6f
75162306a36Sopenharmony_ci
75262306a36Sopenharmony_ci	u8                   *tsout_buf;
75362306a36Sopenharmony_ci#define TSOUT_BUF_SIZE (512*188*8)
75462306a36Sopenharmony_ci	struct dvb_ringbuffer tsout_rbuf;
75562306a36Sopenharmony_ci
75662306a36Sopenharmony_ci	u8                   *tsin_buf;
75762306a36Sopenharmony_ci#define TSIN_BUF_SIZE (512*188*8)
75862306a36Sopenharmony_ci	struct dvb_ringbuffer tsin_rbuf;
75962306a36Sopenharmony_ci
76062306a36Sopenharmony_ci	u8                   *ain_buf;
76162306a36Sopenharmony_ci#define AIN_BUF_SIZE (128*1024)
76262306a36Sopenharmony_ci	struct dvb_ringbuffer ain_rbuf;
76362306a36Sopenharmony_ci
76462306a36Sopenharmony_ci
76562306a36Sopenharmony_ci	u8                   *vin_buf;
76662306a36Sopenharmony_ci#define VIN_BUF_SIZE (4*1920*1080)
76762306a36Sopenharmony_ci	struct dvb_ringbuffer vin_rbuf;
76862306a36Sopenharmony_ci
76962306a36Sopenharmony_ci	unsigned long         exp_val;
77062306a36Sopenharmony_ci	int prev_cmd;
77162306a36Sopenharmony_ci
77262306a36Sopenharmony_ci	struct ngene_ci       ci;
77362306a36Sopenharmony_ci};
77462306a36Sopenharmony_ci
77562306a36Sopenharmony_cistruct ngene_info {
77662306a36Sopenharmony_ci	int   type;
77762306a36Sopenharmony_ci#define NGENE_APP        0
77862306a36Sopenharmony_ci#define NGENE_TERRATEC   1
77962306a36Sopenharmony_ci#define NGENE_SIDEWINDER 2
78062306a36Sopenharmony_ci#define NGENE_RACER      3
78162306a36Sopenharmony_ci#define NGENE_VIPER      4
78262306a36Sopenharmony_ci#define NGENE_PYTHON     5
78362306a36Sopenharmony_ci#define NGENE_VBOX_V1	 6
78462306a36Sopenharmony_ci#define NGENE_VBOX_V2	 7
78562306a36Sopenharmony_ci
78662306a36Sopenharmony_ci	int   fw_version;
78762306a36Sopenharmony_ci	bool  msi_supported;
78862306a36Sopenharmony_ci	char *name;
78962306a36Sopenharmony_ci
79062306a36Sopenharmony_ci	int   io_type[MAX_STREAM];
79162306a36Sopenharmony_ci#define NGENE_IO_NONE    0
79262306a36Sopenharmony_ci#define NGENE_IO_TV      1
79362306a36Sopenharmony_ci#define NGENE_IO_HDTV    2
79462306a36Sopenharmony_ci#define NGENE_IO_TSIN    4
79562306a36Sopenharmony_ci#define NGENE_IO_TSOUT   8
79662306a36Sopenharmony_ci#define NGENE_IO_AIN     16
79762306a36Sopenharmony_ci
79862306a36Sopenharmony_ci	void *fe_config[4];
79962306a36Sopenharmony_ci	void *tuner_config[4];
80062306a36Sopenharmony_ci
80162306a36Sopenharmony_ci	int (*demod_attach[4])(struct ngene_channel *);
80262306a36Sopenharmony_ci	int (*tuner_attach[4])(struct ngene_channel *);
80362306a36Sopenharmony_ci
80462306a36Sopenharmony_ci	u8    avf[4];
80562306a36Sopenharmony_ci	u8    msp[4];
80662306a36Sopenharmony_ci	u8    demoda[4];
80762306a36Sopenharmony_ci	u8    lnb[4];
80862306a36Sopenharmony_ci	int   i2c_access;
80962306a36Sopenharmony_ci	u8    ntsc;
81062306a36Sopenharmony_ci	u8    tsf[4];
81162306a36Sopenharmony_ci	u8    i2s[4];
81262306a36Sopenharmony_ci
81362306a36Sopenharmony_ci	int (*gate_ctrl)(struct dvb_frontend *, int);
81462306a36Sopenharmony_ci	int (*switch_ctrl)(struct ngene_channel *, int, int);
81562306a36Sopenharmony_ci};
81662306a36Sopenharmony_ci
81762306a36Sopenharmony_ci
81862306a36Sopenharmony_ci/* Provided by ngene-core.c */
81962306a36Sopenharmony_ciint ngene_probe(struct pci_dev *pci_dev, const struct pci_device_id *id);
82062306a36Sopenharmony_civoid ngene_remove(struct pci_dev *pdev);
82162306a36Sopenharmony_civoid ngene_shutdown(struct pci_dev *pdev);
82262306a36Sopenharmony_ciint ngene_command(struct ngene *dev, struct ngene_command *com);
82362306a36Sopenharmony_ciint ngene_command_gpio_set(struct ngene *dev, u8 select, u8 level);
82462306a36Sopenharmony_civoid set_transfer(struct ngene_channel *chan, int state);
82562306a36Sopenharmony_civoid FillTSBuffer(void *Buffer, int Length, u32 Flags);
82662306a36Sopenharmony_ci
82762306a36Sopenharmony_ci/* Provided by ngene-cards.c */
82862306a36Sopenharmony_ciint ngene_port_has_cxd2099(struct i2c_adapter *i2c, u8 *type);
82962306a36Sopenharmony_ci
83062306a36Sopenharmony_ci/* Provided by ngene-i2c.c */
83162306a36Sopenharmony_ciint ngene_i2c_init(struct ngene *dev, int dev_nr);
83262306a36Sopenharmony_ci
83362306a36Sopenharmony_ci/* Provided by ngene-dvb.c */
83462306a36Sopenharmony_ciextern struct dvb_device ngene_dvbdev_ci;
83562306a36Sopenharmony_civoid *tsout_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags);
83662306a36Sopenharmony_civoid *tsin_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags);
83762306a36Sopenharmony_ciint ngene_start_feed(struct dvb_demux_feed *dvbdmxfeed);
83862306a36Sopenharmony_ciint ngene_stop_feed(struct dvb_demux_feed *dvbdmxfeed);
83962306a36Sopenharmony_ciint my_dvb_dmx_ts_card_init(struct dvb_demux *dvbdemux, char *id,
84062306a36Sopenharmony_ci			    int (*start_feed)(struct dvb_demux_feed *),
84162306a36Sopenharmony_ci			    int (*stop_feed)(struct dvb_demux_feed *),
84262306a36Sopenharmony_ci			    void *priv);
84362306a36Sopenharmony_ciint my_dvb_dmxdev_ts_card_init(struct dmxdev *dmxdev,
84462306a36Sopenharmony_ci			       struct dvb_demux *dvbdemux,
84562306a36Sopenharmony_ci			       struct dmx_frontend *hw_frontend,
84662306a36Sopenharmony_ci			       struct dmx_frontend *mem_frontend,
84762306a36Sopenharmony_ci			       struct dvb_adapter *dvb_adapter);
84862306a36Sopenharmony_ci
84962306a36Sopenharmony_ci#endif
85062306a36Sopenharmony_ci
85162306a36Sopenharmony_ci/*  LocalWords:  Endif
85262306a36Sopenharmony_ci */
853