Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 1 | /* |
| 2 | * stv0900_priv.h |
| 3 | * |
| 4 | * Driver for ST STV0900 satellite demodulator IC. |
| 5 | * |
| 6 | * Copyright (C) ST Microelectronics. |
| 7 | * Copyright (C) 2009 NetUP Inc. |
| 8 | * Copyright (C) 2009 Igor M. Liplianin <liplianin@netup.ru> |
| 9 | * |
| 10 | * This program is free software; you can redistribute it and/or modify |
| 11 | * it under the terms of the GNU General Public License as published by |
| 12 | * the Free Software Foundation; either version 2 of the License, or |
| 13 | * (at your option) any later version. |
| 14 | * |
| 15 | * This program is distributed in the hope that it will be useful, |
| 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 18 | * |
| 19 | * GNU General Public License for more details. |
| 20 | * |
| 21 | * You should have received a copy of the GNU General Public License |
| 22 | * along with this program; if not, write to the Free Software |
| 23 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
| 24 | */ |
| 25 | |
| 26 | #ifndef STV0900_PRIV_H |
| 27 | #define STV0900_PRIV_H |
| 28 | |
| 29 | #include <linux/i2c.h> |
| 30 | |
| 31 | #define ABS(X) ((X) < 0 ? (-1 * (X)) : (X)) |
| 32 | #define INRANGE(X, Y, Z) ((((X) <= (Y)) && ((Y) <= (Z))) \ |
| 33 | || (((Z) <= (Y)) && ((Y) <= (X))) ? 1 : 0) |
| 34 | |
| 35 | #ifndef MAKEWORD |
| 36 | #define MAKEWORD(X, Y) (((X) << 8) + (Y)) |
| 37 | #endif |
| 38 | |
| 39 | #define LSB(X) (((X) & 0xFF)) |
| 40 | #define MSB(Y) (((Y) >> 8) & 0xFF) |
| 41 | |
| 42 | #ifndef TRUE |
| 43 | #define TRUE (1 == 1) |
| 44 | #endif |
| 45 | #ifndef FALSE |
| 46 | #define FALSE (!TRUE) |
| 47 | #endif |
| 48 | |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 49 | #define dprintk(args...) \ |
| 50 | do { \ |
Randy Dunlap | 5a771cb | 2009-03-08 23:01:08 -0300 | [diff] [blame] | 51 | if (stvdebug) \ |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 52 | printk(KERN_DEBUG args); \ |
| 53 | } while (0) |
| 54 | |
| 55 | #define STV0900_MAXLOOKUPSIZE 500 |
| 56 | #define STV0900_BLIND_SEARCH_AGC2_TH 700 |
Igor M. Liplianin | 46960ee | 2009-11-06 23:07:56 -0300 | [diff] [blame] | 57 | #define STV0900_BLIND_SEARCH_AGC2_TH_CUT30 1400 |
| 58 | #define IQPOWER_THRESHOLD 30 |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 59 | |
| 60 | /* One point of the lookup table */ |
| 61 | struct stv000_lookpoint { |
| 62 | s32 realval;/* real value */ |
| 63 | s32 regval;/* binary value */ |
| 64 | }; |
| 65 | |
| 66 | /* Lookup table definition */ |
| 67 | struct stv0900_table{ |
| 68 | s32 size;/* Size of the lookup table */ |
| 69 | struct stv000_lookpoint table[STV0900_MAXLOOKUPSIZE];/* Lookup table */ |
| 70 | }; |
| 71 | |
| 72 | enum fe_stv0900_error { |
| 73 | STV0900_NO_ERROR = 0, |
| 74 | STV0900_INVALID_HANDLE, |
| 75 | STV0900_BAD_PARAMETER, |
| 76 | STV0900_I2C_ERROR, |
| 77 | STV0900_SEARCH_FAILED, |
| 78 | }; |
| 79 | |
| 80 | enum fe_stv0900_clock_type { |
| 81 | STV0900_USE_REGISTERS_DEFAULT, |
| 82 | STV0900_SERIAL_PUNCT_CLOCK,/*Serial punctured clock */ |
| 83 | STV0900_SERIAL_CONT_CLOCK,/*Serial continues clock */ |
| 84 | STV0900_PARALLEL_PUNCT_CLOCK,/*Parallel punctured clock */ |
| 85 | STV0900_DVBCI_CLOCK/*Parallel continues clock : DVBCI */ |
| 86 | }; |
| 87 | |
| 88 | enum fe_stv0900_search_state { |
| 89 | STV0900_SEARCH = 0, |
| 90 | STV0900_PLH_DETECTED, |
| 91 | STV0900_DVBS2_FOUND, |
| 92 | STV0900_DVBS_FOUND |
| 93 | |
| 94 | }; |
| 95 | |
| 96 | enum fe_stv0900_ldpc_state { |
| 97 | STV0900_PATH1_OFF_PATH2_OFF = 0, |
| 98 | STV0900_PATH1_ON_PATH2_OFF = 1, |
| 99 | STV0900_PATH1_OFF_PATH2_ON = 2, |
| 100 | STV0900_PATH1_ON_PATH2_ON = 3 |
| 101 | }; |
| 102 | |
| 103 | enum fe_stv0900_signal_type { |
| 104 | STV0900_NOAGC1 = 0, |
| 105 | STV0900_AGC1OK, |
| 106 | STV0900_NOTIMING, |
| 107 | STV0900_ANALOGCARRIER, |
| 108 | STV0900_TIMINGOK, |
| 109 | STV0900_NOAGC2, |
| 110 | STV0900_AGC2OK, |
| 111 | STV0900_NOCARRIER, |
| 112 | STV0900_CARRIEROK, |
| 113 | STV0900_NODATA, |
| 114 | STV0900_DATAOK, |
| 115 | STV0900_OUTOFRANGE, |
| 116 | STV0900_RANGEOK |
| 117 | }; |
| 118 | |
| 119 | enum fe_stv0900_demod_num { |
| 120 | STV0900_DEMOD_1, |
| 121 | STV0900_DEMOD_2 |
| 122 | }; |
| 123 | |
| 124 | enum fe_stv0900_tracking_standard { |
| 125 | STV0900_DVBS1_STANDARD,/* Found Standard*/ |
| 126 | STV0900_DVBS2_STANDARD, |
| 127 | STV0900_DSS_STANDARD, |
| 128 | STV0900_TURBOCODE_STANDARD, |
| 129 | STV0900_UNKNOWN_STANDARD |
| 130 | }; |
| 131 | |
| 132 | enum fe_stv0900_search_standard { |
| 133 | STV0900_AUTO_SEARCH, |
| 134 | STV0900_SEARCH_DVBS1,/* Search Standard*/ |
| 135 | STV0900_SEARCH_DVBS2, |
| 136 | STV0900_SEARCH_DSS, |
| 137 | STV0900_SEARCH_TURBOCODE |
| 138 | }; |
| 139 | |
| 140 | enum fe_stv0900_search_algo { |
| 141 | STV0900_BLIND_SEARCH,/* offset freq and SR are Unknown */ |
| 142 | STV0900_COLD_START,/* only the SR is known */ |
| 143 | STV0900_WARM_START/* offset freq and SR are known */ |
| 144 | }; |
| 145 | |
| 146 | enum fe_stv0900_modulation { |
| 147 | STV0900_QPSK, |
| 148 | STV0900_8PSK, |
| 149 | STV0900_16APSK, |
| 150 | STV0900_32APSK, |
| 151 | STV0900_UNKNOWN |
| 152 | }; |
| 153 | |
| 154 | enum fe_stv0900_modcode { |
| 155 | STV0900_DUMMY_PLF, |
| 156 | STV0900_QPSK_14, |
| 157 | STV0900_QPSK_13, |
| 158 | STV0900_QPSK_25, |
| 159 | STV0900_QPSK_12, |
| 160 | STV0900_QPSK_35, |
| 161 | STV0900_QPSK_23, |
| 162 | STV0900_QPSK_34, |
| 163 | STV0900_QPSK_45, |
| 164 | STV0900_QPSK_56, |
| 165 | STV0900_QPSK_89, |
| 166 | STV0900_QPSK_910, |
| 167 | STV0900_8PSK_35, |
| 168 | STV0900_8PSK_23, |
| 169 | STV0900_8PSK_34, |
| 170 | STV0900_8PSK_56, |
| 171 | STV0900_8PSK_89, |
| 172 | STV0900_8PSK_910, |
| 173 | STV0900_16APSK_23, |
| 174 | STV0900_16APSK_34, |
| 175 | STV0900_16APSK_45, |
| 176 | STV0900_16APSK_56, |
| 177 | STV0900_16APSK_89, |
| 178 | STV0900_16APSK_910, |
| 179 | STV0900_32APSK_34, |
| 180 | STV0900_32APSK_45, |
| 181 | STV0900_32APSK_56, |
| 182 | STV0900_32APSK_89, |
| 183 | STV0900_32APSK_910, |
| 184 | STV0900_MODCODE_UNKNOWN |
| 185 | }; |
| 186 | |
| 187 | enum fe_stv0900_fec {/*DVBS1, DSS and turbo code puncture rate*/ |
| 188 | STV0900_FEC_1_2 = 0, |
| 189 | STV0900_FEC_2_3, |
| 190 | STV0900_FEC_3_4, |
| 191 | STV0900_FEC_4_5,/*for turbo code only*/ |
| 192 | STV0900_FEC_5_6, |
| 193 | STV0900_FEC_6_7,/*for DSS only */ |
| 194 | STV0900_FEC_7_8, |
| 195 | STV0900_FEC_8_9,/*for turbo code only*/ |
| 196 | STV0900_FEC_UNKNOWN |
| 197 | }; |
| 198 | |
| 199 | enum fe_stv0900_frame_length { |
| 200 | STV0900_LONG_FRAME, |
| 201 | STV0900_SHORT_FRAME |
| 202 | }; |
| 203 | |
| 204 | enum fe_stv0900_pilot { |
| 205 | STV0900_PILOTS_OFF, |
| 206 | STV0900_PILOTS_ON |
| 207 | }; |
| 208 | |
| 209 | enum fe_stv0900_rolloff { |
| 210 | STV0900_35, |
| 211 | STV0900_25, |
| 212 | STV0900_20 |
| 213 | }; |
| 214 | |
| 215 | enum fe_stv0900_search_iq { |
| 216 | STV0900_IQ_AUTO, |
| 217 | STV0900_IQ_AUTO_NORMAL_FIRST, |
| 218 | STV0900_IQ_FORCE_NORMAL, |
| 219 | STV0900_IQ_FORCE_SWAPPED |
| 220 | }; |
| 221 | |
| 222 | enum stv0900_iq_inversion { |
| 223 | STV0900_IQ_NORMAL, |
| 224 | STV0900_IQ_SWAPPED |
| 225 | }; |
| 226 | |
| 227 | enum fe_stv0900_diseqc_mode { |
| 228 | STV0900_22KHZ_Continues = 0, |
| 229 | STV0900_DISEQC_2_3_PWM = 2, |
| 230 | STV0900_DISEQC_3_3_PWM = 3, |
| 231 | STV0900_DISEQC_2_3_ENVELOP = 4, |
| 232 | STV0900_DISEQC_3_3_ENVELOP = 5 |
| 233 | }; |
| 234 | |
| 235 | enum fe_stv0900_demod_mode { |
| 236 | STV0900_SINGLE = 0, |
| 237 | STV0900_DUAL |
| 238 | }; |
| 239 | |
| 240 | struct stv0900_init_params{ |
Lucas De Marchi | 25985ed | 2011-03-30 22:57:33 -0300 | [diff] [blame] | 241 | u32 dmd_ref_clk;/* Reference,Input clock for the demod in Hz */ |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 242 | |
| 243 | /* Demodulator Type (single demod or dual demod) */ |
| 244 | enum fe_stv0900_demod_mode demod_mode; |
| 245 | enum fe_stv0900_rolloff rolloff; |
| 246 | enum fe_stv0900_clock_type path1_ts_clock; |
| 247 | |
| 248 | u8 tun1_maddress; |
| 249 | int tuner1_adc; |
Igor M. Liplianin | cd79d33 | 2009-12-14 20:24:56 -0300 | [diff] [blame] | 250 | int tuner1_type; |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 251 | |
| 252 | /* IQ from the tuner1 to the demod */ |
Igor M. Liplianin | 46960ee | 2009-11-06 23:07:56 -0300 | [diff] [blame] | 253 | enum stv0900_iq_inversion tun1_iq_inv; |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 254 | enum fe_stv0900_clock_type path2_ts_clock; |
| 255 | |
| 256 | u8 tun2_maddress; |
| 257 | int tuner2_adc; |
Igor M. Liplianin | cd79d33 | 2009-12-14 20:24:56 -0300 | [diff] [blame] | 258 | int tuner2_type; |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 259 | |
| 260 | /* IQ from the tuner2 to the demod */ |
Igor M. Liplianin | 46960ee | 2009-11-06 23:07:56 -0300 | [diff] [blame] | 261 | enum stv0900_iq_inversion tun2_iq_inv; |
Igor M. Liplianin | f867c3f | 2009-06-19 05:45:23 -0300 | [diff] [blame] | 262 | struct stv0900_reg *ts_config; |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 263 | }; |
| 264 | |
| 265 | struct stv0900_search_params { |
| 266 | enum fe_stv0900_demod_num path;/* Path Used demod1 or 2 */ |
| 267 | |
| 268 | u32 frequency;/* Transponder frequency (in KHz) */ |
| 269 | u32 symbol_rate;/* Transponder symbol rate (in bds)*/ |
| 270 | u32 search_range;/* Range of the search (in Hz) */ |
| 271 | |
| 272 | enum fe_stv0900_search_standard standard; |
| 273 | enum fe_stv0900_modulation modulation; |
| 274 | enum fe_stv0900_fec fec; |
| 275 | enum fe_stv0900_modcode modcode; |
| 276 | enum fe_stv0900_search_iq iq_inversion; |
| 277 | enum fe_stv0900_search_algo search_algo; |
| 278 | |
| 279 | }; |
| 280 | |
| 281 | struct stv0900_signal_info { |
| 282 | int locked;/* Transponder locked */ |
| 283 | u32 frequency;/* Transponder frequency (in KHz) */ |
| 284 | u32 symbol_rate;/* Transponder symbol rate (in Mbds) */ |
| 285 | |
| 286 | enum fe_stv0900_tracking_standard standard; |
| 287 | enum fe_stv0900_fec fec; |
| 288 | enum fe_stv0900_modcode modcode; |
| 289 | enum fe_stv0900_modulation modulation; |
| 290 | enum fe_stv0900_pilot pilot; |
Igor M. Liplianin | 46960ee | 2009-11-06 23:07:56 -0300 | [diff] [blame] | 291 | enum fe_stv0900_frame_length frame_len; |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 292 | enum stv0900_iq_inversion spectrum; |
| 293 | enum fe_stv0900_rolloff rolloff; |
| 294 | |
| 295 | s32 Power;/* Power of the RF signal (dBm) */ |
| 296 | s32 C_N;/* Carrier to noise ratio (dB x10)*/ |
| 297 | u32 BER;/* Bit error rate (x10^7) */ |
| 298 | |
| 299 | }; |
| 300 | |
| 301 | struct stv0900_internal{ |
| 302 | s32 quartz; |
| 303 | s32 mclk; |
| 304 | /* manual RollOff for DVBS1/DSS only */ |
| 305 | enum fe_stv0900_rolloff rolloff; |
| 306 | /* Demodulator use for single demod or for dual demod) */ |
| 307 | enum fe_stv0900_demod_mode demod_mode; |
| 308 | |
Igor M. Liplianin | 46960ee | 2009-11-06 23:07:56 -0300 | [diff] [blame] | 309 | /*Demods */ |
| 310 | s32 freq[2]; |
| 311 | s32 bw[2]; |
| 312 | s32 symbol_rate[2]; |
| 313 | s32 srch_range[2]; |
Igor M. Liplianin | cd79d33 | 2009-12-14 20:24:56 -0300 | [diff] [blame] | 314 | /* for software/auto tuner */ |
| 315 | int tuner_type[2]; |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 316 | |
| 317 | /* algorithm for search Blind, Cold or Warm*/ |
Igor M. Liplianin | 46960ee | 2009-11-06 23:07:56 -0300 | [diff] [blame] | 318 | enum fe_stv0900_search_algo srch_algo[2]; |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 319 | /* search standard: Auto, DVBS1/DSS only or DVBS2 only*/ |
Igor M. Liplianin | 46960ee | 2009-11-06 23:07:56 -0300 | [diff] [blame] | 320 | enum fe_stv0900_search_standard srch_standard[2]; |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 321 | /* inversion search : auto, auto norma first, normal or inverted */ |
Igor M. Liplianin | 46960ee | 2009-11-06 23:07:56 -0300 | [diff] [blame] | 322 | enum fe_stv0900_search_iq srch_iq_inv[2]; |
| 323 | enum fe_stv0900_modcode modcode[2]; |
| 324 | enum fe_stv0900_modulation modulation[2]; |
| 325 | enum fe_stv0900_fec fec[2]; |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 326 | |
Igor M. Liplianin | 46960ee | 2009-11-06 23:07:56 -0300 | [diff] [blame] | 327 | struct stv0900_signal_info result[2]; |
| 328 | enum fe_stv0900_error err[2]; |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 329 | |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 330 | |
| 331 | struct i2c_adapter *i2c_adap; |
| 332 | u8 i2c_addr; |
| 333 | u8 clkmode;/* 0 for CLKI, 2 for XTALI */ |
| 334 | u8 chip_id; |
Igor M. Liplianin | f867c3f | 2009-06-19 05:45:23 -0300 | [diff] [blame] | 335 | struct stv0900_reg *ts_config; |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 336 | enum fe_stv0900_error errs; |
| 337 | int dmds_used; |
| 338 | }; |
| 339 | |
| 340 | /* state for each demod */ |
| 341 | struct stv0900_state { |
| 342 | /* pointer for internal params, one for each pair of demods */ |
| 343 | struct stv0900_internal *internal; |
| 344 | struct i2c_adapter *i2c_adap; |
| 345 | const struct stv0900_config *config; |
| 346 | struct dvb_frontend frontend; |
| 347 | int demod; |
| 348 | }; |
| 349 | |
Igor M. Liplianin | 46960ee | 2009-11-06 23:07:56 -0300 | [diff] [blame] | 350 | extern int stvdebug; |
| 351 | |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 352 | extern s32 ge2comp(s32 a, s32 width); |
| 353 | |
| 354 | extern void stv0900_write_reg(struct stv0900_internal *i_params, |
| 355 | u16 reg_addr, u8 reg_data); |
| 356 | |
| 357 | extern u8 stv0900_read_reg(struct stv0900_internal *i_params, |
| 358 | u16 reg_addr); |
| 359 | |
| 360 | extern void stv0900_write_bits(struct stv0900_internal *i_params, |
| 361 | u32 label, u8 val); |
| 362 | |
| 363 | extern u8 stv0900_get_bits(struct stv0900_internal *i_params, |
| 364 | u32 label); |
| 365 | |
| 366 | extern int stv0900_get_demod_lock(struct stv0900_internal *i_params, |
| 367 | enum fe_stv0900_demod_num demod, s32 time_out); |
| 368 | extern int stv0900_check_signal_presence(struct stv0900_internal *i_params, |
| 369 | enum fe_stv0900_demod_num demod); |
| 370 | |
| 371 | extern enum fe_stv0900_signal_type stv0900_algo(struct dvb_frontend *fe); |
| 372 | |
| 373 | extern void stv0900_set_tuner(struct dvb_frontend *fe, u32 frequency, |
| 374 | u32 bandwidth); |
| 375 | extern void stv0900_set_bandwidth(struct dvb_frontend *fe, u32 bandwidth); |
| 376 | |
| 377 | extern void stv0900_start_search(struct stv0900_internal *i_params, |
| 378 | enum fe_stv0900_demod_num demod); |
| 379 | |
| 380 | extern u8 stv0900_get_optim_carr_loop(s32 srate, |
| 381 | enum fe_stv0900_modcode modcode, |
| 382 | s32 pilot, u8 chip_id); |
| 383 | |
| 384 | extern u8 stv0900_get_optim_short_carr_loop(s32 srate, |
| 385 | enum fe_stv0900_modulation modulation, |
| 386 | u8 chip_id); |
| 387 | |
| 388 | extern void stv0900_stop_all_s2_modcod(struct stv0900_internal *i_params, |
| 389 | enum fe_stv0900_demod_num demod); |
| 390 | |
Igor M. Liplianin | 46960ee | 2009-11-06 23:07:56 -0300 | [diff] [blame] | 391 | extern void stv0900_activate_s2_modcod(struct stv0900_internal *i_params, |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 392 | enum fe_stv0900_demod_num demod); |
| 393 | |
Igor M. Liplianin | 46960ee | 2009-11-06 23:07:56 -0300 | [diff] [blame] | 394 | extern void stv0900_activate_s2_modcod_single(struct stv0900_internal *i_params, |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 395 | enum fe_stv0900_demod_num demod); |
| 396 | |
Igor M. Liplianin | 46960ee | 2009-11-06 23:07:56 -0300 | [diff] [blame] | 397 | extern enum |
| 398 | fe_stv0900_tracking_standard stv0900_get_standard(struct dvb_frontend *fe, |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 399 | enum fe_stv0900_demod_num demod); |
| 400 | |
Igor M. Liplianin | cd79d33 | 2009-12-14 20:24:56 -0300 | [diff] [blame] | 401 | extern u32 |
| 402 | stv0900_get_freq_auto(struct stv0900_internal *intp, int demod); |
| 403 | |
| 404 | extern void |
| 405 | stv0900_set_tuner_auto(struct stv0900_internal *intp, u32 Frequency, |
| 406 | u32 Bandwidth, int demod); |
| 407 | |
Igor M. Liplianin | db7a484 | 2009-03-03 11:41:39 -0300 | [diff] [blame] | 408 | #endif |