sh_eth: fix EESIPR values for SH77{34|63}
[linux/fpc-iii.git] / drivers / media / dvb-frontends / stv0367.c
blob4ac1ce2831bae9fd13341664a1ad38af6e6d93c9
1 /*
2 * stv0367.c
4 * Driver for ST STV0367 DVB-T & DVB-C demodulator IC.
6 * Copyright (C) ST Microelectronics.
7 * Copyright (C) 2010,2011 NetUP Inc.
8 * Copyright (C) 2010,2011 Igor M. Liplianin <liplianin@netup.ru>
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.
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
19 * GNU General Public License for more details.
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.
26 #include <linux/kernel.h>
27 #include <linux/module.h>
28 #include <linux/string.h>
29 #include <linux/slab.h>
30 #include <linux/i2c.h>
32 #include "stv0367.h"
33 #include "stv0367_regs.h"
34 #include "stv0367_priv.h"
36 /* Max transfer size done by I2C transfer functions */
37 #define MAX_XFER_SIZE 64
39 static int stvdebug;
40 module_param_named(debug, stvdebug, int, 0644);
42 static int i2cdebug;
43 module_param_named(i2c_debug, i2cdebug, int, 0644);
45 #define dprintk(args...) \
46 do { \
47 if (stvdebug) \
48 printk(KERN_DEBUG args); \
49 } while (0)
50 /* DVB-C */
52 struct stv0367cab_state {
53 enum stv0367_cab_signal_type state;
54 u32 mclk;
55 u32 adc_clk;
56 s32 search_range;
57 s32 derot_offset;
58 /* results */
59 int locked; /* channel found */
60 u32 freq_khz; /* found frequency (in kHz) */
61 u32 symbol_rate; /* found symbol rate (in Bds) */
62 enum fe_spectral_inversion spect_inv; /* Spectrum Inversion */
65 struct stv0367ter_state {
66 /* DVB-T */
67 enum stv0367_ter_signal_type state;
68 enum stv0367_ter_if_iq_mode if_iq_mode;
69 enum stv0367_ter_mode mode;/* mode 2K or 8K */
70 enum fe_guard_interval guard;
71 enum stv0367_ter_hierarchy hierarchy;
72 u32 frequency;
73 enum fe_spectral_inversion sense; /* current search spectrum */
74 u8 force; /* force mode/guard */
75 u8 bw; /* channel width 6, 7 or 8 in MHz */
76 u8 pBW; /* channel width used during previous lock */
77 u32 pBER;
78 u32 pPER;
79 u32 ucblocks;
80 s8 echo_pos; /* echo position */
81 u8 first_lock;
82 u8 unlock_counter;
83 u32 agc_val;
86 struct stv0367_state {
87 struct dvb_frontend fe;
88 struct i2c_adapter *i2c;
89 /* config settings */
90 const struct stv0367_config *config;
91 u8 chip_id;
92 /* DVB-C */
93 struct stv0367cab_state *cab_state;
94 /* DVB-T */
95 struct stv0367ter_state *ter_state;
98 struct st_register {
99 u16 addr;
100 u8 value;
103 /* values for STV4100 XTAL=30M int clk=53.125M*/
104 static struct st_register def0367ter[STV0367TER_NBREGS] = {
105 {R367TER_ID, 0x60},
106 {R367TER_I2CRPT, 0xa0},
107 /* {R367TER_I2CRPT, 0x22},*/
108 {R367TER_TOPCTRL, 0x00},/* for xc5000; was 0x02 */
109 {R367TER_IOCFG0, 0x40},
110 {R367TER_DAC0R, 0x00},
111 {R367TER_IOCFG1, 0x00},
112 {R367TER_DAC1R, 0x00},
113 {R367TER_IOCFG2, 0x62},
114 {R367TER_SDFR, 0x00},
115 {R367TER_STATUS, 0xf8},
116 {R367TER_AUX_CLK, 0x0a},
117 {R367TER_FREESYS1, 0x00},
118 {R367TER_FREESYS2, 0x00},
119 {R367TER_FREESYS3, 0x00},
120 {R367TER_GPIO_CFG, 0x55},
121 {R367TER_GPIO_CMD, 0x00},
122 {R367TER_AGC2MAX, 0xff},
123 {R367TER_AGC2MIN, 0x00},
124 {R367TER_AGC1MAX, 0xff},
125 {R367TER_AGC1MIN, 0x00},
126 {R367TER_AGCR, 0xbc},
127 {R367TER_AGC2TH, 0x00},
128 {R367TER_AGC12C, 0x00},
129 {R367TER_AGCCTRL1, 0x85},
130 {R367TER_AGCCTRL2, 0x1f},
131 {R367TER_AGC1VAL1, 0x00},
132 {R367TER_AGC1VAL2, 0x00},
133 {R367TER_AGC2VAL1, 0x6f},
134 {R367TER_AGC2VAL2, 0x05},
135 {R367TER_AGC2PGA, 0x00},
136 {R367TER_OVF_RATE1, 0x00},
137 {R367TER_OVF_RATE2, 0x00},
138 {R367TER_GAIN_SRC1, 0xaa},/* for xc5000; was 0x2b */
139 {R367TER_GAIN_SRC2, 0xd6},/* for xc5000; was 0x04 */
140 {R367TER_INC_DEROT1, 0x55},
141 {R367TER_INC_DEROT2, 0x55},
142 {R367TER_PPM_CPAMP_DIR, 0x2c},
143 {R367TER_PPM_CPAMP_INV, 0x00},
144 {R367TER_FREESTFE_1, 0x00},
145 {R367TER_FREESTFE_2, 0x1c},
146 {R367TER_DCOFFSET, 0x00},
147 {R367TER_EN_PROCESS, 0x05},
148 {R367TER_SDI_SMOOTHER, 0x80},
149 {R367TER_FE_LOOP_OPEN, 0x1c},
150 {R367TER_FREQOFF1, 0x00},
151 {R367TER_FREQOFF2, 0x00},
152 {R367TER_FREQOFF3, 0x00},
153 {R367TER_TIMOFF1, 0x00},
154 {R367TER_TIMOFF2, 0x00},
155 {R367TER_EPQ, 0x02},
156 {R367TER_EPQAUTO, 0x01},
157 {R367TER_SYR_UPDATE, 0xf5},
158 {R367TER_CHPFREE, 0x00},
159 {R367TER_PPM_STATE_MAC, 0x23},
160 {R367TER_INR_THRESHOLD, 0xff},
161 {R367TER_EPQ_TPS_ID_CELL, 0xf9},
162 {R367TER_EPQ_CFG, 0x00},
163 {R367TER_EPQ_STATUS, 0x01},
164 {R367TER_AUTORELOCK, 0x81},
165 {R367TER_BER_THR_VMSB, 0x00},
166 {R367TER_BER_THR_MSB, 0x00},
167 {R367TER_BER_THR_LSB, 0x00},
168 {R367TER_CCD, 0x83},
169 {R367TER_SPECTR_CFG, 0x00},
170 {R367TER_CHC_DUMMY, 0x18},
171 {R367TER_INC_CTL, 0x88},
172 {R367TER_INCTHRES_COR1, 0xb4},
173 {R367TER_INCTHRES_COR2, 0x96},
174 {R367TER_INCTHRES_DET1, 0x0e},
175 {R367TER_INCTHRES_DET2, 0x11},
176 {R367TER_IIR_CELLNB, 0x8d},
177 {R367TER_IIRCX_COEFF1_MSB, 0x00},
178 {R367TER_IIRCX_COEFF1_LSB, 0x00},
179 {R367TER_IIRCX_COEFF2_MSB, 0x09},
180 {R367TER_IIRCX_COEFF2_LSB, 0x18},
181 {R367TER_IIRCX_COEFF3_MSB, 0x14},
182 {R367TER_IIRCX_COEFF3_LSB, 0x9c},
183 {R367TER_IIRCX_COEFF4_MSB, 0x00},
184 {R367TER_IIRCX_COEFF4_LSB, 0x00},
185 {R367TER_IIRCX_COEFF5_MSB, 0x36},
186 {R367TER_IIRCX_COEFF5_LSB, 0x42},
187 {R367TER_FEPATH_CFG, 0x00},
188 {R367TER_PMC1_FUNC, 0x65},
189 {R367TER_PMC1_FOR, 0x00},
190 {R367TER_PMC2_FUNC, 0x00},
191 {R367TER_STATUS_ERR_DA, 0xe0},
192 {R367TER_DIG_AGC_R, 0xfe},
193 {R367TER_COMAGC_TARMSB, 0x0b},
194 {R367TER_COM_AGC_TAR_ENMODE, 0x41},
195 {R367TER_COM_AGC_CFG, 0x3e},
196 {R367TER_COM_AGC_GAIN1, 0x39},
197 {R367TER_AUT_AGC_TARGETMSB, 0x0b},
198 {R367TER_LOCK_DET_MSB, 0x01},
199 {R367TER_AGCTAR_LOCK_LSBS, 0x40},
200 {R367TER_AUT_GAIN_EN, 0xf4},
201 {R367TER_AUT_CFG, 0xf0},
202 {R367TER_LOCKN, 0x23},
203 {R367TER_INT_X_3, 0x00},
204 {R367TER_INT_X_2, 0x03},
205 {R367TER_INT_X_1, 0x8d},
206 {R367TER_INT_X_0, 0xa0},
207 {R367TER_MIN_ERRX_MSB, 0x00},
208 {R367TER_COR_CTL, 0x23},
209 {R367TER_COR_STAT, 0xf6},
210 {R367TER_COR_INTEN, 0x00},
211 {R367TER_COR_INTSTAT, 0x3f},
212 {R367TER_COR_MODEGUARD, 0x03},
213 {R367TER_AGC_CTL, 0x08},
214 {R367TER_AGC_MANUAL1, 0x00},
215 {R367TER_AGC_MANUAL2, 0x00},
216 {R367TER_AGC_TARG, 0x16},
217 {R367TER_AGC_GAIN1, 0x53},
218 {R367TER_AGC_GAIN2, 0x1d},
219 {R367TER_RESERVED_1, 0x00},
220 {R367TER_RESERVED_2, 0x00},
221 {R367TER_RESERVED_3, 0x00},
222 {R367TER_CAS_CTL, 0x44},
223 {R367TER_CAS_FREQ, 0xb3},
224 {R367TER_CAS_DAGCGAIN, 0x12},
225 {R367TER_SYR_CTL, 0x04},
226 {R367TER_SYR_STAT, 0x10},
227 {R367TER_SYR_NCO1, 0x00},
228 {R367TER_SYR_NCO2, 0x00},
229 {R367TER_SYR_OFFSET1, 0x00},
230 {R367TER_SYR_OFFSET2, 0x00},
231 {R367TER_FFT_CTL, 0x00},
232 {R367TER_SCR_CTL, 0x70},
233 {R367TER_PPM_CTL1, 0xf8},
234 {R367TER_TRL_CTL, 0x14},/* for xc5000; was 0xac */
235 {R367TER_TRL_NOMRATE1, 0xae},/* for xc5000; was 0x1e */
236 {R367TER_TRL_NOMRATE2, 0x56},/* for xc5000; was 0x58 */
237 {R367TER_TRL_TIME1, 0x1d},
238 {R367TER_TRL_TIME2, 0xfc},
239 {R367TER_CRL_CTL, 0x24},
240 {R367TER_CRL_FREQ1, 0xad},
241 {R367TER_CRL_FREQ2, 0x9d},
242 {R367TER_CRL_FREQ3, 0xff},
243 {R367TER_CHC_CTL, 0x01},
244 {R367TER_CHC_SNR, 0xf0},
245 {R367TER_BDI_CTL, 0x00},
246 {R367TER_DMP_CTL, 0x00},
247 {R367TER_TPS_RCVD1, 0x30},
248 {R367TER_TPS_RCVD2, 0x02},
249 {R367TER_TPS_RCVD3, 0x01},
250 {R367TER_TPS_RCVD4, 0x00},
251 {R367TER_TPS_ID_CELL1, 0x00},
252 {R367TER_TPS_ID_CELL2, 0x00},
253 {R367TER_TPS_RCVD5_SET1, 0x02},
254 {R367TER_TPS_SET2, 0x02},
255 {R367TER_TPS_SET3, 0x01},
256 {R367TER_TPS_CTL, 0x00},
257 {R367TER_CTL_FFTOSNUM, 0x34},
258 {R367TER_TESTSELECT, 0x09},
259 {R367TER_MSC_REV, 0x0a},
260 {R367TER_PIR_CTL, 0x00},
261 {R367TER_SNR_CARRIER1, 0xa1},
262 {R367TER_SNR_CARRIER2, 0x9a},
263 {R367TER_PPM_CPAMP, 0x2c},
264 {R367TER_TSM_AP0, 0x00},
265 {R367TER_TSM_AP1, 0x00},
266 {R367TER_TSM_AP2 , 0x00},
267 {R367TER_TSM_AP3, 0x00},
268 {R367TER_TSM_AP4, 0x00},
269 {R367TER_TSM_AP5, 0x00},
270 {R367TER_TSM_AP6, 0x00},
271 {R367TER_TSM_AP7, 0x00},
272 {R367TER_TSTRES, 0x00},
273 {R367TER_ANACTRL, 0x0D},/* PLL stoped, restart at init!!! */
274 {R367TER_TSTBUS, 0x00},
275 {R367TER_TSTRATE, 0x00},
276 {R367TER_CONSTMODE, 0x01},
277 {R367TER_CONSTCARR1, 0x00},
278 {R367TER_CONSTCARR2, 0x00},
279 {R367TER_ICONSTEL, 0x0a},
280 {R367TER_QCONSTEL, 0x15},
281 {R367TER_TSTBISTRES0, 0x00},
282 {R367TER_TSTBISTRES1, 0x00},
283 {R367TER_TSTBISTRES2, 0x28},
284 {R367TER_TSTBISTRES3, 0x00},
285 {R367TER_RF_AGC1, 0xff},
286 {R367TER_RF_AGC2, 0x83},
287 {R367TER_ANADIGCTRL, 0x19},
288 {R367TER_PLLMDIV, 0x01},/* for xc5000; was 0x0c */
289 {R367TER_PLLNDIV, 0x06},/* for xc5000; was 0x55 */
290 {R367TER_PLLSETUP, 0x18},
291 {R367TER_DUAL_AD12, 0x0C},/* for xc5000 AGC voltage 1.6V */
292 {R367TER_TSTBIST, 0x00},
293 {R367TER_PAD_COMP_CTRL, 0x00},
294 {R367TER_PAD_COMP_WR, 0x00},
295 {R367TER_PAD_COMP_RD, 0xe0},
296 {R367TER_SYR_TARGET_FFTADJT_MSB, 0x00},
297 {R367TER_SYR_TARGET_FFTADJT_LSB, 0x00},
298 {R367TER_SYR_TARGET_CHCADJT_MSB, 0x00},
299 {R367TER_SYR_TARGET_CHCADJT_LSB, 0x00},
300 {R367TER_SYR_FLAG, 0x00},
301 {R367TER_CRL_TARGET1, 0x00},
302 {R367TER_CRL_TARGET2, 0x00},
303 {R367TER_CRL_TARGET3, 0x00},
304 {R367TER_CRL_TARGET4, 0x00},
305 {R367TER_CRL_FLAG, 0x00},
306 {R367TER_TRL_TARGET1, 0x00},
307 {R367TER_TRL_TARGET2, 0x00},
308 {R367TER_TRL_CHC, 0x00},
309 {R367TER_CHC_SNR_TARG, 0x00},
310 {R367TER_TOP_TRACK, 0x00},
311 {R367TER_TRACKER_FREE1, 0x00},
312 {R367TER_ERROR_CRL1, 0x00},
313 {R367TER_ERROR_CRL2, 0x00},
314 {R367TER_ERROR_CRL3, 0x00},
315 {R367TER_ERROR_CRL4, 0x00},
316 {R367TER_DEC_NCO1, 0x2c},
317 {R367TER_DEC_NCO2, 0x0f},
318 {R367TER_DEC_NCO3, 0x20},
319 {R367TER_SNR, 0xf1},
320 {R367TER_SYR_FFTADJ1, 0x00},
321 {R367TER_SYR_FFTADJ2, 0x00},
322 {R367TER_SYR_CHCADJ1, 0x00},
323 {R367TER_SYR_CHCADJ2, 0x00},
324 {R367TER_SYR_OFF, 0x00},
325 {R367TER_PPM_OFFSET1, 0x00},
326 {R367TER_PPM_OFFSET2, 0x03},
327 {R367TER_TRACKER_FREE2, 0x00},
328 {R367TER_DEBG_LT10, 0x00},
329 {R367TER_DEBG_LT11, 0x00},
330 {R367TER_DEBG_LT12, 0x00},
331 {R367TER_DEBG_LT13, 0x00},
332 {R367TER_DEBG_LT14, 0x00},
333 {R367TER_DEBG_LT15, 0x00},
334 {R367TER_DEBG_LT16, 0x00},
335 {R367TER_DEBG_LT17, 0x00},
336 {R367TER_DEBG_LT18, 0x00},
337 {R367TER_DEBG_LT19, 0x00},
338 {R367TER_DEBG_LT1A, 0x00},
339 {R367TER_DEBG_LT1B, 0x00},
340 {R367TER_DEBG_LT1C, 0x00},
341 {R367TER_DEBG_LT1D, 0x00},
342 {R367TER_DEBG_LT1E, 0x00},
343 {R367TER_DEBG_LT1F, 0x00},
344 {R367TER_RCCFGH, 0x00},
345 {R367TER_RCCFGM, 0x00},
346 {R367TER_RCCFGL, 0x00},
347 {R367TER_RCINSDELH, 0x00},
348 {R367TER_RCINSDELM, 0x00},
349 {R367TER_RCINSDELL, 0x00},
350 {R367TER_RCSTATUS, 0x00},
351 {R367TER_RCSPEED, 0x6f},
352 {R367TER_RCDEBUGM, 0xe7},
353 {R367TER_RCDEBUGL, 0x9b},
354 {R367TER_RCOBSCFG, 0x00},
355 {R367TER_RCOBSM, 0x00},
356 {R367TER_RCOBSL, 0x00},
357 {R367TER_RCFECSPY, 0x00},
358 {R367TER_RCFSPYCFG, 0x00},
359 {R367TER_RCFSPYDATA, 0x00},
360 {R367TER_RCFSPYOUT, 0x00},
361 {R367TER_RCFSTATUS, 0x00},
362 {R367TER_RCFGOODPACK, 0x00},
363 {R367TER_RCFPACKCNT, 0x00},
364 {R367TER_RCFSPYMISC, 0x00},
365 {R367TER_RCFBERCPT4, 0x00},
366 {R367TER_RCFBERCPT3, 0x00},
367 {R367TER_RCFBERCPT2, 0x00},
368 {R367TER_RCFBERCPT1, 0x00},
369 {R367TER_RCFBERCPT0, 0x00},
370 {R367TER_RCFBERERR2, 0x00},
371 {R367TER_RCFBERERR1, 0x00},
372 {R367TER_RCFBERERR0, 0x00},
373 {R367TER_RCFSTATESM, 0x00},
374 {R367TER_RCFSTATESL, 0x00},
375 {R367TER_RCFSPYBER, 0x00},
376 {R367TER_RCFSPYDISTM, 0x00},
377 {R367TER_RCFSPYDISTL, 0x00},
378 {R367TER_RCFSPYOBS7, 0x00},
379 {R367TER_RCFSPYOBS6, 0x00},
380 {R367TER_RCFSPYOBS5, 0x00},
381 {R367TER_RCFSPYOBS4, 0x00},
382 {R367TER_RCFSPYOBS3, 0x00},
383 {R367TER_RCFSPYOBS2, 0x00},
384 {R367TER_RCFSPYOBS1, 0x00},
385 {R367TER_RCFSPYOBS0, 0x00},
386 {R367TER_TSGENERAL, 0x00},
387 {R367TER_RC1SPEED, 0x6f},
388 {R367TER_TSGSTATUS, 0x18},
389 {R367TER_FECM, 0x01},
390 {R367TER_VTH12, 0xff},
391 {R367TER_VTH23, 0xa1},
392 {R367TER_VTH34, 0x64},
393 {R367TER_VTH56, 0x40},
394 {R367TER_VTH67, 0x00},
395 {R367TER_VTH78, 0x2c},
396 {R367TER_VITCURPUN, 0x12},
397 {R367TER_VERROR, 0x01},
398 {R367TER_PRVIT, 0x3f},
399 {R367TER_VAVSRVIT, 0x00},
400 {R367TER_VSTATUSVIT, 0xbd},
401 {R367TER_VTHINUSE, 0xa1},
402 {R367TER_KDIV12, 0x20},
403 {R367TER_KDIV23, 0x40},
404 {R367TER_KDIV34, 0x20},
405 {R367TER_KDIV56, 0x30},
406 {R367TER_KDIV67, 0x00},
407 {R367TER_KDIV78, 0x30},
408 {R367TER_SIGPOWER, 0x54},
409 {R367TER_DEMAPVIT, 0x40},
410 {R367TER_VITSCALE, 0x00},
411 {R367TER_FFEC1PRG, 0x00},
412 {R367TER_FVITCURPUN, 0x12},
413 {R367TER_FVERROR, 0x01},
414 {R367TER_FVSTATUSVIT, 0xbd},
415 {R367TER_DEBUG_LT1, 0x00},
416 {R367TER_DEBUG_LT2, 0x00},
417 {R367TER_DEBUG_LT3, 0x00},
418 {R367TER_TSTSFMET, 0x00},
419 {R367TER_SELOUT, 0x00},
420 {R367TER_TSYNC, 0x00},
421 {R367TER_TSTERR, 0x00},
422 {R367TER_TSFSYNC, 0x00},
423 {R367TER_TSTSFERR, 0x00},
424 {R367TER_TSTTSSF1, 0x01},
425 {R367TER_TSTTSSF2, 0x1f},
426 {R367TER_TSTTSSF3, 0x00},
427 {R367TER_TSTTS1, 0x00},
428 {R367TER_TSTTS2, 0x1f},
429 {R367TER_TSTTS3, 0x01},
430 {R367TER_TSTTS4, 0x00},
431 {R367TER_TSTTSRC, 0x00},
432 {R367TER_TSTTSRS, 0x00},
433 {R367TER_TSSTATEM, 0xb0},
434 {R367TER_TSSTATEL, 0x40},
435 {R367TER_TSCFGH, 0xC0},
436 {R367TER_TSCFGM, 0xc0},/* for xc5000; was 0x00 */
437 {R367TER_TSCFGL, 0x20},
438 {R367TER_TSSYNC, 0x00},
439 {R367TER_TSINSDELH, 0x00},
440 {R367TER_TSINSDELM, 0x00},
441 {R367TER_TSINSDELL, 0x00},
442 {R367TER_TSDIVN, 0x03},
443 {R367TER_TSDIVPM, 0x00},
444 {R367TER_TSDIVPL, 0x00},
445 {R367TER_TSDIVQM, 0x00},
446 {R367TER_TSDIVQL, 0x00},
447 {R367TER_TSDILSTKM, 0x00},
448 {R367TER_TSDILSTKL, 0x00},
449 {R367TER_TSSPEED, 0x40},/* for xc5000; was 0x6f */
450 {R367TER_TSSTATUS, 0x81},
451 {R367TER_TSSTATUS2, 0x6a},
452 {R367TER_TSBITRATEM, 0x0f},
453 {R367TER_TSBITRATEL, 0xc6},
454 {R367TER_TSPACKLENM, 0x00},
455 {R367TER_TSPACKLENL, 0xfc},
456 {R367TER_TSBLOCLENM, 0x0a},
457 {R367TER_TSBLOCLENL, 0x80},
458 {R367TER_TSDLYH, 0x90},
459 {R367TER_TSDLYM, 0x68},
460 {R367TER_TSDLYL, 0x01},
461 {R367TER_TSNPDAV, 0x00},
462 {R367TER_TSBUFSTATH, 0x00},
463 {R367TER_TSBUFSTATM, 0x00},
464 {R367TER_TSBUFSTATL, 0x00},
465 {R367TER_TSDEBUGM, 0xcf},
466 {R367TER_TSDEBUGL, 0x1e},
467 {R367TER_TSDLYSETH, 0x00},
468 {R367TER_TSDLYSETM, 0x68},
469 {R367TER_TSDLYSETL, 0x00},
470 {R367TER_TSOBSCFG, 0x00},
471 {R367TER_TSOBSM, 0x47},
472 {R367TER_TSOBSL, 0x1f},
473 {R367TER_ERRCTRL1, 0x95},
474 {R367TER_ERRCNT1H, 0x80},
475 {R367TER_ERRCNT1M, 0x00},
476 {R367TER_ERRCNT1L, 0x00},
477 {R367TER_ERRCTRL2, 0x95},
478 {R367TER_ERRCNT2H, 0x00},
479 {R367TER_ERRCNT2M, 0x00},
480 {R367TER_ERRCNT2L, 0x00},
481 {R367TER_FECSPY, 0x88},
482 {R367TER_FSPYCFG, 0x2c},
483 {R367TER_FSPYDATA, 0x3a},
484 {R367TER_FSPYOUT, 0x06},
485 {R367TER_FSTATUS, 0x61},
486 {R367TER_FGOODPACK, 0xff},
487 {R367TER_FPACKCNT, 0xff},
488 {R367TER_FSPYMISC, 0x66},
489 {R367TER_FBERCPT4, 0x00},
490 {R367TER_FBERCPT3, 0x00},
491 {R367TER_FBERCPT2, 0x36},
492 {R367TER_FBERCPT1, 0x36},
493 {R367TER_FBERCPT0, 0x14},
494 {R367TER_FBERERR2, 0x00},
495 {R367TER_FBERERR1, 0x03},
496 {R367TER_FBERERR0, 0x28},
497 {R367TER_FSTATESM, 0x00},
498 {R367TER_FSTATESL, 0x02},
499 {R367TER_FSPYBER, 0x00},
500 {R367TER_FSPYDISTM, 0x01},
501 {R367TER_FSPYDISTL, 0x9f},
502 {R367TER_FSPYOBS7, 0xc9},
503 {R367TER_FSPYOBS6, 0x99},
504 {R367TER_FSPYOBS5, 0x08},
505 {R367TER_FSPYOBS4, 0xec},
506 {R367TER_FSPYOBS3, 0x01},
507 {R367TER_FSPYOBS2, 0x0f},
508 {R367TER_FSPYOBS1, 0xf5},
509 {R367TER_FSPYOBS0, 0x08},
510 {R367TER_SFDEMAP, 0x40},
511 {R367TER_SFERROR, 0x00},
512 {R367TER_SFAVSR, 0x30},
513 {R367TER_SFECSTATUS, 0xcc},
514 {R367TER_SFKDIV12, 0x20},
515 {R367TER_SFKDIV23, 0x40},
516 {R367TER_SFKDIV34, 0x20},
517 {R367TER_SFKDIV56, 0x20},
518 {R367TER_SFKDIV67, 0x00},
519 {R367TER_SFKDIV78, 0x20},
520 {R367TER_SFDILSTKM, 0x00},
521 {R367TER_SFDILSTKL, 0x00},
522 {R367TER_SFSTATUS, 0xb5},
523 {R367TER_SFDLYH, 0x90},
524 {R367TER_SFDLYM, 0x60},
525 {R367TER_SFDLYL, 0x01},
526 {R367TER_SFDLYSETH, 0xc0},
527 {R367TER_SFDLYSETM, 0x60},
528 {R367TER_SFDLYSETL, 0x00},
529 {R367TER_SFOBSCFG, 0x00},
530 {R367TER_SFOBSM, 0x47},
531 {R367TER_SFOBSL, 0x05},
532 {R367TER_SFECINFO, 0x40},
533 {R367TER_SFERRCTRL, 0x74},
534 {R367TER_SFERRCNTH, 0x80},
535 {R367TER_SFERRCNTM , 0x00},
536 {R367TER_SFERRCNTL, 0x00},
537 {R367TER_SYMBRATEM, 0x2f},
538 {R367TER_SYMBRATEL, 0x50},
539 {R367TER_SYMBSTATUS, 0x7f},
540 {R367TER_SYMBCFG, 0x00},
541 {R367TER_SYMBFIFOM, 0xf4},
542 {R367TER_SYMBFIFOL, 0x0d},
543 {R367TER_SYMBOFFSM, 0xf0},
544 {R367TER_SYMBOFFSL, 0x2d},
545 {R367TER_DEBUG_LT4, 0x00},
546 {R367TER_DEBUG_LT5, 0x00},
547 {R367TER_DEBUG_LT6, 0x00},
548 {R367TER_DEBUG_LT7, 0x00},
549 {R367TER_DEBUG_LT8, 0x00},
550 {R367TER_DEBUG_LT9, 0x00},
553 #define RF_LOOKUP_TABLE_SIZE 31
554 #define RF_LOOKUP_TABLE2_SIZE 16
555 /* RF Level (for RF AGC->AGC1) Lookup Table, depends on the board and tuner.*/
556 static const s32 stv0367cab_RF_LookUp1[RF_LOOKUP_TABLE_SIZE][RF_LOOKUP_TABLE_SIZE] = {
557 {/*AGC1*/
558 48, 50, 51, 53, 54, 56, 57, 58, 60, 61, 62, 63,
559 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
560 76, 77, 78, 80, 83, 85, 88,
561 }, {/*RF(dbm)*/
562 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
563 34, 35, 36, 37, 38, 39, 41, 42, 43, 44, 46, 47,
564 49, 50, 52, 53, 54, 55, 56,
567 /* RF Level (for IF AGC->AGC2) Lookup Table, depends on the board and tuner.*/
568 static const s32 stv0367cab_RF_LookUp2[RF_LOOKUP_TABLE2_SIZE][RF_LOOKUP_TABLE2_SIZE] = {
569 {/*AGC2*/
570 28, 29, 31, 32, 34, 35, 36, 37,
571 38, 39, 40, 41, 42, 43, 44, 45,
572 }, {/*RF(dbm)*/
573 57, 58, 59, 60, 61, 62, 63, 64,
574 65, 66, 67, 68, 69, 70, 71, 72,
578 static struct st_register def0367cab[STV0367CAB_NBREGS] = {
579 {R367CAB_ID, 0x60},
580 {R367CAB_I2CRPT, 0xa0},
581 /*{R367CAB_I2CRPT, 0x22},*/
582 {R367CAB_TOPCTRL, 0x10},
583 {R367CAB_IOCFG0, 0x80},
584 {R367CAB_DAC0R, 0x00},
585 {R367CAB_IOCFG1, 0x00},
586 {R367CAB_DAC1R, 0x00},
587 {R367CAB_IOCFG2, 0x00},
588 {R367CAB_SDFR, 0x00},
589 {R367CAB_AUX_CLK, 0x00},
590 {R367CAB_FREESYS1, 0x00},
591 {R367CAB_FREESYS2, 0x00},
592 {R367CAB_FREESYS3, 0x00},
593 {R367CAB_GPIO_CFG, 0x55},
594 {R367CAB_GPIO_CMD, 0x01},
595 {R367CAB_TSTRES, 0x00},
596 {R367CAB_ANACTRL, 0x0d},/* was 0x00 need to check - I.M.L.*/
597 {R367CAB_TSTBUS, 0x00},
598 {R367CAB_RF_AGC1, 0xea},
599 {R367CAB_RF_AGC2, 0x82},
600 {R367CAB_ANADIGCTRL, 0x0b},
601 {R367CAB_PLLMDIV, 0x01},
602 {R367CAB_PLLNDIV, 0x08},
603 {R367CAB_PLLSETUP, 0x18},
604 {R367CAB_DUAL_AD12, 0x0C}, /* for xc5000 AGC voltage 1.6V */
605 {R367CAB_TSTBIST, 0x00},
606 {R367CAB_CTRL_1, 0x00},
607 {R367CAB_CTRL_2, 0x03},
608 {R367CAB_IT_STATUS1, 0x2b},
609 {R367CAB_IT_STATUS2, 0x08},
610 {R367CAB_IT_EN1, 0x00},
611 {R367CAB_IT_EN2, 0x00},
612 {R367CAB_CTRL_STATUS, 0x04},
613 {R367CAB_TEST_CTL, 0x00},
614 {R367CAB_AGC_CTL, 0x73},
615 {R367CAB_AGC_IF_CFG, 0x50},
616 {R367CAB_AGC_RF_CFG, 0x00},
617 {R367CAB_AGC_PWM_CFG, 0x03},
618 {R367CAB_AGC_PWR_REF_L, 0x5a},
619 {R367CAB_AGC_PWR_REF_H, 0x00},
620 {R367CAB_AGC_RF_TH_L, 0xff},
621 {R367CAB_AGC_RF_TH_H, 0x07},
622 {R367CAB_AGC_IF_LTH_L, 0x00},
623 {R367CAB_AGC_IF_LTH_H, 0x08},
624 {R367CAB_AGC_IF_HTH_L, 0xff},
625 {R367CAB_AGC_IF_HTH_H, 0x07},
626 {R367CAB_AGC_PWR_RD_L, 0xa0},
627 {R367CAB_AGC_PWR_RD_M, 0xe9},
628 {R367CAB_AGC_PWR_RD_H, 0x03},
629 {R367CAB_AGC_PWM_IFCMD_L, 0xe4},
630 {R367CAB_AGC_PWM_IFCMD_H, 0x00},
631 {R367CAB_AGC_PWM_RFCMD_L, 0xff},
632 {R367CAB_AGC_PWM_RFCMD_H, 0x07},
633 {R367CAB_IQDEM_CFG, 0x01},
634 {R367CAB_MIX_NCO_LL, 0x22},
635 {R367CAB_MIX_NCO_HL, 0x96},
636 {R367CAB_MIX_NCO_HH, 0x55},
637 {R367CAB_SRC_NCO_LL, 0xff},
638 {R367CAB_SRC_NCO_LH, 0x0c},
639 {R367CAB_SRC_NCO_HL, 0xf5},
640 {R367CAB_SRC_NCO_HH, 0x20},
641 {R367CAB_IQDEM_GAIN_SRC_L, 0x06},
642 {R367CAB_IQDEM_GAIN_SRC_H, 0x01},
643 {R367CAB_IQDEM_DCRM_CFG_LL, 0xfe},
644 {R367CAB_IQDEM_DCRM_CFG_LH, 0xff},
645 {R367CAB_IQDEM_DCRM_CFG_HL, 0x0f},
646 {R367CAB_IQDEM_DCRM_CFG_HH, 0x00},
647 {R367CAB_IQDEM_ADJ_COEFF0, 0x34},
648 {R367CAB_IQDEM_ADJ_COEFF1, 0xae},
649 {R367CAB_IQDEM_ADJ_COEFF2, 0x46},
650 {R367CAB_IQDEM_ADJ_COEFF3, 0x77},
651 {R367CAB_IQDEM_ADJ_COEFF4, 0x96},
652 {R367CAB_IQDEM_ADJ_COEFF5, 0x69},
653 {R367CAB_IQDEM_ADJ_COEFF6, 0xc7},
654 {R367CAB_IQDEM_ADJ_COEFF7, 0x01},
655 {R367CAB_IQDEM_ADJ_EN, 0x04},
656 {R367CAB_IQDEM_ADJ_AGC_REF, 0x94},
657 {R367CAB_ALLPASSFILT1, 0xc9},
658 {R367CAB_ALLPASSFILT2, 0x2d},
659 {R367CAB_ALLPASSFILT3, 0xa3},
660 {R367CAB_ALLPASSFILT4, 0xfb},
661 {R367CAB_ALLPASSFILT5, 0xf6},
662 {R367CAB_ALLPASSFILT6, 0x45},
663 {R367CAB_ALLPASSFILT7, 0x6f},
664 {R367CAB_ALLPASSFILT8, 0x7e},
665 {R367CAB_ALLPASSFILT9, 0x05},
666 {R367CAB_ALLPASSFILT10, 0x0a},
667 {R367CAB_ALLPASSFILT11, 0x51},
668 {R367CAB_TRL_AGC_CFG, 0x20},
669 {R367CAB_TRL_LPF_CFG, 0x28},
670 {R367CAB_TRL_LPF_ACQ_GAIN, 0x44},
671 {R367CAB_TRL_LPF_TRK_GAIN, 0x22},
672 {R367CAB_TRL_LPF_OUT_GAIN, 0x03},
673 {R367CAB_TRL_LOCKDET_LTH, 0x04},
674 {R367CAB_TRL_LOCKDET_HTH, 0x11},
675 {R367CAB_TRL_LOCKDET_TRGVAL, 0x20},
676 {R367CAB_IQ_QAM, 0x01},
677 {R367CAB_FSM_STATE, 0xa0},
678 {R367CAB_FSM_CTL, 0x08},
679 {R367CAB_FSM_STS, 0x0c},
680 {R367CAB_FSM_SNR0_HTH, 0x00},
681 {R367CAB_FSM_SNR1_HTH, 0x00},
682 {R367CAB_FSM_SNR2_HTH, 0x23},/* 0x00 */
683 {R367CAB_FSM_SNR0_LTH, 0x00},
684 {R367CAB_FSM_SNR1_LTH, 0x00},
685 {R367CAB_FSM_EQA1_HTH, 0x00},
686 {R367CAB_FSM_TEMPO, 0x32},
687 {R367CAB_FSM_CONFIG, 0x03},
688 {R367CAB_EQU_I_TESTTAP_L, 0x11},
689 {R367CAB_EQU_I_TESTTAP_M, 0x00},
690 {R367CAB_EQU_I_TESTTAP_H, 0x00},
691 {R367CAB_EQU_TESTAP_CFG, 0x00},
692 {R367CAB_EQU_Q_TESTTAP_L, 0xff},
693 {R367CAB_EQU_Q_TESTTAP_M, 0x00},
694 {R367CAB_EQU_Q_TESTTAP_H, 0x00},
695 {R367CAB_EQU_TAP_CTRL, 0x00},
696 {R367CAB_EQU_CTR_CRL_CONTROL_L, 0x11},
697 {R367CAB_EQU_CTR_CRL_CONTROL_H, 0x05},
698 {R367CAB_EQU_CTR_HIPOW_L, 0x00},
699 {R367CAB_EQU_CTR_HIPOW_H, 0x00},
700 {R367CAB_EQU_I_EQU_LO, 0xef},
701 {R367CAB_EQU_I_EQU_HI, 0x00},
702 {R367CAB_EQU_Q_EQU_LO, 0xee},
703 {R367CAB_EQU_Q_EQU_HI, 0x00},
704 {R367CAB_EQU_MAPPER, 0xc5},
705 {R367CAB_EQU_SWEEP_RATE, 0x80},
706 {R367CAB_EQU_SNR_LO, 0x64},
707 {R367CAB_EQU_SNR_HI, 0x03},
708 {R367CAB_EQU_GAMMA_LO, 0x00},
709 {R367CAB_EQU_GAMMA_HI, 0x00},
710 {R367CAB_EQU_ERR_GAIN, 0x36},
711 {R367CAB_EQU_RADIUS, 0xaa},
712 {R367CAB_EQU_FFE_MAINTAP, 0x00},
713 {R367CAB_EQU_FFE_LEAKAGE, 0x63},
714 {R367CAB_EQU_FFE_MAINTAP_POS, 0xdf},
715 {R367CAB_EQU_GAIN_WIDE, 0x88},
716 {R367CAB_EQU_GAIN_NARROW, 0x41},
717 {R367CAB_EQU_CTR_LPF_GAIN, 0xd1},
718 {R367CAB_EQU_CRL_LPF_GAIN, 0xa7},
719 {R367CAB_EQU_GLOBAL_GAIN, 0x06},
720 {R367CAB_EQU_CRL_LD_SEN, 0x85},
721 {R367CAB_EQU_CRL_LD_VAL, 0xe2},
722 {R367CAB_EQU_CRL_TFR, 0x20},
723 {R367CAB_EQU_CRL_BISTH_LO, 0x00},
724 {R367CAB_EQU_CRL_BISTH_HI, 0x00},
725 {R367CAB_EQU_SWEEP_RANGE_LO, 0x00},
726 {R367CAB_EQU_SWEEP_RANGE_HI, 0x00},
727 {R367CAB_EQU_CRL_LIMITER, 0x40},
728 {R367CAB_EQU_MODULUS_MAP, 0x90},
729 {R367CAB_EQU_PNT_GAIN, 0xa7},
730 {R367CAB_FEC_AC_CTR_0, 0x16},
731 {R367CAB_FEC_AC_CTR_1, 0x0b},
732 {R367CAB_FEC_AC_CTR_2, 0x88},
733 {R367CAB_FEC_AC_CTR_3, 0x02},
734 {R367CAB_FEC_STATUS, 0x12},
735 {R367CAB_RS_COUNTER_0, 0x7d},
736 {R367CAB_RS_COUNTER_1, 0xd0},
737 {R367CAB_RS_COUNTER_2, 0x19},
738 {R367CAB_RS_COUNTER_3, 0x0b},
739 {R367CAB_RS_COUNTER_4, 0xa3},
740 {R367CAB_RS_COUNTER_5, 0x00},
741 {R367CAB_BERT_0, 0x01},
742 {R367CAB_BERT_1, 0x25},
743 {R367CAB_BERT_2, 0x41},
744 {R367CAB_BERT_3, 0x39},
745 {R367CAB_OUTFORMAT_0, 0xc2},
746 {R367CAB_OUTFORMAT_1, 0x22},
747 {R367CAB_SMOOTHER_2, 0x28},
748 {R367CAB_TSMF_CTRL_0, 0x01},
749 {R367CAB_TSMF_CTRL_1, 0xc6},
750 {R367CAB_TSMF_CTRL_3, 0x43},
751 {R367CAB_TS_ON_ID_0, 0x00},
752 {R367CAB_TS_ON_ID_1, 0x00},
753 {R367CAB_TS_ON_ID_2, 0x00},
754 {R367CAB_TS_ON_ID_3, 0x00},
755 {R367CAB_RE_STATUS_0, 0x00},
756 {R367CAB_RE_STATUS_1, 0x00},
757 {R367CAB_RE_STATUS_2, 0x00},
758 {R367CAB_RE_STATUS_3, 0x00},
759 {R367CAB_TS_STATUS_0, 0x00},
760 {R367CAB_TS_STATUS_1, 0x00},
761 {R367CAB_TS_STATUS_2, 0xa0},
762 {R367CAB_TS_STATUS_3, 0x00},
763 {R367CAB_T_O_ID_0, 0x00},
764 {R367CAB_T_O_ID_1, 0x00},
765 {R367CAB_T_O_ID_2, 0x00},
766 {R367CAB_T_O_ID_3, 0x00},
769 static
770 int stv0367_writeregs(struct stv0367_state *state, u16 reg, u8 *data, int len)
772 u8 buf[MAX_XFER_SIZE];
773 struct i2c_msg msg = {
774 .addr = state->config->demod_address,
775 .flags = 0,
776 .buf = buf,
777 .len = len + 2
779 int ret;
781 if (2 + len > sizeof(buf)) {
782 printk(KERN_WARNING
783 "%s: i2c wr reg=%04x: len=%d is too big!\n",
784 KBUILD_MODNAME, reg, len);
785 return -EINVAL;
789 buf[0] = MSB(reg);
790 buf[1] = LSB(reg);
791 memcpy(buf + 2, data, len);
793 if (i2cdebug)
794 printk(KERN_DEBUG "%s: [%02x] %02x: %02x\n", __func__,
795 state->config->demod_address, reg, buf[2]);
797 ret = i2c_transfer(state->i2c, &msg, 1);
798 if (ret != 1)
799 printk(KERN_ERR "%s: i2c write error! ([%02x] %02x: %02x)\n",
800 __func__, state->config->demod_address, reg, buf[2]);
802 return (ret != 1) ? -EREMOTEIO : 0;
805 static int stv0367_writereg(struct stv0367_state *state, u16 reg, u8 data)
807 return stv0367_writeregs(state, reg, &data, 1);
810 static u8 stv0367_readreg(struct stv0367_state *state, u16 reg)
812 u8 b0[] = { 0, 0 };
813 u8 b1[] = { 0 };
814 struct i2c_msg msg[] = {
816 .addr = state->config->demod_address,
817 .flags = 0,
818 .buf = b0,
819 .len = 2
820 }, {
821 .addr = state->config->demod_address,
822 .flags = I2C_M_RD,
823 .buf = b1,
824 .len = 1
827 int ret;
829 b0[0] = MSB(reg);
830 b0[1] = LSB(reg);
832 ret = i2c_transfer(state->i2c, msg, 2);
833 if (ret != 2)
834 printk(KERN_ERR "%s: i2c read error ([%02x] %02x: %02x)\n",
835 __func__, state->config->demod_address, reg, b1[0]);
837 if (i2cdebug)
838 printk(KERN_DEBUG "%s: [%02x] %02x: %02x\n", __func__,
839 state->config->demod_address, reg, b1[0]);
841 return b1[0];
844 static void extract_mask_pos(u32 label, u8 *mask, u8 *pos)
846 u8 position = 0, i = 0;
848 (*mask) = label & 0xff;
850 while ((position == 0) && (i < 8)) {
851 position = ((*mask) >> i) & 0x01;
852 i++;
855 (*pos) = (i - 1);
858 static void stv0367_writebits(struct stv0367_state *state, u32 label, u8 val)
860 u8 reg, mask, pos;
862 reg = stv0367_readreg(state, (label >> 16) & 0xffff);
863 extract_mask_pos(label, &mask, &pos);
865 val = mask & (val << pos);
867 reg = (reg & (~mask)) | val;
868 stv0367_writereg(state, (label >> 16) & 0xffff, reg);
872 static void stv0367_setbits(u8 *reg, u32 label, u8 val)
874 u8 mask, pos;
876 extract_mask_pos(label, &mask, &pos);
878 val = mask & (val << pos);
880 (*reg) = ((*reg) & (~mask)) | val;
883 static u8 stv0367_readbits(struct stv0367_state *state, u32 label)
885 u8 val = 0xff;
886 u8 mask, pos;
888 extract_mask_pos(label, &mask, &pos);
890 val = stv0367_readreg(state, label >> 16);
891 val = (val & mask) >> pos;
893 return val;
896 #if 0 /* Currently, unused */
897 static u8 stv0367_getbits(u8 reg, u32 label)
899 u8 mask, pos;
901 extract_mask_pos(label, &mask, &pos);
903 return (reg & mask) >> pos;
905 #endif
906 static int stv0367ter_gate_ctrl(struct dvb_frontend *fe, int enable)
908 struct stv0367_state *state = fe->demodulator_priv;
909 u8 tmp = stv0367_readreg(state, R367TER_I2CRPT);
911 dprintk("%s:\n", __func__);
913 if (enable) {
914 stv0367_setbits(&tmp, F367TER_STOP_ENABLE, 0);
915 stv0367_setbits(&tmp, F367TER_I2CT_ON, 1);
916 } else {
917 stv0367_setbits(&tmp, F367TER_STOP_ENABLE, 1);
918 stv0367_setbits(&tmp, F367TER_I2CT_ON, 0);
921 stv0367_writereg(state, R367TER_I2CRPT, tmp);
923 return 0;
926 static u32 stv0367_get_tuner_freq(struct dvb_frontend *fe)
928 struct dvb_frontend_ops *frontend_ops = &fe->ops;
929 struct dvb_tuner_ops *tuner_ops = &frontend_ops->tuner_ops;
930 u32 freq = 0;
931 int err = 0;
933 dprintk("%s:\n", __func__);
935 if (tuner_ops->get_frequency) {
936 err = tuner_ops->get_frequency(fe, &freq);
937 if (err < 0) {
938 printk(KERN_ERR "%s: Invalid parameter\n", __func__);
939 return err;
942 dprintk("%s: frequency=%d\n", __func__, freq);
944 } else
945 return -1;
947 return freq;
950 static u16 CellsCoeffs_8MHz_367cofdm[3][6][5] = {
952 {0x10EF, 0xE205, 0x10EF, 0xCE49, 0x6DA7}, /* CELL 1 COEFFS 27M*/
953 {0x2151, 0xc557, 0x2151, 0xc705, 0x6f93}, /* CELL 2 COEFFS */
954 {0x2503, 0xc000, 0x2503, 0xc375, 0x7194}, /* CELL 3 COEFFS */
955 {0x20E9, 0xca94, 0x20e9, 0xc153, 0x7194}, /* CELL 4 COEFFS */
956 {0x06EF, 0xF852, 0x06EF, 0xC057, 0x7207}, /* CELL 5 COEFFS */
957 {0x0000, 0x0ECC, 0x0ECC, 0x0000, 0x3647} /* CELL 6 COEFFS */
958 }, {
959 {0x10A0, 0xE2AF, 0x10A1, 0xCE76, 0x6D6D}, /* CELL 1 COEFFS 25M*/
960 {0x20DC, 0xC676, 0x20D9, 0xC80A, 0x6F29},
961 {0x2532, 0xC000, 0x251D, 0xC391, 0x706F},
962 {0x1F7A, 0xCD2B, 0x2032, 0xC15E, 0x711F},
963 {0x0698, 0xFA5E, 0x0568, 0xC059, 0x7193},
964 {0x0000, 0x0918, 0x149C, 0x0000, 0x3642} /* CELL 6 COEFFS */
965 }, {
966 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, /* 30M */
967 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
968 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
969 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
970 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
971 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000}
975 static u16 CellsCoeffs_7MHz_367cofdm[3][6][5] = {
977 {0x12CA, 0xDDAF, 0x12CA, 0xCCEB, 0x6FB1}, /* CELL 1 COEFFS 27M*/
978 {0x2329, 0xC000, 0x2329, 0xC6B0, 0x725F}, /* CELL 2 COEFFS */
979 {0x2394, 0xC000, 0x2394, 0xC2C7, 0x7410}, /* CELL 3 COEFFS */
980 {0x251C, 0xC000, 0x251C, 0xC103, 0x74D9}, /* CELL 4 COEFFS */
981 {0x0804, 0xF546, 0x0804, 0xC040, 0x7544}, /* CELL 5 COEFFS */
982 {0x0000, 0x0CD9, 0x0CD9, 0x0000, 0x370A} /* CELL 6 COEFFS */
983 }, {
984 {0x1285, 0xDE47, 0x1285, 0xCD17, 0x6F76}, /*25M*/
985 {0x234C, 0xC000, 0x2348, 0xC6DA, 0x7206},
986 {0x23B4, 0xC000, 0x23AC, 0xC2DB, 0x73B3},
987 {0x253D, 0xC000, 0x25B6, 0xC10B, 0x747F},
988 {0x0721, 0xF79C, 0x065F, 0xC041, 0x74EB},
989 {0x0000, 0x08FA, 0x1162, 0x0000, 0x36FF}
990 }, {
991 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, /* 30M */
992 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
993 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
994 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
995 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
996 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000}
1000 static u16 CellsCoeffs_6MHz_367cofdm[3][6][5] = {
1002 {0x1699, 0xD5B8, 0x1699, 0xCBC3, 0x713B}, /* CELL 1 COEFFS 27M*/
1003 {0x2245, 0xC000, 0x2245, 0xC568, 0x74D5}, /* CELL 2 COEFFS */
1004 {0x227F, 0xC000, 0x227F, 0xC1FC, 0x76C6}, /* CELL 3 COEFFS */
1005 {0x235E, 0xC000, 0x235E, 0xC0A7, 0x778A}, /* CELL 4 COEFFS */
1006 {0x0ECB, 0xEA0B, 0x0ECB, 0xC027, 0x77DD}, /* CELL 5 COEFFS */
1007 {0x0000, 0x0B68, 0x0B68, 0x0000, 0xC89A}, /* CELL 6 COEFFS */
1008 }, {
1009 {0x1655, 0xD64E, 0x1658, 0xCBEF, 0x70FE}, /*25M*/
1010 {0x225E, 0xC000, 0x2256, 0xC589, 0x7489},
1011 {0x2293, 0xC000, 0x2295, 0xC209, 0x767E},
1012 {0x2377, 0xC000, 0x23AA, 0xC0AB, 0x7746},
1013 {0x0DC7, 0xEBC8, 0x0D07, 0xC027, 0x7799},
1014 {0x0000, 0x0888, 0x0E9C, 0x0000, 0x3757}
1016 }, {
1017 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, /* 30M */
1018 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1019 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1020 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1021 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000},
1022 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000}
1026 static u32 stv0367ter_get_mclk(struct stv0367_state *state, u32 ExtClk_Hz)
1028 u32 mclk_Hz = 0; /* master clock frequency (Hz) */
1029 u32 m, n, p;
1031 dprintk("%s:\n", __func__);
1033 if (stv0367_readbits(state, F367TER_BYPASS_PLLXN) == 0) {
1034 n = (u32)stv0367_readbits(state, F367TER_PLL_NDIV);
1035 if (n == 0)
1036 n = n + 1;
1038 m = (u32)stv0367_readbits(state, F367TER_PLL_MDIV);
1039 if (m == 0)
1040 m = m + 1;
1042 p = (u32)stv0367_readbits(state, F367TER_PLL_PDIV);
1043 if (p > 5)
1044 p = 5;
1046 mclk_Hz = ((ExtClk_Hz / 2) * n) / (m * (1 << p));
1048 dprintk("N=%d M=%d P=%d mclk_Hz=%d ExtClk_Hz=%d\n",
1049 n, m, p, mclk_Hz, ExtClk_Hz);
1050 } else
1051 mclk_Hz = ExtClk_Hz;
1053 dprintk("%s: mclk_Hz=%d\n", __func__, mclk_Hz);
1055 return mclk_Hz;
1058 static int stv0367ter_filt_coeff_init(struct stv0367_state *state,
1059 u16 CellsCoeffs[3][6][5], u32 DemodXtal)
1061 int i, j, k, freq;
1063 dprintk("%s:\n", __func__);
1065 freq = stv0367ter_get_mclk(state, DemodXtal);
1067 if (freq == 53125000)
1068 k = 1; /* equivalent to Xtal 25M on 362*/
1069 else if (freq == 54000000)
1070 k = 0; /* equivalent to Xtal 27M on 362*/
1071 else if (freq == 52500000)
1072 k = 2; /* equivalent to Xtal 30M on 362*/
1073 else
1074 return 0;
1076 for (i = 1; i <= 6; i++) {
1077 stv0367_writebits(state, F367TER_IIR_CELL_NB, i - 1);
1079 for (j = 1; j <= 5; j++) {
1080 stv0367_writereg(state,
1081 (R367TER_IIRCX_COEFF1_MSB + 2 * (j - 1)),
1082 MSB(CellsCoeffs[k][i-1][j-1]));
1083 stv0367_writereg(state,
1084 (R367TER_IIRCX_COEFF1_LSB + 2 * (j - 1)),
1085 LSB(CellsCoeffs[k][i-1][j-1]));
1089 return 1;
1093 static void stv0367ter_agc_iir_lock_detect_set(struct stv0367_state *state)
1095 dprintk("%s:\n", __func__);
1097 stv0367_writebits(state, F367TER_LOCK_DETECT_LSB, 0x00);
1099 /* Lock detect 1 */
1100 stv0367_writebits(state, F367TER_LOCK_DETECT_CHOICE, 0x00);
1101 stv0367_writebits(state, F367TER_LOCK_DETECT_MSB, 0x06);
1102 stv0367_writebits(state, F367TER_AUT_AGC_TARGET_LSB, 0x04);
1104 /* Lock detect 2 */
1105 stv0367_writebits(state, F367TER_LOCK_DETECT_CHOICE, 0x01);
1106 stv0367_writebits(state, F367TER_LOCK_DETECT_MSB, 0x06);
1107 stv0367_writebits(state, F367TER_AUT_AGC_TARGET_LSB, 0x04);
1109 /* Lock detect 3 */
1110 stv0367_writebits(state, F367TER_LOCK_DETECT_CHOICE, 0x02);
1111 stv0367_writebits(state, F367TER_LOCK_DETECT_MSB, 0x01);
1112 stv0367_writebits(state, F367TER_AUT_AGC_TARGET_LSB, 0x00);
1114 /* Lock detect 4 */
1115 stv0367_writebits(state, F367TER_LOCK_DETECT_CHOICE, 0x03);
1116 stv0367_writebits(state, F367TER_LOCK_DETECT_MSB, 0x01);
1117 stv0367_writebits(state, F367TER_AUT_AGC_TARGET_LSB, 0x00);
1121 static int stv0367_iir_filt_init(struct stv0367_state *state, u8 Bandwidth,
1122 u32 DemodXtalValue)
1124 dprintk("%s:\n", __func__);
1126 stv0367_writebits(state, F367TER_NRST_IIR, 0);
1128 switch (Bandwidth) {
1129 case 6:
1130 if (!stv0367ter_filt_coeff_init(state,
1131 CellsCoeffs_6MHz_367cofdm,
1132 DemodXtalValue))
1133 return 0;
1134 break;
1135 case 7:
1136 if (!stv0367ter_filt_coeff_init(state,
1137 CellsCoeffs_7MHz_367cofdm,
1138 DemodXtalValue))
1139 return 0;
1140 break;
1141 case 8:
1142 if (!stv0367ter_filt_coeff_init(state,
1143 CellsCoeffs_8MHz_367cofdm,
1144 DemodXtalValue))
1145 return 0;
1146 break;
1147 default:
1148 return 0;
1151 stv0367_writebits(state, F367TER_NRST_IIR, 1);
1153 return 1;
1156 static void stv0367ter_agc_iir_rst(struct stv0367_state *state)
1159 u8 com_n;
1161 dprintk("%s:\n", __func__);
1163 com_n = stv0367_readbits(state, F367TER_COM_N);
1165 stv0367_writebits(state, F367TER_COM_N, 0x07);
1167 stv0367_writebits(state, F367TER_COM_SOFT_RSTN, 0x00);
1168 stv0367_writebits(state, F367TER_COM_AGC_ON, 0x00);
1170 stv0367_writebits(state, F367TER_COM_SOFT_RSTN, 0x01);
1171 stv0367_writebits(state, F367TER_COM_AGC_ON, 0x01);
1173 stv0367_writebits(state, F367TER_COM_N, com_n);
1177 static int stv0367ter_duration(s32 mode, int tempo1, int tempo2, int tempo3)
1179 int local_tempo = 0;
1180 switch (mode) {
1181 case 0:
1182 local_tempo = tempo1;
1183 break;
1184 case 1:
1185 local_tempo = tempo2;
1186 break ;
1188 case 2:
1189 local_tempo = tempo3;
1190 break;
1192 default:
1193 break;
1195 /* msleep(local_tempo); */
1196 return local_tempo;
1199 static enum
1200 stv0367_ter_signal_type stv0367ter_check_syr(struct stv0367_state *state)
1202 int wd = 100;
1203 unsigned short int SYR_var;
1204 s32 SYRStatus;
1206 dprintk("%s:\n", __func__);
1208 SYR_var = stv0367_readbits(state, F367TER_SYR_LOCK);
1210 while ((!SYR_var) && (wd > 0)) {
1211 usleep_range(2000, 3000);
1212 wd -= 2;
1213 SYR_var = stv0367_readbits(state, F367TER_SYR_LOCK);
1216 if (!SYR_var)
1217 SYRStatus = FE_TER_NOSYMBOL;
1218 else
1219 SYRStatus = FE_TER_SYMBOLOK;
1221 dprintk("stv0367ter_check_syr SYRStatus %s\n",
1222 SYR_var == 0 ? "No Symbol" : "OK");
1224 return SYRStatus;
1227 static enum
1228 stv0367_ter_signal_type stv0367ter_check_cpamp(struct stv0367_state *state,
1229 s32 FFTmode)
1232 s32 CPAMPvalue = 0, CPAMPStatus, CPAMPMin;
1233 int wd = 0;
1235 dprintk("%s:\n", __func__);
1237 switch (FFTmode) {
1238 case 0: /*2k mode*/
1239 CPAMPMin = 20;
1240 wd = 10;
1241 break;
1242 case 1: /*8k mode*/
1243 CPAMPMin = 80;
1244 wd = 55;
1245 break;
1246 case 2: /*4k mode*/
1247 CPAMPMin = 40;
1248 wd = 30;
1249 break;
1250 default:
1251 CPAMPMin = 0xffff; /*drives to NOCPAMP */
1252 break;
1255 dprintk("%s: CPAMPMin=%d wd=%d\n", __func__, CPAMPMin, wd);
1257 CPAMPvalue = stv0367_readbits(state, F367TER_PPM_CPAMP_DIRECT);
1258 while ((CPAMPvalue < CPAMPMin) && (wd > 0)) {
1259 usleep_range(1000, 2000);
1260 wd -= 1;
1261 CPAMPvalue = stv0367_readbits(state, F367TER_PPM_CPAMP_DIRECT);
1262 /*dprintk("CPAMPvalue= %d at wd=%d\n",CPAMPvalue,wd); */
1264 dprintk("******last CPAMPvalue= %d at wd=%d\n", CPAMPvalue, wd);
1265 if (CPAMPvalue < CPAMPMin) {
1266 CPAMPStatus = FE_TER_NOCPAMP;
1267 printk(KERN_ERR "CPAMP failed\n");
1268 } else {
1269 printk(KERN_ERR "CPAMP OK !\n");
1270 CPAMPStatus = FE_TER_CPAMPOK;
1273 return CPAMPStatus;
1276 static enum stv0367_ter_signal_type
1277 stv0367ter_lock_algo(struct stv0367_state *state)
1279 enum stv0367_ter_signal_type ret_flag;
1280 short int wd, tempo;
1281 u8 try, u_var1 = 0, u_var2 = 0, u_var3 = 0, u_var4 = 0, mode, guard;
1282 u8 tmp, tmp2;
1284 dprintk("%s:\n", __func__);
1286 if (state == NULL)
1287 return FE_TER_SWNOK;
1289 try = 0;
1290 do {
1291 ret_flag = FE_TER_LOCKOK;
1293 stv0367_writebits(state, F367TER_CORE_ACTIVE, 0);
1295 if (state->config->if_iq_mode != 0)
1296 stv0367_writebits(state, F367TER_COM_N, 0x07);
1298 stv0367_writebits(state, F367TER_GUARD, 3);/* suggest 2k 1/4 */
1299 stv0367_writebits(state, F367TER_MODE, 0);
1300 stv0367_writebits(state, F367TER_SYR_TR_DIS, 0);
1301 usleep_range(5000, 10000);
1303 stv0367_writebits(state, F367TER_CORE_ACTIVE, 1);
1306 if (stv0367ter_check_syr(state) == FE_TER_NOSYMBOL)
1307 return FE_TER_NOSYMBOL;
1308 else { /*
1309 if chip locked on wrong mode first try,
1310 it must lock correctly second try */
1311 mode = stv0367_readbits(state, F367TER_SYR_MODE);
1312 if (stv0367ter_check_cpamp(state, mode) ==
1313 FE_TER_NOCPAMP) {
1314 if (try == 0)
1315 ret_flag = FE_TER_NOCPAMP;
1320 try++;
1321 } while ((try < 10) && (ret_flag != FE_TER_LOCKOK));
1323 tmp = stv0367_readreg(state, R367TER_SYR_STAT);
1324 tmp2 = stv0367_readreg(state, R367TER_STATUS);
1325 dprintk("state=%p\n", state);
1326 dprintk("LOCK OK! mode=%d SYR_STAT=0x%x R367TER_STATUS=0x%x\n",
1327 mode, tmp, tmp2);
1329 tmp = stv0367_readreg(state, R367TER_PRVIT);
1330 tmp2 = stv0367_readreg(state, R367TER_I2CRPT);
1331 dprintk("PRVIT=0x%x I2CRPT=0x%x\n", tmp, tmp2);
1333 tmp = stv0367_readreg(state, R367TER_GAIN_SRC1);
1334 dprintk("GAIN_SRC1=0x%x\n", tmp);
1336 if ((mode != 0) && (mode != 1) && (mode != 2))
1337 return FE_TER_SWNOK;
1339 /*guard=stv0367_readbits(state,F367TER_SYR_GUARD); */
1341 /*suppress EPQ auto for SYR_GARD 1/16 or 1/32
1342 and set channel predictor in automatic */
1343 #if 0
1344 switch (guard) {
1346 case 0:
1347 case 1:
1348 stv0367_writebits(state, F367TER_AUTO_LE_EN, 0);
1349 stv0367_writereg(state, R367TER_CHC_CTL, 0x01);
1350 break;
1351 case 2:
1352 case 3:
1353 stv0367_writebits(state, F367TER_AUTO_LE_EN, 1);
1354 stv0367_writereg(state, R367TER_CHC_CTL, 0x11);
1355 break;
1357 default:
1358 return FE_TER_SWNOK;
1360 #endif
1362 /*reset fec an reedsolo FOR 367 only*/
1363 stv0367_writebits(state, F367TER_RST_SFEC, 1);
1364 stv0367_writebits(state, F367TER_RST_REEDSOLO, 1);
1365 usleep_range(1000, 2000);
1366 stv0367_writebits(state, F367TER_RST_SFEC, 0);
1367 stv0367_writebits(state, F367TER_RST_REEDSOLO, 0);
1369 u_var1 = stv0367_readbits(state, F367TER_LK);
1370 u_var2 = stv0367_readbits(state, F367TER_PRF);
1371 u_var3 = stv0367_readbits(state, F367TER_TPS_LOCK);
1372 /* u_var4=stv0367_readbits(state,F367TER_TSFIFO_LINEOK); */
1374 wd = stv0367ter_duration(mode, 125, 500, 250);
1375 tempo = stv0367ter_duration(mode, 4, 16, 8);
1377 /*while ( ((!u_var1)||(!u_var2)||(!u_var3)||(!u_var4)) && (wd>=0)) */
1378 while (((!u_var1) || (!u_var2) || (!u_var3)) && (wd >= 0)) {
1379 usleep_range(1000 * tempo, 1000 * (tempo + 1));
1380 wd -= tempo;
1381 u_var1 = stv0367_readbits(state, F367TER_LK);
1382 u_var2 = stv0367_readbits(state, F367TER_PRF);
1383 u_var3 = stv0367_readbits(state, F367TER_TPS_LOCK);
1384 /*u_var4=stv0367_readbits(state, F367TER_TSFIFO_LINEOK); */
1387 if (!u_var1)
1388 return FE_TER_NOLOCK;
1391 if (!u_var2)
1392 return FE_TER_NOPRFOUND;
1394 if (!u_var3)
1395 return FE_TER_NOTPS;
1397 guard = stv0367_readbits(state, F367TER_SYR_GUARD);
1398 stv0367_writereg(state, R367TER_CHC_CTL, 0x11);
1399 switch (guard) {
1400 case 0:
1401 case 1:
1402 stv0367_writebits(state, F367TER_AUTO_LE_EN, 0);
1403 /*stv0367_writereg(state,R367TER_CHC_CTL, 0x1);*/
1404 stv0367_writebits(state, F367TER_SYR_FILTER, 0);
1405 break;
1406 case 2:
1407 case 3:
1408 stv0367_writebits(state, F367TER_AUTO_LE_EN, 1);
1409 /*stv0367_writereg(state,R367TER_CHC_CTL, 0x11);*/
1410 stv0367_writebits(state, F367TER_SYR_FILTER, 1);
1411 break;
1413 default:
1414 return FE_TER_SWNOK;
1417 /* apply Sfec workaround if 8K 64QAM CR!=1/2*/
1418 if ((stv0367_readbits(state, F367TER_TPS_CONST) == 2) &&
1419 (mode == 1) &&
1420 (stv0367_readbits(state, F367TER_TPS_HPCODE) != 0)) {
1421 stv0367_writereg(state, R367TER_SFDLYSETH, 0xc0);
1422 stv0367_writereg(state, R367TER_SFDLYSETM, 0x60);
1423 stv0367_writereg(state, R367TER_SFDLYSETL, 0x0);
1424 } else
1425 stv0367_writereg(state, R367TER_SFDLYSETH, 0x0);
1427 wd = stv0367ter_duration(mode, 125, 500, 250);
1428 u_var4 = stv0367_readbits(state, F367TER_TSFIFO_LINEOK);
1430 while ((!u_var4) && (wd >= 0)) {
1431 usleep_range(1000 * tempo, 1000 * (tempo + 1));
1432 wd -= tempo;
1433 u_var4 = stv0367_readbits(state, F367TER_TSFIFO_LINEOK);
1436 if (!u_var4)
1437 return FE_TER_NOLOCK;
1439 /* for 367 leave COM_N at 0x7 for IQ_mode*/
1440 /*if(ter_state->if_iq_mode!=FE_TER_NORMAL_IF_TUNER) {
1441 tempo=0;
1442 while ((stv0367_readbits(state,F367TER_COM_USEGAINTRK)!=1) &&
1443 (stv0367_readbits(state,F367TER_COM_AGCLOCK)!=1)&&(tempo<100)) {
1444 ChipWaitOrAbort(state,1);
1445 tempo+=1;
1448 stv0367_writebits(state,F367TER_COM_N,0x17);
1449 } */
1451 stv0367_writebits(state, F367TER_SYR_TR_DIS, 1);
1453 dprintk("FE_TER_LOCKOK !!!\n");
1455 return FE_TER_LOCKOK;
1459 static void stv0367ter_set_ts_mode(struct stv0367_state *state,
1460 enum stv0367_ts_mode PathTS)
1463 dprintk("%s:\n", __func__);
1465 if (state == NULL)
1466 return;
1468 stv0367_writebits(state, F367TER_TS_DIS, 0);
1469 switch (PathTS) {
1470 default:
1471 /*for removing warning :default we can assume in parallel mode*/
1472 case STV0367_PARALLEL_PUNCT_CLOCK:
1473 stv0367_writebits(state, F367TER_TSFIFO_SERIAL, 0);
1474 stv0367_writebits(state, F367TER_TSFIFO_DVBCI, 0);
1475 break;
1476 case STV0367_SERIAL_PUNCT_CLOCK:
1477 stv0367_writebits(state, F367TER_TSFIFO_SERIAL, 1);
1478 stv0367_writebits(state, F367TER_TSFIFO_DVBCI, 1);
1479 break;
1483 static void stv0367ter_set_clk_pol(struct stv0367_state *state,
1484 enum stv0367_clk_pol clock)
1487 dprintk("%s:\n", __func__);
1489 if (state == NULL)
1490 return;
1492 switch (clock) {
1493 case STV0367_RISINGEDGE_CLOCK:
1494 stv0367_writebits(state, F367TER_TS_BYTE_CLK_INV, 1);
1495 break;
1496 case STV0367_FALLINGEDGE_CLOCK:
1497 stv0367_writebits(state, F367TER_TS_BYTE_CLK_INV, 0);
1498 break;
1499 /*case FE_TER_CLOCK_POLARITY_DEFAULT:*/
1500 default:
1501 stv0367_writebits(state, F367TER_TS_BYTE_CLK_INV, 0);
1502 break;
1506 #if 0
1507 static void stv0367ter_core_sw(struct stv0367_state *state)
1510 dprintk("%s:\n", __func__);
1512 stv0367_writebits(state, F367TER_CORE_ACTIVE, 0);
1513 stv0367_writebits(state, F367TER_CORE_ACTIVE, 1);
1514 msleep(350);
1516 #endif
1517 static int stv0367ter_standby(struct dvb_frontend *fe, u8 standby_on)
1519 struct stv0367_state *state = fe->demodulator_priv;
1521 dprintk("%s:\n", __func__);
1523 if (standby_on) {
1524 stv0367_writebits(state, F367TER_STDBY, 1);
1525 stv0367_writebits(state, F367TER_STDBY_FEC, 1);
1526 stv0367_writebits(state, F367TER_STDBY_CORE, 1);
1527 } else {
1528 stv0367_writebits(state, F367TER_STDBY, 0);
1529 stv0367_writebits(state, F367TER_STDBY_FEC, 0);
1530 stv0367_writebits(state, F367TER_STDBY_CORE, 0);
1533 return 0;
1536 static int stv0367ter_sleep(struct dvb_frontend *fe)
1538 return stv0367ter_standby(fe, 1);
1541 static int stv0367ter_init(struct dvb_frontend *fe)
1543 struct stv0367_state *state = fe->demodulator_priv;
1544 struct stv0367ter_state *ter_state = state->ter_state;
1545 int i;
1547 dprintk("%s:\n", __func__);
1549 ter_state->pBER = 0;
1551 for (i = 0; i < STV0367TER_NBREGS; i++)
1552 stv0367_writereg(state, def0367ter[i].addr,
1553 def0367ter[i].value);
1555 switch (state->config->xtal) {
1556 /*set internal freq to 53.125MHz */
1557 case 16000000:
1558 stv0367_writereg(state, R367TER_PLLMDIV, 0x2);
1559 stv0367_writereg(state, R367TER_PLLNDIV, 0x1b);
1560 stv0367_writereg(state, R367TER_PLLSETUP, 0x18);
1561 break;
1562 case 25000000:
1563 stv0367_writereg(state, R367TER_PLLMDIV, 0xa);
1564 stv0367_writereg(state, R367TER_PLLNDIV, 0x55);
1565 stv0367_writereg(state, R367TER_PLLSETUP, 0x18);
1566 break;
1567 default:
1568 case 27000000:
1569 dprintk("FE_STV0367TER_SetCLKgen for 27Mhz\n");
1570 stv0367_writereg(state, R367TER_PLLMDIV, 0x1);
1571 stv0367_writereg(state, R367TER_PLLNDIV, 0x8);
1572 stv0367_writereg(state, R367TER_PLLSETUP, 0x18);
1573 break;
1574 case 30000000:
1575 stv0367_writereg(state, R367TER_PLLMDIV, 0xc);
1576 stv0367_writereg(state, R367TER_PLLNDIV, 0x55);
1577 stv0367_writereg(state, R367TER_PLLSETUP, 0x18);
1578 break;
1581 stv0367_writereg(state, R367TER_I2CRPT, 0xa0);
1582 stv0367_writereg(state, R367TER_ANACTRL, 0x00);
1584 /*Set TS1 and TS2 to serial or parallel mode */
1585 stv0367ter_set_ts_mode(state, state->config->ts_mode);
1586 stv0367ter_set_clk_pol(state, state->config->clk_pol);
1588 state->chip_id = stv0367_readreg(state, R367TER_ID);
1589 ter_state->first_lock = 0;
1590 ter_state->unlock_counter = 2;
1592 return 0;
1595 static int stv0367ter_algo(struct dvb_frontend *fe)
1597 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1598 struct stv0367_state *state = fe->demodulator_priv;
1599 struct stv0367ter_state *ter_state = state->ter_state;
1600 int offset = 0, tempo = 0;
1601 u8 u_var;
1602 u8 /*constell,*/ counter;
1603 s8 step;
1604 s32 timing_offset = 0;
1605 u32 trl_nomrate = 0, InternalFreq = 0, temp = 0;
1607 dprintk("%s:\n", __func__);
1609 ter_state->frequency = p->frequency;
1610 ter_state->force = FE_TER_FORCENONE
1611 + stv0367_readbits(state, F367TER_FORCE) * 2;
1612 ter_state->if_iq_mode = state->config->if_iq_mode;
1613 switch (state->config->if_iq_mode) {
1614 case FE_TER_NORMAL_IF_TUNER: /* Normal IF mode */
1615 dprintk("ALGO: FE_TER_NORMAL_IF_TUNER selected\n");
1616 stv0367_writebits(state, F367TER_TUNER_BB, 0);
1617 stv0367_writebits(state, F367TER_LONGPATH_IF, 0);
1618 stv0367_writebits(state, F367TER_DEMUX_SWAP, 0);
1619 break;
1620 case FE_TER_LONGPATH_IF_TUNER: /* Long IF mode */
1621 dprintk("ALGO: FE_TER_LONGPATH_IF_TUNER selected\n");
1622 stv0367_writebits(state, F367TER_TUNER_BB, 0);
1623 stv0367_writebits(state, F367TER_LONGPATH_IF, 1);
1624 stv0367_writebits(state, F367TER_DEMUX_SWAP, 1);
1625 break;
1626 case FE_TER_IQ_TUNER: /* IQ mode */
1627 dprintk("ALGO: FE_TER_IQ_TUNER selected\n");
1628 stv0367_writebits(state, F367TER_TUNER_BB, 1);
1629 stv0367_writebits(state, F367TER_PPM_INVSEL, 0);
1630 break;
1631 default:
1632 printk(KERN_ERR "ALGO: wrong TUNER type selected\n");
1633 return -EINVAL;
1636 usleep_range(5000, 7000);
1638 switch (p->inversion) {
1639 case INVERSION_AUTO:
1640 default:
1641 dprintk("%s: inversion AUTO\n", __func__);
1642 if (ter_state->if_iq_mode == FE_TER_IQ_TUNER)
1643 stv0367_writebits(state, F367TER_IQ_INVERT,
1644 ter_state->sense);
1645 else
1646 stv0367_writebits(state, F367TER_INV_SPECTR,
1647 ter_state->sense);
1649 break;
1650 case INVERSION_ON:
1651 case INVERSION_OFF:
1652 if (ter_state->if_iq_mode == FE_TER_IQ_TUNER)
1653 stv0367_writebits(state, F367TER_IQ_INVERT,
1654 p->inversion);
1655 else
1656 stv0367_writebits(state, F367TER_INV_SPECTR,
1657 p->inversion);
1659 break;
1662 if ((ter_state->if_iq_mode != FE_TER_NORMAL_IF_TUNER) &&
1663 (ter_state->pBW != ter_state->bw)) {
1664 stv0367ter_agc_iir_lock_detect_set(state);
1666 /*set fine agc target to 180 for LPIF or IQ mode*/
1667 /* set Q_AGCTarget */
1668 stv0367_writebits(state, F367TER_SEL_IQNTAR, 1);
1669 stv0367_writebits(state, F367TER_AUT_AGC_TARGET_MSB, 0xB);
1670 /*stv0367_writebits(state,AUT_AGC_TARGET_LSB,0x04); */
1672 /* set Q_AGCTarget */
1673 stv0367_writebits(state, F367TER_SEL_IQNTAR, 0);
1674 stv0367_writebits(state, F367TER_AUT_AGC_TARGET_MSB, 0xB);
1675 /*stv0367_writebits(state,AUT_AGC_TARGET_LSB,0x04); */
1677 if (!stv0367_iir_filt_init(state, ter_state->bw,
1678 state->config->xtal))
1679 return -EINVAL;
1680 /*set IIR filter once for 6,7 or 8MHz BW*/
1681 ter_state->pBW = ter_state->bw;
1683 stv0367ter_agc_iir_rst(state);
1686 if (ter_state->hierarchy == FE_TER_HIER_LOW_PRIO)
1687 stv0367_writebits(state, F367TER_BDI_LPSEL, 0x01);
1688 else
1689 stv0367_writebits(state, F367TER_BDI_LPSEL, 0x00);
1691 InternalFreq = stv0367ter_get_mclk(state, state->config->xtal) / 1000;
1692 temp = (int)
1693 ((((ter_state->bw * 64 * (1 << 15) * 100)
1694 / (InternalFreq)) * 10) / 7);
1696 stv0367_writebits(state, F367TER_TRL_NOMRATE_LSB, temp % 2);
1697 temp = temp / 2;
1698 stv0367_writebits(state, F367TER_TRL_NOMRATE_HI, temp / 256);
1699 stv0367_writebits(state, F367TER_TRL_NOMRATE_LO, temp % 256);
1701 temp = stv0367_readbits(state, F367TER_TRL_NOMRATE_HI) * 512 +
1702 stv0367_readbits(state, F367TER_TRL_NOMRATE_LO) * 2 +
1703 stv0367_readbits(state, F367TER_TRL_NOMRATE_LSB);
1704 temp = (int)(((1 << 17) * ter_state->bw * 1000) / (7 * (InternalFreq)));
1705 stv0367_writebits(state, F367TER_GAIN_SRC_HI, temp / 256);
1706 stv0367_writebits(state, F367TER_GAIN_SRC_LO, temp % 256);
1707 temp = stv0367_readbits(state, F367TER_GAIN_SRC_HI) * 256 +
1708 stv0367_readbits(state, F367TER_GAIN_SRC_LO);
1710 temp = (int)
1711 ((InternalFreq - state->config->if_khz) * (1 << 16)
1712 / (InternalFreq));
1714 dprintk("DEROT temp=0x%x\n", temp);
1715 stv0367_writebits(state, F367TER_INC_DEROT_HI, temp / 256);
1716 stv0367_writebits(state, F367TER_INC_DEROT_LO, temp % 256);
1718 ter_state->echo_pos = 0;
1719 ter_state->ucblocks = 0; /* liplianin */
1720 ter_state->pBER = 0; /* liplianin */
1721 stv0367_writebits(state, F367TER_LONG_ECHO, ter_state->echo_pos);
1723 if (stv0367ter_lock_algo(state) != FE_TER_LOCKOK)
1724 return 0;
1726 ter_state->state = FE_TER_LOCKOK;
1728 ter_state->mode = stv0367_readbits(state, F367TER_SYR_MODE);
1729 ter_state->guard = stv0367_readbits(state, F367TER_SYR_GUARD);
1731 ter_state->first_lock = 1; /* we know sense now :) */
1733 ter_state->agc_val =
1734 (stv0367_readbits(state, F367TER_AGC1_VAL_LO) << 16) +
1735 (stv0367_readbits(state, F367TER_AGC1_VAL_HI) << 24) +
1736 stv0367_readbits(state, F367TER_AGC2_VAL_LO) +
1737 (stv0367_readbits(state, F367TER_AGC2_VAL_HI) << 8);
1739 /* Carrier offset calculation */
1740 stv0367_writebits(state, F367TER_FREEZE, 1);
1741 offset = (stv0367_readbits(state, F367TER_CRL_FOFFSET_VHI) << 16) ;
1742 offset += (stv0367_readbits(state, F367TER_CRL_FOFFSET_HI) << 8);
1743 offset += (stv0367_readbits(state, F367TER_CRL_FOFFSET_LO));
1744 stv0367_writebits(state, F367TER_FREEZE, 0);
1745 if (offset > 8388607)
1746 offset -= 16777216;
1748 offset = offset * 2 / 16384;
1750 if (ter_state->mode == FE_TER_MODE_2K)
1751 offset = (offset * 4464) / 1000;/*** 1 FFT BIN=4.464khz***/
1752 else if (ter_state->mode == FE_TER_MODE_4K)
1753 offset = (offset * 223) / 100;/*** 1 FFT BIN=2.23khz***/
1754 else if (ter_state->mode == FE_TER_MODE_8K)
1755 offset = (offset * 111) / 100;/*** 1 FFT BIN=1.1khz***/
1757 if (stv0367_readbits(state, F367TER_PPM_INVSEL) == 1) {
1758 if ((stv0367_readbits(state, F367TER_INV_SPECTR) ==
1759 (stv0367_readbits(state,
1760 F367TER_STATUS_INV_SPECRUM) == 1)))
1761 offset = offset * -1;
1764 if (ter_state->bw == 6)
1765 offset = (offset * 6) / 8;
1766 else if (ter_state->bw == 7)
1767 offset = (offset * 7) / 8;
1769 ter_state->frequency += offset;
1771 tempo = 10; /* exit even if timing_offset stays null */
1772 while ((timing_offset == 0) && (tempo > 0)) {
1773 usleep_range(10000, 20000); /*was 20ms */
1774 /* fine tuning of timing offset if required */
1775 timing_offset = stv0367_readbits(state, F367TER_TRL_TOFFSET_LO)
1776 + 256 * stv0367_readbits(state,
1777 F367TER_TRL_TOFFSET_HI);
1778 if (timing_offset >= 32768)
1779 timing_offset -= 65536;
1780 trl_nomrate = (512 * stv0367_readbits(state,
1781 F367TER_TRL_NOMRATE_HI)
1782 + stv0367_readbits(state, F367TER_TRL_NOMRATE_LO) * 2
1783 + stv0367_readbits(state, F367TER_TRL_NOMRATE_LSB));
1785 timing_offset = ((signed)(1000000 / trl_nomrate) *
1786 timing_offset) / 2048;
1787 tempo--;
1790 if (timing_offset <= 0) {
1791 timing_offset = (timing_offset - 11) / 22;
1792 step = -1;
1793 } else {
1794 timing_offset = (timing_offset + 11) / 22;
1795 step = 1;
1798 for (counter = 0; counter < abs(timing_offset); counter++) {
1799 trl_nomrate += step;
1800 stv0367_writebits(state, F367TER_TRL_NOMRATE_LSB,
1801 trl_nomrate % 2);
1802 stv0367_writebits(state, F367TER_TRL_NOMRATE_LO,
1803 trl_nomrate / 2);
1804 usleep_range(1000, 2000);
1807 usleep_range(5000, 6000);
1808 /* unlocks could happen in case of trl centring big step,
1809 then a core off/on restarts demod */
1810 u_var = stv0367_readbits(state, F367TER_LK);
1812 if (!u_var) {
1813 stv0367_writebits(state, F367TER_CORE_ACTIVE, 0);
1814 msleep(20);
1815 stv0367_writebits(state, F367TER_CORE_ACTIVE, 1);
1818 return 0;
1821 static int stv0367ter_set_frontend(struct dvb_frontend *fe)
1823 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
1824 struct stv0367_state *state = fe->demodulator_priv;
1825 struct stv0367ter_state *ter_state = state->ter_state;
1827 /*u8 trials[2]; */
1828 s8 num_trials, index;
1829 u8 SenseTrials[] = { INVERSION_ON, INVERSION_OFF };
1831 stv0367ter_init(fe);
1833 if (fe->ops.tuner_ops.set_params) {
1834 if (fe->ops.i2c_gate_ctrl)
1835 fe->ops.i2c_gate_ctrl(fe, 1);
1836 fe->ops.tuner_ops.set_params(fe);
1837 if (fe->ops.i2c_gate_ctrl)
1838 fe->ops.i2c_gate_ctrl(fe, 0);
1841 switch (p->transmission_mode) {
1842 default:
1843 case TRANSMISSION_MODE_AUTO:
1844 case TRANSMISSION_MODE_2K:
1845 ter_state->mode = FE_TER_MODE_2K;
1846 break;
1847 /* case TRANSMISSION_MODE_4K:
1848 pLook.mode = FE_TER_MODE_4K;
1849 break;*/
1850 case TRANSMISSION_MODE_8K:
1851 ter_state->mode = FE_TER_MODE_8K;
1852 break;
1855 switch (p->guard_interval) {
1856 default:
1857 case GUARD_INTERVAL_1_32:
1858 case GUARD_INTERVAL_1_16:
1859 case GUARD_INTERVAL_1_8:
1860 case GUARD_INTERVAL_1_4:
1861 ter_state->guard = p->guard_interval;
1862 break;
1863 case GUARD_INTERVAL_AUTO:
1864 ter_state->guard = GUARD_INTERVAL_1_32;
1865 break;
1868 switch (p->bandwidth_hz) {
1869 case 6000000:
1870 ter_state->bw = FE_TER_CHAN_BW_6M;
1871 break;
1872 case 7000000:
1873 ter_state->bw = FE_TER_CHAN_BW_7M;
1874 break;
1875 case 8000000:
1876 default:
1877 ter_state->bw = FE_TER_CHAN_BW_8M;
1880 ter_state->hierarchy = FE_TER_HIER_NONE;
1882 switch (p->inversion) {
1883 case INVERSION_OFF:
1884 case INVERSION_ON:
1885 num_trials = 1;
1886 break;
1887 default:
1888 num_trials = 2;
1889 if (ter_state->first_lock)
1890 num_trials = 1;
1891 break;
1894 ter_state->state = FE_TER_NOLOCK;
1895 index = 0;
1897 while (((index) < num_trials) && (ter_state->state != FE_TER_LOCKOK)) {
1898 if (!ter_state->first_lock) {
1899 if (p->inversion == INVERSION_AUTO)
1900 ter_state->sense = SenseTrials[index];
1903 stv0367ter_algo(fe);
1905 if ((ter_state->state == FE_TER_LOCKOK) &&
1906 (p->inversion == INVERSION_AUTO) &&
1907 (index == 1)) {
1908 /* invert spectrum sense */
1909 SenseTrials[index] = SenseTrials[0];
1910 SenseTrials[(index + 1) % 2] = (SenseTrials[1] + 1) % 2;
1913 index++;
1916 return 0;
1919 static int stv0367ter_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
1921 struct stv0367_state *state = fe->demodulator_priv;
1922 struct stv0367ter_state *ter_state = state->ter_state;
1923 u32 errs = 0;
1925 /*wait for counting completion*/
1926 if (stv0367_readbits(state, F367TER_SFERRC_OLDVALUE) == 0) {
1927 errs =
1928 ((u32)stv0367_readbits(state, F367TER_ERR_CNT1)
1929 * (1 << 16))
1930 + ((u32)stv0367_readbits(state, F367TER_ERR_CNT1_HI)
1931 * (1 << 8))
1932 + ((u32)stv0367_readbits(state, F367TER_ERR_CNT1_LO));
1933 ter_state->ucblocks = errs;
1936 (*ucblocks) = ter_state->ucblocks;
1938 return 0;
1941 static int stv0367ter_get_frontend(struct dvb_frontend *fe,
1942 struct dtv_frontend_properties *p)
1944 struct stv0367_state *state = fe->demodulator_priv;
1945 struct stv0367ter_state *ter_state = state->ter_state;
1946 enum stv0367_ter_mode mode;
1947 int constell = 0,/* snr = 0,*/ Data = 0;
1949 p->frequency = stv0367_get_tuner_freq(fe);
1950 if ((int)p->frequency < 0)
1951 p->frequency = -p->frequency;
1953 constell = stv0367_readbits(state, F367TER_TPS_CONST);
1954 if (constell == 0)
1955 p->modulation = QPSK;
1956 else if (constell == 1)
1957 p->modulation = QAM_16;
1958 else
1959 p->modulation = QAM_64;
1961 p->inversion = stv0367_readbits(state, F367TER_INV_SPECTR);
1963 /* Get the Hierarchical mode */
1964 Data = stv0367_readbits(state, F367TER_TPS_HIERMODE);
1966 switch (Data) {
1967 case 0:
1968 p->hierarchy = HIERARCHY_NONE;
1969 break;
1970 case 1:
1971 p->hierarchy = HIERARCHY_1;
1972 break;
1973 case 2:
1974 p->hierarchy = HIERARCHY_2;
1975 break;
1976 case 3:
1977 p->hierarchy = HIERARCHY_4;
1978 break;
1979 default:
1980 p->hierarchy = HIERARCHY_AUTO;
1981 break; /* error */
1984 /* Get the FEC Rate */
1985 if (ter_state->hierarchy == FE_TER_HIER_LOW_PRIO)
1986 Data = stv0367_readbits(state, F367TER_TPS_LPCODE);
1987 else
1988 Data = stv0367_readbits(state, F367TER_TPS_HPCODE);
1990 switch (Data) {
1991 case 0:
1992 p->code_rate_HP = FEC_1_2;
1993 break;
1994 case 1:
1995 p->code_rate_HP = FEC_2_3;
1996 break;
1997 case 2:
1998 p->code_rate_HP = FEC_3_4;
1999 break;
2000 case 3:
2001 p->code_rate_HP = FEC_5_6;
2002 break;
2003 case 4:
2004 p->code_rate_HP = FEC_7_8;
2005 break;
2006 default:
2007 p->code_rate_HP = FEC_AUTO;
2008 break; /* error */
2011 mode = stv0367_readbits(state, F367TER_SYR_MODE);
2013 switch (mode) {
2014 case FE_TER_MODE_2K:
2015 p->transmission_mode = TRANSMISSION_MODE_2K;
2016 break;
2017 /* case FE_TER_MODE_4K:
2018 p->transmission_mode = TRANSMISSION_MODE_4K;
2019 break;*/
2020 case FE_TER_MODE_8K:
2021 p->transmission_mode = TRANSMISSION_MODE_8K;
2022 break;
2023 default:
2024 p->transmission_mode = TRANSMISSION_MODE_AUTO;
2027 p->guard_interval = stv0367_readbits(state, F367TER_SYR_GUARD);
2029 return 0;
2032 static int stv0367ter_read_snr(struct dvb_frontend *fe, u16 *snr)
2034 struct stv0367_state *state = fe->demodulator_priv;
2035 u32 snru32 = 0;
2036 int cpt = 0;
2037 u8 cut = stv0367_readbits(state, F367TER_IDENTIFICATIONREG);
2039 while (cpt < 10) {
2040 usleep_range(2000, 3000);
2041 if (cut == 0x50) /*cut 1.0 cut 1.1*/
2042 snru32 += stv0367_readbits(state, F367TER_CHCSNR) / 4;
2043 else /*cu2.0*/
2044 snru32 += 125 * stv0367_readbits(state, F367TER_CHCSNR);
2046 cpt++;
2049 snru32 /= 10;/*average on 10 values*/
2051 *snr = snru32 / 1000;
2053 return 0;
2056 #if 0
2057 static int stv0367ter_status(struct dvb_frontend *fe)
2060 struct stv0367_state *state = fe->demodulator_priv;
2061 struct stv0367ter_state *ter_state = state->ter_state;
2062 int locked = FALSE;
2064 locked = (stv0367_readbits(state, F367TER_LK));
2065 if (!locked)
2066 ter_state->unlock_counter += 1;
2067 else
2068 ter_state->unlock_counter = 0;
2070 if (ter_state->unlock_counter > 2) {
2071 if (!stv0367_readbits(state, F367TER_TPS_LOCK) ||
2072 (!stv0367_readbits(state, F367TER_LK))) {
2073 stv0367_writebits(state, F367TER_CORE_ACTIVE, 0);
2074 usleep_range(2000, 3000);
2075 stv0367_writebits(state, F367TER_CORE_ACTIVE, 1);
2076 msleep(350);
2077 locked = (stv0367_readbits(state, F367TER_TPS_LOCK)) &&
2078 (stv0367_readbits(state, F367TER_LK));
2083 return locked;
2085 #endif
2086 static int stv0367ter_read_status(struct dvb_frontend *fe,
2087 enum fe_status *status)
2089 struct stv0367_state *state = fe->demodulator_priv;
2091 dprintk("%s:\n", __func__);
2093 *status = 0;
2095 if (stv0367_readbits(state, F367TER_LK)) {
2096 *status |= FE_HAS_LOCK;
2097 dprintk("%s: stv0367 has locked\n", __func__);
2100 return 0;
2103 static int stv0367ter_read_ber(struct dvb_frontend *fe, u32 *ber)
2105 struct stv0367_state *state = fe->demodulator_priv;
2106 struct stv0367ter_state *ter_state = state->ter_state;
2107 u32 Errors = 0, tber = 0, temporary = 0;
2108 int abc = 0, def = 0;
2111 /*wait for counting completion*/
2112 if (stv0367_readbits(state, F367TER_SFERRC_OLDVALUE) == 0)
2113 Errors = ((u32)stv0367_readbits(state, F367TER_SFEC_ERR_CNT)
2114 * (1 << 16))
2115 + ((u32)stv0367_readbits(state, F367TER_SFEC_ERR_CNT_HI)
2116 * (1 << 8))
2117 + ((u32)stv0367_readbits(state,
2118 F367TER_SFEC_ERR_CNT_LO));
2119 /*measurement not completed, load previous value*/
2120 else {
2121 tber = ter_state->pBER;
2122 return 0;
2125 abc = stv0367_readbits(state, F367TER_SFEC_ERR_SOURCE);
2126 def = stv0367_readbits(state, F367TER_SFEC_NUM_EVENT);
2128 if (Errors == 0) {
2129 tber = 0;
2130 } else if (abc == 0x7) {
2131 if (Errors <= 4) {
2132 temporary = (Errors * 1000000000) / (8 * (1 << 14));
2133 temporary = temporary;
2134 } else if (Errors <= 42) {
2135 temporary = (Errors * 100000000) / (8 * (1 << 14));
2136 temporary = temporary * 10;
2137 } else if (Errors <= 429) {
2138 temporary = (Errors * 10000000) / (8 * (1 << 14));
2139 temporary = temporary * 100;
2140 } else if (Errors <= 4294) {
2141 temporary = (Errors * 1000000) / (8 * (1 << 14));
2142 temporary = temporary * 1000;
2143 } else if (Errors <= 42949) {
2144 temporary = (Errors * 100000) / (8 * (1 << 14));
2145 temporary = temporary * 10000;
2146 } else if (Errors <= 429496) {
2147 temporary = (Errors * 10000) / (8 * (1 << 14));
2148 temporary = temporary * 100000;
2149 } else { /*if (Errors<4294967) 2^22 max error*/
2150 temporary = (Errors * 1000) / (8 * (1 << 14));
2151 temporary = temporary * 100000; /* still to *10 */
2154 /* Byte error*/
2155 if (def == 2)
2156 /*tber=Errors/(8*(1 <<14));*/
2157 tber = temporary;
2158 else if (def == 3)
2159 /*tber=Errors/(8*(1 <<16));*/
2160 tber = temporary / 4;
2161 else if (def == 4)
2162 /*tber=Errors/(8*(1 <<18));*/
2163 tber = temporary / 16;
2164 else if (def == 5)
2165 /*tber=Errors/(8*(1 <<20));*/
2166 tber = temporary / 64;
2167 else if (def == 6)
2168 /*tber=Errors/(8*(1 <<22));*/
2169 tber = temporary / 256;
2170 else
2171 /* should not pass here*/
2172 tber = 0;
2174 if ((Errors < 4294967) && (Errors > 429496))
2175 tber *= 10;
2179 /* save actual value */
2180 ter_state->pBER = tber;
2182 (*ber) = tber;
2184 return 0;
2186 #if 0
2187 static u32 stv0367ter_get_per(struct stv0367_state *state)
2189 struct stv0367ter_state *ter_state = state->ter_state;
2190 u32 Errors = 0, Per = 0, temporary = 0;
2191 int abc = 0, def = 0, cpt = 0;
2193 while (((stv0367_readbits(state, F367TER_SFERRC_OLDVALUE) == 1) &&
2194 (cpt < 400)) || ((Errors == 0) && (cpt < 400))) {
2195 usleep_range(1000, 2000);
2196 Errors = ((u32)stv0367_readbits(state, F367TER_ERR_CNT1)
2197 * (1 << 16))
2198 + ((u32)stv0367_readbits(state, F367TER_ERR_CNT1_HI)
2199 * (1 << 8))
2200 + ((u32)stv0367_readbits(state, F367TER_ERR_CNT1_LO));
2201 cpt++;
2203 abc = stv0367_readbits(state, F367TER_ERR_SRC1);
2204 def = stv0367_readbits(state, F367TER_NUM_EVT1);
2206 if (Errors == 0)
2207 Per = 0;
2208 else if (abc == 0x9) {
2209 if (Errors <= 4) {
2210 temporary = (Errors * 1000000000) / (8 * (1 << 8));
2211 temporary = temporary;
2212 } else if (Errors <= 42) {
2213 temporary = (Errors * 100000000) / (8 * (1 << 8));
2214 temporary = temporary * 10;
2215 } else if (Errors <= 429) {
2216 temporary = (Errors * 10000000) / (8 * (1 << 8));
2217 temporary = temporary * 100;
2218 } else if (Errors <= 4294) {
2219 temporary = (Errors * 1000000) / (8 * (1 << 8));
2220 temporary = temporary * 1000;
2221 } else if (Errors <= 42949) {
2222 temporary = (Errors * 100000) / (8 * (1 << 8));
2223 temporary = temporary * 10000;
2224 } else { /*if(Errors<=429496) 2^16 errors max*/
2225 temporary = (Errors * 10000) / (8 * (1 << 8));
2226 temporary = temporary * 100000;
2229 /* pkt error*/
2230 if (def == 2)
2231 /*Per=Errors/(1 << 8);*/
2232 Per = temporary;
2233 else if (def == 3)
2234 /*Per=Errors/(1 << 10);*/
2235 Per = temporary / 4;
2236 else if (def == 4)
2237 /*Per=Errors/(1 << 12);*/
2238 Per = temporary / 16;
2239 else if (def == 5)
2240 /*Per=Errors/(1 << 14);*/
2241 Per = temporary / 64;
2242 else if (def == 6)
2243 /*Per=Errors/(1 << 16);*/
2244 Per = temporary / 256;
2245 else
2246 Per = 0;
2249 /* save actual value */
2250 ter_state->pPER = Per;
2252 return Per;
2254 #endif
2255 static int stv0367_get_tune_settings(struct dvb_frontend *fe,
2256 struct dvb_frontend_tune_settings
2257 *fe_tune_settings)
2259 fe_tune_settings->min_delay_ms = 1000;
2260 fe_tune_settings->step_size = 0;
2261 fe_tune_settings->max_drift = 0;
2263 return 0;
2266 static void stv0367_release(struct dvb_frontend *fe)
2268 struct stv0367_state *state = fe->demodulator_priv;
2270 kfree(state->ter_state);
2271 kfree(state->cab_state);
2272 kfree(state);
2275 static const struct dvb_frontend_ops stv0367ter_ops = {
2276 .delsys = { SYS_DVBT },
2277 .info = {
2278 .name = "ST STV0367 DVB-T",
2279 .frequency_min = 47000000,
2280 .frequency_max = 862000000,
2281 .frequency_stepsize = 15625,
2282 .frequency_tolerance = 0,
2283 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
2284 FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
2285 FE_CAN_FEC_AUTO |
2286 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
2287 FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_QAM_AUTO |
2288 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_RECOVER |
2289 FE_CAN_INVERSION_AUTO |
2290 FE_CAN_MUTE_TS
2292 .release = stv0367_release,
2293 .init = stv0367ter_init,
2294 .sleep = stv0367ter_sleep,
2295 .i2c_gate_ctrl = stv0367ter_gate_ctrl,
2296 .set_frontend = stv0367ter_set_frontend,
2297 .get_frontend = stv0367ter_get_frontend,
2298 .get_tune_settings = stv0367_get_tune_settings,
2299 .read_status = stv0367ter_read_status,
2300 .read_ber = stv0367ter_read_ber,/* too slow */
2301 /* .read_signal_strength = stv0367_read_signal_strength,*/
2302 .read_snr = stv0367ter_read_snr,
2303 .read_ucblocks = stv0367ter_read_ucblocks,
2306 struct dvb_frontend *stv0367ter_attach(const struct stv0367_config *config,
2307 struct i2c_adapter *i2c)
2309 struct stv0367_state *state = NULL;
2310 struct stv0367ter_state *ter_state = NULL;
2312 /* allocate memory for the internal state */
2313 state = kzalloc(sizeof(struct stv0367_state), GFP_KERNEL);
2314 if (state == NULL)
2315 goto error;
2316 ter_state = kzalloc(sizeof(struct stv0367ter_state), GFP_KERNEL);
2317 if (ter_state == NULL)
2318 goto error;
2320 /* setup the state */
2321 state->i2c = i2c;
2322 state->config = config;
2323 state->ter_state = ter_state;
2324 state->fe.ops = stv0367ter_ops;
2325 state->fe.demodulator_priv = state;
2326 state->chip_id = stv0367_readreg(state, 0xf000);
2328 dprintk("%s: chip_id = 0x%x\n", __func__, state->chip_id);
2330 /* check if the demod is there */
2331 if ((state->chip_id != 0x50) && (state->chip_id != 0x60))
2332 goto error;
2334 return &state->fe;
2336 error:
2337 kfree(ter_state);
2338 kfree(state);
2339 return NULL;
2341 EXPORT_SYMBOL(stv0367ter_attach);
2343 static int stv0367cab_gate_ctrl(struct dvb_frontend *fe, int enable)
2345 struct stv0367_state *state = fe->demodulator_priv;
2347 dprintk("%s:\n", __func__);
2349 stv0367_writebits(state, F367CAB_I2CT_ON, (enable > 0) ? 1 : 0);
2351 return 0;
2354 static u32 stv0367cab_get_mclk(struct dvb_frontend *fe, u32 ExtClk_Hz)
2356 struct stv0367_state *state = fe->demodulator_priv;
2357 u32 mclk_Hz = 0;/* master clock frequency (Hz) */
2358 u32 M, N, P;
2361 if (stv0367_readbits(state, F367CAB_BYPASS_PLLXN) == 0) {
2362 N = (u32)stv0367_readbits(state, F367CAB_PLL_NDIV);
2363 if (N == 0)
2364 N = N + 1;
2366 M = (u32)stv0367_readbits(state, F367CAB_PLL_MDIV);
2367 if (M == 0)
2368 M = M + 1;
2370 P = (u32)stv0367_readbits(state, F367CAB_PLL_PDIV);
2372 if (P > 5)
2373 P = 5;
2375 mclk_Hz = ((ExtClk_Hz / 2) * N) / (M * (1 << P));
2376 dprintk("stv0367cab_get_mclk BYPASS_PLLXN mclk_Hz=%d\n",
2377 mclk_Hz);
2378 } else
2379 mclk_Hz = ExtClk_Hz;
2381 dprintk("stv0367cab_get_mclk final mclk_Hz=%d\n", mclk_Hz);
2383 return mclk_Hz;
2386 static u32 stv0367cab_get_adc_freq(struct dvb_frontend *fe, u32 ExtClk_Hz)
2388 u32 ADCClk_Hz = ExtClk_Hz;
2390 ADCClk_Hz = stv0367cab_get_mclk(fe, ExtClk_Hz);
2392 return ADCClk_Hz;
2395 static enum stv0367cab_mod stv0367cab_SetQamSize(struct stv0367_state *state,
2396 u32 SymbolRate,
2397 enum stv0367cab_mod QAMSize)
2399 /* Set QAM size */
2400 stv0367_writebits(state, F367CAB_QAM_MODE, QAMSize);
2402 /* Set Registers settings specific to the QAM size */
2403 switch (QAMSize) {
2404 case FE_CAB_MOD_QAM4:
2405 stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
2406 break;
2407 case FE_CAB_MOD_QAM16:
2408 stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x64);
2409 stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
2410 stv0367_writereg(state, R367CAB_FSM_STATE, 0x90);
2411 stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
2412 stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa7);
2413 stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x95);
2414 stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x40);
2415 stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0x8a);
2416 break;
2417 case FE_CAB_MOD_QAM32:
2418 stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
2419 stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x6e);
2420 stv0367_writereg(state, R367CAB_FSM_STATE, 0xb0);
2421 stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
2422 stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xb7);
2423 stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x9d);
2424 stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x7f);
2425 stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0xa7);
2426 break;
2427 case FE_CAB_MOD_QAM64:
2428 stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x82);
2429 stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x5a);
2430 if (SymbolRate > 45000000) {
2431 stv0367_writereg(state, R367CAB_FSM_STATE, 0xb0);
2432 stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
2433 stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa5);
2434 } else if (SymbolRate > 25000000) {
2435 stv0367_writereg(state, R367CAB_FSM_STATE, 0xa0);
2436 stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
2437 stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa6);
2438 } else {
2439 stv0367_writereg(state, R367CAB_FSM_STATE, 0xa0);
2440 stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xd1);
2441 stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa7);
2443 stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x95);
2444 stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x40);
2445 stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0x99);
2446 break;
2447 case FE_CAB_MOD_QAM128:
2448 stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
2449 stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x76);
2450 stv0367_writereg(state, R367CAB_FSM_STATE, 0x90);
2451 stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xb1);
2452 if (SymbolRate > 45000000)
2453 stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa7);
2454 else if (SymbolRate > 25000000)
2455 stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa6);
2456 else
2457 stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0x97);
2459 stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x8e);
2460 stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x7f);
2461 stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0xa7);
2462 break;
2463 case FE_CAB_MOD_QAM256:
2464 stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x94);
2465 stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x5a);
2466 stv0367_writereg(state, R367CAB_FSM_STATE, 0xa0);
2467 if (SymbolRate > 45000000)
2468 stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
2469 else if (SymbolRate > 25000000)
2470 stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
2471 else
2472 stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xd1);
2474 stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa7);
2475 stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x85);
2476 stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x40);
2477 stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0xa7);
2478 break;
2479 case FE_CAB_MOD_QAM512:
2480 stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
2481 break;
2482 case FE_CAB_MOD_QAM1024:
2483 stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
2484 break;
2485 default:
2486 break;
2489 return QAMSize;
2492 static u32 stv0367cab_set_derot_freq(struct stv0367_state *state,
2493 u32 adc_hz, s32 derot_hz)
2495 u32 sampled_if = 0;
2496 u32 adc_khz;
2498 adc_khz = adc_hz / 1000;
2500 dprintk("%s: adc_hz=%d derot_hz=%d\n", __func__, adc_hz, derot_hz);
2502 if (adc_khz != 0) {
2503 if (derot_hz < 1000000)
2504 derot_hz = adc_hz / 4; /* ZIF operation */
2505 if (derot_hz > adc_hz)
2506 derot_hz = derot_hz - adc_hz;
2507 sampled_if = (u32)derot_hz / 1000;
2508 sampled_if *= 32768;
2509 sampled_if /= adc_khz;
2510 sampled_if *= 256;
2513 if (sampled_if > 8388607)
2514 sampled_if = 8388607;
2516 dprintk("%s: sampled_if=0x%x\n", __func__, sampled_if);
2518 stv0367_writereg(state, R367CAB_MIX_NCO_LL, sampled_if);
2519 stv0367_writereg(state, R367CAB_MIX_NCO_HL, (sampled_if >> 8));
2520 stv0367_writebits(state, F367CAB_MIX_NCO_INC_HH, (sampled_if >> 16));
2522 return derot_hz;
2525 static u32 stv0367cab_get_derot_freq(struct stv0367_state *state, u32 adc_hz)
2527 u32 sampled_if;
2529 sampled_if = stv0367_readbits(state, F367CAB_MIX_NCO_INC_LL) +
2530 (stv0367_readbits(state, F367CAB_MIX_NCO_INC_HL) << 8) +
2531 (stv0367_readbits(state, F367CAB_MIX_NCO_INC_HH) << 16);
2533 sampled_if /= 256;
2534 sampled_if *= (adc_hz / 1000);
2535 sampled_if += 1;
2536 sampled_if /= 32768;
2538 return sampled_if;
2541 static u32 stv0367cab_set_srate(struct stv0367_state *state, u32 adc_hz,
2542 u32 mclk_hz, u32 SymbolRate,
2543 enum stv0367cab_mod QAMSize)
2545 u32 QamSizeCorr = 0;
2546 u32 u32_tmp = 0, u32_tmp1 = 0;
2547 u32 adp_khz;
2549 dprintk("%s:\n", __func__);
2551 /* Set Correction factor of SRC gain */
2552 switch (QAMSize) {
2553 case FE_CAB_MOD_QAM4:
2554 QamSizeCorr = 1110;
2555 break;
2556 case FE_CAB_MOD_QAM16:
2557 QamSizeCorr = 1032;
2558 break;
2559 case FE_CAB_MOD_QAM32:
2560 QamSizeCorr = 954;
2561 break;
2562 case FE_CAB_MOD_QAM64:
2563 QamSizeCorr = 983;
2564 break;
2565 case FE_CAB_MOD_QAM128:
2566 QamSizeCorr = 957;
2567 break;
2568 case FE_CAB_MOD_QAM256:
2569 QamSizeCorr = 948;
2570 break;
2571 case FE_CAB_MOD_QAM512:
2572 QamSizeCorr = 0;
2573 break;
2574 case FE_CAB_MOD_QAM1024:
2575 QamSizeCorr = 944;
2576 break;
2577 default:
2578 break;
2581 /* Transfer ratio calculation */
2582 if (adc_hz != 0) {
2583 u32_tmp = 256 * SymbolRate;
2584 u32_tmp = u32_tmp / adc_hz;
2586 stv0367_writereg(state, R367CAB_EQU_CRL_TFR, (u8)u32_tmp);
2588 /* Symbol rate and SRC gain calculation */
2589 adp_khz = (mclk_hz >> 1) / 1000;/* TRL works at half the system clock */
2590 if (adp_khz != 0) {
2591 u32_tmp = SymbolRate;
2592 u32_tmp1 = SymbolRate;
2594 if (u32_tmp < 2097152) { /* 2097152 = 2^21 */
2595 /* Symbol rate calculation */
2596 u32_tmp *= 2048; /* 2048 = 2^11 */
2597 u32_tmp = u32_tmp / adp_khz;
2598 u32_tmp = u32_tmp * 16384; /* 16384 = 2^14 */
2599 u32_tmp /= 125 ; /* 125 = 1000/2^3 */
2600 u32_tmp = u32_tmp * 8; /* 8 = 2^3 */
2602 /* SRC Gain Calculation */
2603 u32_tmp1 *= 2048; /* *2*2^10 */
2604 u32_tmp1 /= 439; /* *2/878 */
2605 u32_tmp1 *= 256; /* *2^8 */
2606 u32_tmp1 = u32_tmp1 / adp_khz; /* /(AdpClk in kHz) */
2607 u32_tmp1 *= QamSizeCorr * 9; /* *1000*corr factor */
2608 u32_tmp1 = u32_tmp1 / 10000000;
2610 } else if (u32_tmp < 4194304) { /* 4194304 = 2**22 */
2611 /* Symbol rate calculation */
2612 u32_tmp *= 1024 ; /* 1024 = 2**10 */
2613 u32_tmp = u32_tmp / adp_khz;
2614 u32_tmp = u32_tmp * 16384; /* 16384 = 2**14 */
2615 u32_tmp /= 125 ; /* 125 = 1000/2**3 */
2616 u32_tmp = u32_tmp * 16; /* 16 = 2**4 */
2618 /* SRC Gain Calculation */
2619 u32_tmp1 *= 1024; /* *2*2^9 */
2620 u32_tmp1 /= 439; /* *2/878 */
2621 u32_tmp1 *= 256; /* *2^8 */
2622 u32_tmp1 = u32_tmp1 / adp_khz; /* /(AdpClk in kHz)*/
2623 u32_tmp1 *= QamSizeCorr * 9; /* *1000*corr factor */
2624 u32_tmp1 = u32_tmp1 / 5000000;
2625 } else if (u32_tmp < 8388607) { /* 8388607 = 2**23 */
2626 /* Symbol rate calculation */
2627 u32_tmp *= 512 ; /* 512 = 2**9 */
2628 u32_tmp = u32_tmp / adp_khz;
2629 u32_tmp = u32_tmp * 16384; /* 16384 = 2**14 */
2630 u32_tmp /= 125 ; /* 125 = 1000/2**3 */
2631 u32_tmp = u32_tmp * 32; /* 32 = 2**5 */
2633 /* SRC Gain Calculation */
2634 u32_tmp1 *= 512; /* *2*2^8 */
2635 u32_tmp1 /= 439; /* *2/878 */
2636 u32_tmp1 *= 256; /* *2^8 */
2637 u32_tmp1 = u32_tmp1 / adp_khz; /* /(AdpClk in kHz) */
2638 u32_tmp1 *= QamSizeCorr * 9; /* *1000*corr factor */
2639 u32_tmp1 = u32_tmp1 / 2500000;
2640 } else {
2641 /* Symbol rate calculation */
2642 u32_tmp *= 256 ; /* 256 = 2**8 */
2643 u32_tmp = u32_tmp / adp_khz;
2644 u32_tmp = u32_tmp * 16384; /* 16384 = 2**13 */
2645 u32_tmp /= 125 ; /* 125 = 1000/2**3 */
2646 u32_tmp = u32_tmp * 64; /* 64 = 2**6 */
2648 /* SRC Gain Calculation */
2649 u32_tmp1 *= 256; /* 2*2^7 */
2650 u32_tmp1 /= 439; /* *2/878 */
2651 u32_tmp1 *= 256; /* *2^8 */
2652 u32_tmp1 = u32_tmp1 / adp_khz; /* /(AdpClk in kHz) */
2653 u32_tmp1 *= QamSizeCorr * 9; /* *1000*corr factor */
2654 u32_tmp1 = u32_tmp1 / 1250000;
2657 #if 0
2658 /* Filters' coefficients are calculated and written
2659 into registers only if the filters are enabled */
2660 if (stv0367_readbits(state, F367CAB_ADJ_EN)) {
2661 stv0367cab_SetIirAdjacentcoefficient(state, mclk_hz,
2662 SymbolRate);
2663 /* AllPass filter must be enabled
2664 when the adjacents filter is used */
2665 stv0367_writebits(state, F367CAB_ALLPASSFILT_EN, 1);
2666 stv0367cab_SetAllPasscoefficient(state, mclk_hz, SymbolRate);
2667 } else
2668 /* AllPass filter must be disabled
2669 when the adjacents filter is not used */
2670 #endif
2671 stv0367_writebits(state, F367CAB_ALLPASSFILT_EN, 0);
2673 stv0367_writereg(state, R367CAB_SRC_NCO_LL, u32_tmp);
2674 stv0367_writereg(state, R367CAB_SRC_NCO_LH, (u32_tmp >> 8));
2675 stv0367_writereg(state, R367CAB_SRC_NCO_HL, (u32_tmp >> 16));
2676 stv0367_writereg(state, R367CAB_SRC_NCO_HH, (u32_tmp >> 24));
2678 stv0367_writereg(state, R367CAB_IQDEM_GAIN_SRC_L, u32_tmp1 & 0x00ff);
2679 stv0367_writebits(state, F367CAB_GAIN_SRC_HI, (u32_tmp1 >> 8) & 0x00ff);
2681 return SymbolRate ;
2684 static u32 stv0367cab_GetSymbolRate(struct stv0367_state *state, u32 mclk_hz)
2686 u32 regsym;
2687 u32 adp_khz;
2689 regsym = stv0367_readreg(state, R367CAB_SRC_NCO_LL) +
2690 (stv0367_readreg(state, R367CAB_SRC_NCO_LH) << 8) +
2691 (stv0367_readreg(state, R367CAB_SRC_NCO_HL) << 16) +
2692 (stv0367_readreg(state, R367CAB_SRC_NCO_HH) << 24);
2694 adp_khz = (mclk_hz >> 1) / 1000;/* TRL works at half the system clock */
2696 if (regsym < 134217728) { /* 134217728L = 2**27*/
2697 regsym = regsym * 32; /* 32 = 2**5 */
2698 regsym = regsym / 32768; /* 32768L = 2**15 */
2699 regsym = adp_khz * regsym; /* AdpClk in kHz */
2700 regsym = regsym / 128; /* 128 = 2**7 */
2701 regsym *= 125 ; /* 125 = 1000/2**3 */
2702 regsym /= 2048 ; /* 2048 = 2**11 */
2703 } else if (regsym < 268435456) { /* 268435456L = 2**28 */
2704 regsym = regsym * 16; /* 16 = 2**4 */
2705 regsym = regsym / 32768; /* 32768L = 2**15 */
2706 regsym = adp_khz * regsym; /* AdpClk in kHz */
2707 regsym = regsym / 128; /* 128 = 2**7 */
2708 regsym *= 125 ; /* 125 = 1000/2**3*/
2709 regsym /= 1024 ; /* 256 = 2**10*/
2710 } else if (regsym < 536870912) { /* 536870912L = 2**29*/
2711 regsym = regsym * 8; /* 8 = 2**3 */
2712 regsym = regsym / 32768; /* 32768L = 2**15 */
2713 regsym = adp_khz * regsym; /* AdpClk in kHz */
2714 regsym = regsym / 128; /* 128 = 2**7 */
2715 regsym *= 125 ; /* 125 = 1000/2**3 */
2716 regsym /= 512 ; /* 128 = 2**9 */
2717 } else {
2718 regsym = regsym * 4; /* 4 = 2**2 */
2719 regsym = regsym / 32768; /* 32768L = 2**15 */
2720 regsym = adp_khz * regsym; /* AdpClk in kHz */
2721 regsym = regsym / 128; /* 128 = 2**7 */
2722 regsym *= 125 ; /* 125 = 1000/2**3 */
2723 regsym /= 256 ; /* 64 = 2**8 */
2726 return regsym;
2729 static int stv0367cab_read_status(struct dvb_frontend *fe,
2730 enum fe_status *status)
2732 struct stv0367_state *state = fe->demodulator_priv;
2734 dprintk("%s:\n", __func__);
2736 *status = 0;
2738 if (stv0367_readbits(state, F367CAB_QAMFEC_LOCK)) {
2739 *status |= FE_HAS_LOCK;
2740 dprintk("%s: stv0367 has locked\n", __func__);
2743 return 0;
2746 static int stv0367cab_standby(struct dvb_frontend *fe, u8 standby_on)
2748 struct stv0367_state *state = fe->demodulator_priv;
2750 dprintk("%s:\n", __func__);
2752 if (standby_on) {
2753 stv0367_writebits(state, F367CAB_BYPASS_PLLXN, 0x03);
2754 stv0367_writebits(state, F367CAB_STDBY_PLLXN, 0x01);
2755 stv0367_writebits(state, F367CAB_STDBY, 1);
2756 stv0367_writebits(state, F367CAB_STDBY_CORE, 1);
2757 stv0367_writebits(state, F367CAB_EN_BUFFER_I, 0);
2758 stv0367_writebits(state, F367CAB_EN_BUFFER_Q, 0);
2759 stv0367_writebits(state, F367CAB_POFFQ, 1);
2760 stv0367_writebits(state, F367CAB_POFFI, 1);
2761 } else {
2762 stv0367_writebits(state, F367CAB_STDBY_PLLXN, 0x00);
2763 stv0367_writebits(state, F367CAB_BYPASS_PLLXN, 0x00);
2764 stv0367_writebits(state, F367CAB_STDBY, 0);
2765 stv0367_writebits(state, F367CAB_STDBY_CORE, 0);
2766 stv0367_writebits(state, F367CAB_EN_BUFFER_I, 1);
2767 stv0367_writebits(state, F367CAB_EN_BUFFER_Q, 1);
2768 stv0367_writebits(state, F367CAB_POFFQ, 0);
2769 stv0367_writebits(state, F367CAB_POFFI, 0);
2772 return 0;
2775 static int stv0367cab_sleep(struct dvb_frontend *fe)
2777 return stv0367cab_standby(fe, 1);
2780 static int stv0367cab_init(struct dvb_frontend *fe)
2782 struct stv0367_state *state = fe->demodulator_priv;
2783 struct stv0367cab_state *cab_state = state->cab_state;
2784 int i;
2786 dprintk("%s:\n", __func__);
2788 for (i = 0; i < STV0367CAB_NBREGS; i++)
2789 stv0367_writereg(state, def0367cab[i].addr,
2790 def0367cab[i].value);
2792 switch (state->config->ts_mode) {
2793 case STV0367_DVBCI_CLOCK:
2794 dprintk("Setting TSMode = STV0367_DVBCI_CLOCK\n");
2795 stv0367_writebits(state, F367CAB_OUTFORMAT, 0x03);
2796 break;
2797 case STV0367_SERIAL_PUNCT_CLOCK:
2798 case STV0367_SERIAL_CONT_CLOCK:
2799 stv0367_writebits(state, F367CAB_OUTFORMAT, 0x01);
2800 break;
2801 case STV0367_PARALLEL_PUNCT_CLOCK:
2802 case STV0367_OUTPUTMODE_DEFAULT:
2803 stv0367_writebits(state, F367CAB_OUTFORMAT, 0x00);
2804 break;
2807 switch (state->config->clk_pol) {
2808 case STV0367_RISINGEDGE_CLOCK:
2809 stv0367_writebits(state, F367CAB_CLK_POLARITY, 0x00);
2810 break;
2811 case STV0367_FALLINGEDGE_CLOCK:
2812 case STV0367_CLOCKPOLARITY_DEFAULT:
2813 stv0367_writebits(state, F367CAB_CLK_POLARITY, 0x01);
2814 break;
2817 stv0367_writebits(state, F367CAB_SYNC_STRIP, 0x00);
2819 stv0367_writebits(state, F367CAB_CT_NBST, 0x01);
2821 stv0367_writebits(state, F367CAB_TS_SWAP, 0x01);
2823 stv0367_writebits(state, F367CAB_FIFO_BYPASS, 0x00);
2825 stv0367_writereg(state, R367CAB_ANACTRL, 0x00);/*PLL enabled and used */
2827 cab_state->mclk = stv0367cab_get_mclk(fe, state->config->xtal);
2828 cab_state->adc_clk = stv0367cab_get_adc_freq(fe, state->config->xtal);
2830 return 0;
2832 static
2833 enum stv0367_cab_signal_type stv0367cab_algo(struct stv0367_state *state,
2834 struct dtv_frontend_properties *p)
2836 struct stv0367cab_state *cab_state = state->cab_state;
2837 enum stv0367_cab_signal_type signalType = FE_CAB_NOAGC;
2838 u32 QAMFEC_Lock, QAM_Lock, u32_tmp,
2839 LockTime, TRLTimeOut, AGCTimeOut, CRLSymbols,
2840 CRLTimeOut, EQLTimeOut, DemodTimeOut, FECTimeOut;
2841 u8 TrackAGCAccum;
2842 s32 tmp;
2844 dprintk("%s:\n", __func__);
2846 /* Timeouts calculation */
2847 /* A max lock time of 25 ms is allowed for delayed AGC */
2848 AGCTimeOut = 25;
2849 /* 100000 symbols needed by the TRL as a maximum value */
2850 TRLTimeOut = 100000000 / p->symbol_rate;
2851 /* CRLSymbols is the needed number of symbols to achieve a lock
2852 within [-4%, +4%] of the symbol rate.
2853 CRL timeout is calculated
2854 for a lock within [-search_range, +search_range].
2855 EQL timeout can be changed depending on
2856 the micro-reflections we want to handle.
2857 A characterization must be performed
2858 with these echoes to get new timeout values.
2860 switch (p->modulation) {
2861 case QAM_16:
2862 CRLSymbols = 150000;
2863 EQLTimeOut = 100;
2864 break;
2865 case QAM_32:
2866 CRLSymbols = 250000;
2867 EQLTimeOut = 100;
2868 break;
2869 case QAM_64:
2870 CRLSymbols = 200000;
2871 EQLTimeOut = 100;
2872 break;
2873 case QAM_128:
2874 CRLSymbols = 250000;
2875 EQLTimeOut = 100;
2876 break;
2877 case QAM_256:
2878 CRLSymbols = 250000;
2879 EQLTimeOut = 100;
2880 break;
2881 default:
2882 CRLSymbols = 200000;
2883 EQLTimeOut = 100;
2884 break;
2886 #if 0
2887 if (pIntParams->search_range < 0) {
2888 CRLTimeOut = (25 * CRLSymbols *
2889 (-pIntParams->search_range / 1000)) /
2890 (pIntParams->symbol_rate / 1000);
2891 } else
2892 #endif
2893 CRLTimeOut = (25 * CRLSymbols * (cab_state->search_range / 1000)) /
2894 (p->symbol_rate / 1000);
2896 CRLTimeOut = (1000 * CRLTimeOut) / p->symbol_rate;
2897 /* Timeouts below 50ms are coerced */
2898 if (CRLTimeOut < 50)
2899 CRLTimeOut = 50;
2900 /* A maximum of 100 TS packets is needed to get FEC lock even in case
2901 the spectrum inversion needs to be changed.
2902 This is equal to 20 ms in case of the lowest symbol rate of 0.87Msps
2904 FECTimeOut = 20;
2905 DemodTimeOut = AGCTimeOut + TRLTimeOut + CRLTimeOut + EQLTimeOut;
2907 dprintk("%s: DemodTimeOut=%d\n", __func__, DemodTimeOut);
2909 /* Reset the TRL to ensure nothing starts until the
2910 AGC is stable which ensures a better lock time
2912 stv0367_writereg(state, R367CAB_CTRL_1, 0x04);
2913 /* Set AGC accumulation time to minimum and lock threshold to maximum
2914 in order to speed up the AGC lock */
2915 TrackAGCAccum = stv0367_readbits(state, F367CAB_AGC_ACCUMRSTSEL);
2916 stv0367_writebits(state, F367CAB_AGC_ACCUMRSTSEL, 0x0);
2917 /* Modulus Mapper is disabled */
2918 stv0367_writebits(state, F367CAB_MODULUSMAP_EN, 0);
2919 /* Disable the sweep function */
2920 stv0367_writebits(state, F367CAB_SWEEP_EN, 0);
2921 /* The sweep function is never used, Sweep rate must be set to 0 */
2922 /* Set the derotator frequency in Hz */
2923 stv0367cab_set_derot_freq(state, cab_state->adc_clk,
2924 (1000 * (s32)state->config->if_khz + cab_state->derot_offset));
2925 /* Disable the Allpass Filter when the symbol rate is out of range */
2926 if ((p->symbol_rate > 10800000) | (p->symbol_rate < 1800000)) {
2927 stv0367_writebits(state, F367CAB_ADJ_EN, 0);
2928 stv0367_writebits(state, F367CAB_ALLPASSFILT_EN, 0);
2930 #if 0
2931 /* Check if the tuner is locked */
2932 tuner_lock = stv0367cab_tuner_get_status(fe);
2933 if (tuner_lock == 0)
2934 return FE_367CAB_NOTUNER;
2935 #endif
2936 /* Release the TRL to start demodulator acquisition */
2937 /* Wait for QAM lock */
2938 LockTime = 0;
2939 stv0367_writereg(state, R367CAB_CTRL_1, 0x00);
2940 do {
2941 QAM_Lock = stv0367_readbits(state, F367CAB_FSM_STATUS);
2942 if ((LockTime >= (DemodTimeOut - EQLTimeOut)) &&
2943 (QAM_Lock == 0x04))
2945 * We don't wait longer, the frequency/phase offset
2946 * must be too big
2948 LockTime = DemodTimeOut;
2949 else if ((LockTime >= (AGCTimeOut + TRLTimeOut)) &&
2950 (QAM_Lock == 0x02))
2952 * We don't wait longer, either there is no signal or
2953 * it is not the right symbol rate or it is an analog
2954 * carrier
2957 LockTime = DemodTimeOut;
2958 u32_tmp = stv0367_readbits(state,
2959 F367CAB_AGC_PWR_WORD_LO) +
2960 (stv0367_readbits(state,
2961 F367CAB_AGC_PWR_WORD_ME) << 8) +
2962 (stv0367_readbits(state,
2963 F367CAB_AGC_PWR_WORD_HI) << 16);
2964 if (u32_tmp >= 131072)
2965 u32_tmp = 262144 - u32_tmp;
2966 u32_tmp = u32_tmp / (1 << (11 - stv0367_readbits(state,
2967 F367CAB_AGC_IF_BWSEL)));
2969 if (u32_tmp < stv0367_readbits(state,
2970 F367CAB_AGC_PWRREF_LO) +
2971 256 * stv0367_readbits(state,
2972 F367CAB_AGC_PWRREF_HI) - 10)
2973 QAM_Lock = 0x0f;
2974 } else {
2975 usleep_range(10000, 20000);
2976 LockTime += 10;
2978 dprintk("QAM_Lock=0x%x LockTime=%d\n", QAM_Lock, LockTime);
2979 tmp = stv0367_readreg(state, R367CAB_IT_STATUS1);
2981 dprintk("R367CAB_IT_STATUS1=0x%x\n", tmp);
2983 } while (((QAM_Lock != 0x0c) && (QAM_Lock != 0x0b)) &&
2984 (LockTime < DemodTimeOut));
2986 dprintk("QAM_Lock=0x%x\n", QAM_Lock);
2988 tmp = stv0367_readreg(state, R367CAB_IT_STATUS1);
2989 dprintk("R367CAB_IT_STATUS1=0x%x\n", tmp);
2990 tmp = stv0367_readreg(state, R367CAB_IT_STATUS2);
2991 dprintk("R367CAB_IT_STATUS2=0x%x\n", tmp);
2993 tmp = stv0367cab_get_derot_freq(state, cab_state->adc_clk);
2994 dprintk("stv0367cab_get_derot_freq=0x%x\n", tmp);
2996 if ((QAM_Lock == 0x0c) || (QAM_Lock == 0x0b)) {
2997 /* Wait for FEC lock */
2998 LockTime = 0;
2999 do {
3000 usleep_range(5000, 7000);
3001 LockTime += 5;
3002 QAMFEC_Lock = stv0367_readbits(state,
3003 F367CAB_QAMFEC_LOCK);
3004 } while (!QAMFEC_Lock && (LockTime < FECTimeOut));
3005 } else
3006 QAMFEC_Lock = 0;
3008 if (QAMFEC_Lock) {
3009 signalType = FE_CAB_DATAOK;
3010 cab_state->spect_inv = stv0367_readbits(state,
3011 F367CAB_QUAD_INV);
3012 #if 0
3013 /* not clear for me */
3014 if (state->config->if_khz != 0) {
3015 if (state->config->if_khz > cab_state->adc_clk / 1000) {
3016 cab_state->freq_khz =
3017 FE_Cab_TunerGetFrequency(pIntParams->hTuner)
3018 - stv0367cab_get_derot_freq(state, cab_state->adc_clk)
3019 - cab_state->adc_clk / 1000 + state->config->if_khz;
3020 } else {
3021 cab_state->freq_khz =
3022 FE_Cab_TunerGetFrequency(pIntParams->hTuner)
3023 - stv0367cab_get_derot_freq(state, cab_state->adc_clk)
3024 + state->config->if_khz;
3026 } else {
3027 cab_state->freq_khz =
3028 FE_Cab_TunerGetFrequency(pIntParams->hTuner) +
3029 stv0367cab_get_derot_freq(state,
3030 cab_state->adc_clk) -
3031 cab_state->adc_clk / 4000;
3033 #endif
3034 cab_state->symbol_rate = stv0367cab_GetSymbolRate(state,
3035 cab_state->mclk);
3036 cab_state->locked = 1;
3038 /* stv0367_setbits(state, F367CAB_AGC_ACCUMRSTSEL,7);*/
3039 } else {
3040 switch (QAM_Lock) {
3041 case 1:
3042 signalType = FE_CAB_NOAGC;
3043 break;
3044 case 2:
3045 signalType = FE_CAB_NOTIMING;
3046 break;
3047 case 3:
3048 signalType = FE_CAB_TIMINGOK;
3049 break;
3050 case 4:
3051 signalType = FE_CAB_NOCARRIER;
3052 break;
3053 case 5:
3054 signalType = FE_CAB_CARRIEROK;
3055 break;
3056 case 7:
3057 signalType = FE_CAB_NOBLIND;
3058 break;
3059 case 8:
3060 signalType = FE_CAB_BLINDOK;
3061 break;
3062 case 10:
3063 signalType = FE_CAB_NODEMOD;
3064 break;
3065 case 11:
3066 signalType = FE_CAB_DEMODOK;
3067 break;
3068 case 12:
3069 signalType = FE_CAB_DEMODOK;
3070 break;
3071 case 13:
3072 signalType = FE_CAB_NODEMOD;
3073 break;
3074 case 14:
3075 signalType = FE_CAB_NOBLIND;
3076 break;
3077 case 15:
3078 signalType = FE_CAB_NOSIGNAL;
3079 break;
3080 default:
3081 break;
3086 /* Set the AGC control values to tracking values */
3087 stv0367_writebits(state, F367CAB_AGC_ACCUMRSTSEL, TrackAGCAccum);
3088 return signalType;
3091 static int stv0367cab_set_frontend(struct dvb_frontend *fe)
3093 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
3094 struct stv0367_state *state = fe->demodulator_priv;
3095 struct stv0367cab_state *cab_state = state->cab_state;
3096 enum stv0367cab_mod QAMSize = 0;
3098 dprintk("%s: freq = %d, srate = %d\n", __func__,
3099 p->frequency, p->symbol_rate);
3101 cab_state->derot_offset = 0;
3103 switch (p->modulation) {
3104 case QAM_16:
3105 QAMSize = FE_CAB_MOD_QAM16;
3106 break;
3107 case QAM_32:
3108 QAMSize = FE_CAB_MOD_QAM32;
3109 break;
3110 case QAM_64:
3111 QAMSize = FE_CAB_MOD_QAM64;
3112 break;
3113 case QAM_128:
3114 QAMSize = FE_CAB_MOD_QAM128;
3115 break;
3116 case QAM_256:
3117 QAMSize = FE_CAB_MOD_QAM256;
3118 break;
3119 default:
3120 break;
3123 stv0367cab_init(fe);
3125 /* Tuner Frequency Setting */
3126 if (fe->ops.tuner_ops.set_params) {
3127 if (fe->ops.i2c_gate_ctrl)
3128 fe->ops.i2c_gate_ctrl(fe, 1);
3129 fe->ops.tuner_ops.set_params(fe);
3130 if (fe->ops.i2c_gate_ctrl)
3131 fe->ops.i2c_gate_ctrl(fe, 0);
3134 stv0367cab_SetQamSize(
3135 state,
3136 p->symbol_rate,
3137 QAMSize);
3139 stv0367cab_set_srate(state,
3140 cab_state->adc_clk,
3141 cab_state->mclk,
3142 p->symbol_rate,
3143 QAMSize);
3144 /* Search algorithm launch, [-1.1*RangeOffset, +1.1*RangeOffset] scan */
3145 cab_state->state = stv0367cab_algo(state, p);
3146 return 0;
3149 static int stv0367cab_get_frontend(struct dvb_frontend *fe,
3150 struct dtv_frontend_properties *p)
3152 struct stv0367_state *state = fe->demodulator_priv;
3153 struct stv0367cab_state *cab_state = state->cab_state;
3155 enum stv0367cab_mod QAMSize;
3157 dprintk("%s:\n", __func__);
3159 p->symbol_rate = stv0367cab_GetSymbolRate(state, cab_state->mclk);
3161 QAMSize = stv0367_readbits(state, F367CAB_QAM_MODE);
3162 switch (QAMSize) {
3163 case FE_CAB_MOD_QAM16:
3164 p->modulation = QAM_16;
3165 break;
3166 case FE_CAB_MOD_QAM32:
3167 p->modulation = QAM_32;
3168 break;
3169 case FE_CAB_MOD_QAM64:
3170 p->modulation = QAM_64;
3171 break;
3172 case FE_CAB_MOD_QAM128:
3173 p->modulation = QAM_128;
3174 break;
3175 case FE_CAB_MOD_QAM256:
3176 p->modulation = QAM_256;
3177 break;
3178 default:
3179 break;
3182 p->frequency = stv0367_get_tuner_freq(fe);
3184 dprintk("%s: tuner frequency = %d\n", __func__, p->frequency);
3186 if (state->config->if_khz == 0) {
3187 p->frequency +=
3188 (stv0367cab_get_derot_freq(state, cab_state->adc_clk) -
3189 cab_state->adc_clk / 4000);
3190 return 0;
3193 if (state->config->if_khz > cab_state->adc_clk / 1000)
3194 p->frequency += (state->config->if_khz
3195 - stv0367cab_get_derot_freq(state, cab_state->adc_clk)
3196 - cab_state->adc_clk / 1000);
3197 else
3198 p->frequency += (state->config->if_khz
3199 - stv0367cab_get_derot_freq(state, cab_state->adc_clk));
3201 return 0;
3204 #if 0
3205 void stv0367cab_GetErrorCount(state, enum stv0367cab_mod QAMSize,
3206 u32 symbol_rate, FE_367qam_Monitor *Monitor_results)
3208 stv0367cab_OptimiseNByteAndGetBER(state, QAMSize, symbol_rate, Monitor_results);
3209 stv0367cab_GetPacketsCount(state, Monitor_results);
3211 return;
3214 static int stv0367cab_read_ber(struct dvb_frontend *fe, u32 *ber)
3216 struct stv0367_state *state = fe->demodulator_priv;
3218 return 0;
3220 #endif
3221 static s32 stv0367cab_get_rf_lvl(struct stv0367_state *state)
3223 s32 rfLevel = 0;
3224 s32 RfAgcPwm = 0, IfAgcPwm = 0;
3225 u8 i;
3227 stv0367_writebits(state, F367CAB_STDBY_ADCGP, 0x0);
3229 RfAgcPwm =
3230 (stv0367_readbits(state, F367CAB_RF_AGC1_LEVEL_LO) & 0x03) +
3231 (stv0367_readbits(state, F367CAB_RF_AGC1_LEVEL_HI) << 2);
3232 RfAgcPwm = 100 * RfAgcPwm / 1023;
3234 IfAgcPwm =
3235 stv0367_readbits(state, F367CAB_AGC_IF_PWMCMD_LO) +
3236 (stv0367_readbits(state, F367CAB_AGC_IF_PWMCMD_HI) << 8);
3237 if (IfAgcPwm >= 2048)
3238 IfAgcPwm -= 2048;
3239 else
3240 IfAgcPwm += 2048;
3242 IfAgcPwm = 100 * IfAgcPwm / 4095;
3244 /* For DTT75467 on NIM */
3245 if (RfAgcPwm < 90 && IfAgcPwm < 28) {
3246 for (i = 0; i < RF_LOOKUP_TABLE_SIZE; i++) {
3247 if (RfAgcPwm <= stv0367cab_RF_LookUp1[0][i]) {
3248 rfLevel = (-1) * stv0367cab_RF_LookUp1[1][i];
3249 break;
3252 if (i == RF_LOOKUP_TABLE_SIZE)
3253 rfLevel = -56;
3254 } else { /*if IF AGC>10*/
3255 for (i = 0; i < RF_LOOKUP_TABLE2_SIZE; i++) {
3256 if (IfAgcPwm <= stv0367cab_RF_LookUp2[0][i]) {
3257 rfLevel = (-1) * stv0367cab_RF_LookUp2[1][i];
3258 break;
3261 if (i == RF_LOOKUP_TABLE2_SIZE)
3262 rfLevel = -72;
3264 return rfLevel;
3267 static int stv0367cab_read_strength(struct dvb_frontend *fe, u16 *strength)
3269 struct stv0367_state *state = fe->demodulator_priv;
3271 s32 signal = stv0367cab_get_rf_lvl(state);
3273 dprintk("%s: signal=%d dBm\n", __func__, signal);
3275 if (signal <= -72)
3276 *strength = 65535;
3277 else
3278 *strength = (22 + signal) * (-1311);
3280 dprintk("%s: strength=%d\n", __func__, (*strength));
3282 return 0;
3285 static int stv0367cab_read_snr(struct dvb_frontend *fe, u16 *snr)
3287 struct stv0367_state *state = fe->demodulator_priv;
3288 u32 noisepercentage;
3289 enum stv0367cab_mod QAMSize;
3290 u32 regval = 0, temp = 0;
3291 int power, i;
3293 QAMSize = stv0367_readbits(state, F367CAB_QAM_MODE);
3294 switch (QAMSize) {
3295 case FE_CAB_MOD_QAM4:
3296 power = 21904;
3297 break;
3298 case FE_CAB_MOD_QAM16:
3299 power = 20480;
3300 break;
3301 case FE_CAB_MOD_QAM32:
3302 power = 23040;
3303 break;
3304 case FE_CAB_MOD_QAM64:
3305 power = 21504;
3306 break;
3307 case FE_CAB_MOD_QAM128:
3308 power = 23616;
3309 break;
3310 case FE_CAB_MOD_QAM256:
3311 power = 21760;
3312 break;
3313 case FE_CAB_MOD_QAM512:
3314 power = 1;
3315 break;
3316 case FE_CAB_MOD_QAM1024:
3317 power = 21280;
3318 break;
3319 default:
3320 power = 1;
3321 break;
3324 for (i = 0; i < 10; i++) {
3325 regval += (stv0367_readbits(state, F367CAB_SNR_LO)
3326 + 256 * stv0367_readbits(state, F367CAB_SNR_HI));
3329 regval /= 10; /*for average over 10 times in for loop above*/
3330 if (regval != 0) {
3331 temp = power
3332 * (1 << (3 + stv0367_readbits(state, F367CAB_SNR_PER)));
3333 temp /= regval;
3336 /* table values, not needed to calculate logarithms */
3337 if (temp >= 5012)
3338 noisepercentage = 100;
3339 else if (temp >= 3981)
3340 noisepercentage = 93;
3341 else if (temp >= 3162)
3342 noisepercentage = 86;
3343 else if (temp >= 2512)
3344 noisepercentage = 79;
3345 else if (temp >= 1995)
3346 noisepercentage = 72;
3347 else if (temp >= 1585)
3348 noisepercentage = 65;
3349 else if (temp >= 1259)
3350 noisepercentage = 58;
3351 else if (temp >= 1000)
3352 noisepercentage = 50;
3353 else if (temp >= 794)
3354 noisepercentage = 43;
3355 else if (temp >= 501)
3356 noisepercentage = 36;
3357 else if (temp >= 316)
3358 noisepercentage = 29;
3359 else if (temp >= 200)
3360 noisepercentage = 22;
3361 else if (temp >= 158)
3362 noisepercentage = 14;
3363 else if (temp >= 126)
3364 noisepercentage = 7;
3365 else
3366 noisepercentage = 0;
3368 dprintk("%s: noisepercentage=%d\n", __func__, noisepercentage);
3370 *snr = (noisepercentage * 65535) / 100;
3372 return 0;
3375 static int stv0367cab_read_ucblcks(struct dvb_frontend *fe, u32 *ucblocks)
3377 struct stv0367_state *state = fe->demodulator_priv;
3378 int corrected, tscount;
3380 *ucblocks = (stv0367_readreg(state, R367CAB_RS_COUNTER_5) << 8)
3381 | stv0367_readreg(state, R367CAB_RS_COUNTER_4);
3382 corrected = (stv0367_readreg(state, R367CAB_RS_COUNTER_3) << 8)
3383 | stv0367_readreg(state, R367CAB_RS_COUNTER_2);
3384 tscount = (stv0367_readreg(state, R367CAB_RS_COUNTER_2) << 8)
3385 | stv0367_readreg(state, R367CAB_RS_COUNTER_1);
3387 dprintk("%s: uncorrected blocks=%d corrected blocks=%d tscount=%d\n",
3388 __func__, *ucblocks, corrected, tscount);
3390 return 0;
3393 static const struct dvb_frontend_ops stv0367cab_ops = {
3394 .delsys = { SYS_DVBC_ANNEX_A },
3395 .info = {
3396 .name = "ST STV0367 DVB-C",
3397 .frequency_min = 47000000,
3398 .frequency_max = 862000000,
3399 .frequency_stepsize = 62500,
3400 .symbol_rate_min = 870000,
3401 .symbol_rate_max = 11700000,
3402 .caps = 0x400 |/* FE_CAN_QAM_4 */
3403 FE_CAN_QAM_16 | FE_CAN_QAM_32 |
3404 FE_CAN_QAM_64 | FE_CAN_QAM_128 |
3405 FE_CAN_QAM_256 | FE_CAN_FEC_AUTO
3407 .release = stv0367_release,
3408 .init = stv0367cab_init,
3409 .sleep = stv0367cab_sleep,
3410 .i2c_gate_ctrl = stv0367cab_gate_ctrl,
3411 .set_frontend = stv0367cab_set_frontend,
3412 .get_frontend = stv0367cab_get_frontend,
3413 .read_status = stv0367cab_read_status,
3414 /* .read_ber = stv0367cab_read_ber, */
3415 .read_signal_strength = stv0367cab_read_strength,
3416 .read_snr = stv0367cab_read_snr,
3417 .read_ucblocks = stv0367cab_read_ucblcks,
3418 .get_tune_settings = stv0367_get_tune_settings,
3421 struct dvb_frontend *stv0367cab_attach(const struct stv0367_config *config,
3422 struct i2c_adapter *i2c)
3424 struct stv0367_state *state = NULL;
3425 struct stv0367cab_state *cab_state = NULL;
3427 /* allocate memory for the internal state */
3428 state = kzalloc(sizeof(struct stv0367_state), GFP_KERNEL);
3429 if (state == NULL)
3430 goto error;
3431 cab_state = kzalloc(sizeof(struct stv0367cab_state), GFP_KERNEL);
3432 if (cab_state == NULL)
3433 goto error;
3435 /* setup the state */
3436 state->i2c = i2c;
3437 state->config = config;
3438 cab_state->search_range = 280000;
3439 state->cab_state = cab_state;
3440 state->fe.ops = stv0367cab_ops;
3441 state->fe.demodulator_priv = state;
3442 state->chip_id = stv0367_readreg(state, 0xf000);
3444 dprintk("%s: chip_id = 0x%x\n", __func__, state->chip_id);
3446 /* check if the demod is there */
3447 if ((state->chip_id != 0x50) && (state->chip_id != 0x60))
3448 goto error;
3450 return &state->fe;
3452 error:
3453 kfree(cab_state);
3454 kfree(state);
3455 return NULL;
3457 EXPORT_SYMBOL(stv0367cab_attach);
3459 MODULE_PARM_DESC(debug, "Set debug");
3460 MODULE_PARM_DESC(i2c_debug, "Set i2c debug");
3462 MODULE_AUTHOR("Igor M. Liplianin");
3463 MODULE_DESCRIPTION("ST STV0367 DVB-C/T demodulator driver");
3464 MODULE_LICENSE("GPL");