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