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