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