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