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