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