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