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