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