1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * SMI PCIe driver for DVBSky cards. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2014 Max nibble <nibble.max@gmail.com> 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef _SMI_PCIE_H_ 9*4882a593Smuzhiyun #define _SMI_PCIE_H_ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/i2c.h> 12*4882a593Smuzhiyun #include <linux/i2c-algo-bit.h> 13*4882a593Smuzhiyun #include <linux/init.h> 14*4882a593Smuzhiyun #include <linux/interrupt.h> 15*4882a593Smuzhiyun #include <linux/kernel.h> 16*4882a593Smuzhiyun #include <linux/module.h> 17*4882a593Smuzhiyun #include <linux/pci.h> 18*4882a593Smuzhiyun #include <linux/dma-mapping.h> 19*4882a593Smuzhiyun #include <linux/slab.h> 20*4882a593Smuzhiyun #include <media/rc-core.h> 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #include <media/demux.h> 23*4882a593Smuzhiyun #include <media/dmxdev.h> 24*4882a593Smuzhiyun #include <media/dvb_demux.h> 25*4882a593Smuzhiyun #include <media/dvb_frontend.h> 26*4882a593Smuzhiyun #include <media/dvb_net.h> 27*4882a593Smuzhiyun #include <media/dvbdev.h> 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /* -------- Register Base -------- */ 30*4882a593Smuzhiyun #define MSI_CONTROL_REG_BASE 0x0800 31*4882a593Smuzhiyun #define SYSTEM_CONTROL_REG_BASE 0x0880 32*4882a593Smuzhiyun #define PCIE_EP_DEBUG_REG_BASE 0x08C0 33*4882a593Smuzhiyun #define IR_CONTROL_REG_BASE 0x0900 34*4882a593Smuzhiyun #define I2C_A_CONTROL_REG_BASE 0x0940 35*4882a593Smuzhiyun #define I2C_B_CONTROL_REG_BASE 0x0980 36*4882a593Smuzhiyun #define ATV_PORTA_CONTROL_REG_BASE 0x09C0 37*4882a593Smuzhiyun #define DTV_PORTA_CONTROL_REG_BASE 0x0A00 38*4882a593Smuzhiyun #define AES_PORTA_CONTROL_REG_BASE 0x0A80 39*4882a593Smuzhiyun #define DMA_PORTA_CONTROL_REG_BASE 0x0AC0 40*4882a593Smuzhiyun #define ATV_PORTB_CONTROL_REG_BASE 0x0B00 41*4882a593Smuzhiyun #define DTV_PORTB_CONTROL_REG_BASE 0x0B40 42*4882a593Smuzhiyun #define AES_PORTB_CONTROL_REG_BASE 0x0BC0 43*4882a593Smuzhiyun #define DMA_PORTB_CONTROL_REG_BASE 0x0C00 44*4882a593Smuzhiyun #define UART_A_REGISTER_BASE 0x0C40 45*4882a593Smuzhiyun #define UART_B_REGISTER_BASE 0x0C80 46*4882a593Smuzhiyun #define GPS_CONTROL_REG_BASE 0x0CC0 47*4882a593Smuzhiyun #define DMA_PORTC_CONTROL_REG_BASE 0x0D00 48*4882a593Smuzhiyun #define DMA_PORTD_CONTROL_REG_BASE 0x0D00 49*4882a593Smuzhiyun #define AES_RANDOM_DATA_BASE 0x0D80 50*4882a593Smuzhiyun #define AES_KEY_IN_BASE 0x0D90 51*4882a593Smuzhiyun #define RANDOM_DATA_LIB_BASE 0x0E00 52*4882a593Smuzhiyun #define IR_DATA_BUFFER_BASE 0x0F00 53*4882a593Smuzhiyun #define PORTA_TS_BUFFER_BASE 0x1000 54*4882a593Smuzhiyun #define PORTA_I2S_BUFFER_BASE 0x1400 55*4882a593Smuzhiyun #define PORTB_TS_BUFFER_BASE 0x1800 56*4882a593Smuzhiyun #define PORTB_I2S_BUFFER_BASE 0x1C00 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* -------- MSI control and state register -------- */ 59*4882a593Smuzhiyun #define MSI_DELAY_TIMER (MSI_CONTROL_REG_BASE + 0x00) 60*4882a593Smuzhiyun #define MSI_INT_STATUS (MSI_CONTROL_REG_BASE + 0x08) 61*4882a593Smuzhiyun #define MSI_INT_STATUS_CLR (MSI_CONTROL_REG_BASE + 0x0C) 62*4882a593Smuzhiyun #define MSI_INT_STATUS_SET (MSI_CONTROL_REG_BASE + 0x10) 63*4882a593Smuzhiyun #define MSI_INT_ENA (MSI_CONTROL_REG_BASE + 0x14) 64*4882a593Smuzhiyun #define MSI_INT_ENA_CLR (MSI_CONTROL_REG_BASE + 0x18) 65*4882a593Smuzhiyun #define MSI_INT_ENA_SET (MSI_CONTROL_REG_BASE + 0x1C) 66*4882a593Smuzhiyun #define MSI_SOFT_RESET (MSI_CONTROL_REG_BASE + 0x20) 67*4882a593Smuzhiyun #define MSI_CFG_SRC0 (MSI_CONTROL_REG_BASE + 0x24) 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun /* -------- Hybird Controller System Control register -------- */ 70*4882a593Smuzhiyun #define MUX_MODE_CTRL (SYSTEM_CONTROL_REG_BASE + 0x00) 71*4882a593Smuzhiyun #define rbPaMSMask 0x07 72*4882a593Smuzhiyun #define rbPaMSDtvNoGpio 0x00 /*[2:0], DTV Simple mode */ 73*4882a593Smuzhiyun #define rbPaMSDtv4bitGpio 0x01 /*[2:0], DTV TS2 Serial mode)*/ 74*4882a593Smuzhiyun #define rbPaMSDtv7bitGpio 0x02 /*[2:0], DTV TS0 Serial mode*/ 75*4882a593Smuzhiyun #define rbPaMS8bitGpio 0x03 /*[2:0], GPIO mode selected;(8bit GPIO)*/ 76*4882a593Smuzhiyun #define rbPaMSAtv 0x04 /*[2:0], 3'b1xx: ATV mode select*/ 77*4882a593Smuzhiyun #define rbPbMSMask 0x38 78*4882a593Smuzhiyun #define rbPbMSDtvNoGpio 0x00 /*[5:3], DTV Simple mode */ 79*4882a593Smuzhiyun #define rbPbMSDtv4bitGpio 0x08 /*[5:3], DTV TS2 Serial mode*/ 80*4882a593Smuzhiyun #define rbPbMSDtv7bitGpio 0x10 /*[5:3], DTV TS0 Serial mode*/ 81*4882a593Smuzhiyun #define rbPbMS8bitGpio 0x18 /*[5:3], GPIO mode selected;(8bit GPIO)*/ 82*4882a593Smuzhiyun #define rbPbMSAtv 0x20 /*[5:3], 3'b1xx: ATV mode select*/ 83*4882a593Smuzhiyun #define rbPaAESEN 0x40 /*[6], port A AES enable bit*/ 84*4882a593Smuzhiyun #define rbPbAESEN 0x80 /*[7], port B AES enable bit*/ 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun #define INTERNAL_RST (SYSTEM_CONTROL_REG_BASE + 0x04) 87*4882a593Smuzhiyun #define PERIPHERAL_CTRL (SYSTEM_CONTROL_REG_BASE + 0x08) 88*4882a593Smuzhiyun #define GPIO_0to7_CTRL (SYSTEM_CONTROL_REG_BASE + 0x0C) 89*4882a593Smuzhiyun #define GPIO_8to15_CTRL (SYSTEM_CONTROL_REG_BASE + 0x10) 90*4882a593Smuzhiyun #define GPIO_16to24_CTRL (SYSTEM_CONTROL_REG_BASE + 0x14) 91*4882a593Smuzhiyun #define GPIO_INT_SRC_CFG (SYSTEM_CONTROL_REG_BASE + 0x18) 92*4882a593Smuzhiyun #define SYS_BUF_STATUS (SYSTEM_CONTROL_REG_BASE + 0x1C) 93*4882a593Smuzhiyun #define PCIE_IP_REG_ACS (SYSTEM_CONTROL_REG_BASE + 0x20) 94*4882a593Smuzhiyun #define PCIE_IP_REG_ACS_ADDR (SYSTEM_CONTROL_REG_BASE + 0x24) 95*4882a593Smuzhiyun #define PCIE_IP_REG_ACS_DATA (SYSTEM_CONTROL_REG_BASE + 0x28) 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /* -------- IR Control register -------- */ 98*4882a593Smuzhiyun #define IR_Init_Reg (IR_CONTROL_REG_BASE + 0x00) 99*4882a593Smuzhiyun #define IR_Idle_Cnt_Low (IR_CONTROL_REG_BASE + 0x04) 100*4882a593Smuzhiyun #define IR_Idle_Cnt_High (IR_CONTROL_REG_BASE + 0x05) 101*4882a593Smuzhiyun #define IR_Unit_Cnt_Low (IR_CONTROL_REG_BASE + 0x06) 102*4882a593Smuzhiyun #define IR_Unit_Cnt_High (IR_CONTROL_REG_BASE + 0x07) 103*4882a593Smuzhiyun #define IR_Data_Cnt (IR_CONTROL_REG_BASE + 0x08) 104*4882a593Smuzhiyun #define rbIRen 0x80 105*4882a593Smuzhiyun #define rbIRhighidle 0x10 106*4882a593Smuzhiyun #define rbIRlowidle 0x00 107*4882a593Smuzhiyun #define rbIRVld 0x04 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun /* -------- I2C A control and state register -------- */ 110*4882a593Smuzhiyun #define I2C_A_CTL_STATUS (I2C_A_CONTROL_REG_BASE + 0x00) 111*4882a593Smuzhiyun #define I2C_A_ADDR (I2C_A_CONTROL_REG_BASE + 0x04) 112*4882a593Smuzhiyun #define I2C_A_SW_CTL (I2C_A_CONTROL_REG_BASE + 0x08) 113*4882a593Smuzhiyun #define I2C_A_TIME_OUT_CNT (I2C_A_CONTROL_REG_BASE + 0x0C) 114*4882a593Smuzhiyun #define I2C_A_FIFO_STATUS (I2C_A_CONTROL_REG_BASE + 0x10) 115*4882a593Smuzhiyun #define I2C_A_FS_EN (I2C_A_CONTROL_REG_BASE + 0x14) 116*4882a593Smuzhiyun #define I2C_A_FIFO_DATA (I2C_A_CONTROL_REG_BASE + 0x20) 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun /* -------- I2C B control and state register -------- */ 119*4882a593Smuzhiyun #define I2C_B_CTL_STATUS (I2C_B_CONTROL_REG_BASE + 0x00) 120*4882a593Smuzhiyun #define I2C_B_ADDR (I2C_B_CONTROL_REG_BASE + 0x04) 121*4882a593Smuzhiyun #define I2C_B_SW_CTL (I2C_B_CONTROL_REG_BASE + 0x08) 122*4882a593Smuzhiyun #define I2C_B_TIME_OUT_CNT (I2C_B_CONTROL_REG_BASE + 0x0C) 123*4882a593Smuzhiyun #define I2C_B_FIFO_STATUS (I2C_B_CONTROL_REG_BASE + 0x10) 124*4882a593Smuzhiyun #define I2C_B_FS_EN (I2C_B_CONTROL_REG_BASE + 0x14) 125*4882a593Smuzhiyun #define I2C_B_FIFO_DATA (I2C_B_CONTROL_REG_BASE + 0x20) 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun #define VIDEO_CTRL_STATUS_A (ATV_PORTA_CONTROL_REG_BASE + 0x04) 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun /* -------- Digital TV control register, Port A -------- */ 130*4882a593Smuzhiyun #define MPEG2_CTRL_A (DTV_PORTA_CONTROL_REG_BASE + 0x00) 131*4882a593Smuzhiyun #define SERIAL_IN_ADDR_A (DTV_PORTA_CONTROL_REG_BASE + 0x4C) 132*4882a593Smuzhiyun #define VLD_CNT_ADDR_A (DTV_PORTA_CONTROL_REG_BASE + 0x60) 133*4882a593Smuzhiyun #define ERR_CNT_ADDR_A (DTV_PORTA_CONTROL_REG_BASE + 0x64) 134*4882a593Smuzhiyun #define BRD_CNT_ADDR_A (DTV_PORTA_CONTROL_REG_BASE + 0x68) 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun /* -------- DMA Control Register, Port A -------- */ 137*4882a593Smuzhiyun #define DMA_PORTA_CHAN0_ADDR_LOW (DMA_PORTA_CONTROL_REG_BASE + 0x00) 138*4882a593Smuzhiyun #define DMA_PORTA_CHAN0_ADDR_HI (DMA_PORTA_CONTROL_REG_BASE + 0x04) 139*4882a593Smuzhiyun #define DMA_PORTA_CHAN0_TRANS_STATE (DMA_PORTA_CONTROL_REG_BASE + 0x08) 140*4882a593Smuzhiyun #define DMA_PORTA_CHAN0_CONTROL (DMA_PORTA_CONTROL_REG_BASE + 0x0C) 141*4882a593Smuzhiyun #define DMA_PORTA_CHAN1_ADDR_LOW (DMA_PORTA_CONTROL_REG_BASE + 0x10) 142*4882a593Smuzhiyun #define DMA_PORTA_CHAN1_ADDR_HI (DMA_PORTA_CONTROL_REG_BASE + 0x14) 143*4882a593Smuzhiyun #define DMA_PORTA_CHAN1_TRANS_STATE (DMA_PORTA_CONTROL_REG_BASE + 0x18) 144*4882a593Smuzhiyun #define DMA_PORTA_CHAN1_CONTROL (DMA_PORTA_CONTROL_REG_BASE + 0x1C) 145*4882a593Smuzhiyun #define DMA_PORTA_MANAGEMENT (DMA_PORTA_CONTROL_REG_BASE + 0x20) 146*4882a593Smuzhiyun #define VIDEO_CTRL_STATUS_B (ATV_PORTB_CONTROL_REG_BASE + 0x04) 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun /* -------- Digital TV control register, Port B -------- */ 149*4882a593Smuzhiyun #define MPEG2_CTRL_B (DTV_PORTB_CONTROL_REG_BASE + 0x00) 150*4882a593Smuzhiyun #define SERIAL_IN_ADDR_B (DTV_PORTB_CONTROL_REG_BASE + 0x4C) 151*4882a593Smuzhiyun #define VLD_CNT_ADDR_B (DTV_PORTB_CONTROL_REG_BASE + 0x60) 152*4882a593Smuzhiyun #define ERR_CNT_ADDR_B (DTV_PORTB_CONTROL_REG_BASE + 0x64) 153*4882a593Smuzhiyun #define BRD_CNT_ADDR_B (DTV_PORTB_CONTROL_REG_BASE + 0x68) 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun /* -------- AES control register, Port B -------- */ 156*4882a593Smuzhiyun #define AES_CTRL_B (AES_PORTB_CONTROL_REG_BASE + 0x00) 157*4882a593Smuzhiyun #define AES_KEY_BASE_B (AES_PORTB_CONTROL_REG_BASE + 0x04) 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun /* -------- DMA Control Register, Port B -------- */ 160*4882a593Smuzhiyun #define DMA_PORTB_CHAN0_ADDR_LOW (DMA_PORTB_CONTROL_REG_BASE + 0x00) 161*4882a593Smuzhiyun #define DMA_PORTB_CHAN0_ADDR_HI (DMA_PORTB_CONTROL_REG_BASE + 0x04) 162*4882a593Smuzhiyun #define DMA_PORTB_CHAN0_TRANS_STATE (DMA_PORTB_CONTROL_REG_BASE + 0x08) 163*4882a593Smuzhiyun #define DMA_PORTB_CHAN0_CONTROL (DMA_PORTB_CONTROL_REG_BASE + 0x0C) 164*4882a593Smuzhiyun #define DMA_PORTB_CHAN1_ADDR_LOW (DMA_PORTB_CONTROL_REG_BASE + 0x10) 165*4882a593Smuzhiyun #define DMA_PORTB_CHAN1_ADDR_HI (DMA_PORTB_CONTROL_REG_BASE + 0x14) 166*4882a593Smuzhiyun #define DMA_PORTB_CHAN1_TRANS_STATE (DMA_PORTB_CONTROL_REG_BASE + 0x18) 167*4882a593Smuzhiyun #define DMA_PORTB_CHAN1_CONTROL (DMA_PORTB_CONTROL_REG_BASE + 0x1C) 168*4882a593Smuzhiyun #define DMA_PORTB_MANAGEMENT (DMA_PORTB_CONTROL_REG_BASE + 0x20) 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun #define DMA_TRANS_UNIT_188 (0x00000007) 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun /* -------- Macro define of 24 interrupt resource --------*/ 173*4882a593Smuzhiyun #define DMA_A_CHAN0_DONE_INT (0x00000001) 174*4882a593Smuzhiyun #define DMA_A_CHAN1_DONE_INT (0x00000002) 175*4882a593Smuzhiyun #define DMA_B_CHAN0_DONE_INT (0x00000004) 176*4882a593Smuzhiyun #define DMA_B_CHAN1_DONE_INT (0x00000008) 177*4882a593Smuzhiyun #define DMA_C_CHAN0_DONE_INT (0x00000010) 178*4882a593Smuzhiyun #define DMA_C_CHAN1_DONE_INT (0x00000020) 179*4882a593Smuzhiyun #define DMA_D_CHAN0_DONE_INT (0x00000040) 180*4882a593Smuzhiyun #define DMA_D_CHAN1_DONE_INT (0x00000080) 181*4882a593Smuzhiyun #define DATA_BUF_OVERFLOW_INT (0x00000100) 182*4882a593Smuzhiyun #define UART_0_X_INT (0x00000200) 183*4882a593Smuzhiyun #define UART_1_X_INT (0x00000400) 184*4882a593Smuzhiyun #define IR_X_INT (0x00000800) 185*4882a593Smuzhiyun #define GPIO_0_INT (0x00001000) 186*4882a593Smuzhiyun #define GPIO_1_INT (0x00002000) 187*4882a593Smuzhiyun #define GPIO_2_INT (0x00004000) 188*4882a593Smuzhiyun #define GPIO_3_INT (0x00008000) 189*4882a593Smuzhiyun #define ALL_INT (0x0000FFFF) 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun /* software I2C bit mask */ 192*4882a593Smuzhiyun #define SW_I2C_MSK_MODE 0x01 193*4882a593Smuzhiyun #define SW_I2C_MSK_CLK_OUT 0x02 194*4882a593Smuzhiyun #define SW_I2C_MSK_DAT_OUT 0x04 195*4882a593Smuzhiyun #define SW_I2C_MSK_CLK_EN 0x08 196*4882a593Smuzhiyun #define SW_I2C_MSK_DAT_EN 0x10 197*4882a593Smuzhiyun #define SW_I2C_MSK_DAT_IN 0x40 198*4882a593Smuzhiyun #define SW_I2C_MSK_CLK_IN 0x80 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun #define SMI_VID 0x1ADE 201*4882a593Smuzhiyun #define SMI_PID 0x3038 202*4882a593Smuzhiyun #define SMI_TS_DMA_BUF_SIZE (1024 * 188) 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun struct smi_cfg_info { 205*4882a593Smuzhiyun #define SMI_DVBSKY_S952 0 206*4882a593Smuzhiyun #define SMI_DVBSKY_S950 1 207*4882a593Smuzhiyun #define SMI_DVBSKY_T9580 2 208*4882a593Smuzhiyun #define SMI_DVBSKY_T982 3 209*4882a593Smuzhiyun #define SMI_TECHNOTREND_S2_4200 4 210*4882a593Smuzhiyun int type; 211*4882a593Smuzhiyun char *name; 212*4882a593Smuzhiyun #define SMI_TS_NULL 0 213*4882a593Smuzhiyun #define SMI_TS_DMA_SINGLE 1 214*4882a593Smuzhiyun #define SMI_TS_DMA_BOTH 3 215*4882a593Smuzhiyun /* SMI_TS_NULL: not use; 216*4882a593Smuzhiyun * SMI_TS_DMA_SINGLE: use DMA 0 only; 217*4882a593Smuzhiyun * SMI_TS_DMA_BOTH:use DMA 0 and 1.*/ 218*4882a593Smuzhiyun int ts_0; 219*4882a593Smuzhiyun int ts_1; 220*4882a593Smuzhiyun #define DVBSKY_FE_NULL 0 221*4882a593Smuzhiyun #define DVBSKY_FE_M88RS6000 1 222*4882a593Smuzhiyun #define DVBSKY_FE_M88DS3103 2 223*4882a593Smuzhiyun #define DVBSKY_FE_SIT2 3 224*4882a593Smuzhiyun int fe_0; 225*4882a593Smuzhiyun int fe_1; 226*4882a593Smuzhiyun char *rc_map; 227*4882a593Smuzhiyun }; 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun struct smi_rc { 230*4882a593Smuzhiyun struct smi_dev *dev; 231*4882a593Smuzhiyun struct rc_dev *rc_dev; 232*4882a593Smuzhiyun char input_phys[64]; 233*4882a593Smuzhiyun char device_name[64]; 234*4882a593Smuzhiyun u8 irData[256]; 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun int users; 237*4882a593Smuzhiyun }; 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun struct smi_port { 240*4882a593Smuzhiyun struct smi_dev *dev; 241*4882a593Smuzhiyun int idx; 242*4882a593Smuzhiyun int enable; 243*4882a593Smuzhiyun int fe_type; 244*4882a593Smuzhiyun /* regs */ 245*4882a593Smuzhiyun u32 DMA_CHAN0_ADDR_LOW; 246*4882a593Smuzhiyun u32 DMA_CHAN0_ADDR_HI; 247*4882a593Smuzhiyun u32 DMA_CHAN0_TRANS_STATE; 248*4882a593Smuzhiyun u32 DMA_CHAN0_CONTROL; 249*4882a593Smuzhiyun u32 DMA_CHAN1_ADDR_LOW; 250*4882a593Smuzhiyun u32 DMA_CHAN1_ADDR_HI; 251*4882a593Smuzhiyun u32 DMA_CHAN1_TRANS_STATE; 252*4882a593Smuzhiyun u32 DMA_CHAN1_CONTROL; 253*4882a593Smuzhiyun u32 DMA_MANAGEMENT; 254*4882a593Smuzhiyun /* dma */ 255*4882a593Smuzhiyun dma_addr_t dma_addr[2]; 256*4882a593Smuzhiyun u8 *cpu_addr[2]; 257*4882a593Smuzhiyun u32 _dmaInterruptCH0; 258*4882a593Smuzhiyun u32 _dmaInterruptCH1; 259*4882a593Smuzhiyun u32 _int_status; 260*4882a593Smuzhiyun struct tasklet_struct tasklet; 261*4882a593Smuzhiyun /* dvb */ 262*4882a593Smuzhiyun struct dmx_frontend hw_frontend; 263*4882a593Smuzhiyun struct dmx_frontend mem_frontend; 264*4882a593Smuzhiyun struct dmxdev dmxdev; 265*4882a593Smuzhiyun struct dvb_adapter dvb_adapter; 266*4882a593Smuzhiyun struct dvb_demux demux; 267*4882a593Smuzhiyun struct dvb_net dvbnet; 268*4882a593Smuzhiyun int users; 269*4882a593Smuzhiyun struct dvb_frontend *fe; 270*4882a593Smuzhiyun /* frontend i2c module */ 271*4882a593Smuzhiyun struct i2c_client *i2c_client_demod; 272*4882a593Smuzhiyun struct i2c_client *i2c_client_tuner; 273*4882a593Smuzhiyun }; 274*4882a593Smuzhiyun 275*4882a593Smuzhiyun struct smi_dev { 276*4882a593Smuzhiyun int nr; 277*4882a593Smuzhiyun struct smi_cfg_info *info; 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun /* pcie */ 280*4882a593Smuzhiyun struct pci_dev *pci_dev; 281*4882a593Smuzhiyun u32 __iomem *lmmio; 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun /* ts port */ 284*4882a593Smuzhiyun struct smi_port ts_port[2]; 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun /* i2c */ 287*4882a593Smuzhiyun struct i2c_adapter i2c_bus[2]; 288*4882a593Smuzhiyun struct i2c_algo_bit_data i2c_bit[2]; 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun /* ir */ 291*4882a593Smuzhiyun struct smi_rc ir; 292*4882a593Smuzhiyun }; 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun #define smi_read(reg) readl(dev->lmmio + ((reg)>>2)) 295*4882a593Smuzhiyun #define smi_write(reg, value) writel((value), dev->lmmio + ((reg)>>2)) 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun #define smi_andor(reg, mask, value) \ 298*4882a593Smuzhiyun writel((readl(dev->lmmio+((reg)>>2)) & ~(mask)) |\ 299*4882a593Smuzhiyun ((value) & (mask)), dev->lmmio+((reg)>>2)) 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun #define smi_set(reg, bit) smi_andor((reg), (bit), (bit)) 302*4882a593Smuzhiyun #define smi_clear(reg, bit) smi_andor((reg), (bit), 0) 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun int smi_ir_irq(struct smi_rc *ir, u32 int_status); 305*4882a593Smuzhiyun void smi_ir_start(struct smi_rc *ir); 306*4882a593Smuzhiyun void smi_ir_exit(struct smi_dev *dev); 307*4882a593Smuzhiyun int smi_ir_init(struct smi_dev *dev); 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun #endif /* #ifndef _SMI_PCIE_H_ */ 310