xref: /openbmc/linux/drivers/media/pci/ngene/ngene.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
189ee7f4fSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
225aee3deSMauro Carvalho Chehab /*
325aee3deSMauro Carvalho Chehab  * ngene.h: nGene PCIe bridge driver
425aee3deSMauro Carvalho Chehab  *
525aee3deSMauro Carvalho Chehab  * Copyright (C) 2005-2007 Micronas
625aee3deSMauro Carvalho Chehab  */
725aee3deSMauro Carvalho Chehab 
825aee3deSMauro Carvalho Chehab #ifndef _NGENE_H_
925aee3deSMauro Carvalho Chehab #define _NGENE_H_
1025aee3deSMauro Carvalho Chehab 
1125aee3deSMauro Carvalho Chehab #include <linux/types.h>
1225aee3deSMauro Carvalho Chehab #include <linux/sched.h>
1325aee3deSMauro Carvalho Chehab #include <linux/interrupt.h>
1425aee3deSMauro Carvalho Chehab #include <linux/i2c.h>
1525aee3deSMauro Carvalho Chehab #include <asm/dma.h>
1625aee3deSMauro Carvalho Chehab #include <linux/scatterlist.h>
1725aee3deSMauro Carvalho Chehab 
1825aee3deSMauro Carvalho Chehab #include <linux/dvb/frontend.h>
1925aee3deSMauro Carvalho Chehab 
20fada1935SMauro Carvalho Chehab #include <media/dmxdev.h>
21fada1935SMauro Carvalho Chehab #include <media/dvbdev.h>
22fada1935SMauro Carvalho Chehab #include <media/dvb_demux.h>
23fada1935SMauro Carvalho Chehab #include <media/dvb_ca_en50221.h>
24fada1935SMauro Carvalho Chehab #include <media/dvb_frontend.h>
25fada1935SMauro Carvalho Chehab #include <media/dvb_ringbuffer.h>
26fada1935SMauro Carvalho Chehab #include <media/dvb_net.h>
2725aee3deSMauro Carvalho Chehab #include "cxd2099.h"
2825aee3deSMauro Carvalho Chehab 
2925aee3deSMauro Carvalho Chehab #define DEVICE_NAME "ngene"
3025aee3deSMauro Carvalho Chehab 
3125aee3deSMauro Carvalho Chehab #define NGENE_VID       0x18c3
3225aee3deSMauro Carvalho Chehab #define NGENE_PID       0x0720
3325aee3deSMauro Carvalho Chehab 
3425aee3deSMauro Carvalho Chehab #ifndef VIDEO_CAP_VC1
3525aee3deSMauro Carvalho Chehab #define VIDEO_CAP_AVC   128
3625aee3deSMauro Carvalho Chehab #define VIDEO_CAP_H264  128
3725aee3deSMauro Carvalho Chehab #define VIDEO_CAP_VC1   256
3825aee3deSMauro Carvalho Chehab #define VIDEO_CAP_WMV9  256
3925aee3deSMauro Carvalho Chehab #define VIDEO_CAP_MPEG4 512
4025aee3deSMauro Carvalho Chehab #endif
4125aee3deSMauro Carvalho Chehab 
4266a4c0c7SDaniel Scheller #define DEMOD_TYPE_STV090X	0
4366a4c0c7SDaniel Scheller #define DEMOD_TYPE_DRXK		1
441c2ad82eSDaniel Scheller #define DEMOD_TYPE_STV0367	2
4566a4c0c7SDaniel Scheller 
467d5397d4SDaniel Scheller #define DEMOD_TYPE_XO2		32
477d5397d4SDaniel Scheller #define DEMOD_TYPE_STV0910	(DEMOD_TYPE_XO2 + 0)
487d5397d4SDaniel Scheller #define DEMOD_TYPE_SONY_CT2	(DEMOD_TYPE_XO2 + 1)
497d5397d4SDaniel Scheller #define DEMOD_TYPE_SONY_ISDBT	(DEMOD_TYPE_XO2 + 2)
507d5397d4SDaniel Scheller #define DEMOD_TYPE_SONY_C2T2	(DEMOD_TYPE_XO2 + 3)
517d5397d4SDaniel Scheller #define DEMOD_TYPE_ST_ATSC	(DEMOD_TYPE_XO2 + 4)
527d5397d4SDaniel Scheller #define DEMOD_TYPE_SONY_C2T2I	(DEMOD_TYPE_XO2 + 5)
537d5397d4SDaniel Scheller 
547d5397d4SDaniel Scheller #define NGENE_XO2_TYPE_NONE	0
557d5397d4SDaniel Scheller #define NGENE_XO2_TYPE_DUOFLEX	1
567d5397d4SDaniel Scheller #define NGENE_XO2_TYPE_CI	2
577d5397d4SDaniel Scheller 
5825aee3deSMauro Carvalho Chehab enum STREAM {
5925aee3deSMauro Carvalho Chehab 	STREAM_VIDEOIN1 = 0,        /* ITU656 or TS Input */
6025aee3deSMauro Carvalho Chehab 	STREAM_VIDEOIN2,
6125aee3deSMauro Carvalho Chehab 	STREAM_AUDIOIN1,            /* I2S or SPI Input */
6225aee3deSMauro Carvalho Chehab 	STREAM_AUDIOIN2,
6325aee3deSMauro Carvalho Chehab 	STREAM_AUDIOOUT,
6425aee3deSMauro Carvalho Chehab 	MAX_STREAM
6525aee3deSMauro Carvalho Chehab };
6625aee3deSMauro Carvalho Chehab 
6725aee3deSMauro Carvalho Chehab enum SMODE_BITS {
6825aee3deSMauro Carvalho Chehab 	SMODE_AUDIO_SPDIF = 0x20,
6925aee3deSMauro Carvalho Chehab 	SMODE_AVSYNC = 0x10,
7025aee3deSMauro Carvalho Chehab 	SMODE_TRANSPORT_STREAM = 0x08,
7125aee3deSMauro Carvalho Chehab 	SMODE_AUDIO_CAPTURE = 0x04,
7225aee3deSMauro Carvalho Chehab 	SMODE_VBI_CAPTURE = 0x02,
7325aee3deSMauro Carvalho Chehab 	SMODE_VIDEO_CAPTURE = 0x01
7425aee3deSMauro Carvalho Chehab };
7525aee3deSMauro Carvalho Chehab 
7625aee3deSMauro Carvalho Chehab enum STREAM_FLAG_BITS {
7725aee3deSMauro Carvalho Chehab 	SFLAG_CHROMA_FORMAT_2COMP  = 0x01, /* Chroma Format : 2's complement */
7825aee3deSMauro Carvalho Chehab 	SFLAG_CHROMA_FORMAT_OFFSET = 0x00, /* Chroma Format : Binary offset */
7925aee3deSMauro Carvalho Chehab 	SFLAG_ORDER_LUMA_CHROMA    = 0x02, /* Byte order: Y,Cb,Y,Cr */
8025aee3deSMauro Carvalho Chehab 	SFLAG_ORDER_CHROMA_LUMA    = 0x00, /* Byte order: Cb,Y,Cr,Y */
8125aee3deSMauro Carvalho Chehab 	SFLAG_COLORBAR             = 0x04, /* Select colorbar */
8225aee3deSMauro Carvalho Chehab };
8325aee3deSMauro Carvalho Chehab 
8425aee3deSMauro Carvalho Chehab #define PROGRAM_ROM     0x0000
8525aee3deSMauro Carvalho Chehab #define PROGRAM_SRAM    0x1000
8625aee3deSMauro Carvalho Chehab #define PERIPHERALS0    0x8000
8725aee3deSMauro Carvalho Chehab #define PERIPHERALS1    0x9000
8825aee3deSMauro Carvalho Chehab #define SHARED_BUFFER   0xC000
8925aee3deSMauro Carvalho Chehab 
9025aee3deSMauro Carvalho Chehab #define HOST_TO_NGENE    (SHARED_BUFFER+0x0000)
9125aee3deSMauro Carvalho Chehab #define NGENE_TO_HOST    (SHARED_BUFFER+0x0100)
9225aee3deSMauro Carvalho Chehab #define NGENE_COMMAND    (SHARED_BUFFER+0x0200)
9325aee3deSMauro Carvalho Chehab #define NGENE_COMMAND_HI (SHARED_BUFFER+0x0204)
9425aee3deSMauro Carvalho Chehab #define NGENE_STATUS     (SHARED_BUFFER+0x0208)
9525aee3deSMauro Carvalho Chehab #define NGENE_STATUS_HI  (SHARED_BUFFER+0x020C)
9625aee3deSMauro Carvalho Chehab #define NGENE_EVENT      (SHARED_BUFFER+0x0210)
9725aee3deSMauro Carvalho Chehab #define NGENE_EVENT_HI   (SHARED_BUFFER+0x0214)
9825aee3deSMauro Carvalho Chehab #define VARIABLES        (SHARED_BUFFER+0x0210)
9925aee3deSMauro Carvalho Chehab 
10025aee3deSMauro Carvalho Chehab #define NGENE_INT_COUNTS       (SHARED_BUFFER+0x0260)
10125aee3deSMauro Carvalho Chehab #define NGENE_INT_ENABLE       (SHARED_BUFFER+0x0264)
10225aee3deSMauro Carvalho Chehab #define NGENE_VBI_LINE_COUNT   (SHARED_BUFFER+0x0268)
10325aee3deSMauro Carvalho Chehab 
10425aee3deSMauro Carvalho Chehab #define BUFFER_GP_XMIT  (SHARED_BUFFER+0x0800)
10525aee3deSMauro Carvalho Chehab #define BUFFER_GP_RECV  (SHARED_BUFFER+0x0900)
10625aee3deSMauro Carvalho Chehab #define EEPROM_AREA     (SHARED_BUFFER+0x0A00)
10725aee3deSMauro Carvalho Chehab 
10825aee3deSMauro Carvalho Chehab #define SG_V_IN_1       (SHARED_BUFFER+0x0A80)
10925aee3deSMauro Carvalho Chehab #define SG_VBI_1        (SHARED_BUFFER+0x0B00)
11025aee3deSMauro Carvalho Chehab #define SG_A_IN_1       (SHARED_BUFFER+0x0B80)
11125aee3deSMauro Carvalho Chehab #define SG_V_IN_2       (SHARED_BUFFER+0x0C00)
11225aee3deSMauro Carvalho Chehab #define SG_VBI_2        (SHARED_BUFFER+0x0C80)
11325aee3deSMauro Carvalho Chehab #define SG_A_IN_2       (SHARED_BUFFER+0x0D00)
11425aee3deSMauro Carvalho Chehab #define SG_V_OUT        (SHARED_BUFFER+0x0D80)
11525aee3deSMauro Carvalho Chehab #define SG_A_OUT2       (SHARED_BUFFER+0x0E00)
11625aee3deSMauro Carvalho Chehab 
11725aee3deSMauro Carvalho Chehab #define DATA_A_IN_1     (SHARED_BUFFER+0x0E80)
11825aee3deSMauro Carvalho Chehab #define DATA_A_IN_2     (SHARED_BUFFER+0x0F00)
11925aee3deSMauro Carvalho Chehab #define DATA_A_OUT      (SHARED_BUFFER+0x0F80)
12025aee3deSMauro Carvalho Chehab #define DATA_V_IN_1     (SHARED_BUFFER+0x1000)
12125aee3deSMauro Carvalho Chehab #define DATA_V_IN_2     (SHARED_BUFFER+0x2000)
12225aee3deSMauro Carvalho Chehab #define DATA_V_OUT      (SHARED_BUFFER+0x3000)
12325aee3deSMauro Carvalho Chehab 
12425aee3deSMauro Carvalho Chehab #define DATA_FIFO_AREA  (SHARED_BUFFER+0x1000)
12525aee3deSMauro Carvalho Chehab 
12625aee3deSMauro Carvalho Chehab #define TIMESTAMPS      0xA000
12725aee3deSMauro Carvalho Chehab #define SCRATCHPAD      0xA080
12825aee3deSMauro Carvalho Chehab #define FORCE_INT       0xA088
12925aee3deSMauro Carvalho Chehab #define FORCE_NMI       0xA090
13025aee3deSMauro Carvalho Chehab #define INT_STATUS      0xA0A0
13125aee3deSMauro Carvalho Chehab 
13225aee3deSMauro Carvalho Chehab #define DEV_VER         0x9004
13325aee3deSMauro Carvalho Chehab 
13425aee3deSMauro Carvalho Chehab #define FW_DEBUG_DEFAULT (PROGRAM_SRAM+0x00FF)
13525aee3deSMauro Carvalho Chehab 
13625aee3deSMauro Carvalho Chehab struct SG_ADDR {
13725aee3deSMauro Carvalho Chehab 	u64 start;
13825aee3deSMauro Carvalho Chehab 	u64 curr;
13925aee3deSMauro Carvalho Chehab 	u16 curr_ptr;
14025aee3deSMauro Carvalho Chehab 	u16 elements;
14125aee3deSMauro Carvalho Chehab 	u32 pad[3];
14225aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
14325aee3deSMauro Carvalho Chehab 
14425aee3deSMauro Carvalho Chehab struct SHARED_MEMORY {
14525aee3deSMauro Carvalho Chehab 	/* C000 */
14625aee3deSMauro Carvalho Chehab 	u32 HostToNgene[64];
14725aee3deSMauro Carvalho Chehab 
14825aee3deSMauro Carvalho Chehab 	/* C100 */
14925aee3deSMauro Carvalho Chehab 	u32 NgeneToHost[64];
15025aee3deSMauro Carvalho Chehab 
15125aee3deSMauro Carvalho Chehab 	/* C200 */
15225aee3deSMauro Carvalho Chehab 	u64 NgeneCommand;
15325aee3deSMauro Carvalho Chehab 	u64 NgeneStatus;
15425aee3deSMauro Carvalho Chehab 	u64 NgeneEvent;
15525aee3deSMauro Carvalho Chehab 
15625aee3deSMauro Carvalho Chehab 	/* C210 */
15725aee3deSMauro Carvalho Chehab 	u8 pad1[0xc260 - 0xc218];
15825aee3deSMauro Carvalho Chehab 
15925aee3deSMauro Carvalho Chehab 	/* C260 */
16025aee3deSMauro Carvalho Chehab 	u32 IntCounts;
16125aee3deSMauro Carvalho Chehab 	u32 IntEnable;
16225aee3deSMauro Carvalho Chehab 
16325aee3deSMauro Carvalho Chehab 	/* C268 */
16425aee3deSMauro Carvalho Chehab 	u8 pad2[0xd000 - 0xc268];
16525aee3deSMauro Carvalho Chehab 
16625aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
16725aee3deSMauro Carvalho Chehab 
16825aee3deSMauro Carvalho Chehab struct BUFFER_STREAM_RESULTS {
16925aee3deSMauro Carvalho Chehab 	u32 Clock;           /* Stream time in 100ns units */
17025aee3deSMauro Carvalho Chehab 	u16 RemainingLines;  /* Remaining lines in this field.
17125aee3deSMauro Carvalho Chehab 				0 for complete field */
17225aee3deSMauro Carvalho Chehab 	u8  FieldCount;      /* Video field number */
17325aee3deSMauro Carvalho Chehab 	u8  Flags;           /* Bit 7 = Done, Bit 6 = seen, Bit 5 = overflow,
17425aee3deSMauro Carvalho Chehab 				Bit 0 = FieldID */
17525aee3deSMauro Carvalho Chehab 	u16 BlockCount;      /* Audio block count (unused) */
17625aee3deSMauro Carvalho Chehab 	u8  Reserved[2];
17725aee3deSMauro Carvalho Chehab 	u32 DTOUpdate;
17825aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
17925aee3deSMauro Carvalho Chehab 
18025aee3deSMauro Carvalho Chehab struct HW_SCATTER_GATHER_ELEMENT {
18125aee3deSMauro Carvalho Chehab 	u64 Address;
18225aee3deSMauro Carvalho Chehab 	u32 Length;
18325aee3deSMauro Carvalho Chehab 	u32 Reserved;
18425aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
18525aee3deSMauro Carvalho Chehab 
18625aee3deSMauro Carvalho Chehab struct BUFFER_HEADER {
18725aee3deSMauro Carvalho Chehab 	u64    Next;
18825aee3deSMauro Carvalho Chehab 	struct BUFFER_STREAM_RESULTS SR;
18925aee3deSMauro Carvalho Chehab 
19025aee3deSMauro Carvalho Chehab 	u32    Number_of_entries_1;
19125aee3deSMauro Carvalho Chehab 	u32    Reserved5;
19225aee3deSMauro Carvalho Chehab 	u64    Address_of_first_entry_1;
19325aee3deSMauro Carvalho Chehab 
19425aee3deSMauro Carvalho Chehab 	u32    Number_of_entries_2;
19525aee3deSMauro Carvalho Chehab 	u32    Reserved7;
19625aee3deSMauro Carvalho Chehab 	u64    Address_of_first_entry_2;
19725aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
19825aee3deSMauro Carvalho Chehab 
19925aee3deSMauro Carvalho Chehab struct EVENT_BUFFER {
20025aee3deSMauro Carvalho Chehab 	u32    TimeStamp;
20125aee3deSMauro Carvalho Chehab 	u8     GPIOStatus;
20225aee3deSMauro Carvalho Chehab 	u8     UARTStatus;
20325aee3deSMauro Carvalho Chehab 	u8     RXCharacter;
20425aee3deSMauro Carvalho Chehab 	u8     EventStatus;
20525aee3deSMauro Carvalho Chehab 	u32    Reserved[2];
20625aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
20725aee3deSMauro Carvalho Chehab 
20825aee3deSMauro Carvalho Chehab /* Firmware commands. */
20925aee3deSMauro Carvalho Chehab 
21025aee3deSMauro Carvalho Chehab enum OPCODES {
21125aee3deSMauro Carvalho Chehab 	CMD_NOP = 0,
21225aee3deSMauro Carvalho Chehab 	CMD_FWLOAD_PREPARE  = 0x01,
21325aee3deSMauro Carvalho Chehab 	CMD_FWLOAD_FINISH   = 0x02,
21425aee3deSMauro Carvalho Chehab 	CMD_I2C_READ        = 0x03,
21525aee3deSMauro Carvalho Chehab 	CMD_I2C_WRITE       = 0x04,
21625aee3deSMauro Carvalho Chehab 
21725aee3deSMauro Carvalho Chehab 	CMD_I2C_WRITE_NOSTOP = 0x05,
21825aee3deSMauro Carvalho Chehab 	CMD_I2C_CONTINUE_WRITE = 0x06,
21925aee3deSMauro Carvalho Chehab 	CMD_I2C_CONTINUE_WRITE_NOSTOP = 0x07,
22025aee3deSMauro Carvalho Chehab 
22125aee3deSMauro Carvalho Chehab 	CMD_DEBUG_OUTPUT    = 0x09,
22225aee3deSMauro Carvalho Chehab 
22325aee3deSMauro Carvalho Chehab 	CMD_CONTROL         = 0x10,
22425aee3deSMauro Carvalho Chehab 	CMD_CONFIGURE_BUFFER = 0x11,
22525aee3deSMauro Carvalho Chehab 	CMD_CONFIGURE_FREE_BUFFER = 0x12,
22625aee3deSMauro Carvalho Chehab 
22725aee3deSMauro Carvalho Chehab 	CMD_SPI_READ        = 0x13,
22825aee3deSMauro Carvalho Chehab 	CMD_SPI_WRITE       = 0x14,
22925aee3deSMauro Carvalho Chehab 
23025aee3deSMauro Carvalho Chehab 	CMD_MEM_READ        = 0x20,
23125aee3deSMauro Carvalho Chehab 	CMD_MEM_WRITE	    = 0x21,
23225aee3deSMauro Carvalho Chehab 	CMD_SFR_READ	    = 0x22,
23325aee3deSMauro Carvalho Chehab 	CMD_SFR_WRITE	    = 0x23,
23425aee3deSMauro Carvalho Chehab 	CMD_IRAM_READ	    = 0x24,
23525aee3deSMauro Carvalho Chehab 	CMD_IRAM_WRITE	    = 0x25,
23625aee3deSMauro Carvalho Chehab 	CMD_SET_GPIO_PIN    = 0x26,
23725aee3deSMauro Carvalho Chehab 	CMD_SET_GPIO_INT    = 0x27,
23825aee3deSMauro Carvalho Chehab 	CMD_CONFIGURE_UART  = 0x28,
23925aee3deSMauro Carvalho Chehab 	CMD_WRITE_UART      = 0x29,
24025aee3deSMauro Carvalho Chehab 	MAX_CMD
24125aee3deSMauro Carvalho Chehab };
24225aee3deSMauro Carvalho Chehab 
24325aee3deSMauro Carvalho Chehab enum RESPONSES {
24425aee3deSMauro Carvalho Chehab 	OK = 0,
24525aee3deSMauro Carvalho Chehab 	ERROR = 1
24625aee3deSMauro Carvalho Chehab };
24725aee3deSMauro Carvalho Chehab 
24825aee3deSMauro Carvalho Chehab struct FW_HEADER {
24925aee3deSMauro Carvalho Chehab 	u8 Opcode;
25025aee3deSMauro Carvalho Chehab 	u8 Length;
25125aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
25225aee3deSMauro Carvalho Chehab 
25325aee3deSMauro Carvalho Chehab struct FW_I2C_WRITE {
25425aee3deSMauro Carvalho Chehab 	struct FW_HEADER hdr;
25525aee3deSMauro Carvalho Chehab 	u8 Device;
25625aee3deSMauro Carvalho Chehab 	u8 Data[250];
25725aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
25825aee3deSMauro Carvalho Chehab 
25925aee3deSMauro Carvalho Chehab struct FW_I2C_CONTINUE_WRITE {
26025aee3deSMauro Carvalho Chehab 	struct FW_HEADER hdr;
26125aee3deSMauro Carvalho Chehab 	u8 Data[250];
26225aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
26325aee3deSMauro Carvalho Chehab 
26425aee3deSMauro Carvalho Chehab struct FW_I2C_READ {
26525aee3deSMauro Carvalho Chehab 	struct FW_HEADER hdr;
26625aee3deSMauro Carvalho Chehab 	u8 Device;
26725aee3deSMauro Carvalho Chehab 	u8 Data[252];    /* followed by two bytes of read data count */
26825aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
26925aee3deSMauro Carvalho Chehab 
27025aee3deSMauro Carvalho Chehab struct FW_SPI_WRITE {
27125aee3deSMauro Carvalho Chehab 	struct FW_HEADER hdr;
27225aee3deSMauro Carvalho Chehab 	u8 ModeSelect;
27325aee3deSMauro Carvalho Chehab 	u8 Data[250];
27425aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
27525aee3deSMauro Carvalho Chehab 
27625aee3deSMauro Carvalho Chehab struct FW_SPI_READ {
27725aee3deSMauro Carvalho Chehab 	struct FW_HEADER hdr;
27825aee3deSMauro Carvalho Chehab 	u8 ModeSelect;
27925aee3deSMauro Carvalho Chehab 	u8 Data[252];    /* followed by two bytes of read data count */
28025aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
28125aee3deSMauro Carvalho Chehab 
28225aee3deSMauro Carvalho Chehab struct FW_FWLOAD_PREPARE {
28325aee3deSMauro Carvalho Chehab 	struct FW_HEADER hdr;
28425aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
28525aee3deSMauro Carvalho Chehab 
28625aee3deSMauro Carvalho Chehab struct FW_FWLOAD_FINISH {
28725aee3deSMauro Carvalho Chehab 	struct FW_HEADER hdr;
28825aee3deSMauro Carvalho Chehab 	u16 Address;     /* address of final block */
28925aee3deSMauro Carvalho Chehab 	u16 Length;
29025aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
29125aee3deSMauro Carvalho Chehab 
29225aee3deSMauro Carvalho Chehab /*
29325aee3deSMauro Carvalho Chehab  * Meaning of FW_STREAM_CONTROL::Mode bits:
29425aee3deSMauro Carvalho Chehab  *  Bit 7: Loopback PEXin to PEXout using TVOut channel
29525aee3deSMauro Carvalho Chehab  *  Bit 6: AVLOOP
29625aee3deSMauro Carvalho Chehab  *  Bit 5: Audio select; 0=I2S, 1=SPDIF
29725aee3deSMauro Carvalho Chehab  *  Bit 4: AVSYNC
29825aee3deSMauro Carvalho Chehab  *  Bit 3: Enable transport stream
29925aee3deSMauro Carvalho Chehab  *  Bit 2: Enable audio capture
30025aee3deSMauro Carvalho Chehab  *  Bit 1: Enable ITU-Video VBI capture
30125aee3deSMauro Carvalho Chehab  *  Bit 0: Enable ITU-Video capture
30225aee3deSMauro Carvalho Chehab  *
30325aee3deSMauro Carvalho Chehab  * Meaning of FW_STREAM_CONTROL::Control bits (see UVI1_CTL)
30425aee3deSMauro Carvalho Chehab  *  Bit 7: continuous capture
30525aee3deSMauro Carvalho Chehab  *  Bit 6: capture one field
30625aee3deSMauro Carvalho Chehab  *  Bit 5: capture one frame
30725aee3deSMauro Carvalho Chehab  *  Bit 4: unused
30825aee3deSMauro Carvalho Chehab  *  Bit 3: starting field; 0=odd, 1=even
30925aee3deSMauro Carvalho Chehab  *  Bit 2: sample size; 0=8-bit, 1=10-bit
31025aee3deSMauro Carvalho Chehab  *  Bit 1: data format; 0=UYVY, 1=YUY2
31125aee3deSMauro Carvalho Chehab  *  Bit 0: resets buffer pointers
31225aee3deSMauro Carvalho Chehab */
31325aee3deSMauro Carvalho Chehab 
31425aee3deSMauro Carvalho Chehab enum FSC_MODE_BITS {
31525aee3deSMauro Carvalho Chehab 	SMODE_LOOPBACK          = 0x80,
31625aee3deSMauro Carvalho Chehab 	SMODE_AVLOOP            = 0x40,
31725aee3deSMauro Carvalho Chehab 	_SMODE_AUDIO_SPDIF      = 0x20,
31825aee3deSMauro Carvalho Chehab 	_SMODE_AVSYNC           = 0x10,
31925aee3deSMauro Carvalho Chehab 	_SMODE_TRANSPORT_STREAM = 0x08,
32025aee3deSMauro Carvalho Chehab 	_SMODE_AUDIO_CAPTURE    = 0x04,
32125aee3deSMauro Carvalho Chehab 	_SMODE_VBI_CAPTURE      = 0x02,
32225aee3deSMauro Carvalho Chehab 	_SMODE_VIDEO_CAPTURE    = 0x01
32325aee3deSMauro Carvalho Chehab };
32425aee3deSMauro Carvalho Chehab 
32525aee3deSMauro Carvalho Chehab 
32625aee3deSMauro Carvalho Chehab /* Meaning of FW_STREAM_CONTROL::Stream bits:
32725aee3deSMauro Carvalho Chehab  * Bit 3: Audio sample count:  0 = relative, 1 = absolute
32825aee3deSMauro Carvalho Chehab  * Bit 2: color bar select; 1=color bars, 0=CV3 decoder
32925aee3deSMauro Carvalho Chehab  * Bits 1-0: stream select, UVI1, UVI2, TVOUT
33025aee3deSMauro Carvalho Chehab  */
33125aee3deSMauro Carvalho Chehab 
33225aee3deSMauro Carvalho Chehab struct FW_STREAM_CONTROL {
33325aee3deSMauro Carvalho Chehab 	struct FW_HEADER hdr;
33425aee3deSMauro Carvalho Chehab 	u8     Stream;             /* Stream number (UVI1, UVI2, TVOUT) */
33525aee3deSMauro Carvalho Chehab 	u8     Control;            /* Value written to UVI1_CTL */
33625aee3deSMauro Carvalho Chehab 	u8     Mode;               /* Controls clock source */
33725aee3deSMauro Carvalho Chehab 	u8     SetupDataLen;	   /* Length of setup data, MSB=1 write
33825aee3deSMauro Carvalho Chehab 				      backwards */
33925aee3deSMauro Carvalho Chehab 	u16    CaptureBlockCount;  /* Blocks (a 256 Bytes) to capture per buffer
34025aee3deSMauro Carvalho Chehab 				      for TS and Audio */
34125aee3deSMauro Carvalho Chehab 	u64    Buffer_Address;	   /* Address of first buffer header */
34225aee3deSMauro Carvalho Chehab 	u16    BytesPerVideoLine;
34325aee3deSMauro Carvalho Chehab 	u16    MaxLinesPerField;
34425aee3deSMauro Carvalho Chehab 	u16    MinLinesPerField;
34525aee3deSMauro Carvalho Chehab 	u16    Reserved_1;
34625aee3deSMauro Carvalho Chehab 	u16    BytesPerVBILine;
34725aee3deSMauro Carvalho Chehab 	u16    MaxVBILinesPerField;
34825aee3deSMauro Carvalho Chehab 	u16    MinVBILinesPerField;
34925aee3deSMauro Carvalho Chehab 	u16    SetupDataAddr;      /* ngene relative address of setup data */
35025aee3deSMauro Carvalho Chehab 	u8     SetupData[32];      /* setup data */
35125aee3deSMauro Carvalho Chehab } __attribute__((__packed__));
35225aee3deSMauro Carvalho Chehab 
35325aee3deSMauro Carvalho Chehab #define AUDIO_BLOCK_SIZE    256
35425aee3deSMauro Carvalho Chehab #define TS_BLOCK_SIZE       256
35525aee3deSMauro Carvalho Chehab 
35625aee3deSMauro Carvalho Chehab struct FW_MEM_READ {
35725aee3deSMauro Carvalho Chehab 	struct FW_HEADER hdr;
35825aee3deSMauro Carvalho Chehab 	u16   address;
35925aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
36025aee3deSMauro Carvalho Chehab 
36125aee3deSMauro Carvalho Chehab struct FW_MEM_WRITE {
36225aee3deSMauro Carvalho Chehab 	struct FW_HEADER hdr;
36325aee3deSMauro Carvalho Chehab 	u16   address;
36425aee3deSMauro Carvalho Chehab 	u8    data;
36525aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
36625aee3deSMauro Carvalho Chehab 
36725aee3deSMauro Carvalho Chehab struct FW_SFR_IRAM_READ {
36825aee3deSMauro Carvalho Chehab 	struct FW_HEADER hdr;
36925aee3deSMauro Carvalho Chehab 	u8    address;
37025aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
37125aee3deSMauro Carvalho Chehab 
37225aee3deSMauro Carvalho Chehab struct FW_SFR_IRAM_WRITE {
37325aee3deSMauro Carvalho Chehab 	struct FW_HEADER hdr;
37425aee3deSMauro Carvalho Chehab 	u8    address;
37525aee3deSMauro Carvalho Chehab 	u8    data;
37625aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
37725aee3deSMauro Carvalho Chehab 
37825aee3deSMauro Carvalho Chehab struct FW_SET_GPIO_PIN {
37925aee3deSMauro Carvalho Chehab 	struct FW_HEADER hdr;
38025aee3deSMauro Carvalho Chehab 	u8    select;
38125aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
38225aee3deSMauro Carvalho Chehab 
38325aee3deSMauro Carvalho Chehab struct FW_SET_GPIO_INT {
38425aee3deSMauro Carvalho Chehab 	struct FW_HEADER hdr;
38525aee3deSMauro Carvalho Chehab 	u8    select;
38625aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
38725aee3deSMauro Carvalho Chehab 
38825aee3deSMauro Carvalho Chehab struct FW_SET_DEBUGMODE {
38925aee3deSMauro Carvalho Chehab 	struct FW_HEADER hdr;
39025aee3deSMauro Carvalho Chehab 	u8   debug_flags;
39125aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
39225aee3deSMauro Carvalho Chehab 
39325aee3deSMauro Carvalho Chehab struct FW_CONFIGURE_BUFFERS {
39425aee3deSMauro Carvalho Chehab 	struct FW_HEADER hdr;
39525aee3deSMauro Carvalho Chehab 	u8   config;
39625aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
39725aee3deSMauro Carvalho Chehab 
39825aee3deSMauro Carvalho Chehab enum _BUFFER_CONFIGS {
39925aee3deSMauro Carvalho Chehab 	/* 4k UVI1, 4k UVI2, 2k AUD1, 2k AUD2  (standard usage) */
40025aee3deSMauro Carvalho Chehab 	BUFFER_CONFIG_4422 = 0,
40125aee3deSMauro Carvalho Chehab 	/* 3k UVI1, 3k UVI2, 3k AUD1, 3k AUD2  (4x TS input usage) */
40225aee3deSMauro Carvalho Chehab 	BUFFER_CONFIG_3333 = 1,
40325aee3deSMauro Carvalho Chehab 	/* 8k UVI1, 0k UVI2, 2k AUD1, 2k I2SOut  (HDTV decoder usage) */
40425aee3deSMauro Carvalho Chehab 	BUFFER_CONFIG_8022 = 2,
40525aee3deSMauro Carvalho Chehab 	BUFFER_CONFIG_FW17 = 255, /* Use new FW 17 command */
40625aee3deSMauro Carvalho Chehab };
40725aee3deSMauro Carvalho Chehab 
40825aee3deSMauro Carvalho Chehab struct FW_CONFIGURE_FREE_BUFFERS {
40925aee3deSMauro Carvalho Chehab 	struct FW_HEADER hdr;
410*8d4abca9SGustavo A. R. Silva 	struct {
41125aee3deSMauro Carvalho Chehab 		u8   UVI1_BufferLength;
41225aee3deSMauro Carvalho Chehab 		u8   UVI2_BufferLength;
41325aee3deSMauro Carvalho Chehab 		u8   TVO_BufferLength;
41425aee3deSMauro Carvalho Chehab 		u8   AUD1_BufferLength;
41525aee3deSMauro Carvalho Chehab 		u8   AUD2_BufferLength;
41625aee3deSMauro Carvalho Chehab 		u8   TVA_BufferLength;
417*8d4abca9SGustavo A. R. Silva 	} __packed config;
41825aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
41925aee3deSMauro Carvalho Chehab 
42025aee3deSMauro Carvalho Chehab struct FW_CONFIGURE_UART {
42125aee3deSMauro Carvalho Chehab 	struct FW_HEADER hdr;
42225aee3deSMauro Carvalho Chehab 	u8 UartControl;
42325aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
42425aee3deSMauro Carvalho Chehab 
42525aee3deSMauro Carvalho Chehab enum _UART_CONFIG {
42625aee3deSMauro Carvalho Chehab 	_UART_BAUDRATE_19200 = 0,
42725aee3deSMauro Carvalho Chehab 	_UART_BAUDRATE_9600  = 1,
42825aee3deSMauro Carvalho Chehab 	_UART_BAUDRATE_4800  = 2,
42925aee3deSMauro Carvalho Chehab 	_UART_BAUDRATE_2400  = 3,
43025aee3deSMauro Carvalho Chehab 	_UART_RX_ENABLE      = 0x40,
43125aee3deSMauro Carvalho Chehab 	_UART_TX_ENABLE      = 0x80,
43225aee3deSMauro Carvalho Chehab };
43325aee3deSMauro Carvalho Chehab 
43425aee3deSMauro Carvalho Chehab struct FW_WRITE_UART {
43525aee3deSMauro Carvalho Chehab 	struct FW_HEADER hdr;
43625aee3deSMauro Carvalho Chehab 	u8 Data[252];
43725aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
43825aee3deSMauro Carvalho Chehab 
43925aee3deSMauro Carvalho Chehab 
44025aee3deSMauro Carvalho Chehab struct ngene_command {
44125aee3deSMauro Carvalho Chehab 	u32 in_len;
44225aee3deSMauro Carvalho Chehab 	u32 out_len;
44325aee3deSMauro Carvalho Chehab 	union {
44425aee3deSMauro Carvalho Chehab 		u32                              raw[64];
44525aee3deSMauro Carvalho Chehab 		u8                               raw8[256];
44625aee3deSMauro Carvalho Chehab 		struct FW_HEADER                 hdr;
44725aee3deSMauro Carvalho Chehab 		struct FW_I2C_WRITE              I2CWrite;
44825aee3deSMauro Carvalho Chehab 		struct FW_I2C_CONTINUE_WRITE     I2CContinueWrite;
44925aee3deSMauro Carvalho Chehab 		struct FW_I2C_READ               I2CRead;
45025aee3deSMauro Carvalho Chehab 		struct FW_STREAM_CONTROL         StreamControl;
45125aee3deSMauro Carvalho Chehab 		struct FW_FWLOAD_PREPARE         FWLoadPrepare;
45225aee3deSMauro Carvalho Chehab 		struct FW_FWLOAD_FINISH          FWLoadFinish;
45325aee3deSMauro Carvalho Chehab 		struct FW_MEM_READ		 MemoryRead;
45425aee3deSMauro Carvalho Chehab 		struct FW_MEM_WRITE		 MemoryWrite;
45525aee3deSMauro Carvalho Chehab 		struct FW_SFR_IRAM_READ		 SfrIramRead;
45625aee3deSMauro Carvalho Chehab 		struct FW_SFR_IRAM_WRITE         SfrIramWrite;
45725aee3deSMauro Carvalho Chehab 		struct FW_SPI_WRITE              SPIWrite;
45825aee3deSMauro Carvalho Chehab 		struct FW_SPI_READ               SPIRead;
45925aee3deSMauro Carvalho Chehab 		struct FW_SET_GPIO_PIN           SetGpioPin;
46025aee3deSMauro Carvalho Chehab 		struct FW_SET_GPIO_INT           SetGpioInt;
46125aee3deSMauro Carvalho Chehab 		struct FW_SET_DEBUGMODE          SetDebugMode;
46225aee3deSMauro Carvalho Chehab 		struct FW_CONFIGURE_BUFFERS      ConfigureBuffers;
46325aee3deSMauro Carvalho Chehab 		struct FW_CONFIGURE_FREE_BUFFERS ConfigureFreeBuffers;
46425aee3deSMauro Carvalho Chehab 		struct FW_CONFIGURE_UART         ConfigureUart;
46525aee3deSMauro Carvalho Chehab 		struct FW_WRITE_UART             WriteUart;
46625aee3deSMauro Carvalho Chehab 	} cmd;
46725aee3deSMauro Carvalho Chehab } __attribute__ ((__packed__));
46825aee3deSMauro Carvalho Chehab 
46925aee3deSMauro Carvalho Chehab #define NGENE_INTERFACE_VERSION 0x103
47025aee3deSMauro Carvalho Chehab #define MAX_VIDEO_BUFFER_SIZE   (417792) /* 288*1440 rounded up to next page */
47125aee3deSMauro Carvalho Chehab #define MAX_AUDIO_BUFFER_SIZE     (8192) /* Gives room for about 23msec@48KHz */
47225aee3deSMauro Carvalho Chehab #define MAX_VBI_BUFFER_SIZE      (28672) /* 1144*18 rounded up to next page */
47325aee3deSMauro Carvalho Chehab #define MAX_TS_BUFFER_SIZE       (98304) /* 512*188 rounded up to next page */
47425aee3deSMauro Carvalho Chehab #define MAX_HDTV_BUFFER_SIZE   (2080768) /* 541*1920*2 rounded up to next page
47525aee3deSMauro Carvalho Chehab 					    Max: (1920x1080i60) */
47625aee3deSMauro Carvalho Chehab 
47725aee3deSMauro Carvalho Chehab #define OVERFLOW_BUFFER_SIZE    (8192)
47825aee3deSMauro Carvalho Chehab 
47925aee3deSMauro Carvalho Chehab #define RING_SIZE_VIDEO     4
48025aee3deSMauro Carvalho Chehab #define RING_SIZE_AUDIO     8
48125aee3deSMauro Carvalho Chehab #define RING_SIZE_TS        8
48225aee3deSMauro Carvalho Chehab 
48325aee3deSMauro Carvalho Chehab #define NUM_SCATTER_GATHER_ENTRIES  8
48425aee3deSMauro Carvalho Chehab 
48525aee3deSMauro Carvalho Chehab #define MAX_DMA_LENGTH (((MAX_VIDEO_BUFFER_SIZE + MAX_VBI_BUFFER_SIZE) * \
48625aee3deSMauro Carvalho Chehab 			RING_SIZE_VIDEO * 2) + \
48725aee3deSMauro Carvalho Chehab 			(MAX_AUDIO_BUFFER_SIZE * RING_SIZE_AUDIO * 2) + \
48825aee3deSMauro Carvalho Chehab 			(MAX_TS_BUFFER_SIZE * RING_SIZE_TS * 4) + \
48925aee3deSMauro Carvalho Chehab 			(RING_SIZE_VIDEO * PAGE_SIZE * 2) + \
49025aee3deSMauro Carvalho Chehab 			(RING_SIZE_AUDIO * PAGE_SIZE * 2) + \
49125aee3deSMauro Carvalho Chehab 			(RING_SIZE_TS    * PAGE_SIZE * 4) + \
49225aee3deSMauro Carvalho Chehab 			 8 * PAGE_SIZE + OVERFLOW_BUFFER_SIZE + PAGE_SIZE)
49325aee3deSMauro Carvalho Chehab 
49425aee3deSMauro Carvalho Chehab #define EVENT_QUEUE_SIZE    16
49525aee3deSMauro Carvalho Chehab 
49625aee3deSMauro Carvalho Chehab /* Gathers the current state of a single channel. */
49725aee3deSMauro Carvalho Chehab 
49825aee3deSMauro Carvalho Chehab struct SBufferHeader {
49925aee3deSMauro Carvalho Chehab 	struct BUFFER_HEADER   ngeneBuffer; /* Physical descriptor */
50025aee3deSMauro Carvalho Chehab 	struct SBufferHeader  *Next;
50125aee3deSMauro Carvalho Chehab 	void                  *Buffer1;
50225aee3deSMauro Carvalho Chehab 	struct HW_SCATTER_GATHER_ELEMENT *scList1;
50325aee3deSMauro Carvalho Chehab 	void                  *Buffer2;
50425aee3deSMauro Carvalho Chehab 	struct HW_SCATTER_GATHER_ELEMENT *scList2;
50525aee3deSMauro Carvalho Chehab };
50625aee3deSMauro Carvalho Chehab 
50725aee3deSMauro Carvalho Chehab /* Sizeof SBufferHeader aligned to next 64 Bit boundary (hw restriction) */
50825aee3deSMauro Carvalho Chehab #define SIZEOF_SBufferHeader ((sizeof(struct SBufferHeader) + 63) & ~63)
50925aee3deSMauro Carvalho Chehab 
51025aee3deSMauro Carvalho Chehab enum HWSTATE {
51125aee3deSMauro Carvalho Chehab 	HWSTATE_STOP,
51225aee3deSMauro Carvalho Chehab 	HWSTATE_STARTUP,
51325aee3deSMauro Carvalho Chehab 	HWSTATE_RUN,
51425aee3deSMauro Carvalho Chehab 	HWSTATE_PAUSE,
51525aee3deSMauro Carvalho Chehab };
51625aee3deSMauro Carvalho Chehab 
51725aee3deSMauro Carvalho Chehab enum KSSTATE {
51825aee3deSMauro Carvalho Chehab 	KSSTATE_STOP,
51925aee3deSMauro Carvalho Chehab 	KSSTATE_ACQUIRE,
52025aee3deSMauro Carvalho Chehab 	KSSTATE_PAUSE,
52125aee3deSMauro Carvalho Chehab 	KSSTATE_RUN,
52225aee3deSMauro Carvalho Chehab };
52325aee3deSMauro Carvalho Chehab 
52425aee3deSMauro Carvalho Chehab struct SRingBufferDescriptor {
52525aee3deSMauro Carvalho Chehab 	struct SBufferHeader *Head; /* Points to first buffer in ring buffer
52625aee3deSMauro Carvalho Chehab 				       structure*/
52725aee3deSMauro Carvalho Chehab 	u64   PAHead;         /* Physical address of first buffer */
52825aee3deSMauro Carvalho Chehab 	u32   MemSize;        /* Memory size of allocated ring buffers
52925aee3deSMauro Carvalho Chehab 				 (needed for freeing) */
53025aee3deSMauro Carvalho Chehab 	u32   NumBuffers;     /* Number of buffers in the ring */
53125aee3deSMauro Carvalho Chehab 	u32   Buffer1Length;  /* Allocated length of Buffer 1 */
53225aee3deSMauro Carvalho Chehab 	u32   Buffer2Length;  /* Allocated length of Buffer 2 */
53325aee3deSMauro Carvalho Chehab 	void *SCListMem;      /* Memory to hold scatter gather lists for this
53425aee3deSMauro Carvalho Chehab 				 ring */
53525aee3deSMauro Carvalho Chehab 	u64   PASCListMem;    /* Physical address  .. */
53625aee3deSMauro Carvalho Chehab 	u32   SCListMemSize;  /* Size of this memory */
53725aee3deSMauro Carvalho Chehab };
53825aee3deSMauro Carvalho Chehab 
53925aee3deSMauro Carvalho Chehab enum STREAMMODEFLAGS {
54025aee3deSMauro Carvalho Chehab 	StreamMode_NONE   = 0, /* Stream not used */
54125aee3deSMauro Carvalho Chehab 	StreamMode_ANALOG = 1, /* Analog: Stream 0,1 = Video, 2,3 = Audio */
54225aee3deSMauro Carvalho Chehab 	StreamMode_TSIN   = 2, /* Transport stream input (all) */
54325aee3deSMauro Carvalho Chehab 	StreamMode_HDTV   = 4, /* HDTV: Maximum 1920x1080p30,1920x1080i60
54425aee3deSMauro Carvalho Chehab 				  (only stream 0) */
54525aee3deSMauro Carvalho Chehab 	StreamMode_TSOUT  = 8, /* Transport stream output (only stream 3) */
54625aee3deSMauro Carvalho Chehab };
54725aee3deSMauro Carvalho Chehab 
54825aee3deSMauro Carvalho Chehab 
54925aee3deSMauro Carvalho Chehab enum BufferExchangeFlags {
55025aee3deSMauro Carvalho Chehab 	BEF_EVEN_FIELD   = 0x00000001,
55125aee3deSMauro Carvalho Chehab 	BEF_CONTINUATION = 0x00000002,
55225aee3deSMauro Carvalho Chehab 	BEF_MORE_DATA    = 0x00000004,
55325aee3deSMauro Carvalho Chehab 	BEF_OVERFLOW     = 0x00000008,
55425aee3deSMauro Carvalho Chehab 	DF_SWAP32        = 0x00010000,
55525aee3deSMauro Carvalho Chehab };
55625aee3deSMauro Carvalho Chehab 
55725aee3deSMauro Carvalho Chehab typedef void *(IBufferExchange)(void *, void *, u32, u32, u32);
55825aee3deSMauro Carvalho Chehab 
55925aee3deSMauro Carvalho Chehab struct MICI_STREAMINFO {
56025aee3deSMauro Carvalho Chehab 	IBufferExchange    *pExchange;
56125aee3deSMauro Carvalho Chehab 	IBufferExchange    *pExchangeVBI;     /* Secondary (VBI, ancillary) */
56225aee3deSMauro Carvalho Chehab 	u8  Stream;
56325aee3deSMauro Carvalho Chehab 	u8  Flags;
56425aee3deSMauro Carvalho Chehab 	u8  Mode;
56525aee3deSMauro Carvalho Chehab 	u8  Reserved;
56625aee3deSMauro Carvalho Chehab 	u16 nLinesVideo;
56725aee3deSMauro Carvalho Chehab 	u16 nBytesPerLineVideo;
56825aee3deSMauro Carvalho Chehab 	u16 nLinesVBI;
56925aee3deSMauro Carvalho Chehab 	u16 nBytesPerLineVBI;
57025aee3deSMauro Carvalho Chehab 	u32 CaptureLength;    /* Used for audio and transport stream */
57125aee3deSMauro Carvalho Chehab };
57225aee3deSMauro Carvalho Chehab 
57325aee3deSMauro Carvalho Chehab /****************************************************************************/
57425aee3deSMauro Carvalho Chehab /* STRUCTS ******************************************************************/
57525aee3deSMauro Carvalho Chehab /****************************************************************************/
57625aee3deSMauro Carvalho Chehab 
57725aee3deSMauro Carvalho Chehab /* sound hardware definition */
57825aee3deSMauro Carvalho Chehab #define MIXER_ADDR_TVTUNER      0
57925aee3deSMauro Carvalho Chehab #define MIXER_ADDR_LAST         0
58025aee3deSMauro Carvalho Chehab 
58125aee3deSMauro Carvalho Chehab struct ngene_channel;
58225aee3deSMauro Carvalho Chehab 
58325aee3deSMauro Carvalho Chehab /*struct sound chip*/
58425aee3deSMauro Carvalho Chehab 
58525aee3deSMauro Carvalho Chehab struct mychip {
58625aee3deSMauro Carvalho Chehab 	struct ngene_channel *chan;
58725aee3deSMauro Carvalho Chehab 	struct snd_card *card;
58825aee3deSMauro Carvalho Chehab 	struct pci_dev *pci;
58925aee3deSMauro Carvalho Chehab 	struct snd_pcm_substream *substream;
59025aee3deSMauro Carvalho Chehab 	struct snd_pcm *pcm;
59125aee3deSMauro Carvalho Chehab 	unsigned long port;
59225aee3deSMauro Carvalho Chehab 	int irq;
59325aee3deSMauro Carvalho Chehab 	spinlock_t mixer_lock;
59425aee3deSMauro Carvalho Chehab 	spinlock_t lock;
59525aee3deSMauro Carvalho Chehab 	int mixer_volume[MIXER_ADDR_LAST + 1][2];
59625aee3deSMauro Carvalho Chehab 	int capture_source[MIXER_ADDR_LAST + 1][2];
59725aee3deSMauro Carvalho Chehab };
59825aee3deSMauro Carvalho Chehab 
59925aee3deSMauro Carvalho Chehab struct ngene_channel {
60025aee3deSMauro Carvalho Chehab 	struct device         device;
60125aee3deSMauro Carvalho Chehab 	struct i2c_adapter    i2c_adapter;
602d19e3a72SDaniel Scheller 	struct i2c_client    *i2c_client[1];
6031c2ad82eSDaniel Scheller 	int                   i2c_client_fe;
60425aee3deSMauro Carvalho Chehab 
60525aee3deSMauro Carvalho Chehab 	struct ngene         *dev;
60625aee3deSMauro Carvalho Chehab 	int                   number;
60725aee3deSMauro Carvalho Chehab 	int                   type;
60825aee3deSMauro Carvalho Chehab 	int                   mode;
60925aee3deSMauro Carvalho Chehab 	bool                  has_adapter;
61025aee3deSMauro Carvalho Chehab 	bool                  has_demux;
61125aee3deSMauro Carvalho Chehab 	int                   demod_type;
61225aee3deSMauro Carvalho Chehab 	int (*gate_ctrl)(struct dvb_frontend *, int);
61325aee3deSMauro Carvalho Chehab 
61425aee3deSMauro Carvalho Chehab 	struct dvb_frontend  *fe;
61525aee3deSMauro Carvalho Chehab 	struct dvb_frontend  *fe2;
61625aee3deSMauro Carvalho Chehab 	struct dmxdev         dmxdev;
61725aee3deSMauro Carvalho Chehab 	struct dvb_demux      demux;
61825aee3deSMauro Carvalho Chehab 	struct dvb_net        dvbnet;
61925aee3deSMauro Carvalho Chehab 	struct dmx_frontend   hw_frontend;
62025aee3deSMauro Carvalho Chehab 	struct dmx_frontend   mem_frontend;
62125aee3deSMauro Carvalho Chehab 	int                   users;
62225aee3deSMauro Carvalho Chehab 	struct video_device  *v4l_dev;
62325aee3deSMauro Carvalho Chehab 	struct dvb_device    *ci_dev;
62425aee3deSMauro Carvalho Chehab 	struct tasklet_struct demux_tasklet;
62525aee3deSMauro Carvalho Chehab 
62625aee3deSMauro Carvalho Chehab 	struct SBufferHeader *nextBuffer;
62725aee3deSMauro Carvalho Chehab 	enum KSSTATE          State;
62825aee3deSMauro Carvalho Chehab 	enum HWSTATE          HWState;
62925aee3deSMauro Carvalho Chehab 	u8                    Stream;
63025aee3deSMauro Carvalho Chehab 	u8                    Flags;
63125aee3deSMauro Carvalho Chehab 	u8                    Mode;
63225aee3deSMauro Carvalho Chehab 	IBufferExchange      *pBufferExchange;
63325aee3deSMauro Carvalho Chehab 	IBufferExchange      *pBufferExchange2;
63425aee3deSMauro Carvalho Chehab 
63525aee3deSMauro Carvalho Chehab 	spinlock_t            state_lock;
63625aee3deSMauro Carvalho Chehab 	u16                   nLines;
63725aee3deSMauro Carvalho Chehab 	u16                   nBytesPerLine;
63825aee3deSMauro Carvalho Chehab 	u16                   nVBILines;
63925aee3deSMauro Carvalho Chehab 	u16                   nBytesPerVBILine;
64025aee3deSMauro Carvalho Chehab 	u16                   itumode;
64125aee3deSMauro Carvalho Chehab 	u32                   Capture1Length;
64225aee3deSMauro Carvalho Chehab 	u32                   Capture2Length;
64325aee3deSMauro Carvalho Chehab 	struct SRingBufferDescriptor RingBuffer;
64425aee3deSMauro Carvalho Chehab 	struct SRingBufferDescriptor TSRingBuffer;
64525aee3deSMauro Carvalho Chehab 	struct SRingBufferDescriptor TSIdleBuffer;
64625aee3deSMauro Carvalho Chehab 
64725aee3deSMauro Carvalho Chehab 	u32                   DataFormatFlags;
64825aee3deSMauro Carvalho Chehab 
64925aee3deSMauro Carvalho Chehab 	int                   AudioDTOUpdated;
65025aee3deSMauro Carvalho Chehab 	u32                   AudioDTOValue;
65125aee3deSMauro Carvalho Chehab 
6520df289a2SMauro Carvalho Chehab 	int (*set_tone)(struct dvb_frontend *, enum fe_sec_tone_mode);
65325aee3deSMauro Carvalho Chehab 	u8 lnbh;
65425aee3deSMauro Carvalho Chehab 
65525aee3deSMauro Carvalho Chehab 	/* stuff from analog driver */
65625aee3deSMauro Carvalho Chehab 
65725aee3deSMauro Carvalho Chehab 	int minor;
65825aee3deSMauro Carvalho Chehab 	struct mychip        *mychip;
65925aee3deSMauro Carvalho Chehab 	struct snd_card      *soundcard;
66025aee3deSMauro Carvalho Chehab 	u8                   *evenbuffer;
66125aee3deSMauro Carvalho Chehab 	u8                    dma_on;
66225aee3deSMauro Carvalho Chehab 	int                   soundstreamon;
66325aee3deSMauro Carvalho Chehab 	int                   audiomute;
66425aee3deSMauro Carvalho Chehab 	int                   soundbuffisallocated;
66525aee3deSMauro Carvalho Chehab 	int                   sndbuffflag;
66625aee3deSMauro Carvalho Chehab 	int                   tun_rdy;
66725aee3deSMauro Carvalho Chehab 	int                   dec_rdy;
66825aee3deSMauro Carvalho Chehab 	int                   tun_dec_rdy;
66925aee3deSMauro Carvalho Chehab 	int                   lastbufferflag;
67025aee3deSMauro Carvalho Chehab 
67125aee3deSMauro Carvalho Chehab 	struct ngene_tvnorm  *tvnorms;
67225aee3deSMauro Carvalho Chehab 	int                   tvnorm_num;
67325aee3deSMauro Carvalho Chehab 	int                   tvnorm;
67425aee3deSMauro Carvalho Chehab 
67525aee3deSMauro Carvalho Chehab 	int running;
67660d0bbecSDaniel Scheller 
67760d0bbecSDaniel Scheller 	int tsin_offset;
67860d0bbecSDaniel Scheller 	u8  tsin_buffer[188];
67925aee3deSMauro Carvalho Chehab };
68025aee3deSMauro Carvalho Chehab 
68125aee3deSMauro Carvalho Chehab 
68225aee3deSMauro Carvalho Chehab struct ngene_ci {
68325aee3deSMauro Carvalho Chehab 	struct device         device;
68425aee3deSMauro Carvalho Chehab 	struct i2c_adapter    i2c_adapter;
68525aee3deSMauro Carvalho Chehab 
68625aee3deSMauro Carvalho Chehab 	struct ngene         *dev;
68725aee3deSMauro Carvalho Chehab 	struct dvb_ca_en50221 *en;
68825aee3deSMauro Carvalho Chehab };
68925aee3deSMauro Carvalho Chehab 
69025aee3deSMauro Carvalho Chehab struct ngene;
69125aee3deSMauro Carvalho Chehab 
69225aee3deSMauro Carvalho Chehab typedef void (rx_cb_t)(struct ngene *, u32, u8);
69325aee3deSMauro Carvalho Chehab typedef void (tx_cb_t)(struct ngene *, u32);
69425aee3deSMauro Carvalho Chehab 
69525aee3deSMauro Carvalho Chehab struct ngene {
69625aee3deSMauro Carvalho Chehab 	int                   nr;
69725aee3deSMauro Carvalho Chehab 	struct pci_dev       *pci_dev;
698c463c979SHans Verkuil 	unsigned char __iomem *iomem;
69925aee3deSMauro Carvalho Chehab 
70025aee3deSMauro Carvalho Chehab 	/*struct i2c_adapter  i2c_adapter;*/
70125aee3deSMauro Carvalho Chehab 
70225aee3deSMauro Carvalho Chehab 	u32                   device_version;
70325aee3deSMauro Carvalho Chehab 	u32                   fw_interface_version;
70425aee3deSMauro Carvalho Chehab 	u32                   icounts;
70525aee3deSMauro Carvalho Chehab 	bool                  msi_enabled;
70625aee3deSMauro Carvalho Chehab 	bool                  cmd_timeout_workaround;
70725aee3deSMauro Carvalho Chehab 
70825aee3deSMauro Carvalho Chehab 	u8                   *CmdDoneByte;
70925aee3deSMauro Carvalho Chehab 	int                   BootFirmware;
71025aee3deSMauro Carvalho Chehab 	void                 *OverflowBuffer;
71125aee3deSMauro Carvalho Chehab 	dma_addr_t            PAOverflowBuffer;
71225aee3deSMauro Carvalho Chehab 	void                 *FWInterfaceBuffer;
71325aee3deSMauro Carvalho Chehab 	dma_addr_t            PAFWInterfaceBuffer;
71425aee3deSMauro Carvalho Chehab 	u8                   *ngenetohost;
71525aee3deSMauro Carvalho Chehab 	u8                   *hosttongene;
71625aee3deSMauro Carvalho Chehab 
71725aee3deSMauro Carvalho Chehab 	struct EVENT_BUFFER   EventQueue[EVENT_QUEUE_SIZE];
71825aee3deSMauro Carvalho Chehab 	int                   EventQueueOverflowCount;
71925aee3deSMauro Carvalho Chehab 	int                   EventQueueOverflowFlag;
72025aee3deSMauro Carvalho Chehab 	struct tasklet_struct event_tasklet;
72125aee3deSMauro Carvalho Chehab 	struct EVENT_BUFFER  *EventBuffer;
72225aee3deSMauro Carvalho Chehab 	int                   EventQueueWriteIndex;
72325aee3deSMauro Carvalho Chehab 	int                   EventQueueReadIndex;
72425aee3deSMauro Carvalho Chehab 
72525aee3deSMauro Carvalho Chehab 	wait_queue_head_t     cmd_wq;
72625aee3deSMauro Carvalho Chehab 	int                   cmd_done;
7271439cdb0SBinoy Jayan 	struct mutex          cmd_mutex;
72890979f04SBinoy Jayan 	struct mutex          stream_mutex;
72925aee3deSMauro Carvalho Chehab 	struct semaphore      pll_mutex;
730bd7a85d3SBinoy Jayan 	struct mutex          i2c_switch_mutex;
73125aee3deSMauro Carvalho Chehab 	int                   i2c_current_channel;
73225aee3deSMauro Carvalho Chehab 	int                   i2c_current_bus;
73325aee3deSMauro Carvalho Chehab 	spinlock_t            cmd_lock;
73425aee3deSMauro Carvalho Chehab 
73525aee3deSMauro Carvalho Chehab 	struct dvb_adapter    adapter[MAX_STREAM];
73625aee3deSMauro Carvalho Chehab 	struct dvb_adapter    *first_adapter; /* "one_adapter" modprobe opt */
73725aee3deSMauro Carvalho Chehab 	struct ngene_channel  channel[MAX_STREAM];
73825aee3deSMauro Carvalho Chehab 
73925aee3deSMauro Carvalho Chehab 	struct ngene_info    *card_info;
74025aee3deSMauro Carvalho Chehab 
74125aee3deSMauro Carvalho Chehab 	tx_cb_t              *TxEventNotify;
74225aee3deSMauro Carvalho Chehab 	rx_cb_t              *RxEventNotify;
74325aee3deSMauro Carvalho Chehab 	int                   tx_busy;
74425aee3deSMauro Carvalho Chehab 	wait_queue_head_t     tx_wq;
74525aee3deSMauro Carvalho Chehab 	wait_queue_head_t     rx_wq;
74625aee3deSMauro Carvalho Chehab #define UART_RBUF_LEN 4096
74725aee3deSMauro Carvalho Chehab 	u8                    uart_rbuf[UART_RBUF_LEN];
74825aee3deSMauro Carvalho Chehab 	int                   uart_rp, uart_wp;
74925aee3deSMauro Carvalho Chehab 
75025aee3deSMauro Carvalho Chehab #define TS_FILLER  0x6f
75125aee3deSMauro Carvalho Chehab 
75225aee3deSMauro Carvalho Chehab 	u8                   *tsout_buf;
75325aee3deSMauro Carvalho Chehab #define TSOUT_BUF_SIZE (512*188*8)
75425aee3deSMauro Carvalho Chehab 	struct dvb_ringbuffer tsout_rbuf;
75525aee3deSMauro Carvalho Chehab 
75625aee3deSMauro Carvalho Chehab 	u8                   *tsin_buf;
75725aee3deSMauro Carvalho Chehab #define TSIN_BUF_SIZE (512*188*8)
75825aee3deSMauro Carvalho Chehab 	struct dvb_ringbuffer tsin_rbuf;
75925aee3deSMauro Carvalho Chehab 
76025aee3deSMauro Carvalho Chehab 	u8                   *ain_buf;
76125aee3deSMauro Carvalho Chehab #define AIN_BUF_SIZE (128*1024)
76225aee3deSMauro Carvalho Chehab 	struct dvb_ringbuffer ain_rbuf;
76325aee3deSMauro Carvalho Chehab 
76425aee3deSMauro Carvalho Chehab 
76525aee3deSMauro Carvalho Chehab 	u8                   *vin_buf;
76625aee3deSMauro Carvalho Chehab #define VIN_BUF_SIZE (4*1920*1080)
76725aee3deSMauro Carvalho Chehab 	struct dvb_ringbuffer vin_rbuf;
76825aee3deSMauro Carvalho Chehab 
76925aee3deSMauro Carvalho Chehab 	unsigned long         exp_val;
77025aee3deSMauro Carvalho Chehab 	int prev_cmd;
77125aee3deSMauro Carvalho Chehab 
77225aee3deSMauro Carvalho Chehab 	struct ngene_ci       ci;
77325aee3deSMauro Carvalho Chehab };
77425aee3deSMauro Carvalho Chehab 
77525aee3deSMauro Carvalho Chehab struct ngene_info {
77625aee3deSMauro Carvalho Chehab 	int   type;
77725aee3deSMauro Carvalho Chehab #define NGENE_APP        0
77825aee3deSMauro Carvalho Chehab #define NGENE_TERRATEC   1
77925aee3deSMauro Carvalho Chehab #define NGENE_SIDEWINDER 2
78025aee3deSMauro Carvalho Chehab #define NGENE_RACER      3
78125aee3deSMauro Carvalho Chehab #define NGENE_VIPER      4
78225aee3deSMauro Carvalho Chehab #define NGENE_PYTHON     5
78325aee3deSMauro Carvalho Chehab #define NGENE_VBOX_V1	 6
78425aee3deSMauro Carvalho Chehab #define NGENE_VBOX_V2	 7
78525aee3deSMauro Carvalho Chehab 
78625aee3deSMauro Carvalho Chehab 	int   fw_version;
78725aee3deSMauro Carvalho Chehab 	bool  msi_supported;
78825aee3deSMauro Carvalho Chehab 	char *name;
78925aee3deSMauro Carvalho Chehab 
79025aee3deSMauro Carvalho Chehab 	int   io_type[MAX_STREAM];
79125aee3deSMauro Carvalho Chehab #define NGENE_IO_NONE    0
79225aee3deSMauro Carvalho Chehab #define NGENE_IO_TV      1
79325aee3deSMauro Carvalho Chehab #define NGENE_IO_HDTV    2
79425aee3deSMauro Carvalho Chehab #define NGENE_IO_TSIN    4
79525aee3deSMauro Carvalho Chehab #define NGENE_IO_TSOUT   8
79625aee3deSMauro Carvalho Chehab #define NGENE_IO_AIN     16
79725aee3deSMauro Carvalho Chehab 
79825aee3deSMauro Carvalho Chehab 	void *fe_config[4];
79925aee3deSMauro Carvalho Chehab 	void *tuner_config[4];
80025aee3deSMauro Carvalho Chehab 
80125aee3deSMauro Carvalho Chehab 	int (*demod_attach[4])(struct ngene_channel *);
80225aee3deSMauro Carvalho Chehab 	int (*tuner_attach[4])(struct ngene_channel *);
80325aee3deSMauro Carvalho Chehab 
80425aee3deSMauro Carvalho Chehab 	u8    avf[4];
80525aee3deSMauro Carvalho Chehab 	u8    msp[4];
80625aee3deSMauro Carvalho Chehab 	u8    demoda[4];
80725aee3deSMauro Carvalho Chehab 	u8    lnb[4];
80825aee3deSMauro Carvalho Chehab 	int   i2c_access;
80925aee3deSMauro Carvalho Chehab 	u8    ntsc;
81025aee3deSMauro Carvalho Chehab 	u8    tsf[4];
81125aee3deSMauro Carvalho Chehab 	u8    i2s[4];
81225aee3deSMauro Carvalho Chehab 
81325aee3deSMauro Carvalho Chehab 	int (*gate_ctrl)(struct dvb_frontend *, int);
81425aee3deSMauro Carvalho Chehab 	int (*switch_ctrl)(struct ngene_channel *, int, int);
81525aee3deSMauro Carvalho Chehab };
81625aee3deSMauro Carvalho Chehab 
81725aee3deSMauro Carvalho Chehab 
81825aee3deSMauro Carvalho Chehab /* Provided by ngene-core.c */
8194c62e976SGreg Kroah-Hartman int ngene_probe(struct pci_dev *pci_dev, const struct pci_device_id *id);
8204c62e976SGreg Kroah-Hartman void ngene_remove(struct pci_dev *pdev);
82125aee3deSMauro Carvalho Chehab void ngene_shutdown(struct pci_dev *pdev);
82225aee3deSMauro Carvalho Chehab int ngene_command(struct ngene *dev, struct ngene_command *com);
82325aee3deSMauro Carvalho Chehab int ngene_command_gpio_set(struct ngene *dev, u8 select, u8 level);
82425aee3deSMauro Carvalho Chehab void set_transfer(struct ngene_channel *chan, int state);
82525aee3deSMauro Carvalho Chehab void FillTSBuffer(void *Buffer, int Length, u32 Flags);
82625aee3deSMauro Carvalho Chehab 
827e39b8e94SDaniel Scheller /* Provided by ngene-cards.c */
828e39b8e94SDaniel Scheller int ngene_port_has_cxd2099(struct i2c_adapter *i2c, u8 *type);
829e39b8e94SDaniel Scheller 
83025aee3deSMauro Carvalho Chehab /* Provided by ngene-i2c.c */
83125aee3deSMauro Carvalho Chehab int ngene_i2c_init(struct ngene *dev, int dev_nr);
83225aee3deSMauro Carvalho Chehab 
83325aee3deSMauro Carvalho Chehab /* Provided by ngene-dvb.c */
83425aee3deSMauro Carvalho Chehab extern struct dvb_device ngene_dvbdev_ci;
83525aee3deSMauro Carvalho Chehab void *tsout_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags);
83625aee3deSMauro Carvalho Chehab void *tsin_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags);
83725aee3deSMauro Carvalho Chehab int ngene_start_feed(struct dvb_demux_feed *dvbdmxfeed);
83825aee3deSMauro Carvalho Chehab int ngene_stop_feed(struct dvb_demux_feed *dvbdmxfeed);
83925aee3deSMauro Carvalho Chehab int my_dvb_dmx_ts_card_init(struct dvb_demux *dvbdemux, char *id,
84025aee3deSMauro Carvalho Chehab 			    int (*start_feed)(struct dvb_demux_feed *),
84125aee3deSMauro Carvalho Chehab 			    int (*stop_feed)(struct dvb_demux_feed *),
84225aee3deSMauro Carvalho Chehab 			    void *priv);
84325aee3deSMauro Carvalho Chehab int my_dvb_dmxdev_ts_card_init(struct dmxdev *dmxdev,
84425aee3deSMauro Carvalho Chehab 			       struct dvb_demux *dvbdemux,
84525aee3deSMauro Carvalho Chehab 			       struct dmx_frontend *hw_frontend,
84625aee3deSMauro Carvalho Chehab 			       struct dmx_frontend *mem_frontend,
84725aee3deSMauro Carvalho Chehab 			       struct dvb_adapter *dvb_adapter);
84825aee3deSMauro Carvalho Chehab 
84925aee3deSMauro Carvalho Chehab #endif
85025aee3deSMauro Carvalho Chehab 
85125aee3deSMauro Carvalho Chehab /*  LocalWords:  Endif
85225aee3deSMauro Carvalho Chehab  */
853