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