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