blob: 2a8aaeb1112dc10ef1267531c36eb14bbd1c8989 [file] [log] [blame]
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001/*
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
36static int stvdebug;
37module_param_named(debug, stvdebug, int, 0644);
38
39static int i2cdebug;
40module_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
49struct 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
63struct 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
84struct 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
96struct st_register {
97 u16 addr;
98 u8 value;
99};
100
101/* values for STV4100 XTAL=30M int clk=53.125M*/
102static 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},
Abylay Ospan01a475d2011-01-02 09:11:00 -0300289 {R367TER_DUAL_AD12, 0x0C},/* for xc5000 AGC voltage 1.6V */
Igor M. Liplianin17cce932011-01-25 17:02:00 -0300290 {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.*/
554s32 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.*/
566s32 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
576static 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},
Abylay Ospan01a475d2011-01-02 09:11:00 -0300602 {R367CAB_DUAL_AD12, 0x0C}, /* for xc5000 AGC voltage 1.6V */
Igor M. Liplianin17cce932011-01-25 17:02:00 -0300603 {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
767static
768int 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
793static int stv0367_writereg(struct stv0367_state *state, u16 reg, u8 data)
794{
795 return stv0367_writeregs(state, reg, &data, 1);
796}
797
798static 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
830static 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
844static 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
858static 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
869static 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
882u8 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
891static 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
911static 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;
Dan Carpenterbf512b22011-03-06 10:40:11 -0300916 int err = 0;
Igor M. Liplianin17cce932011-01-25 17:02:00 -0300917
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
940static 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
965static 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
990static 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
1016static 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
1048static int stv0367ter_filt_coeff_init(struct stv0367_state *state,
Dan Carpenterbc4b18c2011-03-06 10:41:23 -03001049 u16 CellsCoeffs[3][6][5], u32 DemodXtal)
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001050{
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
1083static 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
1111static 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
1146static 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
1167static 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
1189static enum
1190stv0367_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
1217static enum
1218stv0367_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
1266enum
1267stv0367_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);
Hans Verkuilfb661a72011-03-06 09:26:24 -03001315 dprintk("state=%p\n", state);
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001316 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
Lucas De Marchi25985ed2011-03-30 22:57:33 -03001331 /*suppress EPQ auto for SYR_GARD 1/16 or 1/32
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001332 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
1449static 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
1473static 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
1497static 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
1507static 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
1526static int stv0367ter_sleep(struct dvb_frontend *fe)
1527{
1528 return stv0367ter_standby(fe, 1);
1529}
1530
1531int 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
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001580static int stv0367ter_algo(struct dvb_frontend *fe)
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001581{
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001582 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001583 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;
Peter Senna Tschudindf1ec022012-06-14 13:58:14 -03001587 u8 /*constell,*/ counter;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001588 s8 step;
1589 s32 timing_offset = 0;
1590 u32 trl_nomrate = 0, InternalFreq = 0, temp = 0;
1591
1592 dprintk("%s:\n", __func__);
1593
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001594 ter_state->frequency = p->frequency;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001595 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
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001623 switch (p->inversion) {
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001624 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,
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001639 p->inversion);
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001640 else
1641 stv0367_writebits(state, F367TER_INV_SPECTR,
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001642 p->inversion);
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001643
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;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001712
1713 ter_state->mode = stv0367_readbits(state, F367TER_SYR_MODE);
1714 ter_state->guard = stv0367_readbits(state, F367TER_SYR_GUARD);
1715
1716 ter_state->first_lock = 1; /* we know sense now :) */
1717
1718 ter_state->agc_val =
1719 (stv0367_readbits(state, F367TER_AGC1_VAL_LO) << 16) +
1720 (stv0367_readbits(state, F367TER_AGC1_VAL_HI) << 24) +
1721 stv0367_readbits(state, F367TER_AGC2_VAL_LO) +
1722 (stv0367_readbits(state, F367TER_AGC2_VAL_HI) << 8);
1723
1724 /* Carrier offset calculation */
1725 stv0367_writebits(state, F367TER_FREEZE, 1);
1726 offset = (stv0367_readbits(state, F367TER_CRL_FOFFSET_VHI) << 16) ;
1727 offset += (stv0367_readbits(state, F367TER_CRL_FOFFSET_HI) << 8);
1728 offset += (stv0367_readbits(state, F367TER_CRL_FOFFSET_LO));
1729 stv0367_writebits(state, F367TER_FREEZE, 0);
1730 if (offset > 8388607)
1731 offset -= 16777216;
1732
1733 offset = offset * 2 / 16384;
1734
1735 if (ter_state->mode == FE_TER_MODE_2K)
1736 offset = (offset * 4464) / 1000;/*** 1 FFT BIN=4.464khz***/
1737 else if (ter_state->mode == FE_TER_MODE_4K)
1738 offset = (offset * 223) / 100;/*** 1 FFT BIN=2.23khz***/
1739 else if (ter_state->mode == FE_TER_MODE_8K)
1740 offset = (offset * 111) / 100;/*** 1 FFT BIN=1.1khz***/
1741
1742 if (stv0367_readbits(state, F367TER_PPM_INVSEL) == 1) {
1743 if ((stv0367_readbits(state, F367TER_INV_SPECTR) ==
1744 (stv0367_readbits(state,
1745 F367TER_STATUS_INV_SPECRUM) == 1)))
1746 offset = offset * -1;
1747 }
1748
1749 if (ter_state->bw == 6)
1750 offset = (offset * 6) / 8;
1751 else if (ter_state->bw == 7)
1752 offset = (offset * 7) / 8;
1753
1754 ter_state->frequency += offset;
1755
1756 tempo = 10; /* exit even if timing_offset stays null */
1757 while ((timing_offset == 0) && (tempo > 0)) {
1758 usleep_range(10000, 20000); /*was 20ms */
1759 /* fine tuning of timing offset if required */
1760 timing_offset = stv0367_readbits(state, F367TER_TRL_TOFFSET_LO)
1761 + 256 * stv0367_readbits(state,
1762 F367TER_TRL_TOFFSET_HI);
1763 if (timing_offset >= 32768)
1764 timing_offset -= 65536;
1765 trl_nomrate = (512 * stv0367_readbits(state,
1766 F367TER_TRL_NOMRATE_HI)
1767 + stv0367_readbits(state, F367TER_TRL_NOMRATE_LO) * 2
1768 + stv0367_readbits(state, F367TER_TRL_NOMRATE_LSB));
1769
1770 timing_offset = ((signed)(1000000 / trl_nomrate) *
1771 timing_offset) / 2048;
1772 tempo--;
1773 }
1774
1775 if (timing_offset <= 0) {
1776 timing_offset = (timing_offset - 11) / 22;
1777 step = -1;
1778 } else {
1779 timing_offset = (timing_offset + 11) / 22;
1780 step = 1;
1781 }
1782
1783 for (counter = 0; counter < abs(timing_offset); counter++) {
1784 trl_nomrate += step;
1785 stv0367_writebits(state, F367TER_TRL_NOMRATE_LSB,
1786 trl_nomrate % 2);
1787 stv0367_writebits(state, F367TER_TRL_NOMRATE_LO,
1788 trl_nomrate / 2);
1789 usleep_range(1000, 2000);
1790 }
1791
1792 usleep_range(5000, 6000);
1793 /* unlocks could happen in case of trl centring big step,
1794 then a core off/on restarts demod */
1795 u_var = stv0367_readbits(state, F367TER_LK);
1796
1797 if (!u_var) {
1798 stv0367_writebits(state, F367TER_CORE_ACTIVE, 0);
1799 msleep(20);
1800 stv0367_writebits(state, F367TER_CORE_ACTIVE, 1);
1801 }
1802
1803 return 0;
1804}
1805
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001806static int stv0367ter_set_frontend(struct dvb_frontend *fe)
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001807{
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001808 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001809 struct stv0367_state *state = fe->demodulator_priv;
1810 struct stv0367ter_state *ter_state = state->ter_state;
1811
1812 /*u8 trials[2]; */
1813 s8 num_trials, index;
1814 u8 SenseTrials[] = { INVERSION_ON, INVERSION_OFF };
1815
1816 stv0367ter_init(fe);
1817
1818 if (fe->ops.tuner_ops.set_params) {
1819 if (fe->ops.i2c_gate_ctrl)
1820 fe->ops.i2c_gate_ctrl(fe, 1);
Mauro Carvalho Chehab14d24d12011-12-24 12:24:33 -03001821 fe->ops.tuner_ops.set_params(fe);
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001822 if (fe->ops.i2c_gate_ctrl)
1823 fe->ops.i2c_gate_ctrl(fe, 0);
1824 }
1825
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001826 switch (p->transmission_mode) {
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001827 default:
1828 case TRANSMISSION_MODE_AUTO:
1829 case TRANSMISSION_MODE_2K:
1830 ter_state->mode = FE_TER_MODE_2K;
1831 break;
1832/* case TRANSMISSION_MODE_4K:
1833 pLook.mode = FE_TER_MODE_4K;
1834 break;*/
1835 case TRANSMISSION_MODE_8K:
1836 ter_state->mode = FE_TER_MODE_8K;
1837 break;
1838 }
1839
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001840 switch (p->guard_interval) {
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001841 default:
1842 case GUARD_INTERVAL_1_32:
1843 case GUARD_INTERVAL_1_16:
1844 case GUARD_INTERVAL_1_8:
1845 case GUARD_INTERVAL_1_4:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001846 ter_state->guard = p->guard_interval;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001847 break;
1848 case GUARD_INTERVAL_AUTO:
1849 ter_state->guard = GUARD_INTERVAL_1_32;
1850 break;
1851 }
1852
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001853 switch (p->bandwidth_hz) {
1854 case 6000000:
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001855 ter_state->bw = FE_TER_CHAN_BW_6M;
1856 break;
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001857 case 7000000:
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001858 ter_state->bw = FE_TER_CHAN_BW_7M;
1859 break;
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001860 case 8000000:
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001861 default:
1862 ter_state->bw = FE_TER_CHAN_BW_8M;
1863 }
1864
1865 ter_state->hierarchy = FE_TER_HIER_NONE;
1866
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001867 switch (p->inversion) {
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001868 case INVERSION_OFF:
1869 case INVERSION_ON:
1870 num_trials = 1;
1871 break;
1872 default:
1873 num_trials = 2;
1874 if (ter_state->first_lock)
1875 num_trials = 1;
1876 break;
1877 }
1878
1879 ter_state->state = FE_TER_NOLOCK;
1880 index = 0;
1881
1882 while (((index) < num_trials) && (ter_state->state != FE_TER_LOCKOK)) {
1883 if (!ter_state->first_lock) {
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001884 if (p->inversion == INVERSION_AUTO)
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001885 ter_state->sense = SenseTrials[index];
1886
1887 }
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001888 stv0367ter_algo(fe);
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001889
1890 if ((ter_state->state == FE_TER_LOCKOK) &&
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001891 (p->inversion == INVERSION_AUTO) &&
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001892 (index == 1)) {
1893 /* invert spectrum sense */
1894 SenseTrials[index] = SenseTrials[0];
1895 SenseTrials[(index + 1) % 2] = (SenseTrials[1] + 1) % 2;
1896 }
1897
1898 index++;
1899 }
1900
1901 return 0;
1902}
1903
1904static int stv0367ter_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
1905{
1906 struct stv0367_state *state = fe->demodulator_priv;
1907 struct stv0367ter_state *ter_state = state->ter_state;
1908 u32 errs = 0;
1909
1910 /*wait for counting completion*/
1911 if (stv0367_readbits(state, F367TER_SFERRC_OLDVALUE) == 0) {
1912 errs =
1913 ((u32)stv0367_readbits(state, F367TER_ERR_CNT1)
1914 * (1 << 16))
1915 + ((u32)stv0367_readbits(state, F367TER_ERR_CNT1_HI)
1916 * (1 << 8))
1917 + ((u32)stv0367_readbits(state, F367TER_ERR_CNT1_LO));
1918 ter_state->ucblocks = errs;
1919 }
1920
1921 (*ucblocks) = ter_state->ucblocks;
1922
1923 return 0;
1924}
1925
Mauro Carvalho Chehab7c61d802011-12-30 11:30:21 -03001926static int stv0367ter_get_frontend(struct dvb_frontend *fe)
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001927{
Mauro Carvalho Chehab7c61d802011-12-30 11:30:21 -03001928 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001929 struct stv0367_state *state = fe->demodulator_priv;
1930 struct stv0367ter_state *ter_state = state->ter_state;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001931
1932 int error = 0;
1933 enum stv0367_ter_mode mode;
1934 int constell = 0,/* snr = 0,*/ Data = 0;
1935
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001936 p->frequency = stv0367_get_tuner_freq(fe);
1937 if ((int)p->frequency < 0)
1938 p->frequency = -p->frequency;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001939
1940 constell = stv0367_readbits(state, F367TER_TPS_CONST);
1941 if (constell == 0)
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001942 p->modulation = QPSK;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001943 else if (constell == 1)
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001944 p->modulation = QAM_16;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001945 else
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001946 p->modulation = QAM_64;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001947
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001948 p->inversion = stv0367_readbits(state, F367TER_INV_SPECTR);
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001949
1950 /* Get the Hierarchical mode */
1951 Data = stv0367_readbits(state, F367TER_TPS_HIERMODE);
1952
1953 switch (Data) {
1954 case 0:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001955 p->hierarchy = HIERARCHY_NONE;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001956 break;
1957 case 1:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001958 p->hierarchy = HIERARCHY_1;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001959 break;
1960 case 2:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001961 p->hierarchy = HIERARCHY_2;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001962 break;
1963 case 3:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001964 p->hierarchy = HIERARCHY_4;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001965 break;
1966 default:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001967 p->hierarchy = HIERARCHY_AUTO;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001968 break; /* error */
1969 }
1970
1971 /* Get the FEC Rate */
1972 if (ter_state->hierarchy == FE_TER_HIER_LOW_PRIO)
1973 Data = stv0367_readbits(state, F367TER_TPS_LPCODE);
1974 else
1975 Data = stv0367_readbits(state, F367TER_TPS_HPCODE);
1976
1977 switch (Data) {
1978 case 0:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001979 p->code_rate_HP = FEC_1_2;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001980 break;
1981 case 1:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001982 p->code_rate_HP = FEC_2_3;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001983 break;
1984 case 2:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001985 p->code_rate_HP = FEC_3_4;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001986 break;
1987 case 3:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001988 p->code_rate_HP = FEC_5_6;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001989 break;
1990 case 4:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001991 p->code_rate_HP = FEC_7_8;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001992 break;
1993 default:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03001994 p->code_rate_HP = FEC_AUTO;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03001995 break; /* error */
1996 }
1997
1998 mode = stv0367_readbits(state, F367TER_SYR_MODE);
1999
2000 switch (mode) {
2001 case FE_TER_MODE_2K:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03002002 p->transmission_mode = TRANSMISSION_MODE_2K;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03002003 break;
2004/* case FE_TER_MODE_4K:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03002005 p->transmission_mode = TRANSMISSION_MODE_4K;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03002006 break;*/
2007 case FE_TER_MODE_8K:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03002008 p->transmission_mode = TRANSMISSION_MODE_8K;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03002009 break;
2010 default:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03002011 p->transmission_mode = TRANSMISSION_MODE_AUTO;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03002012 }
2013
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03002014 p->guard_interval = stv0367_readbits(state, F367TER_SYR_GUARD);
Igor M. Liplianin17cce932011-01-25 17:02:00 -03002015
2016 return error;
2017}
2018
2019static int stv0367ter_read_snr(struct dvb_frontend *fe, u16 *snr)
2020{
2021 struct stv0367_state *state = fe->demodulator_priv;
2022 u32 snru32 = 0;
2023 int cpt = 0;
2024 u8 cut = stv0367_readbits(state, F367TER_IDENTIFICATIONREG);
2025
2026 while (cpt < 10) {
2027 usleep_range(2000, 3000);
2028 if (cut == 0x50) /*cut 1.0 cut 1.1*/
2029 snru32 += stv0367_readbits(state, F367TER_CHCSNR) / 4;
2030 else /*cu2.0*/
2031 snru32 += 125 * stv0367_readbits(state, F367TER_CHCSNR);
2032
2033 cpt++;
2034 }
2035
2036 snru32 /= 10;/*average on 10 values*/
2037
2038 *snr = snru32 / 1000;
2039
2040 return 0;
2041}
2042
2043#if 0
2044static int stv0367ter_status(struct dvb_frontend *fe)
2045{
2046
2047 struct stv0367_state *state = fe->demodulator_priv;
2048 struct stv0367ter_state *ter_state = state->ter_state;
2049 int locked = FALSE;
2050
2051 locked = (stv0367_readbits(state, F367TER_LK));
2052 if (!locked)
2053 ter_state->unlock_counter += 1;
2054 else
2055 ter_state->unlock_counter = 0;
2056
2057 if (ter_state->unlock_counter > 2) {
2058 if (!stv0367_readbits(state, F367TER_TPS_LOCK) ||
2059 (!stv0367_readbits(state, F367TER_LK))) {
2060 stv0367_writebits(state, F367TER_CORE_ACTIVE, 0);
2061 usleep_range(2000, 3000);
2062 stv0367_writebits(state, F367TER_CORE_ACTIVE, 1);
2063 msleep(350);
2064 locked = (stv0367_readbits(state, F367TER_TPS_LOCK)) &&
2065 (stv0367_readbits(state, F367TER_LK));
2066 }
2067
2068 }
2069
2070 return locked;
2071}
2072#endif
2073static int stv0367ter_read_status(struct dvb_frontend *fe, fe_status_t *status)
2074{
2075 struct stv0367_state *state = fe->demodulator_priv;
2076
2077 dprintk("%s:\n", __func__);
2078
2079 *status = 0;
2080
2081 if (stv0367_readbits(state, F367TER_LK)) {
2082 *status |= FE_HAS_LOCK;
2083 dprintk("%s: stv0367 has locked\n", __func__);
2084 }
2085
2086 return 0;
2087}
2088
2089static int stv0367ter_read_ber(struct dvb_frontend *fe, u32 *ber)
2090{
2091 struct stv0367_state *state = fe->demodulator_priv;
2092 struct stv0367ter_state *ter_state = state->ter_state;
2093 u32 Errors = 0, tber = 0, temporary = 0;
2094 int abc = 0, def = 0;
2095
2096
2097 /*wait for counting completion*/
2098 if (stv0367_readbits(state, F367TER_SFERRC_OLDVALUE) == 0)
2099 Errors = ((u32)stv0367_readbits(state, F367TER_SFEC_ERR_CNT)
2100 * (1 << 16))
2101 + ((u32)stv0367_readbits(state, F367TER_SFEC_ERR_CNT_HI)
2102 * (1 << 8))
2103 + ((u32)stv0367_readbits(state,
2104 F367TER_SFEC_ERR_CNT_LO));
2105 /*measurement not completed, load previous value*/
2106 else {
2107 tber = ter_state->pBER;
2108 return 0;
2109 }
2110
2111 abc = stv0367_readbits(state, F367TER_SFEC_ERR_SOURCE);
2112 def = stv0367_readbits(state, F367TER_SFEC_NUM_EVENT);
2113
2114 if (Errors == 0) {
2115 tber = 0;
2116 } else if (abc == 0x7) {
2117 if (Errors <= 4) {
2118 temporary = (Errors * 1000000000) / (8 * (1 << 14));
2119 temporary = temporary;
2120 } else if (Errors <= 42) {
2121 temporary = (Errors * 100000000) / (8 * (1 << 14));
2122 temporary = temporary * 10;
2123 } else if (Errors <= 429) {
2124 temporary = (Errors * 10000000) / (8 * (1 << 14));
2125 temporary = temporary * 100;
2126 } else if (Errors <= 4294) {
2127 temporary = (Errors * 1000000) / (8 * (1 << 14));
2128 temporary = temporary * 1000;
2129 } else if (Errors <= 42949) {
2130 temporary = (Errors * 100000) / (8 * (1 << 14));
2131 temporary = temporary * 10000;
2132 } else if (Errors <= 429496) {
2133 temporary = (Errors * 10000) / (8 * (1 << 14));
2134 temporary = temporary * 100000;
2135 } else { /*if (Errors<4294967) 2^22 max error*/
2136 temporary = (Errors * 1000) / (8 * (1 << 14));
2137 temporary = temporary * 100000; /* still to *10 */
2138 }
2139
2140 /* Byte error*/
2141 if (def == 2)
2142 /*tber=Errors/(8*(1 <<14));*/
2143 tber = temporary;
2144 else if (def == 3)
2145 /*tber=Errors/(8*(1 <<16));*/
2146 tber = temporary / 4;
2147 else if (def == 4)
2148 /*tber=Errors/(8*(1 <<18));*/
2149 tber = temporary / 16;
2150 else if (def == 5)
2151 /*tber=Errors/(8*(1 <<20));*/
2152 tber = temporary / 64;
2153 else if (def == 6)
2154 /*tber=Errors/(8*(1 <<22));*/
2155 tber = temporary / 256;
2156 else
2157 /* should not pass here*/
2158 tber = 0;
2159
2160 if ((Errors < 4294967) && (Errors > 429496))
2161 tber *= 10;
2162
2163 }
2164
2165 /* save actual value */
2166 ter_state->pBER = tber;
2167
2168 (*ber) = tber;
2169
2170 return 0;
2171}
2172#if 0
2173static u32 stv0367ter_get_per(struct stv0367_state *state)
2174{
2175 struct stv0367ter_state *ter_state = state->ter_state;
2176 u32 Errors = 0, Per = 0, temporary = 0;
2177 int abc = 0, def = 0, cpt = 0;
2178
2179 while (((stv0367_readbits(state, F367TER_SFERRC_OLDVALUE) == 1) &&
2180 (cpt < 400)) || ((Errors == 0) && (cpt < 400))) {
2181 usleep_range(1000, 2000);
2182 Errors = ((u32)stv0367_readbits(state, F367TER_ERR_CNT1)
2183 * (1 << 16))
2184 + ((u32)stv0367_readbits(state, F367TER_ERR_CNT1_HI)
2185 * (1 << 8))
2186 + ((u32)stv0367_readbits(state, F367TER_ERR_CNT1_LO));
2187 cpt++;
2188 }
2189 abc = stv0367_readbits(state, F367TER_ERR_SRC1);
2190 def = stv0367_readbits(state, F367TER_NUM_EVT1);
2191
2192 if (Errors == 0)
2193 Per = 0;
2194 else if (abc == 0x9) {
2195 if (Errors <= 4) {
2196 temporary = (Errors * 1000000000) / (8 * (1 << 8));
2197 temporary = temporary;
2198 } else if (Errors <= 42) {
2199 temporary = (Errors * 100000000) / (8 * (1 << 8));
2200 temporary = temporary * 10;
2201 } else if (Errors <= 429) {
2202 temporary = (Errors * 10000000) / (8 * (1 << 8));
2203 temporary = temporary * 100;
2204 } else if (Errors <= 4294) {
2205 temporary = (Errors * 1000000) / (8 * (1 << 8));
2206 temporary = temporary * 1000;
2207 } else if (Errors <= 42949) {
2208 temporary = (Errors * 100000) / (8 * (1 << 8));
2209 temporary = temporary * 10000;
2210 } else { /*if(Errors<=429496) 2^16 errors max*/
2211 temporary = (Errors * 10000) / (8 * (1 << 8));
2212 temporary = temporary * 100000;
2213 }
2214
2215 /* pkt error*/
2216 if (def == 2)
2217 /*Per=Errors/(1 << 8);*/
2218 Per = temporary;
2219 else if (def == 3)
2220 /*Per=Errors/(1 << 10);*/
2221 Per = temporary / 4;
2222 else if (def == 4)
2223 /*Per=Errors/(1 << 12);*/
2224 Per = temporary / 16;
2225 else if (def == 5)
2226 /*Per=Errors/(1 << 14);*/
2227 Per = temporary / 64;
2228 else if (def == 6)
2229 /*Per=Errors/(1 << 16);*/
2230 Per = temporary / 256;
2231 else
2232 Per = 0;
2233
2234 }
2235 /* save actual value */
2236 ter_state->pPER = Per;
2237
2238 return Per;
2239}
2240#endif
2241static int stv0367_get_tune_settings(struct dvb_frontend *fe,
2242 struct dvb_frontend_tune_settings
2243 *fe_tune_settings)
2244{
2245 fe_tune_settings->min_delay_ms = 1000;
2246 fe_tune_settings->step_size = 0;
2247 fe_tune_settings->max_drift = 0;
2248
2249 return 0;
2250}
2251
2252static void stv0367_release(struct dvb_frontend *fe)
2253{
2254 struct stv0367_state *state = fe->demodulator_priv;
2255
2256 kfree(state->ter_state);
2257 kfree(state->cab_state);
2258 kfree(state);
2259}
2260
2261static struct dvb_frontend_ops stv0367ter_ops = {
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03002262 .delsys = { SYS_DVBT },
Igor M. Liplianin17cce932011-01-25 17:02:00 -03002263 .info = {
2264 .name = "ST STV0367 DVB-T",
Igor M. Liplianin17cce932011-01-25 17:02:00 -03002265 .frequency_min = 47000000,
2266 .frequency_max = 862000000,
2267 .frequency_stepsize = 15625,
2268 .frequency_tolerance = 0,
2269 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
2270 FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
2271 FE_CAN_FEC_AUTO |
2272 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
2273 FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_QAM_AUTO |
2274 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_RECOVER |
2275 FE_CAN_INVERSION_AUTO |
2276 FE_CAN_MUTE_TS
2277 },
2278 .release = stv0367_release,
2279 .init = stv0367ter_init,
2280 .sleep = stv0367ter_sleep,
2281 .i2c_gate_ctrl = stv0367ter_gate_ctrl,
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03002282 .set_frontend = stv0367ter_set_frontend,
2283 .get_frontend = stv0367ter_get_frontend,
Igor M. Liplianin17cce932011-01-25 17:02:00 -03002284 .get_tune_settings = stv0367_get_tune_settings,
2285 .read_status = stv0367ter_read_status,
2286 .read_ber = stv0367ter_read_ber,/* too slow */
2287/* .read_signal_strength = stv0367_read_signal_strength,*/
2288 .read_snr = stv0367ter_read_snr,
2289 .read_ucblocks = stv0367ter_read_ucblocks,
2290};
2291
2292struct dvb_frontend *stv0367ter_attach(const struct stv0367_config *config,
2293 struct i2c_adapter *i2c)
2294{
2295 struct stv0367_state *state = NULL;
2296 struct stv0367ter_state *ter_state = NULL;
2297
2298 /* allocate memory for the internal state */
2299 state = kzalloc(sizeof(struct stv0367_state), GFP_KERNEL);
2300 if (state == NULL)
2301 goto error;
2302 ter_state = kzalloc(sizeof(struct stv0367ter_state), GFP_KERNEL);
2303 if (ter_state == NULL)
2304 goto error;
2305
2306 /* setup the state */
2307 state->i2c = i2c;
2308 state->config = config;
2309 state->ter_state = ter_state;
2310 state->fe.ops = stv0367ter_ops;
2311 state->fe.demodulator_priv = state;
2312 state->chip_id = stv0367_readreg(state, 0xf000);
2313
2314 dprintk("%s: chip_id = 0x%x\n", __func__, state->chip_id);
2315
2316 /* check if the demod is there */
2317 if ((state->chip_id != 0x50) && (state->chip_id != 0x60))
2318 goto error;
2319
2320 return &state->fe;
2321
2322error:
2323 kfree(ter_state);
2324 kfree(state);
2325 return NULL;
2326}
2327EXPORT_SYMBOL(stv0367ter_attach);
2328
2329static int stv0367cab_gate_ctrl(struct dvb_frontend *fe, int enable)
2330{
2331 struct stv0367_state *state = fe->demodulator_priv;
2332
2333 dprintk("%s:\n", __func__);
2334
2335 stv0367_writebits(state, F367CAB_I2CT_ON, (enable > 0) ? 1 : 0);
2336
2337 return 0;
2338}
2339
2340static u32 stv0367cab_get_mclk(struct dvb_frontend *fe, u32 ExtClk_Hz)
2341{
2342 struct stv0367_state *state = fe->demodulator_priv;
2343 u32 mclk_Hz = 0;/* master clock frequency (Hz) */
2344 u32 M, N, P;
2345
2346
2347 if (stv0367_readbits(state, F367CAB_BYPASS_PLLXN) == 0) {
2348 N = (u32)stv0367_readbits(state, F367CAB_PLL_NDIV);
2349 if (N == 0)
2350 N = N + 1;
2351
2352 M = (u32)stv0367_readbits(state, F367CAB_PLL_MDIV);
2353 if (M == 0)
2354 M = M + 1;
2355
2356 P = (u32)stv0367_readbits(state, F367CAB_PLL_PDIV);
2357
2358 if (P > 5)
2359 P = 5;
2360
2361 mclk_Hz = ((ExtClk_Hz / 2) * N) / (M * (1 << P));
2362 dprintk("stv0367cab_get_mclk BYPASS_PLLXN mclk_Hz=%d\n",
2363 mclk_Hz);
2364 } else
2365 mclk_Hz = ExtClk_Hz;
2366
2367 dprintk("stv0367cab_get_mclk final mclk_Hz=%d\n", mclk_Hz);
2368
2369 return mclk_Hz;
2370}
2371
2372static u32 stv0367cab_get_adc_freq(struct dvb_frontend *fe, u32 ExtClk_Hz)
2373{
2374 u32 ADCClk_Hz = ExtClk_Hz;
2375
2376 ADCClk_Hz = stv0367cab_get_mclk(fe, ExtClk_Hz);
2377
2378 return ADCClk_Hz;
2379}
2380
2381enum stv0367cab_mod stv0367cab_SetQamSize(struct stv0367_state *state,
2382 u32 SymbolRate,
2383 enum stv0367cab_mod QAMSize)
2384{
2385 /* Set QAM size */
2386 stv0367_writebits(state, F367CAB_QAM_MODE, QAMSize);
2387
2388 /* Set Registers settings specific to the QAM size */
2389 switch (QAMSize) {
2390 case FE_CAB_MOD_QAM4:
2391 stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
2392 break;
2393 case FE_CAB_MOD_QAM16:
2394 stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x64);
2395 stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
2396 stv0367_writereg(state, R367CAB_FSM_STATE, 0x90);
2397 stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
2398 stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa7);
2399 stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x95);
2400 stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x40);
2401 stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0x8a);
2402 break;
2403 case FE_CAB_MOD_QAM32:
2404 stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
2405 stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x6e);
2406 stv0367_writereg(state, R367CAB_FSM_STATE, 0xb0);
2407 stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
2408 stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xb7);
2409 stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x9d);
2410 stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x7f);
2411 stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0xa7);
2412 break;
2413 case FE_CAB_MOD_QAM64:
2414 stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x82);
2415 stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x5a);
2416 if (SymbolRate > 45000000) {
2417 stv0367_writereg(state, R367CAB_FSM_STATE, 0xb0);
2418 stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
2419 stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa5);
2420 } else if (SymbolRate > 25000000) {
2421 stv0367_writereg(state, R367CAB_FSM_STATE, 0xa0);
2422 stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
2423 stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa6);
2424 } else {
2425 stv0367_writereg(state, R367CAB_FSM_STATE, 0xa0);
2426 stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xd1);
2427 stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa7);
2428 }
2429 stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x95);
2430 stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x40);
2431 stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0x99);
2432 break;
2433 case FE_CAB_MOD_QAM128:
2434 stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
2435 stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x76);
2436 stv0367_writereg(state, R367CAB_FSM_STATE, 0x90);
2437 stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xb1);
2438 if (SymbolRate > 45000000)
2439 stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa7);
2440 else if (SymbolRate > 25000000)
2441 stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa6);
2442 else
2443 stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0x97);
2444
2445 stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x8e);
2446 stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x7f);
2447 stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0xa7);
2448 break;
2449 case FE_CAB_MOD_QAM256:
2450 stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x94);
2451 stv0367_writereg(state, R367CAB_AGC_PWR_REF_L, 0x5a);
2452 stv0367_writereg(state, R367CAB_FSM_STATE, 0xa0);
2453 if (SymbolRate > 45000000)
2454 stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
2455 else if (SymbolRate > 25000000)
2456 stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xc1);
2457 else
2458 stv0367_writereg(state, R367CAB_EQU_CTR_LPF_GAIN, 0xd1);
2459
2460 stv0367_writereg(state, R367CAB_EQU_CRL_LPF_GAIN, 0xa7);
2461 stv0367_writereg(state, R367CAB_EQU_CRL_LD_SEN, 0x85);
2462 stv0367_writereg(state, R367CAB_EQU_CRL_LIMITER, 0x40);
2463 stv0367_writereg(state, R367CAB_EQU_PNT_GAIN, 0xa7);
2464 break;
2465 case FE_CAB_MOD_QAM512:
2466 stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
2467 break;
2468 case FE_CAB_MOD_QAM1024:
2469 stv0367_writereg(state, R367CAB_IQDEM_ADJ_AGC_REF, 0x00);
2470 break;
2471 default:
2472 break;
2473 }
2474
2475 return QAMSize;
2476}
2477
2478static u32 stv0367cab_set_derot_freq(struct stv0367_state *state,
2479 u32 adc_hz, s32 derot_hz)
2480{
2481 u32 sampled_if = 0;
2482 u32 adc_khz;
2483
2484 adc_khz = adc_hz / 1000;
2485
2486 dprintk("%s: adc_hz=%d derot_hz=%d\n", __func__, adc_hz, derot_hz);
2487
2488 if (adc_khz != 0) {
2489 if (derot_hz < 1000000)
2490 derot_hz = adc_hz / 4; /* ZIF operation */
2491 if (derot_hz > adc_hz)
2492 derot_hz = derot_hz - adc_hz;
2493 sampled_if = (u32)derot_hz / 1000;
2494 sampled_if *= 32768;
2495 sampled_if /= adc_khz;
2496 sampled_if *= 256;
2497 }
2498
2499 if (sampled_if > 8388607)
2500 sampled_if = 8388607;
2501
2502 dprintk("%s: sampled_if=0x%x\n", __func__, sampled_if);
2503
2504 stv0367_writereg(state, R367CAB_MIX_NCO_LL, sampled_if);
2505 stv0367_writereg(state, R367CAB_MIX_NCO_HL, (sampled_if >> 8));
2506 stv0367_writebits(state, F367CAB_MIX_NCO_INC_HH, (sampled_if >> 16));
2507
2508 return derot_hz;
2509}
2510
2511static u32 stv0367cab_get_derot_freq(struct stv0367_state *state, u32 adc_hz)
2512{
2513 u32 sampled_if;
2514
2515 sampled_if = stv0367_readbits(state, F367CAB_MIX_NCO_INC_LL) +
2516 (stv0367_readbits(state, F367CAB_MIX_NCO_INC_HL) << 8) +
2517 (stv0367_readbits(state, F367CAB_MIX_NCO_INC_HH) << 16);
2518
2519 sampled_if /= 256;
2520 sampled_if *= (adc_hz / 1000);
2521 sampled_if += 1;
2522 sampled_if /= 32768;
2523
2524 return sampled_if;
2525}
2526
2527static u32 stv0367cab_set_srate(struct stv0367_state *state, u32 adc_hz,
2528 u32 mclk_hz, u32 SymbolRate,
2529 enum stv0367cab_mod QAMSize)
2530{
2531 u32 QamSizeCorr = 0;
2532 u32 u32_tmp = 0, u32_tmp1 = 0;
2533 u32 adp_khz;
2534
2535 dprintk("%s:\n", __func__);
2536
2537 /* Set Correction factor of SRC gain */
2538 switch (QAMSize) {
2539 case FE_CAB_MOD_QAM4:
2540 QamSizeCorr = 1110;
2541 break;
2542 case FE_CAB_MOD_QAM16:
2543 QamSizeCorr = 1032;
2544 break;
2545 case FE_CAB_MOD_QAM32:
2546 QamSizeCorr = 954;
2547 break;
2548 case FE_CAB_MOD_QAM64:
2549 QamSizeCorr = 983;
2550 break;
2551 case FE_CAB_MOD_QAM128:
2552 QamSizeCorr = 957;
2553 break;
2554 case FE_CAB_MOD_QAM256:
2555 QamSizeCorr = 948;
2556 break;
2557 case FE_CAB_MOD_QAM512:
2558 QamSizeCorr = 0;
2559 break;
2560 case FE_CAB_MOD_QAM1024:
2561 QamSizeCorr = 944;
2562 break;
2563 default:
2564 break;
2565 }
2566
2567 /* Transfer ratio calculation */
2568 if (adc_hz != 0) {
2569 u32_tmp = 256 * SymbolRate;
2570 u32_tmp = u32_tmp / adc_hz;
2571 }
2572 stv0367_writereg(state, R367CAB_EQU_CRL_TFR, (u8)u32_tmp);
2573
2574 /* Symbol rate and SRC gain calculation */
2575 adp_khz = (mclk_hz >> 1) / 1000;/* TRL works at half the system clock */
2576 if (adp_khz != 0) {
2577 u32_tmp = SymbolRate;
2578 u32_tmp1 = SymbolRate;
2579
2580 if (u32_tmp < 2097152) { /* 2097152 = 2^21 */
2581 /* Symbol rate calculation */
2582 u32_tmp *= 2048; /* 2048 = 2^11 */
2583 u32_tmp = u32_tmp / adp_khz;
2584 u32_tmp = u32_tmp * 16384; /* 16384 = 2^14 */
2585 u32_tmp /= 125 ; /* 125 = 1000/2^3 */
2586 u32_tmp = u32_tmp * 8; /* 8 = 2^3 */
2587
2588 /* SRC Gain Calculation */
2589 u32_tmp1 *= 2048; /* *2*2^10 */
2590 u32_tmp1 /= 439; /* *2/878 */
2591 u32_tmp1 *= 256; /* *2^8 */
2592 u32_tmp1 = u32_tmp1 / adp_khz; /* /(AdpClk in kHz) */
2593 u32_tmp1 *= QamSizeCorr * 9; /* *1000*corr factor */
2594 u32_tmp1 = u32_tmp1 / 10000000;
2595
2596 } else if (u32_tmp < 4194304) { /* 4194304 = 2**22 */
2597 /* Symbol rate calculation */
2598 u32_tmp *= 1024 ; /* 1024 = 2**10 */
2599 u32_tmp = u32_tmp / adp_khz;
2600 u32_tmp = u32_tmp * 16384; /* 16384 = 2**14 */
2601 u32_tmp /= 125 ; /* 125 = 1000/2**3 */
2602 u32_tmp = u32_tmp * 16; /* 16 = 2**4 */
2603
2604 /* SRC Gain Calculation */
2605 u32_tmp1 *= 1024; /* *2*2^9 */
2606 u32_tmp1 /= 439; /* *2/878 */
2607 u32_tmp1 *= 256; /* *2^8 */
2608 u32_tmp1 = u32_tmp1 / adp_khz; /* /(AdpClk in kHz)*/
2609 u32_tmp1 *= QamSizeCorr * 9; /* *1000*corr factor */
2610 u32_tmp1 = u32_tmp1 / 5000000;
2611 } else if (u32_tmp < 8388607) { /* 8388607 = 2**23 */
2612 /* Symbol rate calculation */
2613 u32_tmp *= 512 ; /* 512 = 2**9 */
2614 u32_tmp = u32_tmp / adp_khz;
2615 u32_tmp = u32_tmp * 16384; /* 16384 = 2**14 */
2616 u32_tmp /= 125 ; /* 125 = 1000/2**3 */
2617 u32_tmp = u32_tmp * 32; /* 32 = 2**5 */
2618
2619 /* SRC Gain Calculation */
2620 u32_tmp1 *= 512; /* *2*2^8 */
2621 u32_tmp1 /= 439; /* *2/878 */
2622 u32_tmp1 *= 256; /* *2^8 */
2623 u32_tmp1 = u32_tmp1 / adp_khz; /* /(AdpClk in kHz) */
2624 u32_tmp1 *= QamSizeCorr * 9; /* *1000*corr factor */
2625 u32_tmp1 = u32_tmp1 / 2500000;
2626 } else {
2627 /* Symbol rate calculation */
2628 u32_tmp *= 256 ; /* 256 = 2**8 */
2629 u32_tmp = u32_tmp / adp_khz;
2630 u32_tmp = u32_tmp * 16384; /* 16384 = 2**13 */
2631 u32_tmp /= 125 ; /* 125 = 1000/2**3 */
2632 u32_tmp = u32_tmp * 64; /* 64 = 2**6 */
2633
2634 /* SRC Gain Calculation */
2635 u32_tmp1 *= 256; /* 2*2^7 */
2636 u32_tmp1 /= 439; /* *2/878 */
2637 u32_tmp1 *= 256; /* *2^8 */
2638 u32_tmp1 = u32_tmp1 / adp_khz; /* /(AdpClk in kHz) */
2639 u32_tmp1 *= QamSizeCorr * 9; /* *1000*corr factor */
2640 u32_tmp1 = u32_tmp1 / 1250000;
2641 }
2642 }
2643#if 0
2644 /* Filters' coefficients are calculated and written
2645 into registers only if the filters are enabled */
2646 if (stv0367_readbits(state, F367CAB_ADJ_EN)) {
2647 stv0367cab_SetIirAdjacentcoefficient(state, mclk_hz,
2648 SymbolRate);
2649 /* AllPass filter must be enabled
2650 when the adjacents filter is used */
2651 stv0367_writebits(state, F367CAB_ALLPASSFILT_EN, 1);
2652 stv0367cab_SetAllPasscoefficient(state, mclk_hz, SymbolRate);
2653 } else
2654 /* AllPass filter must be disabled
2655 when the adjacents filter is not used */
2656#endif
2657 stv0367_writebits(state, F367CAB_ALLPASSFILT_EN, 0);
2658
2659 stv0367_writereg(state, R367CAB_SRC_NCO_LL, u32_tmp);
2660 stv0367_writereg(state, R367CAB_SRC_NCO_LH, (u32_tmp >> 8));
2661 stv0367_writereg(state, R367CAB_SRC_NCO_HL, (u32_tmp >> 16));
2662 stv0367_writereg(state, R367CAB_SRC_NCO_HH, (u32_tmp >> 24));
2663
2664 stv0367_writereg(state, R367CAB_IQDEM_GAIN_SRC_L, u32_tmp1 & 0x00ff);
2665 stv0367_writebits(state, F367CAB_GAIN_SRC_HI, (u32_tmp1 >> 8) & 0x00ff);
2666
2667 return SymbolRate ;
2668}
2669
2670static u32 stv0367cab_GetSymbolRate(struct stv0367_state *state, u32 mclk_hz)
2671{
2672 u32 regsym;
2673 u32 adp_khz;
2674
2675 regsym = stv0367_readreg(state, R367CAB_SRC_NCO_LL) +
2676 (stv0367_readreg(state, R367CAB_SRC_NCO_LH) << 8) +
2677 (stv0367_readreg(state, R367CAB_SRC_NCO_HL) << 16) +
2678 (stv0367_readreg(state, R367CAB_SRC_NCO_HH) << 24);
2679
2680 adp_khz = (mclk_hz >> 1) / 1000;/* TRL works at half the system clock */
2681
2682 if (regsym < 134217728) { /* 134217728L = 2**27*/
2683 regsym = regsym * 32; /* 32 = 2**5 */
2684 regsym = regsym / 32768; /* 32768L = 2**15 */
2685 regsym = adp_khz * regsym; /* AdpClk in kHz */
2686 regsym = regsym / 128; /* 128 = 2**7 */
2687 regsym *= 125 ; /* 125 = 1000/2**3 */
2688 regsym /= 2048 ; /* 2048 = 2**11 */
2689 } else if (regsym < 268435456) { /* 268435456L = 2**28 */
2690 regsym = regsym * 16; /* 16 = 2**4 */
2691 regsym = regsym / 32768; /* 32768L = 2**15 */
2692 regsym = adp_khz * regsym; /* AdpClk in kHz */
2693 regsym = regsym / 128; /* 128 = 2**7 */
2694 regsym *= 125 ; /* 125 = 1000/2**3*/
2695 regsym /= 1024 ; /* 256 = 2**10*/
2696 } else if (regsym < 536870912) { /* 536870912L = 2**29*/
2697 regsym = regsym * 8; /* 8 = 2**3 */
2698 regsym = regsym / 32768; /* 32768L = 2**15 */
2699 regsym = adp_khz * regsym; /* AdpClk in kHz */
2700 regsym = regsym / 128; /* 128 = 2**7 */
2701 regsym *= 125 ; /* 125 = 1000/2**3 */
2702 regsym /= 512 ; /* 128 = 2**9 */
2703 } else {
2704 regsym = regsym * 4; /* 4 = 2**2 */
2705 regsym = regsym / 32768; /* 32768L = 2**15 */
2706 regsym = adp_khz * regsym; /* AdpClk in kHz */
2707 regsym = regsym / 128; /* 128 = 2**7 */
2708 regsym *= 125 ; /* 125 = 1000/2**3 */
2709 regsym /= 256 ; /* 64 = 2**8 */
2710 }
2711
2712 return regsym;
2713}
2714
2715static int stv0367cab_read_status(struct dvb_frontend *fe, fe_status_t *status)
2716{
2717 struct stv0367_state *state = fe->demodulator_priv;
2718
2719 dprintk("%s:\n", __func__);
2720
2721 *status = 0;
2722
2723 if (stv0367_readbits(state, F367CAB_QAMFEC_LOCK)) {
2724 *status |= FE_HAS_LOCK;
2725 dprintk("%s: stv0367 has locked\n", __func__);
2726 }
2727
2728 return 0;
2729}
2730
2731static int stv0367cab_standby(struct dvb_frontend *fe, u8 standby_on)
2732{
2733 struct stv0367_state *state = fe->demodulator_priv;
2734
2735 dprintk("%s:\n", __func__);
2736
2737 if (standby_on) {
2738 stv0367_writebits(state, F367CAB_BYPASS_PLLXN, 0x03);
2739 stv0367_writebits(state, F367CAB_STDBY_PLLXN, 0x01);
2740 stv0367_writebits(state, F367CAB_STDBY, 1);
2741 stv0367_writebits(state, F367CAB_STDBY_CORE, 1);
2742 stv0367_writebits(state, F367CAB_EN_BUFFER_I, 0);
2743 stv0367_writebits(state, F367CAB_EN_BUFFER_Q, 0);
2744 stv0367_writebits(state, F367CAB_POFFQ, 1);
2745 stv0367_writebits(state, F367CAB_POFFI, 1);
2746 } else {
2747 stv0367_writebits(state, F367CAB_STDBY_PLLXN, 0x00);
2748 stv0367_writebits(state, F367CAB_BYPASS_PLLXN, 0x00);
2749 stv0367_writebits(state, F367CAB_STDBY, 0);
2750 stv0367_writebits(state, F367CAB_STDBY_CORE, 0);
2751 stv0367_writebits(state, F367CAB_EN_BUFFER_I, 1);
2752 stv0367_writebits(state, F367CAB_EN_BUFFER_Q, 1);
2753 stv0367_writebits(state, F367CAB_POFFQ, 0);
2754 stv0367_writebits(state, F367CAB_POFFI, 0);
2755 }
2756
2757 return 0;
2758}
2759
2760static int stv0367cab_sleep(struct dvb_frontend *fe)
2761{
2762 return stv0367cab_standby(fe, 1);
2763}
2764
2765int stv0367cab_init(struct dvb_frontend *fe)
2766{
2767 struct stv0367_state *state = fe->demodulator_priv;
2768 struct stv0367cab_state *cab_state = state->cab_state;
2769 int i;
2770
2771 dprintk("%s:\n", __func__);
2772
2773 for (i = 0; i < STV0367CAB_NBREGS; i++)
2774 stv0367_writereg(state, def0367cab[i].addr,
2775 def0367cab[i].value);
2776
2777 switch (state->config->ts_mode) {
2778 case STV0367_DVBCI_CLOCK:
2779 dprintk("Setting TSMode = STV0367_DVBCI_CLOCK\n");
2780 stv0367_writebits(state, F367CAB_OUTFORMAT, 0x03);
2781 break;
2782 case STV0367_SERIAL_PUNCT_CLOCK:
2783 case STV0367_SERIAL_CONT_CLOCK:
2784 stv0367_writebits(state, F367CAB_OUTFORMAT, 0x01);
2785 break;
2786 case STV0367_PARALLEL_PUNCT_CLOCK:
2787 case STV0367_OUTPUTMODE_DEFAULT:
2788 stv0367_writebits(state, F367CAB_OUTFORMAT, 0x00);
2789 break;
2790 }
2791
2792 switch (state->config->clk_pol) {
2793 case STV0367_RISINGEDGE_CLOCK:
2794 stv0367_writebits(state, F367CAB_CLK_POLARITY, 0x00);
2795 break;
2796 case STV0367_FALLINGEDGE_CLOCK:
2797 case STV0367_CLOCKPOLARITY_DEFAULT:
2798 stv0367_writebits(state, F367CAB_CLK_POLARITY, 0x01);
2799 break;
2800 }
2801
2802 stv0367_writebits(state, F367CAB_SYNC_STRIP, 0x00);
2803
2804 stv0367_writebits(state, F367CAB_CT_NBST, 0x01);
2805
2806 stv0367_writebits(state, F367CAB_TS_SWAP, 0x01);
2807
2808 stv0367_writebits(state, F367CAB_FIFO_BYPASS, 0x00);
2809
2810 stv0367_writereg(state, R367CAB_ANACTRL, 0x00);/*PLL enabled and used */
2811
2812 cab_state->mclk = stv0367cab_get_mclk(fe, state->config->xtal);
2813 cab_state->adc_clk = stv0367cab_get_adc_freq(fe, state->config->xtal);
2814
2815 return 0;
2816}
2817static
2818enum stv0367_cab_signal_type stv0367cab_algo(struct stv0367_state *state,
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03002819 struct dtv_frontend_properties *p)
Igor M. Liplianin17cce932011-01-25 17:02:00 -03002820{
Igor M. Liplianin17cce932011-01-25 17:02:00 -03002821 struct stv0367cab_state *cab_state = state->cab_state;
2822 enum stv0367_cab_signal_type signalType = FE_CAB_NOAGC;
2823 u32 QAMFEC_Lock, QAM_Lock, u32_tmp,
2824 LockTime, TRLTimeOut, AGCTimeOut, CRLSymbols,
2825 CRLTimeOut, EQLTimeOut, DemodTimeOut, FECTimeOut;
2826 u8 TrackAGCAccum;
2827 s32 tmp;
2828
2829 dprintk("%s:\n", __func__);
2830
2831 /* Timeouts calculation */
2832 /* A max lock time of 25 ms is allowed for delayed AGC */
2833 AGCTimeOut = 25;
2834 /* 100000 symbols needed by the TRL as a maximum value */
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03002835 TRLTimeOut = 100000000 / p->symbol_rate;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03002836 /* CRLSymbols is the needed number of symbols to achieve a lock
2837 within [-4%, +4%] of the symbol rate.
2838 CRL timeout is calculated
2839 for a lock within [-search_range, +search_range].
2840 EQL timeout can be changed depending on
2841 the micro-reflections we want to handle.
2842 A characterization must be performed
2843 with these echoes to get new timeout values.
2844 */
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03002845 switch (p->modulation) {
Igor M. Liplianin17cce932011-01-25 17:02:00 -03002846 case QAM_16:
2847 CRLSymbols = 150000;
2848 EQLTimeOut = 100;
2849 break;
2850 case QAM_32:
2851 CRLSymbols = 250000;
2852 EQLTimeOut = 100;
2853 break;
2854 case QAM_64:
2855 CRLSymbols = 200000;
2856 EQLTimeOut = 100;
2857 break;
2858 case QAM_128:
2859 CRLSymbols = 250000;
2860 EQLTimeOut = 100;
2861 break;
2862 case QAM_256:
2863 CRLSymbols = 250000;
2864 EQLTimeOut = 100;
2865 break;
2866 default:
2867 CRLSymbols = 200000;
2868 EQLTimeOut = 100;
2869 break;
2870 }
2871#if 0
2872 if (pIntParams->search_range < 0) {
2873 CRLTimeOut = (25 * CRLSymbols *
2874 (-pIntParams->search_range / 1000)) /
2875 (pIntParams->symbol_rate / 1000);
2876 } else
2877#endif
2878 CRLTimeOut = (25 * CRLSymbols * (cab_state->search_range / 1000)) /
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03002879 (p->symbol_rate / 1000);
Igor M. Liplianin17cce932011-01-25 17:02:00 -03002880
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03002881 CRLTimeOut = (1000 * CRLTimeOut) / p->symbol_rate;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03002882 /* Timeouts below 50ms are coerced */
2883 if (CRLTimeOut < 50)
2884 CRLTimeOut = 50;
2885 /* A maximum of 100 TS packets is needed to get FEC lock even in case
2886 the spectrum inversion needs to be changed.
2887 This is equal to 20 ms in case of the lowest symbol rate of 0.87Msps
2888 */
2889 FECTimeOut = 20;
2890 DemodTimeOut = AGCTimeOut + TRLTimeOut + CRLTimeOut + EQLTimeOut;
2891
2892 dprintk("%s: DemodTimeOut=%d\n", __func__, DemodTimeOut);
2893
2894 /* Reset the TRL to ensure nothing starts until the
2895 AGC is stable which ensures a better lock time
2896 */
2897 stv0367_writereg(state, R367CAB_CTRL_1, 0x04);
2898 /* Set AGC accumulation time to minimum and lock threshold to maximum
2899 in order to speed up the AGC lock */
2900 TrackAGCAccum = stv0367_readbits(state, F367CAB_AGC_ACCUMRSTSEL);
2901 stv0367_writebits(state, F367CAB_AGC_ACCUMRSTSEL, 0x0);
2902 /* Modulus Mapper is disabled */
2903 stv0367_writebits(state, F367CAB_MODULUSMAP_EN, 0);
2904 /* Disable the sweep function */
2905 stv0367_writebits(state, F367CAB_SWEEP_EN, 0);
2906 /* The sweep function is never used, Sweep rate must be set to 0 */
2907 /* Set the derotator frequency in Hz */
2908 stv0367cab_set_derot_freq(state, cab_state->adc_clk,
2909 (1000 * (s32)state->config->if_khz + cab_state->derot_offset));
2910 /* Disable the Allpass Filter when the symbol rate is out of range */
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03002911 if ((p->symbol_rate > 10800000) | (p->symbol_rate < 1800000)) {
Igor M. Liplianin17cce932011-01-25 17:02:00 -03002912 stv0367_writebits(state, F367CAB_ADJ_EN, 0);
2913 stv0367_writebits(state, F367CAB_ALLPASSFILT_EN, 0);
2914 }
2915#if 0
2916 /* Check if the tuner is locked */
2917 tuner_lock = stv0367cab_tuner_get_status(fe);
2918 if (tuner_lock == 0)
2919 return FE_367CAB_NOTUNER;
2920#endif
2921 /* Relase the TRL to start demodulator acquisition */
2922 /* Wait for QAM lock */
2923 LockTime = 0;
2924 stv0367_writereg(state, R367CAB_CTRL_1, 0x00);
2925 do {
2926 QAM_Lock = stv0367_readbits(state, F367CAB_FSM_STATUS);
2927 if ((LockTime >= (DemodTimeOut - EQLTimeOut)) &&
2928 (QAM_Lock == 0x04))
2929 /*
2930 * We don't wait longer, the frequency/phase offset
2931 * must be too big
2932 */
2933 LockTime = DemodTimeOut;
2934 else if ((LockTime >= (AGCTimeOut + TRLTimeOut)) &&
2935 (QAM_Lock == 0x02))
2936 /*
2937 * We don't wait longer, either there is no signal or
2938 * it is not the right symbol rate or it is an analog
2939 * carrier
2940 */
2941 {
2942 LockTime = DemodTimeOut;
2943 u32_tmp = stv0367_readbits(state,
2944 F367CAB_AGC_PWR_WORD_LO) +
2945 (stv0367_readbits(state,
2946 F367CAB_AGC_PWR_WORD_ME) << 8) +
2947 (stv0367_readbits(state,
2948 F367CAB_AGC_PWR_WORD_HI) << 16);
2949 if (u32_tmp >= 131072)
2950 u32_tmp = 262144 - u32_tmp;
2951 u32_tmp = u32_tmp / (1 << (11 - stv0367_readbits(state,
2952 F367CAB_AGC_IF_BWSEL)));
2953
2954 if (u32_tmp < stv0367_readbits(state,
2955 F367CAB_AGC_PWRREF_LO) +
2956 256 * stv0367_readbits(state,
2957 F367CAB_AGC_PWRREF_HI) - 10)
2958 QAM_Lock = 0x0f;
2959 } else {
2960 usleep_range(10000, 20000);
2961 LockTime += 10;
2962 }
2963 dprintk("QAM_Lock=0x%x LockTime=%d\n", QAM_Lock, LockTime);
2964 tmp = stv0367_readreg(state, R367CAB_IT_STATUS1);
2965
2966 dprintk("R367CAB_IT_STATUS1=0x%x\n", tmp);
2967
2968 } while (((QAM_Lock != 0x0c) && (QAM_Lock != 0x0b)) &&
2969 (LockTime < DemodTimeOut));
2970
2971 dprintk("QAM_Lock=0x%x\n", QAM_Lock);
2972
2973 tmp = stv0367_readreg(state, R367CAB_IT_STATUS1);
2974 dprintk("R367CAB_IT_STATUS1=0x%x\n", tmp);
2975 tmp = stv0367_readreg(state, R367CAB_IT_STATUS2);
2976 dprintk("R367CAB_IT_STATUS2=0x%x\n", tmp);
2977
2978 tmp = stv0367cab_get_derot_freq(state, cab_state->adc_clk);
2979 dprintk("stv0367cab_get_derot_freq=0x%x\n", tmp);
2980
2981 if ((QAM_Lock == 0x0c) || (QAM_Lock == 0x0b)) {
2982 /* Wait for FEC lock */
2983 LockTime = 0;
2984 do {
2985 usleep_range(5000, 7000);
2986 LockTime += 5;
2987 QAMFEC_Lock = stv0367_readbits(state,
2988 F367CAB_QAMFEC_LOCK);
2989 } while (!QAMFEC_Lock && (LockTime < FECTimeOut));
2990 } else
2991 QAMFEC_Lock = 0;
2992
2993 if (QAMFEC_Lock) {
2994 signalType = FE_CAB_DATAOK;
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03002995 cab_state->modulation = p->modulation;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03002996 cab_state->spect_inv = stv0367_readbits(state,
2997 F367CAB_QUAD_INV);
2998#if 0
2999/* not clear for me */
3000 if (state->config->if_khz != 0) {
3001 if (state->config->if_khz > cab_state->adc_clk / 1000) {
3002 cab_state->freq_khz =
3003 FE_Cab_TunerGetFrequency(pIntParams->hTuner)
3004 - stv0367cab_get_derot_freq(state, cab_state->adc_clk)
3005 - cab_state->adc_clk / 1000 + state->config->if_khz;
3006 } else {
3007 cab_state->freq_khz =
3008 FE_Cab_TunerGetFrequency(pIntParams->hTuner)
3009 - stv0367cab_get_derot_freq(state, cab_state->adc_clk)
3010 + state->config->if_khz;
3011 }
3012 } else {
3013 cab_state->freq_khz =
3014 FE_Cab_TunerGetFrequency(pIntParams->hTuner) +
3015 stv0367cab_get_derot_freq(state,
3016 cab_state->adc_clk) -
3017 cab_state->adc_clk / 4000;
3018 }
3019#endif
3020 cab_state->symbol_rate = stv0367cab_GetSymbolRate(state,
3021 cab_state->mclk);
3022 cab_state->locked = 1;
3023
3024 /* stv0367_setbits(state, F367CAB_AGC_ACCUMRSTSEL,7);*/
3025 } else {
3026 switch (QAM_Lock) {
3027 case 1:
3028 signalType = FE_CAB_NOAGC;
3029 break;
3030 case 2:
3031 signalType = FE_CAB_NOTIMING;
3032 break;
3033 case 3:
3034 signalType = FE_CAB_TIMINGOK;
3035 break;
3036 case 4:
3037 signalType = FE_CAB_NOCARRIER;
3038 break;
3039 case 5:
3040 signalType = FE_CAB_CARRIEROK;
3041 break;
3042 case 7:
3043 signalType = FE_CAB_NOBLIND;
3044 break;
3045 case 8:
3046 signalType = FE_CAB_BLINDOK;
3047 break;
3048 case 10:
3049 signalType = FE_CAB_NODEMOD;
3050 break;
3051 case 11:
3052 signalType = FE_CAB_DEMODOK;
3053 break;
3054 case 12:
3055 signalType = FE_CAB_DEMODOK;
3056 break;
3057 case 13:
3058 signalType = FE_CAB_NODEMOD;
3059 break;
3060 case 14:
3061 signalType = FE_CAB_NOBLIND;
3062 break;
3063 case 15:
3064 signalType = FE_CAB_NOSIGNAL;
3065 break;
3066 default:
3067 break;
3068 }
3069
3070 }
3071
3072 /* Set the AGC control values to tracking values */
3073 stv0367_writebits(state, F367CAB_AGC_ACCUMRSTSEL, TrackAGCAccum);
3074 return signalType;
3075}
3076
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003077static int stv0367cab_set_frontend(struct dvb_frontend *fe)
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003078{
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003079 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003080 struct stv0367_state *state = fe->demodulator_priv;
3081 struct stv0367cab_state *cab_state = state->cab_state;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003082 enum stv0367cab_mod QAMSize = 0;
3083
3084 dprintk("%s: freq = %d, srate = %d\n", __func__,
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003085 p->frequency, p->symbol_rate);
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003086
3087 cab_state->derot_offset = 0;
3088
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003089 switch (p->modulation) {
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003090 case QAM_16:
3091 QAMSize = FE_CAB_MOD_QAM16;
3092 break;
3093 case QAM_32:
3094 QAMSize = FE_CAB_MOD_QAM32;
3095 break;
3096 case QAM_64:
3097 QAMSize = FE_CAB_MOD_QAM64;
3098 break;
3099 case QAM_128:
3100 QAMSize = FE_CAB_MOD_QAM128;
3101 break;
3102 case QAM_256:
3103 QAMSize = FE_CAB_MOD_QAM256;
3104 break;
3105 default:
3106 break;
3107 }
3108
3109 stv0367cab_init(fe);
3110
3111 /* Tuner Frequency Setting */
3112 if (fe->ops.tuner_ops.set_params) {
3113 if (fe->ops.i2c_gate_ctrl)
3114 fe->ops.i2c_gate_ctrl(fe, 1);
Mauro Carvalho Chehab14d24d12011-12-24 12:24:33 -03003115 fe->ops.tuner_ops.set_params(fe);
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003116 if (fe->ops.i2c_gate_ctrl)
3117 fe->ops.i2c_gate_ctrl(fe, 0);
3118 }
3119
3120 stv0367cab_SetQamSize(
3121 state,
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003122 p->symbol_rate,
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003123 QAMSize);
3124
3125 stv0367cab_set_srate(state,
3126 cab_state->adc_clk,
3127 cab_state->mclk,
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003128 p->symbol_rate,
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003129 QAMSize);
3130 /* Search algorithm launch, [-1.1*RangeOffset, +1.1*RangeOffset] scan */
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003131 cab_state->state = stv0367cab_algo(state, p);
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003132 return 0;
3133}
3134
Mauro Carvalho Chehab7c61d802011-12-30 11:30:21 -03003135static int stv0367cab_get_frontend(struct dvb_frontend *fe)
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003136{
Mauro Carvalho Chehab7c61d802011-12-30 11:30:21 -03003137 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003138 struct stv0367_state *state = fe->demodulator_priv;
3139 struct stv0367cab_state *cab_state = state->cab_state;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003140
3141 enum stv0367cab_mod QAMSize;
3142
3143 dprintk("%s:\n", __func__);
3144
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003145 p->symbol_rate = stv0367cab_GetSymbolRate(state, cab_state->mclk);
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003146
3147 QAMSize = stv0367_readbits(state, F367CAB_QAM_MODE);
3148 switch (QAMSize) {
3149 case FE_CAB_MOD_QAM16:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003150 p->modulation = QAM_16;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003151 break;
3152 case FE_CAB_MOD_QAM32:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003153 p->modulation = QAM_32;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003154 break;
3155 case FE_CAB_MOD_QAM64:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003156 p->modulation = QAM_64;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003157 break;
3158 case FE_CAB_MOD_QAM128:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003159 p->modulation = QAM_128;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003160 break;
3161 case QAM_256:
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003162 p->modulation = QAM_256;
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003163 break;
3164 default:
3165 break;
3166 }
3167
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003168 p->frequency = stv0367_get_tuner_freq(fe);
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003169
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003170 dprintk("%s: tuner frequency = %d\n", __func__, p->frequency);
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003171
3172 if (state->config->if_khz == 0) {
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003173 p->frequency +=
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003174 (stv0367cab_get_derot_freq(state, cab_state->adc_clk) -
3175 cab_state->adc_clk / 4000);
3176 return 0;
3177 }
3178
3179 if (state->config->if_khz > cab_state->adc_clk / 1000)
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003180 p->frequency += (state->config->if_khz
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003181 - stv0367cab_get_derot_freq(state, cab_state->adc_clk)
3182 - cab_state->adc_clk / 1000);
3183 else
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003184 p->frequency += (state->config->if_khz
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003185 - stv0367cab_get_derot_freq(state, cab_state->adc_clk));
3186
3187 return 0;
3188}
3189
3190#if 0
3191void stv0367cab_GetErrorCount(state, enum stv0367cab_mod QAMSize,
3192 u32 symbol_rate, FE_367qam_Monitor *Monitor_results)
3193{
3194 stv0367cab_OptimiseNByteAndGetBER(state, QAMSize, symbol_rate, Monitor_results);
3195 stv0367cab_GetPacketsCount(state, Monitor_results);
3196
3197 return;
3198}
3199
3200static int stv0367cab_read_ber(struct dvb_frontend *fe, u32 *ber)
3201{
3202 struct stv0367_state *state = fe->demodulator_priv;
3203
3204 return 0;
3205}
3206#endif
3207static s32 stv0367cab_get_rf_lvl(struct stv0367_state *state)
3208{
3209 s32 rfLevel = 0;
3210 s32 RfAgcPwm = 0, IfAgcPwm = 0;
3211 u8 i;
3212
3213 stv0367_writebits(state, F367CAB_STDBY_ADCGP, 0x0);
3214
3215 RfAgcPwm =
3216 (stv0367_readbits(state, F367CAB_RF_AGC1_LEVEL_LO) & 0x03) +
3217 (stv0367_readbits(state, F367CAB_RF_AGC1_LEVEL_HI) << 2);
3218 RfAgcPwm = 100 * RfAgcPwm / 1023;
3219
3220 IfAgcPwm =
3221 stv0367_readbits(state, F367CAB_AGC_IF_PWMCMD_LO) +
3222 (stv0367_readbits(state, F367CAB_AGC_IF_PWMCMD_HI) << 8);
3223 if (IfAgcPwm >= 2048)
3224 IfAgcPwm -= 2048;
3225 else
3226 IfAgcPwm += 2048;
3227
3228 IfAgcPwm = 100 * IfAgcPwm / 4095;
3229
3230 /* For DTT75467 on NIM */
3231 if (RfAgcPwm < 90 && IfAgcPwm < 28) {
3232 for (i = 0; i < RF_LOOKUP_TABLE_SIZE; i++) {
3233 if (RfAgcPwm <= stv0367cab_RF_LookUp1[0][i]) {
3234 rfLevel = (-1) * stv0367cab_RF_LookUp1[1][i];
3235 break;
3236 }
3237 }
3238 if (i == RF_LOOKUP_TABLE_SIZE)
3239 rfLevel = -56;
3240 } else { /*if IF AGC>10*/
3241 for (i = 0; i < RF_LOOKUP_TABLE2_SIZE; i++) {
3242 if (IfAgcPwm <= stv0367cab_RF_LookUp2[0][i]) {
3243 rfLevel = (-1) * stv0367cab_RF_LookUp2[1][i];
3244 break;
3245 }
3246 }
3247 if (i == RF_LOOKUP_TABLE2_SIZE)
3248 rfLevel = -72;
3249 }
3250 return rfLevel;
3251}
3252
3253static int stv0367cab_read_strength(struct dvb_frontend *fe, u16 *strength)
3254{
3255 struct stv0367_state *state = fe->demodulator_priv;
3256
3257 s32 signal = stv0367cab_get_rf_lvl(state);
3258
3259 dprintk("%s: signal=%d dBm\n", __func__, signal);
3260
3261 if (signal <= -72)
3262 *strength = 65535;
3263 else
3264 *strength = (22 + signal) * (-1311);
3265
3266 dprintk("%s: strength=%d\n", __func__, (*strength));
3267
3268 return 0;
3269}
3270
3271static int stv0367cab_read_snr(struct dvb_frontend *fe, u16 *snr)
3272{
3273 struct stv0367_state *state = fe->demodulator_priv;
3274 u32 noisepercentage;
3275 enum stv0367cab_mod QAMSize;
3276 u32 regval = 0, temp = 0;
3277 int power, i;
3278
3279 QAMSize = stv0367_readbits(state, F367CAB_QAM_MODE);
3280 switch (QAMSize) {
3281 case FE_CAB_MOD_QAM4:
3282 power = 21904;
3283 break;
3284 case FE_CAB_MOD_QAM16:
3285 power = 20480;
3286 break;
3287 case FE_CAB_MOD_QAM32:
3288 power = 23040;
3289 break;
3290 case FE_CAB_MOD_QAM64:
3291 power = 21504;
3292 break;
3293 case FE_CAB_MOD_QAM128:
3294 power = 23616;
3295 break;
3296 case FE_CAB_MOD_QAM256:
3297 power = 21760;
3298 break;
3299 case FE_CAB_MOD_QAM512:
3300 power = 1;
3301 break;
3302 case FE_CAB_MOD_QAM1024:
3303 power = 21280;
3304 break;
3305 default:
3306 power = 1;
3307 break;
3308 }
3309
3310 for (i = 0; i < 10; i++) {
3311 regval += (stv0367_readbits(state, F367CAB_SNR_LO)
3312 + 256 * stv0367_readbits(state, F367CAB_SNR_HI));
3313 }
3314
3315 regval /= 10; /*for average over 10 times in for loop above*/
3316 if (regval != 0) {
3317 temp = power
3318 * (1 << (3 + stv0367_readbits(state, F367CAB_SNR_PER)));
3319 temp /= regval;
3320 }
3321
3322 /* table values, not needed to calculate logarithms */
3323 if (temp >= 5012)
3324 noisepercentage = 100;
3325 else if (temp >= 3981)
3326 noisepercentage = 93;
3327 else if (temp >= 3162)
3328 noisepercentage = 86;
3329 else if (temp >= 2512)
3330 noisepercentage = 79;
3331 else if (temp >= 1995)
3332 noisepercentage = 72;
3333 else if (temp >= 1585)
3334 noisepercentage = 65;
3335 else if (temp >= 1259)
3336 noisepercentage = 58;
3337 else if (temp >= 1000)
3338 noisepercentage = 50;
3339 else if (temp >= 794)
3340 noisepercentage = 43;
3341 else if (temp >= 501)
3342 noisepercentage = 36;
3343 else if (temp >= 316)
3344 noisepercentage = 29;
3345 else if (temp >= 200)
3346 noisepercentage = 22;
3347 else if (temp >= 158)
3348 noisepercentage = 14;
3349 else if (temp >= 126)
3350 noisepercentage = 7;
3351 else
3352 noisepercentage = 0;
3353
3354 dprintk("%s: noisepercentage=%d\n", __func__, noisepercentage);
3355
3356 *snr = (noisepercentage * 65535) / 100;
3357
3358 return 0;
3359}
3360
Abylay Ospan78db66e2011-01-02 09:12:00 -03003361static int stv0367cab_read_ucblcks(struct dvb_frontend *fe, u32 *ucblocks)
3362{
3363 struct stv0367_state *state = fe->demodulator_priv;
3364 int corrected, tscount;
3365
3366 *ucblocks = (stv0367_readreg(state, R367CAB_RS_COUNTER_5) << 8)
3367 | stv0367_readreg(state, R367CAB_RS_COUNTER_4);
3368 corrected = (stv0367_readreg(state, R367CAB_RS_COUNTER_3) << 8)
3369 | stv0367_readreg(state, R367CAB_RS_COUNTER_2);
3370 tscount = (stv0367_readreg(state, R367CAB_RS_COUNTER_2) << 8)
3371 | stv0367_readreg(state, R367CAB_RS_COUNTER_1);
3372
3373 dprintk("%s: uncorrected blocks=%d corrected blocks=%d tscount=%d\n",
3374 __func__, *ucblocks, corrected, tscount);
3375
3376 return 0;
3377};
3378
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003379static struct dvb_frontend_ops stv0367cab_ops = {
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003380 .delsys = { SYS_DVBC_ANNEX_A },
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003381 .info = {
3382 .name = "ST STV0367 DVB-C",
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003383 .frequency_min = 47000000,
3384 .frequency_max = 862000000,
3385 .frequency_stepsize = 62500,
3386 .symbol_rate_min = 870000,
3387 .symbol_rate_max = 11700000,
3388 .caps = 0x400 |/* FE_CAN_QAM_4 */
3389 FE_CAN_QAM_16 | FE_CAN_QAM_32 |
3390 FE_CAN_QAM_64 | FE_CAN_QAM_128 |
3391 FE_CAN_QAM_256 | FE_CAN_FEC_AUTO
3392 },
3393 .release = stv0367_release,
3394 .init = stv0367cab_init,
3395 .sleep = stv0367cab_sleep,
3396 .i2c_gate_ctrl = stv0367cab_gate_ctrl,
Mauro Carvalho Chehab285d55a2011-12-26 13:03:00 -03003397 .set_frontend = stv0367cab_set_frontend,
3398 .get_frontend = stv0367cab_get_frontend,
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003399 .read_status = stv0367cab_read_status,
3400/* .read_ber = stv0367cab_read_ber, */
3401 .read_signal_strength = stv0367cab_read_strength,
3402 .read_snr = stv0367cab_read_snr,
Abylay Ospan78db66e2011-01-02 09:12:00 -03003403 .read_ucblocks = stv0367cab_read_ucblcks,
Igor M. Liplianin17cce932011-01-25 17:02:00 -03003404 .get_tune_settings = stv0367_get_tune_settings,
3405};
3406
3407struct dvb_frontend *stv0367cab_attach(const struct stv0367_config *config,
3408 struct i2c_adapter *i2c)
3409{
3410 struct stv0367_state *state = NULL;
3411 struct stv0367cab_state *cab_state = NULL;
3412
3413 /* allocate memory for the internal state */
3414 state = kzalloc(sizeof(struct stv0367_state), GFP_KERNEL);
3415 if (state == NULL)
3416 goto error;
3417 cab_state = kzalloc(sizeof(struct stv0367cab_state), GFP_KERNEL);
3418 if (cab_state == NULL)
3419 goto error;
3420
3421 /* setup the state */
3422 state->i2c = i2c;
3423 state->config = config;
3424 cab_state->search_range = 280000;
3425 state->cab_state = cab_state;
3426 state->fe.ops = stv0367cab_ops;
3427 state->fe.demodulator_priv = state;
3428 state->chip_id = stv0367_readreg(state, 0xf000);
3429
3430 dprintk("%s: chip_id = 0x%x\n", __func__, state->chip_id);
3431
3432 /* check if the demod is there */
3433 if ((state->chip_id != 0x50) && (state->chip_id != 0x60))
3434 goto error;
3435
3436 return &state->fe;
3437
3438error:
3439 kfree(cab_state);
3440 kfree(state);
3441 return NULL;
3442}
3443EXPORT_SYMBOL(stv0367cab_attach);
3444
3445MODULE_PARM_DESC(debug, "Set debug");
3446MODULE_PARM_DESC(i2c_debug, "Set i2c debug");
3447
3448MODULE_AUTHOR("Igor M. Liplianin");
3449MODULE_DESCRIPTION("ST STV0367 DVB-C/T demodulator driver");
3450MODULE_LICENSE("GPL");