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