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