1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef DIBX000_COMMON_H 3*4882a593Smuzhiyun #define DIBX000_COMMON_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun enum dibx000_i2c_interface { 6*4882a593Smuzhiyun DIBX000_I2C_INTERFACE_TUNER = 0, 7*4882a593Smuzhiyun DIBX000_I2C_INTERFACE_GPIO_1_2 = 1, 8*4882a593Smuzhiyun DIBX000_I2C_INTERFACE_GPIO_3_4 = 2, 9*4882a593Smuzhiyun DIBX000_I2C_INTERFACE_GPIO_6_7 = 3 10*4882a593Smuzhiyun }; 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun struct dibx000_i2c_master { 13*4882a593Smuzhiyun #define DIB3000MC 1 14*4882a593Smuzhiyun #define DIB7000 2 15*4882a593Smuzhiyun #define DIB7000P 11 16*4882a593Smuzhiyun #define DIB7000MC 12 17*4882a593Smuzhiyun #define DIB8000 13 18*4882a593Smuzhiyun u16 device_rev; 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun enum dibx000_i2c_interface selected_interface; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* struct i2c_adapter tuner_i2c_adap; */ 23*4882a593Smuzhiyun struct i2c_adapter gated_tuner_i2c_adap; 24*4882a593Smuzhiyun struct i2c_adapter master_i2c_adap_gpio12; 25*4882a593Smuzhiyun struct i2c_adapter master_i2c_adap_gpio34; 26*4882a593Smuzhiyun struct i2c_adapter master_i2c_adap_gpio67; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun struct i2c_adapter *i2c_adap; 29*4882a593Smuzhiyun u8 i2c_addr; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun u16 base_reg; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* for the I2C transfer */ 34*4882a593Smuzhiyun struct i2c_msg msg[34]; 35*4882a593Smuzhiyun u8 i2c_write_buffer[8]; 36*4882a593Smuzhiyun u8 i2c_read_buffer[2]; 37*4882a593Smuzhiyun struct mutex i2c_buffer_lock; 38*4882a593Smuzhiyun }; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun extern int dibx000_init_i2c_master(struct dibx000_i2c_master *mst, 41*4882a593Smuzhiyun u16 device_rev, struct i2c_adapter *i2c_adap, 42*4882a593Smuzhiyun u8 i2c_addr); 43*4882a593Smuzhiyun extern struct i2c_adapter *dibx000_get_i2c_adapter(struct dibx000_i2c_master 44*4882a593Smuzhiyun *mst, 45*4882a593Smuzhiyun enum dibx000_i2c_interface 46*4882a593Smuzhiyun intf, int gating); 47*4882a593Smuzhiyun extern void dibx000_exit_i2c_master(struct dibx000_i2c_master *mst); 48*4882a593Smuzhiyun extern void dibx000_reset_i2c_master(struct dibx000_i2c_master *mst); 49*4882a593Smuzhiyun extern int dibx000_i2c_set_speed(struct i2c_adapter *i2c_adap, u16 speed); 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun #define BAND_LBAND 0x01 52*4882a593Smuzhiyun #define BAND_UHF 0x02 53*4882a593Smuzhiyun #define BAND_VHF 0x04 54*4882a593Smuzhiyun #define BAND_SBAND 0x08 55*4882a593Smuzhiyun #define BAND_FM 0x10 56*4882a593Smuzhiyun #define BAND_CBAND 0x20 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #define BAND_OF_FREQUENCY(freq_kHz) ((freq_kHz) <= 170000 ? BAND_CBAND : \ 59*4882a593Smuzhiyun (freq_kHz) <= 115000 ? BAND_FM : \ 60*4882a593Smuzhiyun (freq_kHz) <= 250000 ? BAND_VHF : \ 61*4882a593Smuzhiyun (freq_kHz) <= 863000 ? BAND_UHF : \ 62*4882a593Smuzhiyun (freq_kHz) <= 2000000 ? BAND_LBAND : BAND_SBAND ) 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun struct dibx000_agc_config { 65*4882a593Smuzhiyun /* defines the capabilities of this AGC-setting - using the BAND_-defines */ 66*4882a593Smuzhiyun u8 band_caps; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun u16 setup; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun u16 inv_gain; 71*4882a593Smuzhiyun u16 time_stabiliz; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun u8 alpha_level; 74*4882a593Smuzhiyun u16 thlock; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun u8 wbd_inv; 77*4882a593Smuzhiyun u16 wbd_ref; 78*4882a593Smuzhiyun u8 wbd_sel; 79*4882a593Smuzhiyun u8 wbd_alpha; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun u16 agc1_max; 82*4882a593Smuzhiyun u16 agc1_min; 83*4882a593Smuzhiyun u16 agc2_max; 84*4882a593Smuzhiyun u16 agc2_min; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun u8 agc1_pt1; 87*4882a593Smuzhiyun u8 agc1_pt2; 88*4882a593Smuzhiyun u8 agc1_pt3; 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun u8 agc1_slope1; 91*4882a593Smuzhiyun u8 agc1_slope2; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun u8 agc2_pt1; 94*4882a593Smuzhiyun u8 agc2_pt2; 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun u8 agc2_slope1; 97*4882a593Smuzhiyun u8 agc2_slope2; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun u8 alpha_mant; 100*4882a593Smuzhiyun u8 alpha_exp; 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun u8 beta_mant; 103*4882a593Smuzhiyun u8 beta_exp; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun u8 perform_agc_softsplit; 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun struct { 108*4882a593Smuzhiyun u16 min; 109*4882a593Smuzhiyun u16 max; 110*4882a593Smuzhiyun u16 min_thres; 111*4882a593Smuzhiyun u16 max_thres; 112*4882a593Smuzhiyun } split; 113*4882a593Smuzhiyun }; 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun struct dibx000_bandwidth_config { 116*4882a593Smuzhiyun u32 internal; 117*4882a593Smuzhiyun u32 sampling; 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun u8 pll_prediv; 120*4882a593Smuzhiyun u8 pll_ratio; 121*4882a593Smuzhiyun u8 pll_range; 122*4882a593Smuzhiyun u8 pll_reset; 123*4882a593Smuzhiyun u8 pll_bypass; 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun u8 enable_refdiv; 126*4882a593Smuzhiyun u8 bypclk_div; 127*4882a593Smuzhiyun u8 IO_CLK_en_core; 128*4882a593Smuzhiyun u8 ADClkSrc; 129*4882a593Smuzhiyun u8 modulo; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun u16 sad_cfg; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun u32 ifreq; 134*4882a593Smuzhiyun u32 timf; 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun u32 xtal_hz; 137*4882a593Smuzhiyun }; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun enum dibx000_adc_states { 140*4882a593Smuzhiyun DIBX000_SLOW_ADC_ON = 0, 141*4882a593Smuzhiyun DIBX000_SLOW_ADC_OFF, 142*4882a593Smuzhiyun DIBX000_ADC_ON, 143*4882a593Smuzhiyun DIBX000_ADC_OFF, 144*4882a593Smuzhiyun DIBX000_VBG_ENABLE, 145*4882a593Smuzhiyun DIBX000_VBG_DISABLE, 146*4882a593Smuzhiyun }; 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun #define BANDWIDTH_TO_KHZ(v) ((v) / 1000) 149*4882a593Smuzhiyun #define BANDWIDTH_TO_HZ(v) ((v) * 1000) 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun /* Chip output mode. */ 152*4882a593Smuzhiyun #define OUTMODE_HIGH_Z 0 153*4882a593Smuzhiyun #define OUTMODE_MPEG2_PAR_GATED_CLK 1 154*4882a593Smuzhiyun #define OUTMODE_MPEG2_PAR_CONT_CLK 2 155*4882a593Smuzhiyun #define OUTMODE_MPEG2_SERIAL 7 156*4882a593Smuzhiyun #define OUTMODE_DIVERSITY 4 157*4882a593Smuzhiyun #define OUTMODE_MPEG2_FIFO 5 158*4882a593Smuzhiyun #define OUTMODE_ANALOG_ADC 6 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun #define INPUT_MODE_OFF 0x11 161*4882a593Smuzhiyun #define INPUT_MODE_DIVERSITY 0x12 162*4882a593Smuzhiyun #define INPUT_MODE_MPEG 0x13 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun enum frontend_tune_state { 165*4882a593Smuzhiyun CT_TUNER_START = 10, 166*4882a593Smuzhiyun CT_TUNER_STEP_0, 167*4882a593Smuzhiyun CT_TUNER_STEP_1, 168*4882a593Smuzhiyun CT_TUNER_STEP_2, 169*4882a593Smuzhiyun CT_TUNER_STEP_3, 170*4882a593Smuzhiyun CT_TUNER_STEP_4, 171*4882a593Smuzhiyun CT_TUNER_STEP_5, 172*4882a593Smuzhiyun CT_TUNER_STEP_6, 173*4882a593Smuzhiyun CT_TUNER_STEP_7, 174*4882a593Smuzhiyun CT_TUNER_STOP, 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun CT_AGC_START = 20, 177*4882a593Smuzhiyun CT_AGC_STEP_0, 178*4882a593Smuzhiyun CT_AGC_STEP_1, 179*4882a593Smuzhiyun CT_AGC_STEP_2, 180*4882a593Smuzhiyun CT_AGC_STEP_3, 181*4882a593Smuzhiyun CT_AGC_STEP_4, 182*4882a593Smuzhiyun CT_AGC_STOP, 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun CT_DEMOD_START = 30, 185*4882a593Smuzhiyun CT_DEMOD_STEP_1, 186*4882a593Smuzhiyun CT_DEMOD_STEP_2, 187*4882a593Smuzhiyun CT_DEMOD_STEP_3, 188*4882a593Smuzhiyun CT_DEMOD_STEP_4, 189*4882a593Smuzhiyun CT_DEMOD_STEP_5, 190*4882a593Smuzhiyun CT_DEMOD_STEP_6, 191*4882a593Smuzhiyun CT_DEMOD_STEP_7, 192*4882a593Smuzhiyun CT_DEMOD_STEP_8, 193*4882a593Smuzhiyun CT_DEMOD_STEP_9, 194*4882a593Smuzhiyun CT_DEMOD_STEP_10, 195*4882a593Smuzhiyun CT_DEMOD_STEP_11, 196*4882a593Smuzhiyun CT_DEMOD_SEARCH_NEXT = 51, 197*4882a593Smuzhiyun CT_DEMOD_STEP_LOCKED, 198*4882a593Smuzhiyun CT_DEMOD_STOP, 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun CT_DONE = 100, 201*4882a593Smuzhiyun CT_SHUTDOWN, 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun }; 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun struct dvb_frontend_parametersContext { 206*4882a593Smuzhiyun #define CHANNEL_STATUS_PARAMETERS_UNKNOWN 0x01 207*4882a593Smuzhiyun #define CHANNEL_STATUS_PARAMETERS_SET 0x02 208*4882a593Smuzhiyun u8 status; 209*4882a593Smuzhiyun u32 tune_time_estimation[2]; 210*4882a593Smuzhiyun s32 tps_available; 211*4882a593Smuzhiyun u16 tps[9]; 212*4882a593Smuzhiyun }; 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun #define FE_STATUS_TUNE_FAILED 0 215*4882a593Smuzhiyun #define FE_STATUS_TUNE_TIMED_OUT -1 216*4882a593Smuzhiyun #define FE_STATUS_TUNE_TIME_TOO_SHORT -2 217*4882a593Smuzhiyun #define FE_STATUS_TUNE_PENDING -3 218*4882a593Smuzhiyun #define FE_STATUS_STD_SUCCESS -4 219*4882a593Smuzhiyun #define FE_STATUS_FFT_SUCCESS -5 220*4882a593Smuzhiyun #define FE_STATUS_DEMOD_SUCCESS -6 221*4882a593Smuzhiyun #define FE_STATUS_LOCKED -7 222*4882a593Smuzhiyun #define FE_STATUS_DATA_LOCKED -8 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun #define FE_CALLBACK_TIME_NEVER 0xffffffff 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun #define DATA_BUS_ACCESS_MODE_8BIT 0x01 227*4882a593Smuzhiyun #define DATA_BUS_ACCESS_MODE_16BIT 0x02 228*4882a593Smuzhiyun #define DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT 0x10 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun struct dibGPIOFunction { 231*4882a593Smuzhiyun #define BOARD_GPIO_COMPONENT_BUS_ADAPTER 1 232*4882a593Smuzhiyun #define BOARD_GPIO_COMPONENT_DEMOD 2 233*4882a593Smuzhiyun u8 component; 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun #define BOARD_GPIO_FUNCTION_BOARD_ON 1 236*4882a593Smuzhiyun #define BOARD_GPIO_FUNCTION_BOARD_OFF 2 237*4882a593Smuzhiyun #define BOARD_GPIO_FUNCTION_COMPONENT_ON 3 238*4882a593Smuzhiyun #define BOARD_GPIO_FUNCTION_COMPONENT_OFF 4 239*4882a593Smuzhiyun #define BOARD_GPIO_FUNCTION_SUBBAND_PWM 5 240*4882a593Smuzhiyun #define BOARD_GPIO_FUNCTION_SUBBAND_GPIO 6 241*4882a593Smuzhiyun u8 function; 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun /* mask, direction and value are used specify which GPIO to change GPIO0 244*4882a593Smuzhiyun * is LSB and possible GPIO31 is MSB. The same bit-position as in the 245*4882a593Smuzhiyun * mask is used for the direction and the value. Direction == 1 is OUT, 246*4882a593Smuzhiyun * 0 == IN. For direction "OUT" value is either 1 or 0, for direction IN 247*4882a593Smuzhiyun * value has no meaning. 248*4882a593Smuzhiyun * 249*4882a593Smuzhiyun * In case of BOARD_GPIO_FUNCTION_PWM mask is giving the GPIO to be 250*4882a593Smuzhiyun * used to do the PWM. Direction gives the PWModulator to be used. 251*4882a593Smuzhiyun * Value gives the PWM value in device-dependent scale. 252*4882a593Smuzhiyun */ 253*4882a593Smuzhiyun u32 mask; 254*4882a593Smuzhiyun u32 direction; 255*4882a593Smuzhiyun u32 value; 256*4882a593Smuzhiyun }; 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun #define MAX_NB_SUBBANDS 8 259*4882a593Smuzhiyun struct dibSubbandSelection { 260*4882a593Smuzhiyun u8 size; /* Actual number of subbands. */ 261*4882a593Smuzhiyun struct { 262*4882a593Smuzhiyun u16 f_mhz; 263*4882a593Smuzhiyun struct dibGPIOFunction gpio; 264*4882a593Smuzhiyun } subband[MAX_NB_SUBBANDS]; 265*4882a593Smuzhiyun }; 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun #define DEMOD_TIMF_SET 0x00 268*4882a593Smuzhiyun #define DEMOD_TIMF_GET 0x01 269*4882a593Smuzhiyun #define DEMOD_TIMF_UPDATE 0x02 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun #define MPEG_ON_DIBTX 1 272*4882a593Smuzhiyun #define DIV_ON_DIBTX 2 273*4882a593Smuzhiyun #define ADC_ON_DIBTX 3 274*4882a593Smuzhiyun #define DEMOUT_ON_HOSTBUS 4 275*4882a593Smuzhiyun #define DIBTX_ON_HOSTBUS 5 276*4882a593Smuzhiyun #define MPEG_ON_HOSTBUS 6 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun #endif 279