Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / media / dvb-frontends / dib8000.c
1 /*
2  * Linux-DVB Driver for DiBcom's DiB8000 chip (ISDB-T).
3  *
4  * Copyright (C) 2009 DiBcom (http://www.dibcom.fr/)
5  *
6  * This program is free software; you can redistribute it and/or
7  *  modify it under the terms of the GNU General Public License as
8  *  published by the Free Software Foundation, version 2.
9  */
10 #include <linux/kernel.h>
11 #include <linux/slab.h>
12 #include <linux/i2c.h>
13 #include <linux/mutex.h>
14 #include <asm/div64.h>
15
16 #include "dvb_math.h"
17
18 #include "dvb_frontend.h"
19
20 #include "dib8000.h"
21
22 #define LAYER_ALL -1
23 #define LAYER_A   1
24 #define LAYER_B   2
25 #define LAYER_C   3
26
27 #define MAX_NUMBER_OF_FRONTENDS 6
28 /* #define DIB8000_AGC_FREEZE */
29
30 static int debug;
31 module_param(debug, int, 0644);
32 MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
33
34 #define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiB8000: "); printk(args); printk("\n"); } } while (0)
35
36 struct i2c_device {
37         struct i2c_adapter *adap;
38         u8 addr;
39         u8 *i2c_write_buffer;
40         u8 *i2c_read_buffer;
41         struct mutex *i2c_buffer_lock;
42 };
43
44 enum param_loop_step {
45         LOOP_TUNE_1,
46         LOOP_TUNE_2
47 };
48
49 enum dib8000_autosearch_step {
50         AS_START = 0,
51         AS_SEARCHING_FFT,
52         AS_SEARCHING_GUARD,
53         AS_DONE = 100,
54 };
55
56 enum timeout_mode {
57         SYMBOL_DEPENDENT_OFF = 0,
58         SYMBOL_DEPENDENT_ON,
59 };
60
61 struct dib8000_state {
62         struct dib8000_config cfg;
63
64         struct i2c_device i2c;
65
66         struct dibx000_i2c_master i2c_master;
67
68         u16 wbd_ref;
69
70         u8 current_band;
71         u32 current_bandwidth;
72         struct dibx000_agc_config *current_agc;
73         u32 timf;
74         u32 timf_default;
75
76         u8 div_force_off:1;
77         u8 div_state:1;
78         u16 div_sync_wait;
79
80         u8 agc_state;
81         u8 differential_constellation;
82         u8 diversity_onoff;
83
84         s16 ber_monitored_layer;
85         u16 gpio_dir;
86         u16 gpio_val;
87
88         u16 revision;
89         u8 isdbt_cfg_loaded;
90         enum frontend_tune_state tune_state;
91         s32 status;
92
93         struct dvb_frontend *fe[MAX_NUMBER_OF_FRONTENDS];
94
95         /* for the I2C transfer */
96         struct i2c_msg msg[2];
97         u8 i2c_write_buffer[4];
98         u8 i2c_read_buffer[2];
99         struct mutex i2c_buffer_lock;
100         u8 input_mode_mpeg;
101
102         u16 tuner_enable;
103         struct i2c_adapter dib8096p_tuner_adap;
104         u16 current_demod_bw;
105
106         u16 seg_mask;
107         u16 seg_diff_mask;
108         u16 mode;
109         u8 layer_b_nb_seg;
110         u8 layer_c_nb_seg;
111
112         u8 channel_parameters_set;
113         u16 autosearch_state;
114         u16 found_nfft;
115         u16 found_guard;
116         u8 subchannel;
117         u8 symbol_duration;
118         u32 timeout;
119         u8 longest_intlv_layer;
120         u16 output_mode;
121
122         /* for DVBv5 stats */
123         s64 init_ucb;
124         unsigned long per_jiffies_stats;
125         unsigned long ber_jiffies_stats;
126         unsigned long ber_jiffies_stats_layer[3];
127
128 #ifdef DIB8000_AGC_FREEZE
129         u16 agc1_max;
130         u16 agc1_min;
131         u16 agc2_max;
132         u16 agc2_min;
133 #endif
134 };
135
136 enum dib8000_power_mode {
137         DIB8000_POWER_ALL = 0,
138         DIB8000_POWER_INTERFACE_ONLY,
139 };
140
141 static u16 dib8000_i2c_read16(struct i2c_device *i2c, u16 reg)
142 {
143         u16 ret;
144         struct i2c_msg msg[2] = {
145                 {.addr = i2c->addr >> 1, .flags = 0, .len = 2},
146                 {.addr = i2c->addr >> 1, .flags = I2C_M_RD, .len = 2},
147         };
148
149         if (mutex_lock_interruptible(i2c->i2c_buffer_lock) < 0) {
150                 dprintk("could not acquire lock");
151                 return 0;
152         }
153
154         msg[0].buf    = i2c->i2c_write_buffer;
155         msg[0].buf[0] = reg >> 8;
156         msg[0].buf[1] = reg & 0xff;
157         msg[1].buf    = i2c->i2c_read_buffer;
158
159         if (i2c_transfer(i2c->adap, msg, 2) != 2)
160                 dprintk("i2c read error on %d", reg);
161
162         ret = (msg[1].buf[0] << 8) | msg[1].buf[1];
163         mutex_unlock(i2c->i2c_buffer_lock);
164         return ret;
165 }
166
167 static u16 __dib8000_read_word(struct dib8000_state *state, u16 reg)
168 {
169         u16 ret;
170
171         state->i2c_write_buffer[0] = reg >> 8;
172         state->i2c_write_buffer[1] = reg & 0xff;
173
174         memset(state->msg, 0, 2 * sizeof(struct i2c_msg));
175         state->msg[0].addr = state->i2c.addr >> 1;
176         state->msg[0].flags = 0;
177         state->msg[0].buf = state->i2c_write_buffer;
178         state->msg[0].len = 2;
179         state->msg[1].addr = state->i2c.addr >> 1;
180         state->msg[1].flags = I2C_M_RD;
181         state->msg[1].buf = state->i2c_read_buffer;
182         state->msg[1].len = 2;
183
184         if (i2c_transfer(state->i2c.adap, state->msg, 2) != 2)
185                 dprintk("i2c read error on %d", reg);
186
187         ret = (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
188
189         return ret;
190 }
191
192 static u16 dib8000_read_word(struct dib8000_state *state, u16 reg)
193 {
194         u16 ret;
195
196         if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
197                 dprintk("could not acquire lock");
198                 return 0;
199         }
200
201         ret = __dib8000_read_word(state, reg);
202
203         mutex_unlock(&state->i2c_buffer_lock);
204
205         return ret;
206 }
207
208 static u32 dib8000_read32(struct dib8000_state *state, u16 reg)
209 {
210         u16 rw[2];
211
212         if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
213                 dprintk("could not acquire lock");
214                 return 0;
215         }
216
217         rw[0] = __dib8000_read_word(state, reg + 0);
218         rw[1] = __dib8000_read_word(state, reg + 1);
219
220         mutex_unlock(&state->i2c_buffer_lock);
221
222         return ((rw[0] << 16) | (rw[1]));
223 }
224
225 static int dib8000_i2c_write16(struct i2c_device *i2c, u16 reg, u16 val)
226 {
227         struct i2c_msg msg = {.addr = i2c->addr >> 1, .flags = 0, .len = 4};
228         int ret = 0;
229
230         if (mutex_lock_interruptible(i2c->i2c_buffer_lock) < 0) {
231                 dprintk("could not acquire lock");
232                 return -EINVAL;
233         }
234
235         msg.buf    = i2c->i2c_write_buffer;
236         msg.buf[0] = (reg >> 8) & 0xff;
237         msg.buf[1] = reg & 0xff;
238         msg.buf[2] = (val >> 8) & 0xff;
239         msg.buf[3] = val & 0xff;
240
241         ret = i2c_transfer(i2c->adap, &msg, 1) != 1 ? -EREMOTEIO : 0;
242         mutex_unlock(i2c->i2c_buffer_lock);
243
244         return ret;
245 }
246
247 static int dib8000_write_word(struct dib8000_state *state, u16 reg, u16 val)
248 {
249         int ret;
250
251         if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
252                 dprintk("could not acquire lock");
253                 return -EINVAL;
254         }
255
256         state->i2c_write_buffer[0] = (reg >> 8) & 0xff;
257         state->i2c_write_buffer[1] = reg & 0xff;
258         state->i2c_write_buffer[2] = (val >> 8) & 0xff;
259         state->i2c_write_buffer[3] = val & 0xff;
260
261         memset(&state->msg[0], 0, sizeof(struct i2c_msg));
262         state->msg[0].addr = state->i2c.addr >> 1;
263         state->msg[0].flags = 0;
264         state->msg[0].buf = state->i2c_write_buffer;
265         state->msg[0].len = 4;
266
267         ret = (i2c_transfer(state->i2c.adap, state->msg, 1) != 1 ?
268                         -EREMOTEIO : 0);
269         mutex_unlock(&state->i2c_buffer_lock);
270
271         return ret;
272 }
273
274 static const s16 coeff_2k_sb_1seg_dqpsk[8] = {
275         (769 << 5) | 0x0a, (745 << 5) | 0x03, (595 << 5) | 0x0d, (769 << 5) | 0x0a, (920 << 5) | 0x09, (784 << 5) | 0x02, (519 << 5) | 0x0c,
276                 (920 << 5) | 0x09
277 };
278
279 static const s16 coeff_2k_sb_1seg[8] = {
280         (692 << 5) | 0x0b, (683 << 5) | 0x01, (519 << 5) | 0x09, (692 << 5) | 0x0b, 0 | 0x1f, 0 | 0x1f, 0 | 0x1f, 0 | 0x1f
281 };
282
283 static const s16 coeff_2k_sb_3seg_0dqpsk_1dqpsk[8] = {
284         (832 << 5) | 0x10, (912 << 5) | 0x05, (900 << 5) | 0x12, (832 << 5) | 0x10, (-931 << 5) | 0x0f, (912 << 5) | 0x04, (807 << 5) | 0x11,
285                 (-931 << 5) | 0x0f
286 };
287
288 static const s16 coeff_2k_sb_3seg_0dqpsk[8] = {
289         (622 << 5) | 0x0c, (941 << 5) | 0x04, (796 << 5) | 0x10, (622 << 5) | 0x0c, (982 << 5) | 0x0c, (519 << 5) | 0x02, (572 << 5) | 0x0e,
290                 (982 << 5) | 0x0c
291 };
292
293 static const s16 coeff_2k_sb_3seg_1dqpsk[8] = {
294         (699 << 5) | 0x14, (607 << 5) | 0x04, (944 << 5) | 0x13, (699 << 5) | 0x14, (-720 << 5) | 0x0d, (640 << 5) | 0x03, (866 << 5) | 0x12,
295                 (-720 << 5) | 0x0d
296 };
297
298 static const s16 coeff_2k_sb_3seg[8] = {
299         (664 << 5) | 0x0c, (925 << 5) | 0x03, (937 << 5) | 0x10, (664 << 5) | 0x0c, (-610 << 5) | 0x0a, (697 << 5) | 0x01, (836 << 5) | 0x0e,
300                 (-610 << 5) | 0x0a
301 };
302
303 static const s16 coeff_4k_sb_1seg_dqpsk[8] = {
304         (-955 << 5) | 0x0e, (687 << 5) | 0x04, (818 << 5) | 0x10, (-955 << 5) | 0x0e, (-922 << 5) | 0x0d, (750 << 5) | 0x03, (665 << 5) | 0x0f,
305                 (-922 << 5) | 0x0d
306 };
307
308 static const s16 coeff_4k_sb_1seg[8] = {
309         (638 << 5) | 0x0d, (683 << 5) | 0x02, (638 << 5) | 0x0d, (638 << 5) | 0x0d, (-655 << 5) | 0x0a, (517 << 5) | 0x00, (698 << 5) | 0x0d,
310                 (-655 << 5) | 0x0a
311 };
312
313 static const s16 coeff_4k_sb_3seg_0dqpsk_1dqpsk[8] = {
314         (-707 << 5) | 0x14, (910 << 5) | 0x06, (889 << 5) | 0x16, (-707 << 5) | 0x14, (-958 << 5) | 0x13, (993 << 5) | 0x05, (523 << 5) | 0x14,
315                 (-958 << 5) | 0x13
316 };
317
318 static const s16 coeff_4k_sb_3seg_0dqpsk[8] = {
319         (-723 << 5) | 0x13, (910 << 5) | 0x05, (777 << 5) | 0x14, (-723 << 5) | 0x13, (-568 << 5) | 0x0f, (547 << 5) | 0x03, (696 << 5) | 0x12,
320                 (-568 << 5) | 0x0f
321 };
322
323 static const s16 coeff_4k_sb_3seg_1dqpsk[8] = {
324         (-940 << 5) | 0x15, (607 << 5) | 0x05, (915 << 5) | 0x16, (-940 << 5) | 0x15, (-848 << 5) | 0x13, (683 << 5) | 0x04, (543 << 5) | 0x14,
325                 (-848 << 5) | 0x13
326 };
327
328 static const s16 coeff_4k_sb_3seg[8] = {
329         (612 << 5) | 0x12, (910 << 5) | 0x04, (864 << 5) | 0x14, (612 << 5) | 0x12, (-869 << 5) | 0x13, (683 << 5) | 0x02, (869 << 5) | 0x12,
330                 (-869 << 5) | 0x13
331 };
332
333 static const s16 coeff_8k_sb_1seg_dqpsk[8] = {
334         (-835 << 5) | 0x12, (684 << 5) | 0x05, (735 << 5) | 0x14, (-835 << 5) | 0x12, (-598 << 5) | 0x10, (781 << 5) | 0x04, (739 << 5) | 0x13,
335                 (-598 << 5) | 0x10
336 };
337
338 static const s16 coeff_8k_sb_1seg[8] = {
339         (673 << 5) | 0x0f, (683 << 5) | 0x03, (808 << 5) | 0x12, (673 << 5) | 0x0f, (585 << 5) | 0x0f, (512 << 5) | 0x01, (780 << 5) | 0x0f,
340                 (585 << 5) | 0x0f
341 };
342
343 static const s16 coeff_8k_sb_3seg_0dqpsk_1dqpsk[8] = {
344         (863 << 5) | 0x17, (930 << 5) | 0x07, (878 << 5) | 0x19, (863 << 5) | 0x17, (0 << 5) | 0x14, (521 << 5) | 0x05, (980 << 5) | 0x18,
345                 (0 << 5) | 0x14
346 };
347
348 static const s16 coeff_8k_sb_3seg_0dqpsk[8] = {
349         (-924 << 5) | 0x17, (910 << 5) | 0x06, (774 << 5) | 0x17, (-924 << 5) | 0x17, (-877 << 5) | 0x15, (565 << 5) | 0x04, (553 << 5) | 0x15,
350                 (-877 << 5) | 0x15
351 };
352
353 static const s16 coeff_8k_sb_3seg_1dqpsk[8] = {
354         (-921 << 5) | 0x19, (607 << 5) | 0x06, (881 << 5) | 0x19, (-921 << 5) | 0x19, (-921 << 5) | 0x14, (713 << 5) | 0x05, (1018 << 5) | 0x18,
355                 (-921 << 5) | 0x14
356 };
357
358 static const s16 coeff_8k_sb_3seg[8] = {
359         (514 << 5) | 0x14, (910 << 5) | 0x05, (861 << 5) | 0x17, (514 << 5) | 0x14, (690 << 5) | 0x14, (683 << 5) | 0x03, (662 << 5) | 0x15,
360                 (690 << 5) | 0x14
361 };
362
363 static const s16 ana_fe_coeff_3seg[24] = {
364         81, 80, 78, 74, 68, 61, 54, 45, 37, 28, 19, 11, 4, 1022, 1017, 1013, 1010, 1008, 1008, 1008, 1008, 1010, 1014, 1017
365 };
366
367 static const s16 ana_fe_coeff_1seg[24] = {
368         249, 226, 164, 82, 5, 981, 970, 988, 1018, 20, 31, 26, 8, 1012, 1000, 1018, 1012, 8, 15, 14, 9, 3, 1017, 1003
369 };
370
371 static const s16 ana_fe_coeff_13seg[24] = {
372         396, 305, 105, -51, -77, -12, 41, 31, -11, -30, -11, 14, 15, -2, -13, -7, 5, 8, 1, -6, -7, -3, 0, 1
373 };
374
375 static u16 fft_to_mode(struct dib8000_state *state)
376 {
377         u16 mode;
378         switch (state->fe[0]->dtv_property_cache.transmission_mode) {
379         case TRANSMISSION_MODE_2K:
380                 mode = 1;
381                 break;
382         case TRANSMISSION_MODE_4K:
383                 mode = 2;
384                 break;
385         default:
386         case TRANSMISSION_MODE_AUTO:
387         case TRANSMISSION_MODE_8K:
388                 mode = 3;
389                 break;
390         }
391         return mode;
392 }
393
394 static void dib8000_set_acquisition_mode(struct dib8000_state *state)
395 {
396         u16 nud = dib8000_read_word(state, 298);
397         nud |= (1 << 3) | (1 << 0);
398         dprintk("acquisition mode activated");
399         dib8000_write_word(state, 298, nud);
400 }
401 static int dib8000_set_output_mode(struct dvb_frontend *fe, int mode)
402 {
403         struct dib8000_state *state = fe->demodulator_priv;
404         u16 outreg, fifo_threshold, smo_mode, sram = 0x0205;    /* by default SDRAM deintlv is enabled */
405
406         state->output_mode = mode;
407         outreg = 0;
408         fifo_threshold = 1792;
409         smo_mode = (dib8000_read_word(state, 299) & 0x0050) | (1 << 1);
410
411         dprintk("-I-    Setting output mode for demod %p to %d",
412                         &state->fe[0], mode);
413
414         switch (mode) {
415         case OUTMODE_MPEG2_PAR_GATED_CLK:       // STBs with parallel gated clock
416                 outreg = (1 << 10);     /* 0x0400 */
417                 break;
418         case OUTMODE_MPEG2_PAR_CONT_CLK:        // STBs with parallel continues clock
419                 outreg = (1 << 10) | (1 << 6);  /* 0x0440 */
420                 break;
421         case OUTMODE_MPEG2_SERIAL:      // STBs with serial input
422                 outreg = (1 << 10) | (2 << 6) | (0 << 1);       /* 0x0482 */
423                 break;
424         case OUTMODE_DIVERSITY:
425                 if (state->cfg.hostbus_diversity) {
426                         outreg = (1 << 10) | (4 << 6);  /* 0x0500 */
427                         sram &= 0xfdff;
428                 } else
429                         sram |= 0x0c00;
430                 break;
431         case OUTMODE_MPEG2_FIFO:        // e.g. USB feeding
432                 smo_mode |= (3 << 1);
433                 fifo_threshold = 512;
434                 outreg = (1 << 10) | (5 << 6);
435                 break;
436         case OUTMODE_HIGH_Z:    // disable
437                 outreg = 0;
438                 break;
439
440         case OUTMODE_ANALOG_ADC:
441                 outreg = (1 << 10) | (3 << 6);
442                 dib8000_set_acquisition_mode(state);
443                 break;
444
445         default:
446                 dprintk("Unhandled output_mode passed to be set for demod %p",
447                                 &state->fe[0]);
448                 return -EINVAL;
449         }
450
451         if (state->cfg.output_mpeg2_in_188_bytes)
452                 smo_mode |= (1 << 5);
453
454         dib8000_write_word(state, 299, smo_mode);
455         dib8000_write_word(state, 300, fifo_threshold); /* synchronous fread */
456         dib8000_write_word(state, 1286, outreg);
457         dib8000_write_word(state, 1291, sram);
458
459         return 0;
460 }
461
462 static int dib8000_set_diversity_in(struct dvb_frontend *fe, int onoff)
463 {
464         struct dib8000_state *state = fe->demodulator_priv;
465         u16 tmp, sync_wait = dib8000_read_word(state, 273) & 0xfff0;
466
467         dprintk("set diversity input to %i", onoff);
468         if (!state->differential_constellation) {
469                 dib8000_write_word(state, 272, 1 << 9); //dvsy_off_lmod4 = 1
470                 dib8000_write_word(state, 273, sync_wait | (1 << 2) | 2);       // sync_enable = 1; comb_mode = 2
471         } else {
472                 dib8000_write_word(state, 272, 0);      //dvsy_off_lmod4 = 0
473                 dib8000_write_word(state, 273, sync_wait);      // sync_enable = 0; comb_mode = 0
474         }
475         state->diversity_onoff = onoff;
476
477         switch (onoff) {
478         case 0:         /* only use the internal way - not the diversity input */
479                 dib8000_write_word(state, 270, 1);
480                 dib8000_write_word(state, 271, 0);
481                 break;
482         case 1:         /* both ways */
483                 dib8000_write_word(state, 270, 6);
484                 dib8000_write_word(state, 271, 6);
485                 break;
486         case 2:         /* only the diversity input */
487                 dib8000_write_word(state, 270, 0);
488                 dib8000_write_word(state, 271, 1);
489                 break;
490         }
491
492         if (state->revision == 0x8002) {
493                 tmp = dib8000_read_word(state, 903);
494                 dib8000_write_word(state, 903, tmp & ~(1 << 3));
495                 msleep(30);
496                 dib8000_write_word(state, 903, tmp | (1 << 3));
497         }
498         return 0;
499 }
500
501 static void dib8000_set_power_mode(struct dib8000_state *state, enum dib8000_power_mode mode)
502 {
503         /* by default everything is going to be powered off */
504         u16 reg_774 = 0x3fff, reg_775 = 0xffff, reg_776 = 0xffff,
505                 reg_900 = (dib8000_read_word(state, 900) & 0xfffc) | 0x3,
506                 reg_1280;
507
508         if (state->revision != 0x8090)
509                 reg_1280 = (dib8000_read_word(state, 1280) & 0x00ff) | 0xff00;
510         else
511                 reg_1280 = (dib8000_read_word(state, 1280) & 0x707f) | 0x8f80;
512
513         /* now, depending on the requested mode, we power on */
514         switch (mode) {
515                 /* power up everything in the demod */
516         case DIB8000_POWER_ALL:
517                 reg_774 = 0x0000;
518                 reg_775 = 0x0000;
519                 reg_776 = 0x0000;
520                 reg_900 &= 0xfffc;
521                 if (state->revision != 0x8090)
522                         reg_1280 &= 0x00ff;
523                 else
524                         reg_1280 &= 0x707f;
525                 break;
526         case DIB8000_POWER_INTERFACE_ONLY:
527                 if (state->revision != 0x8090)
528                         reg_1280 &= 0x00ff;
529                 else
530                         reg_1280 &= 0xfa7b;
531                 break;
532         }
533
534         dprintk("powermode : 774 : %x ; 775 : %x; 776 : %x ; 900 : %x; 1280 : %x", reg_774, reg_775, reg_776, reg_900, reg_1280);
535         dib8000_write_word(state, 774, reg_774);
536         dib8000_write_word(state, 775, reg_775);
537         dib8000_write_word(state, 776, reg_776);
538         dib8000_write_word(state, 900, reg_900);
539         dib8000_write_word(state, 1280, reg_1280);
540 }
541
542 static int dib8000_set_adc_state(struct dib8000_state *state, enum dibx000_adc_states no)
543 {
544         int ret = 0;
545         u16 reg, reg_907 = dib8000_read_word(state, 907);
546         u16 reg_908 = dib8000_read_word(state, 908);
547
548         switch (no) {
549         case DIBX000_SLOW_ADC_ON:
550                 if (state->revision != 0x8090) {
551                         reg_908 |= (1 << 1) | (1 << 0);
552                         ret |= dib8000_write_word(state, 908, reg_908);
553                         reg_908 &= ~(1 << 1);
554                 } else {
555                         reg = dib8000_read_word(state, 1925);
556                         /* en_slowAdc = 1 & reset_sladc = 1 */
557                         dib8000_write_word(state, 1925, reg |
558                                         (1<<4) | (1<<2));
559
560                         /* read acces to make it works... strange ... */
561                         reg = dib8000_read_word(state, 1925);
562                         msleep(20);
563                         /* en_slowAdc = 1 & reset_sladc = 0 */
564                         dib8000_write_word(state, 1925, reg & ~(1<<4));
565
566                         reg = dib8000_read_word(state, 921) & ~((0x3 << 14)
567                                         | (0x3 << 12));
568                         /* ref = Vin1 => Vbg ; sel = Vin0 or Vin3 ;
569                            (Vin2 = Vcm) */
570                         dib8000_write_word(state, 921, reg | (1 << 14)
571                                         | (3 << 12));
572                 }
573                 break;
574
575         case DIBX000_SLOW_ADC_OFF:
576                 if (state->revision == 0x8090) {
577                         reg = dib8000_read_word(state, 1925);
578                         /* reset_sladc = 1 en_slowAdc = 0 */
579                         dib8000_write_word(state, 1925,
580                                         (reg & ~(1<<2)) | (1<<4));
581                 }
582                 reg_908 |= (1 << 1) | (1 << 0);
583                 break;
584
585         case DIBX000_ADC_ON:
586                 reg_907 &= 0x0fff;
587                 reg_908 &= 0x0003;
588                 break;
589
590         case DIBX000_ADC_OFF:   // leave the VBG voltage on
591                 reg_907 |= (1 << 14) | (1 << 13) | (1 << 12);
592                 reg_908 |= (1 << 5) | (1 << 4) | (1 << 3) | (1 << 2);
593                 break;
594
595         case DIBX000_VBG_ENABLE:
596                 reg_907 &= ~(1 << 15);
597                 break;
598
599         case DIBX000_VBG_DISABLE:
600                 reg_907 |= (1 << 15);
601                 break;
602
603         default:
604                 break;
605         }
606
607         ret |= dib8000_write_word(state, 907, reg_907);
608         ret |= dib8000_write_word(state, 908, reg_908);
609
610         return ret;
611 }
612
613 static int dib8000_set_bandwidth(struct dvb_frontend *fe, u32 bw)
614 {
615         struct dib8000_state *state = fe->demodulator_priv;
616         u32 timf;
617
618         if (bw == 0)
619                 bw = 6000;
620
621         if (state->timf == 0) {
622                 dprintk("using default timf");
623                 timf = state->timf_default;
624         } else {
625                 dprintk("using updated timf");
626                 timf = state->timf;
627         }
628
629         dib8000_write_word(state, 29, (u16) ((timf >> 16) & 0xffff));
630         dib8000_write_word(state, 30, (u16) ((timf) & 0xffff));
631
632         return 0;
633 }
634
635 static int dib8000_sad_calib(struct dib8000_state *state)
636 {
637         u8 sad_sel = 3;
638
639         if (state->revision == 0x8090) {
640                 dib8000_write_word(state, 922, (sad_sel << 2));
641                 dib8000_write_word(state, 923, 2048);
642
643                 dib8000_write_word(state, 922, (sad_sel << 2) | 0x1);
644                 dib8000_write_word(state, 922, (sad_sel << 2));
645         } else {
646                 /* internal */
647                 dib8000_write_word(state, 923, (0 << 1) | (0 << 0));
648                 dib8000_write_word(state, 924, 776);
649
650                 /* do the calibration */
651                 dib8000_write_word(state, 923, (1 << 0));
652                 dib8000_write_word(state, 923, (0 << 0));
653         }
654
655         msleep(1);
656         return 0;
657 }
658
659 int dib8000_set_wbd_ref(struct dvb_frontend *fe, u16 value)
660 {
661         struct dib8000_state *state = fe->demodulator_priv;
662         if (value > 4095)
663                 value = 4095;
664         state->wbd_ref = value;
665         return dib8000_write_word(state, 106, value);
666 }
667 EXPORT_SYMBOL(dib8000_set_wbd_ref);
668
669 static void dib8000_reset_pll_common(struct dib8000_state *state, const struct dibx000_bandwidth_config *bw)
670 {
671         dprintk("ifreq: %d %x, inversion: %d", bw->ifreq, bw->ifreq, bw->ifreq >> 25);
672         if (state->revision != 0x8090) {
673                 dib8000_write_word(state, 23,
674                                 (u16) (((bw->internal * 1000) >> 16) & 0xffff));
675                 dib8000_write_word(state, 24,
676                                 (u16) ((bw->internal * 1000) & 0xffff));
677         } else {
678                 dib8000_write_word(state, 23, (u16) (((bw->internal / 2 * 1000) >> 16) & 0xffff));
679                 dib8000_write_word(state, 24,
680                                 (u16) ((bw->internal  / 2 * 1000) & 0xffff));
681         }
682         dib8000_write_word(state, 27, (u16) ((bw->ifreq >> 16) & 0x01ff));
683         dib8000_write_word(state, 28, (u16) (bw->ifreq & 0xffff));
684         dib8000_write_word(state, 26, (u16) ((bw->ifreq >> 25) & 0x0003));
685
686         if (state->revision != 0x8090)
687                 dib8000_write_word(state, 922, bw->sad_cfg);
688 }
689
690 static void dib8000_reset_pll(struct dib8000_state *state)
691 {
692         const struct dibx000_bandwidth_config *pll = state->cfg.pll;
693         u16 clk_cfg1, reg;
694
695         if (state->revision != 0x8090) {
696                 dib8000_write_word(state, 901,
697                                 (pll->pll_prediv << 8) | (pll->pll_ratio << 0));
698
699                 clk_cfg1 = (1 << 10) | (0 << 9) | (pll->IO_CLK_en_core << 8) |
700                         (pll->bypclk_div << 5) | (pll->enable_refdiv << 4) |
701                         (1 << 3) | (pll->pll_range << 1) |
702                         (pll->pll_reset << 0);
703
704                 dib8000_write_word(state, 902, clk_cfg1);
705                 clk_cfg1 = (clk_cfg1 & 0xfff7) | (pll->pll_bypass << 3);
706                 dib8000_write_word(state, 902, clk_cfg1);
707
708                 dprintk("clk_cfg1: 0x%04x", clk_cfg1);
709
710                 /* smpl_cfg: P_refclksel=2, P_ensmplsel=1 nodivsmpl=1 */
711                 if (state->cfg.pll->ADClkSrc == 0)
712                         dib8000_write_word(state, 904,
713                                         (0 << 15) | (0 << 12) | (0 << 10) |
714                                         (pll->modulo << 8) |
715                                         (pll->ADClkSrc << 7) | (0 << 1));
716                 else if (state->cfg.refclksel != 0)
717                         dib8000_write_word(state, 904, (0 << 15) | (1 << 12) |
718                                         ((state->cfg.refclksel & 0x3) << 10) |
719                                         (pll->modulo << 8) |
720                                         (pll->ADClkSrc << 7) | (0 << 1));
721                 else
722                         dib8000_write_word(state, 904, (0 << 15) | (1 << 12) |
723                                         (3 << 10) | (pll->modulo << 8) |
724                                         (pll->ADClkSrc << 7) | (0 << 1));
725         } else {
726                 dib8000_write_word(state, 1856, (!pll->pll_reset<<13) |
727                                 (pll->pll_range<<12) | (pll->pll_ratio<<6) |
728                                 (pll->pll_prediv));
729
730                 reg = dib8000_read_word(state, 1857);
731                 dib8000_write_word(state, 1857, reg|(!pll->pll_bypass<<15));
732
733                 reg = dib8000_read_word(state, 1858); /* Force clk out pll /2 */
734                 dib8000_write_word(state, 1858, reg | 1);
735
736                 dib8000_write_word(state, 904, (pll->modulo << 8));
737         }
738
739         dib8000_reset_pll_common(state, pll);
740 }
741
742 int dib8000_update_pll(struct dvb_frontend *fe,
743                 struct dibx000_bandwidth_config *pll, u32 bw, u8 ratio)
744 {
745         struct dib8000_state *state = fe->demodulator_priv;
746         u16 reg_1857, reg_1856 = dib8000_read_word(state, 1856);
747         u8 loopdiv, prediv, oldprediv = state->cfg.pll->pll_prediv ;
748         u32 internal, xtal;
749
750         /* get back old values */
751         prediv = reg_1856 & 0x3f;
752         loopdiv = (reg_1856 >> 6) & 0x3f;
753
754         if ((pll == NULL) || (pll->pll_prediv == prediv &&
755                                 pll->pll_ratio == loopdiv))
756                 return -EINVAL;
757
758         dprintk("Updating pll (prediv: old =  %d new = %d ; loopdiv : old = %d new = %d)", prediv, pll->pll_prediv, loopdiv, pll->pll_ratio);
759         if (state->revision == 0x8090) {
760                 reg_1856 &= 0xf000;
761                 reg_1857 = dib8000_read_word(state, 1857);
762                 /* disable PLL */
763                 dib8000_write_word(state, 1857, reg_1857 & ~(1 << 15));
764
765                 dib8000_write_word(state, 1856, reg_1856 |
766                                 ((pll->pll_ratio & 0x3f) << 6) |
767                                 (pll->pll_prediv & 0x3f));
768
769                 /* write new system clk into P_sec_len */
770                 internal = dib8000_read32(state, 23) / 1000;
771                 dprintk("Old Internal = %d", internal);
772                 xtal = 2 * (internal / loopdiv) * prediv;
773                 internal = 1000 * (xtal/pll->pll_prediv) * pll->pll_ratio;
774                 dprintk("Xtal = %d , New Fmem = %d New Fdemod = %d, New Fsampling = %d", xtal, internal/1000, internal/2000, internal/8000);
775                 dprintk("New Internal = %d", internal);
776
777                 dib8000_write_word(state, 23,
778                                 (u16) (((internal / 2) >> 16) & 0xffff));
779                 dib8000_write_word(state, 24, (u16) ((internal / 2) & 0xffff));
780                 /* enable PLL */
781                 dib8000_write_word(state, 1857, reg_1857 | (1 << 15));
782
783                 while (((dib8000_read_word(state, 1856)>>15)&0x1) != 1)
784                         dprintk("Waiting for PLL to lock");
785
786                 /* verify */
787                 reg_1856 = dib8000_read_word(state, 1856);
788                 dprintk("PLL Updated with prediv = %d and loopdiv = %d",
789                                 reg_1856&0x3f, (reg_1856>>6)&0x3f);
790         } else {
791                 if (bw != state->current_demod_bw) {
792                         /** Bandwidth change => force PLL update **/
793                         dprintk("PLL: Bandwidth Change %d MHz -> %d MHz (prediv: %d->%d)", state->current_demod_bw / 1000, bw / 1000, oldprediv, state->cfg.pll->pll_prediv);
794
795                         if (state->cfg.pll->pll_prediv != oldprediv) {
796                                 /** Full PLL change only if prediv is changed **/
797
798                                 /** full update => bypass and reconfigure **/
799                                 dprintk("PLL: New Setting for %d MHz Bandwidth (prediv: %d, ratio: %d)", bw/1000, state->cfg.pll->pll_prediv, state->cfg.pll->pll_ratio);
800                                 dib8000_write_word(state, 902, dib8000_read_word(state, 902) | (1<<3)); /* bypass PLL */
801                                 dib8000_reset_pll(state);
802                                 dib8000_write_word(state, 898, 0x0004); /* sad */
803                         } else
804                                 ratio = state->cfg.pll->pll_ratio;
805
806                         state->current_demod_bw = bw;
807                 }
808
809                 if (ratio != 0) {
810                         /** ratio update => only change ratio **/
811                         dprintk("PLL: Update ratio (prediv: %d, ratio: %d)", state->cfg.pll->pll_prediv, ratio);
812                         dib8000_write_word(state, 901, (state->cfg.pll->pll_prediv << 8) | (ratio << 0)); /* only the PLL ratio is updated. */
813                 }
814         }
815
816         return 0;
817 }
818 EXPORT_SYMBOL(dib8000_update_pll);
819
820
821 static int dib8000_reset_gpio(struct dib8000_state *st)
822 {
823         /* reset the GPIOs */
824         dib8000_write_word(st, 1029, st->cfg.gpio_dir);
825         dib8000_write_word(st, 1030, st->cfg.gpio_val);
826
827         /* TODO 782 is P_gpio_od */
828
829         dib8000_write_word(st, 1032, st->cfg.gpio_pwm_pos);
830
831         dib8000_write_word(st, 1037, st->cfg.pwm_freq_div);
832         return 0;
833 }
834
835 static int dib8000_cfg_gpio(struct dib8000_state *st, u8 num, u8 dir, u8 val)
836 {
837         st->cfg.gpio_dir = dib8000_read_word(st, 1029);
838         st->cfg.gpio_dir &= ~(1 << num);        /* reset the direction bit */
839         st->cfg.gpio_dir |= (dir & 0x1) << num; /* set the new direction */
840         dib8000_write_word(st, 1029, st->cfg.gpio_dir);
841
842         st->cfg.gpio_val = dib8000_read_word(st, 1030);
843         st->cfg.gpio_val &= ~(1 << num);        /* reset the direction bit */
844         st->cfg.gpio_val |= (val & 0x01) << num;        /* set the new value */
845         dib8000_write_word(st, 1030, st->cfg.gpio_val);
846
847         dprintk("gpio dir: %x: gpio val: %x", st->cfg.gpio_dir, st->cfg.gpio_val);
848
849         return 0;
850 }
851
852 int dib8000_set_gpio(struct dvb_frontend *fe, u8 num, u8 dir, u8 val)
853 {
854         struct dib8000_state *state = fe->demodulator_priv;
855         return dib8000_cfg_gpio(state, num, dir, val);
856 }
857
858 EXPORT_SYMBOL(dib8000_set_gpio);
859 static const u16 dib8000_defaults[] = {
860         /* auto search configuration - lock0 by default waiting
861          * for cpil_lock; lock1 cpil_lock; lock2 tmcc_sync_lock */
862         3, 7,
863         0x0004,
864         0x0400,
865         0x0814,
866
867         12, 11,
868         0x001b,
869         0x7740,
870         0x005b,
871         0x8d80,
872         0x01c9,
873         0xc380,
874         0x0000,
875         0x0080,
876         0x0000,
877         0x0090,
878         0x0001,
879         0xd4c0,
880
881         /*1, 32,
882                 0x6680 // P_corm_thres Lock algorithms configuration */
883
884         11, 80,                 /* set ADC level to -16 */
885         (1 << 13) - 825 - 117,
886         (1 << 13) - 837 - 117,
887         (1 << 13) - 811 - 117,
888         (1 << 13) - 766 - 117,
889         (1 << 13) - 737 - 117,
890         (1 << 13) - 693 - 117,
891         (1 << 13) - 648 - 117,
892         (1 << 13) - 619 - 117,
893         (1 << 13) - 575 - 117,
894         (1 << 13) - 531 - 117,
895         (1 << 13) - 501 - 117,
896
897         4, 108,
898         0,
899         0,
900         0,
901         0,
902
903         1, 175,
904         0x0410,
905         1, 179,
906         8192,                   // P_fft_nb_to_cut
907
908         6, 181,
909         0x2800,                 // P_coff_corthres_ ( 2k 4k 8k ) 0x2800
910         0x2800,
911         0x2800,
912         0x2800,                 // P_coff_cpilthres_ ( 2k 4k 8k ) 0x2800
913         0x2800,
914         0x2800,
915
916         2, 193,
917         0x0666,                 // P_pha3_thres
918         0x0000,                 // P_cti_use_cpe, P_cti_use_prog
919
920         2, 205,
921         0x200f,                 // P_cspu_regul, P_cspu_win_cut
922         0x000f,                 // P_des_shift_work
923
924         5, 215,
925         0x023d,                 // P_adp_regul_cnt
926         0x00a4,                 // P_adp_noise_cnt
927         0x00a4,                 // P_adp_regul_ext
928         0x7ff0,                 // P_adp_noise_ext
929         0x3ccc,                 // P_adp_fil
930
931         1, 230,
932         0x0000,                 // P_2d_byp_ti_num
933
934         1, 263,
935         0x800,                  //P_equal_thres_wgn
936
937         1, 268,
938         (2 << 9) | 39,          // P_equal_ctrl_synchro, P_equal_speedmode
939
940         1, 270,
941         0x0001,                 // P_div_lock0_wait
942         1, 285,
943         0x0020,                 //p_fec_
944         1, 299,
945         0x0062,                 /* P_smo_mode, P_smo_rs_discard, P_smo_fifo_flush, P_smo_pid_parse, P_smo_error_discard */
946
947         1, 338,
948         (1 << 12) |             // P_ctrl_corm_thres4pre_freq_inh=1
949                 (1 << 10) |
950                 (0 << 9) |              /* P_ctrl_pre_freq_inh=0 */
951                 (3 << 5) |              /* P_ctrl_pre_freq_step=3 */
952                 (1 << 0),               /* P_pre_freq_win_len=1 */
953
954         0,
955 };
956
957 static u16 dib8000_identify(struct i2c_device *client)
958 {
959         u16 value;
960
961         //because of glitches sometimes
962         value = dib8000_i2c_read16(client, 896);
963
964         if ((value = dib8000_i2c_read16(client, 896)) != 0x01b3) {
965                 dprintk("wrong Vendor ID (read=0x%x)", value);
966                 return 0;
967         }
968
969         value = dib8000_i2c_read16(client, 897);
970         if (value != 0x8000 && value != 0x8001 &&
971                         value != 0x8002 && value != 0x8090) {
972                 dprintk("wrong Device ID (%x)", value);
973                 return 0;
974         }
975
976         switch (value) {
977         case 0x8000:
978                 dprintk("found DiB8000A");
979                 break;
980         case 0x8001:
981                 dprintk("found DiB8000B");
982                 break;
983         case 0x8002:
984                 dprintk("found DiB8000C");
985                 break;
986         case 0x8090:
987                 dprintk("found DiB8096P");
988                 break;
989         }
990         return value;
991 }
992
993 static int dib8000_read_unc_blocks(struct dvb_frontend *fe, u32 *unc);
994
995 static void dib8000_reset_stats(struct dvb_frontend *fe)
996 {
997         struct dib8000_state *state = fe->demodulator_priv;
998         struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
999         u32 ucb;
1000
1001         memset(&c->strength, 0, sizeof(c->strength));
1002         memset(&c->cnr, 0, sizeof(c->cnr));
1003         memset(&c->post_bit_error, 0, sizeof(c->post_bit_error));
1004         memset(&c->post_bit_count, 0, sizeof(c->post_bit_count));
1005         memset(&c->block_error, 0, sizeof(c->block_error));
1006
1007         c->strength.len = 1;
1008         c->cnr.len = 1;
1009         c->block_error.len = 1;
1010         c->block_count.len = 1;
1011         c->post_bit_error.len = 1;
1012         c->post_bit_count.len = 1;
1013
1014         c->strength.stat[0].scale = FE_SCALE_DECIBEL;
1015         c->strength.stat[0].uvalue = 0;
1016
1017         c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1018         c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1019         c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1020         c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1021         c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1022
1023         dib8000_read_unc_blocks(fe, &ucb);
1024
1025         state->init_ucb = -ucb;
1026         state->ber_jiffies_stats = 0;
1027         state->per_jiffies_stats = 0;
1028         memset(&state->ber_jiffies_stats_layer, 0,
1029                sizeof(state->ber_jiffies_stats_layer));
1030 }
1031
1032 static int dib8000_reset(struct dvb_frontend *fe)
1033 {
1034         struct dib8000_state *state = fe->demodulator_priv;
1035
1036         if ((state->revision = dib8000_identify(&state->i2c)) == 0)
1037                 return -EINVAL;
1038
1039         /* sram lead in, rdy */
1040         if (state->revision != 0x8090)
1041                 dib8000_write_word(state, 1287, 0x0003);
1042
1043         if (state->revision == 0x8000)
1044                 dprintk("error : dib8000 MA not supported");
1045
1046         dibx000_reset_i2c_master(&state->i2c_master);
1047
1048         dib8000_set_power_mode(state, DIB8000_POWER_ALL);
1049
1050         /* always leave the VBG voltage on - it consumes almost nothing but takes a long time to start */
1051         dib8000_set_adc_state(state, DIBX000_ADC_OFF);
1052
1053         /* restart all parts */
1054         dib8000_write_word(state, 770, 0xffff);
1055         dib8000_write_word(state, 771, 0xffff);
1056         dib8000_write_word(state, 772, 0xfffc);
1057         if (state->revision == 0x8090)
1058                 dib8000_write_word(state, 1280, 0x0045);
1059         else
1060                 dib8000_write_word(state, 1280, 0x004d);
1061         dib8000_write_word(state, 1281, 0x000c);
1062
1063         dib8000_write_word(state, 770, 0x0000);
1064         dib8000_write_word(state, 771, 0x0000);
1065         dib8000_write_word(state, 772, 0x0000);
1066         dib8000_write_word(state, 898, 0x0004); // sad
1067         dib8000_write_word(state, 1280, 0x0000);
1068         dib8000_write_word(state, 1281, 0x0000);
1069
1070         /* drives */
1071         if (state->revision != 0x8090) {
1072                 if (state->cfg.drives)
1073                         dib8000_write_word(state, 906, state->cfg.drives);
1074                 else {
1075                         dprintk("using standard PAD-drive-settings, please adjust settings in config-struct to be optimal.");
1076                         /* min drive SDRAM - not optimal - adjust */
1077                         dib8000_write_word(state, 906, 0x2d98);
1078                 }
1079         }
1080
1081         dib8000_reset_pll(state);
1082         if (state->revision != 0x8090)
1083                 dib8000_write_word(state, 898, 0x0004);
1084
1085         if (dib8000_reset_gpio(state) != 0)
1086                 dprintk("GPIO reset was not successful.");
1087
1088         if ((state->revision != 0x8090) &&
1089                         (dib8000_set_output_mode(fe, OUTMODE_HIGH_Z) != 0))
1090                 dprintk("OUTPUT_MODE could not be resetted.");
1091
1092         state->current_agc = NULL;
1093
1094         // P_iqc_alpha_pha, P_iqc_alpha_amp, P_iqc_dcc_alpha, ...
1095         /* P_iqc_ca2 = 0; P_iqc_impnc_on = 0; P_iqc_mode = 0; */
1096         if (state->cfg.pll->ifreq == 0)
1097                 dib8000_write_word(state, 40, 0x0755);  /* P_iqc_corr_inh = 0 enable IQcorr block */
1098         else
1099                 dib8000_write_word(state, 40, 0x1f55);  /* P_iqc_corr_inh = 1 disable IQcorr block */
1100
1101         {
1102                 u16 l = 0, r;
1103                 const u16 *n;
1104                 n = dib8000_defaults;
1105                 l = *n++;
1106                 while (l) {
1107                         r = *n++;
1108                         do {
1109                                 dib8000_write_word(state, r, *n++);
1110                                 r++;
1111                         } while (--l);
1112                         l = *n++;
1113                 }
1114         }
1115
1116         state->isdbt_cfg_loaded = 0;
1117
1118         //div_cfg override for special configs
1119         if ((state->revision != 8090) && (state->cfg.div_cfg != 0))
1120                 dib8000_write_word(state, 903, state->cfg.div_cfg);
1121
1122         /* unforce divstr regardless whether i2c enumeration was done or not */
1123         dib8000_write_word(state, 1285, dib8000_read_word(state, 1285) & ~(1 << 1));
1124
1125         dib8000_set_bandwidth(fe, 6000);
1126
1127         dib8000_set_adc_state(state, DIBX000_SLOW_ADC_ON);
1128         dib8000_sad_calib(state);
1129         if (state->revision != 0x8090)
1130                 dib8000_set_adc_state(state, DIBX000_SLOW_ADC_OFF);
1131
1132         /* ber_rs_len = 3 */
1133         dib8000_write_word(state, 285, (dib8000_read_word(state, 285) & ~0x60) | (3 << 5));
1134
1135         dib8000_set_power_mode(state, DIB8000_POWER_INTERFACE_ONLY);
1136
1137         dib8000_reset_stats(fe);
1138
1139         return 0;
1140 }
1141
1142 static void dib8000_restart_agc(struct dib8000_state *state)
1143 {
1144         // P_restart_iqc & P_restart_agc
1145         dib8000_write_word(state, 770, 0x0a00);
1146         dib8000_write_word(state, 770, 0x0000);
1147 }
1148
1149 static int dib8000_update_lna(struct dib8000_state *state)
1150 {
1151         u16 dyn_gain;
1152
1153         if (state->cfg.update_lna) {
1154                 // read dyn_gain here (because it is demod-dependent and not tuner)
1155                 dyn_gain = dib8000_read_word(state, 390);
1156
1157                 if (state->cfg.update_lna(state->fe[0], dyn_gain)) {
1158                         dib8000_restart_agc(state);
1159                         return 1;
1160                 }
1161         }
1162         return 0;
1163 }
1164
1165 static int dib8000_set_agc_config(struct dib8000_state *state, u8 band)
1166 {
1167         struct dibx000_agc_config *agc = NULL;
1168         int i;
1169         u16 reg;
1170
1171         if (state->current_band == band && state->current_agc != NULL)
1172                 return 0;
1173         state->current_band = band;
1174
1175         for (i = 0; i < state->cfg.agc_config_count; i++)
1176                 if (state->cfg.agc[i].band_caps & band) {
1177                         agc = &state->cfg.agc[i];
1178                         break;
1179                 }
1180
1181         if (agc == NULL) {
1182                 dprintk("no valid AGC configuration found for band 0x%02x", band);
1183                 return -EINVAL;
1184         }
1185
1186         state->current_agc = agc;
1187
1188         /* AGC */
1189         dib8000_write_word(state, 76, agc->setup);
1190         dib8000_write_word(state, 77, agc->inv_gain);
1191         dib8000_write_word(state, 78, agc->time_stabiliz);
1192         dib8000_write_word(state, 101, (agc->alpha_level << 12) | agc->thlock);
1193
1194         // Demod AGC loop configuration
1195         dib8000_write_word(state, 102, (agc->alpha_mant << 5) | agc->alpha_exp);
1196         dib8000_write_word(state, 103, (agc->beta_mant << 6) | agc->beta_exp);
1197
1198         dprintk("WBD: ref: %d, sel: %d, active: %d, alpha: %d",
1199                 state->wbd_ref != 0 ? state->wbd_ref : agc->wbd_ref, agc->wbd_sel, !agc->perform_agc_softsplit, agc->wbd_sel);
1200
1201         /* AGC continued */
1202         if (state->wbd_ref != 0)
1203                 dib8000_write_word(state, 106, state->wbd_ref);
1204         else                    // use default
1205                 dib8000_write_word(state, 106, agc->wbd_ref);
1206
1207         if (state->revision == 0x8090) {
1208                 reg = dib8000_read_word(state, 922) & (0x3 << 2);
1209                 dib8000_write_word(state, 922, reg | (agc->wbd_sel << 2));
1210         }
1211
1212         dib8000_write_word(state, 107, (agc->wbd_alpha << 9) | (agc->perform_agc_softsplit << 8));
1213         dib8000_write_word(state, 108, agc->agc1_max);
1214         dib8000_write_word(state, 109, agc->agc1_min);
1215         dib8000_write_word(state, 110, agc->agc2_max);
1216         dib8000_write_word(state, 111, agc->agc2_min);
1217         dib8000_write_word(state, 112, (agc->agc1_pt1 << 8) | agc->agc1_pt2);
1218         dib8000_write_word(state, 113, (agc->agc1_slope1 << 8) | agc->agc1_slope2);
1219         dib8000_write_word(state, 114, (agc->agc2_pt1 << 8) | agc->agc2_pt2);
1220         dib8000_write_word(state, 115, (agc->agc2_slope1 << 8) | agc->agc2_slope2);
1221
1222         dib8000_write_word(state, 75, agc->agc1_pt3);
1223         if (state->revision != 0x8090)
1224                 dib8000_write_word(state, 923,
1225                                 (dib8000_read_word(state, 923) & 0xffe3) |
1226                                 (agc->wbd_inv << 4) | (agc->wbd_sel << 2));
1227
1228         return 0;
1229 }
1230
1231 void dib8000_pwm_agc_reset(struct dvb_frontend *fe)
1232 {
1233         struct dib8000_state *state = fe->demodulator_priv;
1234         dib8000_set_adc_state(state, DIBX000_ADC_ON);
1235         dib8000_set_agc_config(state, (unsigned char)(BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000)));
1236 }
1237 EXPORT_SYMBOL(dib8000_pwm_agc_reset);
1238
1239 static int dib8000_agc_soft_split(struct dib8000_state *state)
1240 {
1241         u16 agc, split_offset;
1242
1243         if (!state->current_agc || !state->current_agc->perform_agc_softsplit || state->current_agc->split.max == 0)
1244                 return FE_CALLBACK_TIME_NEVER;
1245
1246         // n_agc_global
1247         agc = dib8000_read_word(state, 390);
1248
1249         if (agc > state->current_agc->split.min_thres)
1250                 split_offset = state->current_agc->split.min;
1251         else if (agc < state->current_agc->split.max_thres)
1252                 split_offset = state->current_agc->split.max;
1253         else
1254                 split_offset = state->current_agc->split.max *
1255                         (agc - state->current_agc->split.min_thres) /
1256                         (state->current_agc->split.max_thres - state->current_agc->split.min_thres);
1257
1258         dprintk("AGC split_offset: %d", split_offset);
1259
1260         // P_agc_force_split and P_agc_split_offset
1261         dib8000_write_word(state, 107, (dib8000_read_word(state, 107) & 0xff00) | split_offset);
1262         return 5000;
1263 }
1264
1265 static int dib8000_agc_startup(struct dvb_frontend *fe)
1266 {
1267         struct dib8000_state *state = fe->demodulator_priv;
1268         enum frontend_tune_state *tune_state = &state->tune_state;
1269         int ret = 0;
1270         u16 reg, upd_demod_gain_period = 0x8000;
1271
1272         switch (*tune_state) {
1273         case CT_AGC_START:
1274                 // set power-up level: interf+analog+AGC
1275
1276                 if (state->revision != 0x8090)
1277                         dib8000_set_adc_state(state, DIBX000_ADC_ON);
1278                 else {
1279                         dib8000_set_power_mode(state, DIB8000_POWER_ALL);
1280
1281                         reg = dib8000_read_word(state, 1947)&0xff00;
1282                         dib8000_write_word(state, 1946,
1283                                         upd_demod_gain_period & 0xFFFF);
1284                         /* bit 14 = enDemodGain */
1285                         dib8000_write_word(state, 1947, reg | (1<<14) |
1286                                         ((upd_demod_gain_period >> 16) & 0xFF));
1287
1288                         /* enable adc i & q */
1289                         reg = dib8000_read_word(state, 1920);
1290                         dib8000_write_word(state, 1920, (reg | 0x3) &
1291                                         (~(1 << 7)));
1292                 }
1293
1294                 if (dib8000_set_agc_config(state, (unsigned char)(BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000))) != 0) {
1295                         *tune_state = CT_AGC_STOP;
1296                         state->status = FE_STATUS_TUNE_FAILED;
1297                         break;
1298                 }
1299
1300                 ret = 70;
1301                 *tune_state = CT_AGC_STEP_0;
1302                 break;
1303
1304         case CT_AGC_STEP_0:
1305                 //AGC initialization
1306                 if (state->cfg.agc_control)
1307                         state->cfg.agc_control(fe, 1);
1308
1309                 dib8000_restart_agc(state);
1310
1311                 // wait AGC rough lock time
1312                 ret = 50;
1313                 *tune_state = CT_AGC_STEP_1;
1314                 break;
1315
1316         case CT_AGC_STEP_1:
1317                 // wait AGC accurate lock time
1318                 ret = 70;
1319
1320                 if (dib8000_update_lna(state))
1321                         // wait only AGC rough lock time
1322                         ret = 50;
1323                 else
1324                         *tune_state = CT_AGC_STEP_2;
1325                 break;
1326
1327         case CT_AGC_STEP_2:
1328                 dib8000_agc_soft_split(state);
1329
1330                 if (state->cfg.agc_control)
1331                         state->cfg.agc_control(fe, 0);
1332
1333                 *tune_state = CT_AGC_STOP;
1334                 break;
1335         default:
1336                 ret = dib8000_agc_soft_split(state);
1337                 break;
1338         }
1339         return ret;
1340
1341 }
1342
1343 static void dib8096p_host_bus_drive(struct dib8000_state *state, u8 drive)
1344 {
1345         u16 reg;
1346
1347         drive &= 0x7;
1348
1349         /* drive host bus 2, 3, 4 */
1350         reg = dib8000_read_word(state, 1798) &
1351                 ~(0x7 | (0x7 << 6) | (0x7 << 12));
1352         reg |= (drive<<12) | (drive<<6) | drive;
1353         dib8000_write_word(state, 1798, reg);
1354
1355         /* drive host bus 5,6 */
1356         reg = dib8000_read_word(state, 1799) & ~((0x7 << 2) | (0x7 << 8));
1357         reg |= (drive<<8) | (drive<<2);
1358         dib8000_write_word(state, 1799, reg);
1359
1360         /* drive host bus 7, 8, 9 */
1361         reg = dib8000_read_word(state, 1800) &
1362                 ~(0x7 | (0x7 << 6) | (0x7 << 12));
1363         reg |= (drive<<12) | (drive<<6) | drive;
1364         dib8000_write_word(state, 1800, reg);
1365
1366         /* drive host bus 10, 11 */
1367         reg = dib8000_read_word(state, 1801) & ~((0x7 << 2) | (0x7 << 8));
1368         reg |= (drive<<8) | (drive<<2);
1369         dib8000_write_word(state, 1801, reg);
1370
1371         /* drive host bus 12, 13, 14 */
1372         reg = dib8000_read_word(state, 1802) &
1373                 ~(0x7 | (0x7 << 6) | (0x7 << 12));
1374         reg |= (drive<<12) | (drive<<6) | drive;
1375         dib8000_write_word(state, 1802, reg);
1376 }
1377
1378 static u32 dib8096p_calcSyncFreq(u32 P_Kin, u32 P_Kout,
1379                 u32 insertExtSynchro, u32 syncSize)
1380 {
1381         u32 quantif = 3;
1382         u32 nom = (insertExtSynchro * P_Kin+syncSize);
1383         u32 denom = P_Kout;
1384         u32 syncFreq = ((nom << quantif) / denom);
1385
1386         if ((syncFreq & ((1 << quantif) - 1)) != 0)
1387                 syncFreq = (syncFreq >> quantif) + 1;
1388         else
1389                 syncFreq = (syncFreq >> quantif);
1390
1391         if (syncFreq != 0)
1392                 syncFreq = syncFreq - 1;
1393
1394         return syncFreq;
1395 }
1396
1397 static void dib8096p_cfg_DibTx(struct dib8000_state *state, u32 P_Kin,
1398                 u32 P_Kout, u32 insertExtSynchro, u32 synchroMode,
1399                 u32 syncWord, u32 syncSize)
1400 {
1401         dprintk("Configure DibStream Tx");
1402
1403         dib8000_write_word(state, 1615, 1);
1404         dib8000_write_word(state, 1603, P_Kin);
1405         dib8000_write_word(state, 1605, P_Kout);
1406         dib8000_write_word(state, 1606, insertExtSynchro);
1407         dib8000_write_word(state, 1608, synchroMode);
1408         dib8000_write_word(state, 1609, (syncWord >> 16) & 0xffff);
1409         dib8000_write_word(state, 1610, syncWord & 0xffff);
1410         dib8000_write_word(state, 1612, syncSize);
1411         dib8000_write_word(state, 1615, 0);
1412 }
1413
1414 static void dib8096p_cfg_DibRx(struct dib8000_state *state, u32 P_Kin,
1415                 u32 P_Kout, u32 synchroMode, u32 insertExtSynchro,
1416                 u32 syncWord, u32 syncSize, u32 dataOutRate)
1417 {
1418         u32 syncFreq;
1419
1420         dprintk("Configure DibStream Rx synchroMode = %d", synchroMode);
1421
1422         if ((P_Kin != 0) && (P_Kout != 0)) {
1423                 syncFreq = dib8096p_calcSyncFreq(P_Kin, P_Kout,
1424                                 insertExtSynchro, syncSize);
1425                 dib8000_write_word(state, 1542, syncFreq);
1426         }
1427
1428         dib8000_write_word(state, 1554, 1);
1429         dib8000_write_word(state, 1536, P_Kin);
1430         dib8000_write_word(state, 1537, P_Kout);
1431         dib8000_write_word(state, 1539, synchroMode);
1432         dib8000_write_word(state, 1540, (syncWord >> 16) & 0xffff);
1433         dib8000_write_word(state, 1541, syncWord & 0xffff);
1434         dib8000_write_word(state, 1543, syncSize);
1435         dib8000_write_word(state, 1544, dataOutRate);
1436         dib8000_write_word(state, 1554, 0);
1437 }
1438
1439 static void dib8096p_enMpegMux(struct dib8000_state *state, int onoff)
1440 {
1441         u16 reg_1287;
1442
1443         reg_1287 = dib8000_read_word(state, 1287);
1444
1445         switch (onoff) {
1446         case 1:
1447                         reg_1287 &= ~(1 << 8);
1448                         break;
1449         case 0:
1450                         reg_1287 |= (1 << 8);
1451                         break;
1452         }
1453
1454         dib8000_write_word(state, 1287, reg_1287);
1455 }
1456
1457 static void dib8096p_configMpegMux(struct dib8000_state *state,
1458                 u16 pulseWidth, u16 enSerialMode, u16 enSerialClkDiv2)
1459 {
1460         u16 reg_1287;
1461
1462         dprintk("Enable Mpeg mux");
1463
1464         dib8096p_enMpegMux(state, 0);
1465
1466         /* If the input mode is MPEG do not divide the serial clock */
1467         if ((enSerialMode == 1) && (state->input_mode_mpeg == 1))
1468                 enSerialClkDiv2 = 0;
1469
1470         reg_1287 = ((pulseWidth & 0x1f) << 3) |
1471                 ((enSerialMode & 0x1) << 2) | (enSerialClkDiv2 & 0x1);
1472         dib8000_write_word(state, 1287, reg_1287);
1473
1474         dib8096p_enMpegMux(state, 1);
1475 }
1476
1477 static void dib8096p_setDibTxMux(struct dib8000_state *state, int mode)
1478 {
1479         u16 reg_1288 = dib8000_read_word(state, 1288) & ~(0x7 << 7);
1480
1481         switch (mode) {
1482         case MPEG_ON_DIBTX:
1483                         dprintk("SET MPEG ON DIBSTREAM TX");
1484                         dib8096p_cfg_DibTx(state, 8, 5, 0, 0, 0, 0);
1485                         reg_1288 |= (1 << 9); break;
1486         case DIV_ON_DIBTX:
1487                         dprintk("SET DIV_OUT ON DIBSTREAM TX");
1488                         dib8096p_cfg_DibTx(state, 5, 5, 0, 0, 0, 0);
1489                         reg_1288 |= (1 << 8); break;
1490         case ADC_ON_DIBTX:
1491                         dprintk("SET ADC_OUT ON DIBSTREAM TX");
1492                         dib8096p_cfg_DibTx(state, 20, 5, 10, 0, 0, 0);
1493                         reg_1288 |= (1 << 7); break;
1494         default:
1495                         break;
1496         }
1497         dib8000_write_word(state, 1288, reg_1288);
1498 }
1499
1500 static void dib8096p_setHostBusMux(struct dib8000_state *state, int mode)
1501 {
1502         u16 reg_1288 = dib8000_read_word(state, 1288) & ~(0x7 << 4);
1503
1504         switch (mode) {
1505         case DEMOUT_ON_HOSTBUS:
1506                         dprintk("SET DEM OUT OLD INTERF ON HOST BUS");
1507                         dib8096p_enMpegMux(state, 0);
1508                         reg_1288 |= (1 << 6);
1509                         break;
1510         case DIBTX_ON_HOSTBUS:
1511                         dprintk("SET DIBSTREAM TX ON HOST BUS");
1512                         dib8096p_enMpegMux(state, 0);
1513                         reg_1288 |= (1 << 5);
1514                         break;
1515         case MPEG_ON_HOSTBUS:
1516                         dprintk("SET MPEG MUX ON HOST BUS");
1517                         reg_1288 |= (1 << 4);
1518                         break;
1519         default:
1520                         break;
1521         }
1522         dib8000_write_word(state, 1288, reg_1288);
1523 }
1524
1525 static int dib8096p_set_diversity_in(struct dvb_frontend *fe, int onoff)
1526 {
1527         struct dib8000_state *state = fe->demodulator_priv;
1528         u16 reg_1287;
1529
1530         switch (onoff) {
1531         case 0: /* only use the internal way - not the diversity input */
1532                         dprintk("%s mode OFF : by default Enable Mpeg INPUT",
1533                                         __func__);
1534                         /* outputRate = 8 */
1535                         dib8096p_cfg_DibRx(state, 8, 5, 0, 0, 0, 8, 0);
1536
1537                         /* Do not divide the serial clock of MPEG MUX in
1538                            SERIAL MODE in case input mode MPEG is used */
1539                         reg_1287 = dib8000_read_word(state, 1287);
1540                         /* enSerialClkDiv2 == 1 ? */
1541                         if ((reg_1287 & 0x1) == 1) {
1542                                 /* force enSerialClkDiv2 = 0 */
1543                                 reg_1287 &= ~0x1;
1544                                 dib8000_write_word(state, 1287, reg_1287);
1545                         }
1546                         state->input_mode_mpeg = 1;
1547                         break;
1548         case 1: /* both ways */
1549         case 2: /* only the diversity input */
1550                         dprintk("%s ON : Enable diversity INPUT", __func__);
1551                         dib8096p_cfg_DibRx(state, 5, 5, 0, 0, 0, 0, 0);
1552                         state->input_mode_mpeg = 0;
1553                         break;
1554         }
1555
1556         dib8000_set_diversity_in(state->fe[0], onoff);
1557         return 0;
1558 }
1559
1560 static int dib8096p_set_output_mode(struct dvb_frontend *fe, int mode)
1561 {
1562         struct dib8000_state *state = fe->demodulator_priv;
1563         u16 outreg, smo_mode, fifo_threshold;
1564         u8 prefer_mpeg_mux_use = 1;
1565         int ret = 0;
1566
1567         state->output_mode = mode;
1568         dib8096p_host_bus_drive(state, 1);
1569
1570         fifo_threshold = 1792;
1571         smo_mode = (dib8000_read_word(state, 299) & 0x0050) | (1 << 1);
1572         outreg   = dib8000_read_word(state, 1286) &
1573                 ~((1 << 10) | (0x7 << 6) | (1 << 1));
1574
1575         switch (mode) {
1576         case OUTMODE_HIGH_Z:
1577                         outreg = 0;
1578                         break;
1579
1580         case OUTMODE_MPEG2_SERIAL:
1581                         if (prefer_mpeg_mux_use) {
1582                                 dprintk("dib8096P setting output mode TS_SERIAL using Mpeg Mux");
1583                                 dib8096p_configMpegMux(state, 3, 1, 1);
1584                                 dib8096p_setHostBusMux(state, MPEG_ON_HOSTBUS);
1585                         } else {/* Use Smooth block */
1586                                 dprintk("dib8096P setting output mode TS_SERIAL using Smooth bloc");
1587                                 dib8096p_setHostBusMux(state,
1588                                                 DEMOUT_ON_HOSTBUS);
1589                                 outreg |= (2 << 6) | (0 << 1);
1590                         }
1591                         break;
1592
1593         case OUTMODE_MPEG2_PAR_GATED_CLK:
1594                         if (prefer_mpeg_mux_use) {
1595                                 dprintk("dib8096P setting output mode TS_PARALLEL_GATED using Mpeg Mux");
1596                                 dib8096p_configMpegMux(state, 2, 0, 0);
1597                                 dib8096p_setHostBusMux(state, MPEG_ON_HOSTBUS);
1598                         } else { /* Use Smooth block */
1599                                 dprintk("dib8096P setting output mode TS_PARALLEL_GATED using Smooth block");
1600                                 dib8096p_setHostBusMux(state,
1601                                                 DEMOUT_ON_HOSTBUS);
1602                                 outreg |= (0 << 6);
1603                         }
1604                         break;
1605
1606         case OUTMODE_MPEG2_PAR_CONT_CLK: /* Using Smooth block only */
1607                         dprintk("dib8096P setting output mode TS_PARALLEL_CONT using Smooth block");
1608                         dib8096p_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
1609                         outreg |= (1 << 6);
1610                         break;
1611
1612         case OUTMODE_MPEG2_FIFO:
1613                         /* Using Smooth block because not supported
1614                            by new Mpeg Mux bloc */
1615                         dprintk("dib8096P setting output mode TS_FIFO using Smooth block");
1616                         dib8096p_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
1617                         outreg |= (5 << 6);
1618                         smo_mode |= (3 << 1);
1619                         fifo_threshold = 512;
1620                         break;
1621
1622         case OUTMODE_DIVERSITY:
1623                         dprintk("dib8096P setting output mode MODE_DIVERSITY");
1624                         dib8096p_setDibTxMux(state, DIV_ON_DIBTX);
1625                         dib8096p_setHostBusMux(state, DIBTX_ON_HOSTBUS);
1626                         break;
1627
1628         case OUTMODE_ANALOG_ADC:
1629                         dprintk("dib8096P setting output mode MODE_ANALOG_ADC");
1630                         dib8096p_setDibTxMux(state, ADC_ON_DIBTX);
1631                         dib8096p_setHostBusMux(state, DIBTX_ON_HOSTBUS);
1632                         break;
1633         }
1634
1635         if (mode != OUTMODE_HIGH_Z)
1636                 outreg |= (1<<10);
1637
1638         dprintk("output_mpeg2_in_188_bytes = %d",
1639                         state->cfg.output_mpeg2_in_188_bytes);
1640         if (state->cfg.output_mpeg2_in_188_bytes)
1641                 smo_mode |= (1 << 5);
1642
1643         ret |= dib8000_write_word(state, 299, smo_mode);
1644         /* synchronous fread */
1645         ret |= dib8000_write_word(state, 299 + 1, fifo_threshold);
1646         ret |= dib8000_write_word(state, 1286, outreg);
1647
1648         return ret;
1649 }
1650
1651 static int map_addr_to_serpar_number(struct i2c_msg *msg)
1652 {
1653         if (msg->buf[0] <= 15)
1654                 msg->buf[0] -= 1;
1655         else if (msg->buf[0] == 17)
1656                 msg->buf[0] = 15;
1657         else if (msg->buf[0] == 16)
1658                 msg->buf[0] = 17;
1659         else if (msg->buf[0] == 19)
1660                 msg->buf[0] = 16;
1661         else if (msg->buf[0] >= 21 && msg->buf[0] <= 25)
1662                 msg->buf[0] -= 3;
1663         else if (msg->buf[0] == 28)
1664                 msg->buf[0] = 23;
1665         else if (msg->buf[0] == 99)
1666                 msg->buf[0] = 99;
1667         else
1668                 return -EINVAL;
1669         return 0;
1670 }
1671
1672 static int dib8096p_tuner_write_serpar(struct i2c_adapter *i2c_adap,
1673                 struct i2c_msg msg[], int num)
1674 {
1675         struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1676         u8 n_overflow = 1;
1677         u16 i = 1000;
1678         u16 serpar_num = msg[0].buf[0];
1679
1680         while (n_overflow == 1 && i) {
1681                 n_overflow = (dib8000_read_word(state, 1984) >> 1) & 0x1;
1682                 i--;
1683                 if (i == 0)
1684                         dprintk("Tuner ITF: write busy (overflow)");
1685         }
1686         dib8000_write_word(state, 1985, (1 << 6) | (serpar_num & 0x3f));
1687         dib8000_write_word(state, 1986, (msg[0].buf[1] << 8) | msg[0].buf[2]);
1688
1689         return num;
1690 }
1691
1692 static int dib8096p_tuner_read_serpar(struct i2c_adapter *i2c_adap,
1693                 struct i2c_msg msg[], int num)
1694 {
1695         struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1696         u8 n_overflow = 1, n_empty = 1;
1697         u16 i = 1000;
1698         u16 serpar_num = msg[0].buf[0];
1699         u16 read_word;
1700
1701         while (n_overflow == 1 && i) {
1702                 n_overflow = (dib8000_read_word(state, 1984) >> 1) & 0x1;
1703                 i--;
1704                 if (i == 0)
1705                         dprintk("TunerITF: read busy (overflow)");
1706         }
1707         dib8000_write_word(state, 1985, (0<<6) | (serpar_num&0x3f));
1708
1709         i = 1000;
1710         while (n_empty == 1 && i) {
1711                 n_empty = dib8000_read_word(state, 1984)&0x1;
1712                 i--;
1713                 if (i == 0)
1714                         dprintk("TunerITF: read busy (empty)");
1715         }
1716
1717         read_word = dib8000_read_word(state, 1987);
1718         msg[1].buf[0] = (read_word >> 8) & 0xff;
1719         msg[1].buf[1] = (read_word) & 0xff;
1720
1721         return num;
1722 }
1723
1724 static int dib8096p_tuner_rw_serpar(struct i2c_adapter *i2c_adap,
1725                 struct i2c_msg msg[], int num)
1726 {
1727         if (map_addr_to_serpar_number(&msg[0]) == 0) {
1728                 if (num == 1) /* write */
1729                         return dib8096p_tuner_write_serpar(i2c_adap, msg, 1);
1730                 else /* read */
1731                         return dib8096p_tuner_read_serpar(i2c_adap, msg, 2);
1732         }
1733         return num;
1734 }
1735
1736 static int dib8096p_rw_on_apb(struct i2c_adapter *i2c_adap,
1737                 struct i2c_msg msg[], int num, u16 apb_address)
1738 {
1739         struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1740         u16 word;
1741
1742         if (num == 1) {         /* write */
1743                 dib8000_write_word(state, apb_address,
1744                                 ((msg[0].buf[1] << 8) | (msg[0].buf[2])));
1745         } else {
1746                 word = dib8000_read_word(state, apb_address);
1747                 msg[1].buf[0] = (word >> 8) & 0xff;
1748                 msg[1].buf[1] = (word) & 0xff;
1749         }
1750         return num;
1751 }
1752
1753 static int dib8096p_tuner_xfer(struct i2c_adapter *i2c_adap,
1754                 struct i2c_msg msg[], int num)
1755 {
1756         struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1757         u16 apb_address = 0, word;
1758         int i = 0;
1759
1760         switch (msg[0].buf[0]) {
1761         case 0x12:
1762                         apb_address = 1920;
1763                         break;
1764         case 0x14:
1765                         apb_address = 1921;
1766                         break;
1767         case 0x24:
1768                         apb_address = 1922;
1769                         break;
1770         case 0x1a:
1771                         apb_address = 1923;
1772                         break;
1773         case 0x22:
1774                         apb_address = 1924;
1775                         break;
1776         case 0x33:
1777                         apb_address = 1926;
1778                         break;
1779         case 0x34:
1780                         apb_address = 1927;
1781                         break;
1782         case 0x35:
1783                         apb_address = 1928;
1784                         break;
1785         case 0x36:
1786                         apb_address = 1929;
1787                         break;
1788         case 0x37:
1789                         apb_address = 1930;
1790                         break;
1791         case 0x38:
1792                         apb_address = 1931;
1793                         break;
1794         case 0x39:
1795                         apb_address = 1932;
1796                         break;
1797         case 0x2a:
1798                         apb_address = 1935;
1799                         break;
1800         case 0x2b:
1801                         apb_address = 1936;
1802                         break;
1803         case 0x2c:
1804                         apb_address = 1937;
1805                         break;
1806         case 0x2d:
1807                         apb_address = 1938;
1808                         break;
1809         case 0x2e:
1810                         apb_address = 1939;
1811                         break;
1812         case 0x2f:
1813                         apb_address = 1940;
1814                         break;
1815         case 0x30:
1816                         apb_address = 1941;
1817                         break;
1818         case 0x31:
1819                         apb_address = 1942;
1820                         break;
1821         case 0x32:
1822                         apb_address = 1943;
1823                         break;
1824         case 0x3e:
1825                         apb_address = 1944;
1826                         break;
1827         case 0x3f:
1828                         apb_address = 1945;
1829                         break;
1830         case 0x40:
1831                         apb_address = 1948;
1832                         break;
1833         case 0x25:
1834                         apb_address = 936;
1835                         break;
1836         case 0x26:
1837                         apb_address = 937;
1838                         break;
1839         case 0x27:
1840                         apb_address = 938;
1841                         break;
1842         case 0x28:
1843                         apb_address = 939;
1844                         break;
1845         case 0x1d:
1846                         /* get sad sel request */
1847                         i = ((dib8000_read_word(state, 921) >> 12)&0x3);
1848                         word = dib8000_read_word(state, 924+i);
1849                         msg[1].buf[0] = (word >> 8) & 0xff;
1850                         msg[1].buf[1] = (word) & 0xff;
1851                         return num;
1852         case 0x1f:
1853                         if (num == 1) { /* write */
1854                                 word = (u16) ((msg[0].buf[1] << 8) |
1855                                                 msg[0].buf[2]);
1856                                 /* in the VGAMODE Sel are located on bit 0/1 */
1857                                 word &= 0x3;
1858                                 word = (dib8000_read_word(state, 921) &
1859                                                 ~(3<<12)) | (word<<12);
1860                                 /* Set the proper input */
1861                                 dib8000_write_word(state, 921, word);
1862                                 return num;
1863                         }
1864         }
1865
1866         if (apb_address != 0) /* R/W acces via APB */
1867                 return dib8096p_rw_on_apb(i2c_adap, msg, num, apb_address);
1868         else  /* R/W access via SERPAR  */
1869                 return dib8096p_tuner_rw_serpar(i2c_adap, msg, num);
1870
1871         return 0;
1872 }
1873
1874 static u32 dib8096p_i2c_func(struct i2c_adapter *adapter)
1875 {
1876         return I2C_FUNC_I2C;
1877 }
1878
1879 static struct i2c_algorithm dib8096p_tuner_xfer_algo = {
1880         .master_xfer = dib8096p_tuner_xfer,
1881         .functionality = dib8096p_i2c_func,
1882 };
1883
1884 struct i2c_adapter *dib8096p_get_i2c_tuner(struct dvb_frontend *fe)
1885 {
1886         struct dib8000_state *st = fe->demodulator_priv;
1887         return &st->dib8096p_tuner_adap;
1888 }
1889 EXPORT_SYMBOL(dib8096p_get_i2c_tuner);
1890
1891 int dib8096p_tuner_sleep(struct dvb_frontend *fe, int onoff)
1892 {
1893         struct dib8000_state *state = fe->demodulator_priv;
1894         u16 en_cur_state;
1895
1896         dprintk("sleep dib8096p: %d", onoff);
1897
1898         en_cur_state = dib8000_read_word(state, 1922);
1899
1900         /* LNAs and MIX are ON and therefore it is a valid configuration */
1901         if (en_cur_state > 0xff)
1902                 state->tuner_enable = en_cur_state ;
1903
1904         if (onoff)
1905                 en_cur_state &= 0x00ff;
1906         else {
1907                 if (state->tuner_enable != 0)
1908                         en_cur_state = state->tuner_enable;
1909         }
1910
1911         dib8000_write_word(state, 1922, en_cur_state);
1912
1913         return 0;
1914 }
1915 EXPORT_SYMBOL(dib8096p_tuner_sleep);
1916
1917 static const s32 lut_1000ln_mant[] =
1918 {
1919         908, 7003, 7090, 7170, 7244, 7313, 7377, 7438, 7495, 7549, 7600
1920 };
1921
1922 s32 dib8000_get_adc_power(struct dvb_frontend *fe, u8 mode)
1923 {
1924         struct dib8000_state *state = fe->demodulator_priv;
1925         u32 ix = 0, tmp_val = 0, exp = 0, mant = 0;
1926         s32 val;
1927
1928         val = dib8000_read32(state, 384);
1929         if (mode) {
1930                 tmp_val = val;
1931                 while (tmp_val >>= 1)
1932                         exp++;
1933                 mant = (val * 1000 / (1<<exp));
1934                 ix = (u8)((mant-1000)/100); /* index of the LUT */
1935                 val = (lut_1000ln_mant[ix] + 693*(exp-20) - 6908);
1936                 val = (val*256)/1000;
1937         }
1938         return val;
1939 }
1940 EXPORT_SYMBOL(dib8000_get_adc_power);
1941
1942 int dib8090p_get_dc_power(struct dvb_frontend *fe, u8 IQ)
1943 {
1944         struct dib8000_state *state = fe->demodulator_priv;
1945         int val = 0;
1946
1947         switch (IQ) {
1948         case 1:
1949                         val = dib8000_read_word(state, 403);
1950                         break;
1951         case 0:
1952                         val = dib8000_read_word(state, 404);
1953                         break;
1954         }
1955         if (val  & 0x200)
1956                 val -= 1024;
1957
1958         return val;
1959 }
1960 EXPORT_SYMBOL(dib8090p_get_dc_power);
1961
1962 static void dib8000_update_timf(struct dib8000_state *state)
1963 {
1964         u32 timf = state->timf = dib8000_read32(state, 435);
1965
1966         dib8000_write_word(state, 29, (u16) (timf >> 16));
1967         dib8000_write_word(state, 30, (u16) (timf & 0xffff));
1968         dprintk("Updated timing frequency: %d (default: %d)", state->timf, state->timf_default);
1969 }
1970
1971 u32 dib8000_ctrl_timf(struct dvb_frontend *fe, uint8_t op, uint32_t timf)
1972 {
1973         struct dib8000_state *state = fe->demodulator_priv;
1974
1975         switch (op) {
1976         case DEMOD_TIMF_SET:
1977                         state->timf = timf;
1978                         break;
1979         case DEMOD_TIMF_UPDATE:
1980                         dib8000_update_timf(state);
1981                         break;
1982         case DEMOD_TIMF_GET:
1983                         break;
1984         }
1985         dib8000_set_bandwidth(state->fe[0], 6000);
1986
1987         return state->timf;
1988 }
1989 EXPORT_SYMBOL(dib8000_ctrl_timf);
1990
1991 static const u16 adc_target_16dB[11] = {
1992         (1 << 13) - 825 - 117,
1993         (1 << 13) - 837 - 117,
1994         (1 << 13) - 811 - 117,
1995         (1 << 13) - 766 - 117,
1996         (1 << 13) - 737 - 117,
1997         (1 << 13) - 693 - 117,
1998         (1 << 13) - 648 - 117,
1999         (1 << 13) - 619 - 117,
2000         (1 << 13) - 575 - 117,
2001         (1 << 13) - 531 - 117,
2002         (1 << 13) - 501 - 117
2003 };
2004 static const u8 permu_seg[] = { 6, 5, 7, 4, 8, 3, 9, 2, 10, 1, 11, 0, 12 };
2005
2006 static u16 dib8000_set_layer(struct dib8000_state *state, u8 layer_index, u16 max_constellation)
2007 {
2008         u8  cr, constellation, time_intlv;
2009         struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2010
2011         switch (c->layer[layer_index].modulation) {
2012         case DQPSK:
2013                         constellation = 0;
2014                         break;
2015         case  QPSK:
2016                         constellation = 1;
2017                         break;
2018         case QAM_16:
2019                         constellation = 2;
2020                         break;
2021         case QAM_64:
2022         default:
2023                         constellation = 3;
2024                         break;
2025         }
2026
2027         switch (c->layer[layer_index].fec) {
2028         case FEC_1_2:
2029                         cr = 1;
2030                         break;
2031         case FEC_2_3:
2032                         cr = 2;
2033                         break;
2034         case FEC_3_4:
2035                         cr = 3;
2036                         break;
2037         case FEC_5_6:
2038                         cr = 5;
2039                         break;
2040         case FEC_7_8:
2041         default:
2042                         cr = 7;
2043                         break;
2044         }
2045
2046         if ((c->layer[layer_index].interleaving > 0) && ((c->layer[layer_index].interleaving <= 3) || (c->layer[layer_index].interleaving == 4 && c->isdbt_sb_mode == 1)))
2047                 time_intlv = c->layer[layer_index].interleaving;
2048         else
2049                 time_intlv = 0;
2050
2051         dib8000_write_word(state, 2 + layer_index, (constellation << 10) | ((c->layer[layer_index].segment_count & 0xf) << 6) | (cr << 3) | time_intlv);
2052         if (c->layer[layer_index].segment_count > 0) {
2053                 switch (max_constellation) {
2054                 case DQPSK:
2055                 case QPSK:
2056                                 if (c->layer[layer_index].modulation == QAM_16 || c->layer[layer_index].modulation == QAM_64)
2057                                         max_constellation = c->layer[layer_index].modulation;
2058                                 break;
2059                 case QAM_16:
2060                                 if (c->layer[layer_index].modulation == QAM_64)
2061                                         max_constellation = c->layer[layer_index].modulation;
2062                                 break;
2063                 }
2064         }
2065
2066         return  max_constellation;
2067 }
2068
2069 static const u16 adp_Q64[4] = {0x0148, 0xfff0, 0x00a4, 0xfff8}; /* P_adp_regul_cnt 0.04, P_adp_noise_cnt -0.002, P_adp_regul_ext 0.02, P_adp_noise_ext -0.001 */
2070 static const u16 adp_Q16[4] = {0x023d, 0xffdf, 0x00a4, 0xfff0}; /* P_adp_regul_cnt 0.07, P_adp_noise_cnt -0.004, P_adp_regul_ext 0.02, P_adp_noise_ext -0.002 */
2071 static const u16 adp_Qdefault[4] = {0x099a, 0xffae, 0x0333, 0xfff8}; /* P_adp_regul_cnt 0.3,  P_adp_noise_cnt -0.01,  P_adp_regul_ext 0.1,  P_adp_noise_ext -0.002 */
2072 static u16 dib8000_adp_fine_tune(struct dib8000_state *state, u16 max_constellation)
2073 {
2074         u16 i, ana_gain = 0;
2075         const u16 *adp;
2076
2077         /* channel estimation fine configuration */
2078         switch (max_constellation) {
2079         case QAM_64:
2080                         ana_gain = 0x7;
2081                         adp = &adp_Q64[0];
2082                         break;
2083         case QAM_16:
2084                         ana_gain = 0x7;
2085                         adp = &adp_Q16[0];
2086                         break;
2087         default:
2088                         ana_gain = 0;
2089                         adp = &adp_Qdefault[0];
2090                         break;
2091         }
2092
2093         for (i = 0; i < 4; i++)
2094                 dib8000_write_word(state, 215 + i, adp[i]);
2095
2096         return ana_gain;
2097 }
2098
2099 static void dib8000_update_ana_gain(struct dib8000_state *state, u16 ana_gain)
2100 {
2101         u16 i;
2102
2103         dib8000_write_word(state, 116, ana_gain);
2104
2105         /* update ADC target depending on ana_gain */
2106         if (ana_gain) { /* set -16dB ADC target for ana_gain=-1 */
2107                 for (i = 0; i < 10; i++)
2108                         dib8000_write_word(state, 80 + i, adc_target_16dB[i]);
2109         } else { /* set -22dB ADC target for ana_gain=0 */
2110                 for (i = 0; i < 10; i++)
2111                         dib8000_write_word(state, 80 + i, adc_target_16dB[i] - 355);
2112         }
2113 }
2114
2115 static void dib8000_load_ana_fe_coefs(struct dib8000_state *state, const s16 *ana_fe)
2116 {
2117         u16 mode = 0;
2118
2119         if (state->isdbt_cfg_loaded == 0)
2120                 for (mode = 0; mode < 24; mode++)
2121                         dib8000_write_word(state, 117 + mode, ana_fe[mode]);
2122 }
2123
2124 static const u16 lut_prbs_2k[14] = {
2125         0, 0x423, 0x009, 0x5C7, 0x7A6, 0x3D8, 0x527, 0x7FF, 0x79B, 0x3D6, 0x3A2, 0x53B, 0x2F4, 0x213
2126 };
2127 static const u16 lut_prbs_4k[14] = {
2128         0, 0x208, 0x0C3, 0x7B9, 0x423, 0x5C7, 0x3D8, 0x7FF, 0x3D6, 0x53B, 0x213, 0x029, 0x0D0, 0x48E
2129 };
2130 static const u16 lut_prbs_8k[14] = {
2131         0, 0x740, 0x069, 0x7DD, 0x208, 0x7B9, 0x5C7, 0x7FF, 0x53B, 0x029, 0x48E, 0x4C4, 0x367, 0x684
2132 };
2133
2134 static u16 dib8000_get_init_prbs(struct dib8000_state *state, u16 subchannel)
2135 {
2136         int sub_channel_prbs_group = 0;
2137
2138         sub_channel_prbs_group = (subchannel / 3) + 1;
2139         dprintk("sub_channel_prbs_group = %d , subchannel =%d prbs = 0x%04x", sub_channel_prbs_group, subchannel, lut_prbs_8k[sub_channel_prbs_group]);
2140
2141         switch (state->fe[0]->dtv_property_cache.transmission_mode) {
2142         case TRANSMISSION_MODE_2K:
2143                         return lut_prbs_2k[sub_channel_prbs_group];
2144         case TRANSMISSION_MODE_4K:
2145                         return lut_prbs_4k[sub_channel_prbs_group];
2146         default:
2147         case TRANSMISSION_MODE_8K:
2148                         return lut_prbs_8k[sub_channel_prbs_group];
2149         }
2150 }
2151
2152 static void dib8000_set_13seg_channel(struct dib8000_state *state)
2153 {
2154         u16 i;
2155         u16 coff_pow = 0x2800;
2156
2157         state->seg_mask = 0x1fff; /* All 13 segments enabled */
2158
2159         /* ---- COFF ---- Carloff, the most robust --- */
2160         if (state->isdbt_cfg_loaded == 0) {  /* if not Sound Broadcasting mode : put default values for 13 segments */
2161                 dib8000_write_word(state, 180, (16 << 6) | 9);
2162                 dib8000_write_word(state, 187, (4 << 12) | (8 << 5) | 0x2);
2163                 coff_pow = 0x2800;
2164                 for (i = 0; i < 6; i++)
2165                         dib8000_write_word(state, 181+i, coff_pow);
2166
2167                 /* P_ctrl_corm_thres4pre_freq_inh=1, P_ctrl_pre_freq_mode_sat=1 */
2168                 /* P_ctrl_pre_freq_mode_sat=1, P_ctrl_pre_freq_inh=0, P_ctrl_pre_freq_step = 3, P_pre_freq_win_len=1 */
2169                 dib8000_write_word(state, 338, (1 << 12) | (1 << 10) | (0 << 9) | (3 << 5) | 1);
2170
2171                 /* P_ctrl_pre_freq_win_len=8, P_ctrl_pre_freq_thres_lockin=6 */
2172                 dib8000_write_word(state, 340, (8 << 6) | (6 << 0));
2173                 /* P_ctrl_pre_freq_thres_lockout=4, P_small_use_tmcc/ac/cp=1 */
2174                 dib8000_write_word(state, 341, (4 << 3) | (1 << 2) | (1 << 1) | (1 << 0));
2175
2176                 dib8000_write_word(state, 228, 0);  /* default value */
2177                 dib8000_write_word(state, 265, 31); /* default value */
2178                 dib8000_write_word(state, 205, 0x200f); /* init value */
2179         }
2180
2181         /*
2182          * make the cpil_coff_lock more robust but slower p_coff_winlen
2183          * 6bits; p_coff_thres_lock 6bits (for coff lock if needed)
2184          */
2185
2186         if (state->cfg.pll->ifreq == 0)
2187                 dib8000_write_word(state, 266, ~state->seg_mask | state->seg_diff_mask | 0x40); /* P_equal_noise_seg_inh */
2188
2189         dib8000_load_ana_fe_coefs(state, ana_fe_coeff_13seg);
2190 }
2191
2192 static void dib8000_set_subchannel_prbs(struct dib8000_state *state, u16 init_prbs)
2193 {
2194         u16 reg_1;
2195
2196         reg_1 = dib8000_read_word(state, 1);
2197         dib8000_write_word(state, 1, (init_prbs << 2) | (reg_1 & 0x3)); /* ADDR 1 */
2198 }
2199
2200 static void dib8000_small_fine_tune(struct dib8000_state *state)
2201 {
2202         u16 i;
2203         const s16 *ncoeff;
2204         struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2205
2206         dib8000_write_word(state, 352, state->seg_diff_mask);
2207         dib8000_write_word(state, 353, state->seg_mask);
2208
2209         /* P_small_coef_ext_enable=ISDB-Tsb, P_small_narrow_band=ISDB-Tsb, P_small_last_seg=13, P_small_offset_num_car=5 */
2210         dib8000_write_word(state, 351, (c->isdbt_sb_mode << 9) | (c->isdbt_sb_mode << 8) | (13 << 4) | 5);
2211
2212         if (c->isdbt_sb_mode) {
2213                 /* ---- SMALL ---- */
2214                 switch (c->transmission_mode) {
2215                 case TRANSMISSION_MODE_2K:
2216                                 if (c->isdbt_partial_reception == 0) { /* 1-seg */
2217                                         if (c->layer[0].modulation == DQPSK) /* DQPSK */
2218                                                 ncoeff = coeff_2k_sb_1seg_dqpsk;
2219                                         else /* QPSK or QAM */
2220                                                 ncoeff = coeff_2k_sb_1seg;
2221                                 } else { /* 3-segments */
2222                                         if (c->layer[0].modulation == DQPSK) { /* DQPSK on central segment */
2223                                                 if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
2224                                                         ncoeff = coeff_2k_sb_3seg_0dqpsk_1dqpsk;
2225                                                 else /* QPSK or QAM on external segments */
2226                                                         ncoeff = coeff_2k_sb_3seg_0dqpsk;
2227                                         } else { /* QPSK or QAM on central segment */
2228                                                 if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
2229                                                         ncoeff = coeff_2k_sb_3seg_1dqpsk;
2230                                                 else /* QPSK or QAM on external segments */
2231                                                         ncoeff = coeff_2k_sb_3seg;
2232                                         }
2233                                 }
2234                                 break;
2235                 case TRANSMISSION_MODE_4K:
2236                                 if (c->isdbt_partial_reception == 0) { /* 1-seg */
2237                                         if (c->layer[0].modulation == DQPSK) /* DQPSK */
2238                                                 ncoeff = coeff_4k_sb_1seg_dqpsk;
2239                                         else /* QPSK or QAM */
2240                                                 ncoeff = coeff_4k_sb_1seg;
2241                                 } else { /* 3-segments */
2242                                         if (c->layer[0].modulation == DQPSK) { /* DQPSK on central segment */
2243                                                 if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
2244                                                         ncoeff = coeff_4k_sb_3seg_0dqpsk_1dqpsk;
2245                                                 else /* QPSK or QAM on external segments */
2246                                                         ncoeff = coeff_4k_sb_3seg_0dqpsk;
2247                                         } else { /* QPSK or QAM on central segment */
2248                                                 if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
2249                                                         ncoeff = coeff_4k_sb_3seg_1dqpsk;
2250                                                 else /* QPSK or QAM on external segments */
2251                                                         ncoeff = coeff_4k_sb_3seg;
2252                                         }
2253                                 }
2254                                 break;
2255                 case TRANSMISSION_MODE_AUTO:
2256                 case TRANSMISSION_MODE_8K:
2257                 default:
2258                                 if (c->isdbt_partial_reception == 0) { /* 1-seg */
2259                                         if (c->layer[0].modulation == DQPSK) /* DQPSK */
2260                                                 ncoeff = coeff_8k_sb_1seg_dqpsk;
2261                                         else /* QPSK or QAM */
2262                                                 ncoeff = coeff_8k_sb_1seg;
2263                                 } else { /* 3-segments */
2264                                         if (c->layer[0].modulation == DQPSK) { /* DQPSK on central segment */
2265                                                 if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
2266                                                         ncoeff = coeff_8k_sb_3seg_0dqpsk_1dqpsk;
2267                                                 else /* QPSK or QAM on external segments */
2268                                                         ncoeff = coeff_8k_sb_3seg_0dqpsk;
2269                                         } else { /* QPSK or QAM on central segment */
2270                                                 if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
2271                                                         ncoeff = coeff_8k_sb_3seg_1dqpsk;
2272                                                 else /* QPSK or QAM on external segments */
2273                                                         ncoeff = coeff_8k_sb_3seg;
2274                                         }
2275                                 }
2276                                 break;
2277                 }
2278
2279                 for (i = 0; i < 8; i++)
2280                         dib8000_write_word(state, 343 + i, ncoeff[i]);
2281         }
2282 }
2283
2284 static const u16 coff_thres_1seg[3] = {300, 150, 80};
2285 static const u16 coff_thres_3seg[3] = {350, 300, 250};
2286 static void dib8000_set_sb_channel(struct dib8000_state *state)
2287 {
2288         struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2289         const u16 *coff;
2290         u16 i;
2291
2292         if (c->transmission_mode == TRANSMISSION_MODE_2K || c->transmission_mode == TRANSMISSION_MODE_4K) {
2293                 dib8000_write_word(state, 219, dib8000_read_word(state, 219) | 0x1); /* adp_pass =1 */
2294                 dib8000_write_word(state, 190, dib8000_read_word(state, 190) | (0x1 << 14)); /* pha3_force_pha_shift = 1 */
2295         } else {
2296                 dib8000_write_word(state, 219, dib8000_read_word(state, 219) & 0xfffe); /* adp_pass =0 */
2297                 dib8000_write_word(state, 190, dib8000_read_word(state, 190) & 0xbfff); /* pha3_force_pha_shift = 0 */
2298         }
2299
2300         if (c->isdbt_partial_reception == 1) /* 3-segments */
2301                 state->seg_mask = 0x00E0;
2302         else /* 1-segment */
2303                 state->seg_mask = 0x0040;
2304
2305         dib8000_write_word(state, 268, (dib8000_read_word(state, 268) & 0xF9FF) | 0x0200);
2306
2307         /* ---- COFF ---- Carloff, the most robust --- */
2308         /* P_coff_cpil_alpha=4, P_coff_inh=0, P_coff_cpil_winlen=64, P_coff_narrow_band=1, P_coff_square_val=1, P_coff_one_seg=~partial_rcpt, P_coff_use_tmcc=1, P_coff_use_ac=1 */
2309         dib8000_write_word(state, 187, (4 << 12) | (0 << 11) | (63 << 5) | (0x3 << 3) | ((~c->isdbt_partial_reception & 1) << 2) | 0x3);
2310
2311         dib8000_write_word(state, 340, (16 << 6) | (8 << 0)); /* P_ctrl_pre_freq_win_len=16, P_ctrl_pre_freq_thres_lockin=8 */
2312         dib8000_write_word(state, 341, (6 << 3) | (1 << 2) | (1 << 1) | (1 << 0));/* P_ctrl_pre_freq_thres_lockout=6, P_small_use_tmcc/ac/cp=1 */
2313
2314         /* Sound Broadcasting mode 1 seg */
2315         if (c->isdbt_partial_reception == 0) {
2316                 /* P_coff_winlen=63, P_coff_thres_lock=15, P_coff_one_seg_width = (P_mode == 3) , P_coff_one_seg_sym = (P_mode-1) */
2317                 if (state->mode == 3)
2318                         dib8000_write_word(state, 180, 0x1fcf | ((state->mode - 1) << 14));
2319                 else
2320                         dib8000_write_word(state, 180, 0x0fcf | ((state->mode - 1) << 14));
2321
2322                 /* P_ctrl_corm_thres4pre_freq_inh=1,P_ctrl_pre_freq_mode_sat=1, P_ctrl_pre_freq_inh=0, P_ctrl_pre_freq_step = 5, P_pre_freq_win_len=4 */
2323                 dib8000_write_word(state, 338, (1 << 12) | (1 << 10) | (0 << 9) | (5 << 5) | 4);
2324                 coff = &coff_thres_1seg[0];
2325         } else {   /* Sound Broadcasting mode 3 seg */
2326                 dib8000_write_word(state, 180, 0x1fcf | (1 << 14));
2327                 /* P_ctrl_corm_thres4pre_freq_inh = 1, P_ctrl_pre_freq_mode_sat=1, P_ctrl_pre_freq_inh=0, P_ctrl_pre_freq_step = 4, P_pre_freq_win_len=4 */
2328                 dib8000_write_word(state, 338, (1 << 12) | (1 << 10) | (0 << 9) | (4 << 5) | 4);
2329                 coff = &coff_thres_3seg[0];
2330         }
2331
2332         dib8000_write_word(state, 228, 1); /* P_2d_mode_byp=1 */
2333         dib8000_write_word(state, 205, dib8000_read_word(state, 205) & 0xfff0); /* P_cspu_win_cut = 0 */
2334
2335         if (c->isdbt_partial_reception == 0 && c->transmission_mode == TRANSMISSION_MODE_2K)
2336                 dib8000_write_word(state, 265, 15); /* P_equal_noise_sel = 15 */
2337
2338         /* Write COFF thres */
2339         for (i = 0 ; i < 3; i++) {
2340                 dib8000_write_word(state, 181+i, coff[i]);
2341                 dib8000_write_word(state, 184+i, coff[i]);
2342         }
2343
2344         /*
2345          * make the cpil_coff_lock more robust but slower p_coff_winlen
2346          * 6bits; p_coff_thres_lock 6bits (for coff lock if needed)
2347          */
2348
2349         dib8000_write_word(state, 266, ~state->seg_mask | state->seg_diff_mask); /* P_equal_noise_seg_inh */
2350
2351         if (c->isdbt_partial_reception == 0)
2352                 dib8000_write_word(state, 178, 64); /* P_fft_powrange = 64 */
2353         else
2354                 dib8000_write_word(state, 178, 32); /* P_fft_powrange = 32 */
2355 }
2356
2357 static void dib8000_set_isdbt_common_channel(struct dib8000_state *state, u8 seq, u8 autosearching)
2358 {
2359         u16 p_cfr_left_edge  = 0, p_cfr_right_edge = 0;
2360         u16 tmcc_pow = 0, ana_gain = 0, tmp = 0, i = 0, nbseg_diff = 0 ;
2361         u16 max_constellation = DQPSK;
2362         int init_prbs;
2363         struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2364
2365         /* P_mode */
2366         dib8000_write_word(state, 10, (seq << 4));
2367
2368         /* init mode */
2369         state->mode = fft_to_mode(state);
2370
2371         /* set guard */
2372         tmp = dib8000_read_word(state, 1);
2373         dib8000_write_word(state, 1, (tmp&0xfffc) | (c->guard_interval & 0x3));
2374
2375         dib8000_write_word(state, 274, (dib8000_read_word(state, 274) & 0xffcf) | ((c->isdbt_partial_reception & 1) << 5) | ((c->isdbt_sb_mode & 1) << 4));
2376
2377         /* signal optimization parameter */
2378         if (c->isdbt_partial_reception) {
2379                 state->seg_diff_mask = (c->layer[0].modulation == DQPSK) << permu_seg[0];
2380                 for (i = 1; i < 3; i++)
2381                         nbseg_diff += (c->layer[i].modulation == DQPSK) * c->layer[i].segment_count;
2382                 for (i = 0; i < nbseg_diff; i++)
2383                         state->seg_diff_mask |= 1 << permu_seg[i+1];
2384         } else {
2385                 for (i = 0; i < 3; i++)
2386                         nbseg_diff += (c->layer[i].modulation == DQPSK) * c->layer[i].segment_count;
2387                 for (i = 0; i < nbseg_diff; i++)
2388                         state->seg_diff_mask |= 1 << permu_seg[i];
2389         }
2390
2391         if (state->seg_diff_mask)
2392                 dib8000_write_word(state, 268, (dib8000_read_word(state, 268) & 0xF9FF) | 0x0200);
2393         else
2394                 dib8000_write_word(state, 268, (2 << 9) | 39); /*init value */
2395
2396         for (i = 0; i < 3; i++)
2397                 max_constellation = dib8000_set_layer(state, i, max_constellation);
2398         if (autosearching == 0) {
2399                 state->layer_b_nb_seg = c->layer[1].segment_count;
2400                 state->layer_c_nb_seg = c->layer[2].segment_count;
2401         }
2402
2403         /* WRITE: Mode & Diff mask */
2404         dib8000_write_word(state, 0, (state->mode << 13) | state->seg_diff_mask);
2405
2406         state->differential_constellation = (state->seg_diff_mask != 0);
2407
2408         /* channel estimation fine configuration */
2409         ana_gain = dib8000_adp_fine_tune(state, max_constellation);
2410
2411         /* update ana_gain depending on max constellation */
2412         dib8000_update_ana_gain(state, ana_gain);
2413
2414         /* ---- ANA_FE ---- */
2415         if (c->isdbt_partial_reception) /* 3-segments */
2416                 dib8000_load_ana_fe_coefs(state, ana_fe_coeff_3seg);
2417         else
2418                 dib8000_load_ana_fe_coefs(state, ana_fe_coeff_1seg); /* 1-segment */
2419
2420         /* TSB or ISDBT ? apply it now */
2421         if (c->isdbt_sb_mode) {
2422                 dib8000_set_sb_channel(state);
2423                 if (c->isdbt_sb_subchannel < 14)
2424                         init_prbs = dib8000_get_init_prbs(state, c->isdbt_sb_subchannel);
2425                 else
2426                         init_prbs = 0;
2427         } else {
2428                 dib8000_set_13seg_channel(state);
2429                 init_prbs = 0xfff;
2430         }
2431
2432         /* SMALL */
2433         dib8000_small_fine_tune(state);
2434
2435         dib8000_set_subchannel_prbs(state, init_prbs);
2436
2437         /* ---- CHAN_BLK ---- */
2438         for (i = 0; i < 13; i++) {
2439                 if ((((~state->seg_diff_mask) >> i) & 1) == 1) {
2440                         p_cfr_left_edge  += (1 << i) * ((i == 0) || ((((state->seg_mask & (~state->seg_diff_mask)) >> (i - 1)) & 1) == 0));
2441                         p_cfr_right_edge += (1 << i) * ((i == 12) || ((((state->seg_mask & (~state->seg_diff_mask)) >> (i + 1)) & 1) == 0));
2442                 }
2443         }
2444         dib8000_write_word(state, 222, p_cfr_left_edge); /* p_cfr_left_edge */
2445         dib8000_write_word(state, 223, p_cfr_right_edge); /* p_cfr_right_edge */
2446         /* "P_cspu_left_edge" & "P_cspu_right_edge" not used => do not care */
2447
2448         dib8000_write_word(state, 189, ~state->seg_mask | state->seg_diff_mask); /* P_lmod4_seg_inh */
2449         dib8000_write_word(state, 192, ~state->seg_mask | state->seg_diff_mask); /* P_pha3_seg_inh */
2450         dib8000_write_word(state, 225, ~state->seg_mask | state->seg_diff_mask); /* P_tac_seg_inh */
2451
2452         if (!autosearching)
2453                 dib8000_write_word(state, 288, (~state->seg_mask | state->seg_diff_mask) & 0x1fff); /* P_tmcc_seg_eq_inh */
2454         else
2455                 dib8000_write_word(state, 288, 0x1fff); /*disable equalisation of the tmcc when autosearch to be able to find the DQPSK channels. */
2456
2457         dib8000_write_word(state, 211, state->seg_mask & (~state->seg_diff_mask)); /* P_des_seg_enabled */
2458         dib8000_write_word(state, 287, ~state->seg_mask | 0x1000); /* P_tmcc_seg_inh */
2459
2460         dib8000_write_word(state, 178, 32); /* P_fft_powrange = 32 */
2461
2462         /* ---- TMCC ---- */
2463         for (i = 0; i < 3; i++)
2464                 tmcc_pow += (((c->layer[i].modulation == DQPSK) * 4 + 1) * c->layer[i].segment_count) ;
2465
2466         /* Quantif of "P_tmcc_dec_thres_?k" is (0, 5+mode, 9); */
2467         /* Threshold is set at 1/4 of max power. */
2468         tmcc_pow *= (1 << (9-2));
2469         dib8000_write_word(state, 290, tmcc_pow); /* P_tmcc_dec_thres_2k */
2470         dib8000_write_word(state, 291, tmcc_pow); /* P_tmcc_dec_thres_4k */
2471         dib8000_write_word(state, 292, tmcc_pow); /* P_tmcc_dec_thres_8k */
2472         /*dib8000_write_word(state, 287, (1 << 13) | 0x1000 ); */
2473
2474         /* ---- PHA3 ---- */
2475         if (state->isdbt_cfg_loaded == 0)
2476                 dib8000_write_word(state, 250, 3285); /* p_2d_hspeed_thr0 */
2477
2478         state->isdbt_cfg_loaded = 0;
2479 }
2480
2481 static u32 dib8000_wait_lock(struct dib8000_state *state, u32 internal,
2482                              u32 wait0_ms, u32 wait1_ms, u32 wait2_ms)
2483 {
2484         u32 value = 0;  /* P_search_end0 wait time */
2485         u16 reg = 11;   /* P_search_end0 start addr */
2486
2487         for (reg = 11; reg < 16; reg += 2) {
2488                 if (reg == 11) {
2489                         if (state->revision == 0x8090)
2490                                 value = internal * wait1_ms;
2491                         else
2492                                 value = internal * wait0_ms;
2493                 } else if (reg == 13)
2494                         value = internal * wait1_ms;
2495                 else if (reg == 15)
2496                         value = internal * wait2_ms;
2497                 dib8000_write_word(state, reg, (u16)((value >> 16) & 0xffff));
2498                 dib8000_write_word(state, (reg + 1), (u16)(value & 0xffff));
2499         }
2500         return value;
2501 }
2502
2503 static int dib8000_autosearch_start(struct dvb_frontend *fe)
2504 {
2505         struct dib8000_state *state = fe->demodulator_priv;
2506         struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2507         u8 slist = 0;
2508         u32 value, internal = state->cfg.pll->internal;
2509
2510         if (state->revision == 0x8090)
2511                 internal = dib8000_read32(state, 23) / 1000;
2512
2513         if ((state->revision >= 0x8002) &&
2514             (state->autosearch_state == AS_SEARCHING_FFT)) {
2515                 dib8000_write_word(state,  37, 0x0065); /* P_ctrl_pha_off_max default values */
2516                 dib8000_write_word(state, 116, 0x0000); /* P_ana_gain to 0 */
2517
2518                 dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x1fff) | (0 << 13) | (1 << 15)); /* P_mode = 0, P_restart_search=1 */
2519                 dib8000_write_word(state, 1, (dib8000_read_word(state, 1) & 0xfffc) | 0); /* P_guard = 0 */
2520                 dib8000_write_word(state, 6, 0); /* P_lock0_mask = 0 */
2521                 dib8000_write_word(state, 7, 0); /* P_lock1_mask = 0 */
2522                 dib8000_write_word(state, 8, 0); /* P_lock2_mask = 0 */
2523                 dib8000_write_word(state, 10, (dib8000_read_word(state, 10) & 0x200) | (16 << 4) | (0 << 0)); /* P_search_list=16, P_search_maxtrial=0 */
2524
2525                 if (state->revision == 0x8090)
2526                         value = dib8000_wait_lock(state, internal, 10, 10, 10); /* time in ms configure P_search_end0 P_search_end1 P_search_end2 */
2527                 else
2528                         value = dib8000_wait_lock(state, internal, 20, 20, 20); /* time in ms configure P_search_end0 P_search_end1 P_search_end2 */
2529
2530                 dib8000_write_word(state, 17, 0);
2531                 dib8000_write_word(state, 18, 200); /* P_search_rstst = 200 */
2532                 dib8000_write_word(state, 19, 0);
2533                 dib8000_write_word(state, 20, 400); /* P_search_rstend = 400 */
2534                 dib8000_write_word(state, 21, (value >> 16) & 0xffff); /* P_search_checkst */
2535                 dib8000_write_word(state, 22, value & 0xffff);
2536
2537                 if (state->revision == 0x8090)
2538                         dib8000_write_word(state, 32, (dib8000_read_word(state, 32) & 0xf0ff) | (0 << 8)); /* P_corm_alpha = 0 */
2539                 else
2540                         dib8000_write_word(state, 32, (dib8000_read_word(state, 32) & 0xf0ff) | (9 << 8)); /* P_corm_alpha = 3 */
2541                 dib8000_write_word(state, 355, 2); /* P_search_param_max = 2 */
2542
2543                 /* P_search_param_select = (1 | 1<<4 | 1 << 8) */
2544                 dib8000_write_word(state, 356, 0);
2545                 dib8000_write_word(state, 357, 0x111);
2546
2547                 dib8000_write_word(state, 770, (dib8000_read_word(state, 770) & 0xdfff) | (1 << 13)); /* P_restart_ccg = 1 */
2548                 dib8000_write_word(state, 770, (dib8000_read_word(state, 770) & 0xdfff) | (0 << 13)); /* P_restart_ccg = 0 */
2549                 dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x7ff) | (0 << 15) | (1 << 13)); /* P_restart_search = 0; */
2550         } else if ((state->revision >= 0x8002) &&
2551                    (state->autosearch_state == AS_SEARCHING_GUARD)) {
2552                 c->transmission_mode = TRANSMISSION_MODE_8K;
2553                 c->guard_interval = GUARD_INTERVAL_1_8;
2554                 c->inversion = 0;
2555                 c->layer[0].modulation = QAM_64;
2556                 c->layer[0].fec = FEC_2_3;
2557                 c->layer[0].interleaving = 0;
2558                 c->layer[0].segment_count = 13;
2559
2560                 slist = 16;
2561                 c->transmission_mode = state->found_nfft;
2562
2563                 dib8000_set_isdbt_common_channel(state, slist, 1);
2564
2565                 /* set lock_mask values */
2566                 dib8000_write_word(state, 6, 0x4);
2567                 if (state->revision == 0x8090)
2568                         dib8000_write_word(state, 7, ((1 << 12) | (1 << 11) | (1 << 10)));/* tmcc_dec_lock, tmcc_sync_lock, tmcc_data_lock, tmcc_bch_uncor */
2569                 else
2570                         dib8000_write_word(state, 7, 0x8);
2571                 dib8000_write_word(state, 8, 0x1000);
2572
2573                 /* set lock_mask wait time values */
2574                 if (state->revision == 0x8090)
2575                         dib8000_wait_lock(state, internal, 50, 100, 1000); /* time in ms configure P_search_end0 P_search_end1 P_search_end2 */
2576                 else
2577                         dib8000_wait_lock(state, internal, 50, 200, 1000); /* time in ms configure P_search_end0 P_search_end1 P_search_end2 */
2578
2579                 dib8000_write_word(state, 355, 3); /* P_search_param_max = 3 */
2580
2581                 /* P_search_param_select = 0xf; look for the 4 different guard intervals */
2582                 dib8000_write_word(state, 356, 0);
2583                 dib8000_write_word(state, 357, 0xf);
2584
2585                 value = dib8000_read_word(state, 0);
2586                 dib8000_write_word(state, 0, (u16)((1 << 15) | value));
2587                 dib8000_read_word(state, 1284);  /* reset the INT. n_irq_pending */
2588                 dib8000_write_word(state, 0, (u16)value);
2589         } else {
2590                 c->inversion = 0;
2591                 c->layer[0].modulation = QAM_64;
2592                 c->layer[0].fec = FEC_2_3;
2593                 c->layer[0].interleaving = 0;
2594                 c->layer[0].segment_count = 13;
2595                 if (!c->isdbt_sb_mode)
2596                         c->layer[0].segment_count = 13;
2597
2598                 /* choose the right list, in sb, always do everything */
2599                 if (c->isdbt_sb_mode) {
2600                         slist = 7;
2601                         dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));
2602                 } else {
2603                         if (c->guard_interval == GUARD_INTERVAL_AUTO) {
2604                                 if (c->transmission_mode == TRANSMISSION_MODE_AUTO) {
2605                                         c->transmission_mode = TRANSMISSION_MODE_8K;
2606                                         c->guard_interval = GUARD_INTERVAL_1_8;
2607                                         slist = 7;
2608                                         dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));  /* P_mode = 1 to have autosearch start ok with mode2 */
2609                                 } else {
2610                                         c->guard_interval = GUARD_INTERVAL_1_8;
2611                                         slist = 3;
2612                                 }
2613                         } else {
2614                                 if (c->transmission_mode == TRANSMISSION_MODE_AUTO) {
2615                                         c->transmission_mode = TRANSMISSION_MODE_8K;
2616                                         slist = 2;
2617                                         dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));  /* P_mode = 1 */
2618                                 } else
2619                                         slist = 0;
2620                         }
2621                 }
2622                 dprintk("Using list for autosearch : %d", slist);
2623
2624                 dib8000_set_isdbt_common_channel(state, slist, 1);
2625
2626                 /* set lock_mask values */
2627                 dib8000_write_word(state, 6, 0x4);
2628                 if (state->revision == 0x8090)
2629                         dib8000_write_word(state, 7, (1 << 12) | (1 << 11) | (1 << 10));
2630                 else
2631                         dib8000_write_word(state, 7, 0x8);
2632                 dib8000_write_word(state, 8, 0x1000);
2633
2634                 /* set lock_mask wait time values */
2635                 if (state->revision == 0x8090)
2636                         dib8000_wait_lock(state, internal, 50, 200, 1000); /* time in ms configure P_search_end0 P_search_end1 P_search_end2 */
2637                 else
2638                         dib8000_wait_lock(state, internal, 50, 100, 1000); /* time in ms configure P_search_end0 P_search_end1 P_search_end2 */
2639
2640                 value = dib8000_read_word(state, 0);
2641                 dib8000_write_word(state, 0, (u16)((1 << 15) | value));
2642                 dib8000_read_word(state, 1284);  /* reset the INT. n_irq_pending */
2643                 dib8000_write_word(state, 0, (u16)value);
2644         }
2645         return 0;
2646 }
2647
2648 static int dib8000_autosearch_irq(struct dvb_frontend *fe)
2649 {
2650         struct dib8000_state *state = fe->demodulator_priv;
2651         u16 irq_pending = dib8000_read_word(state, 1284);
2652
2653         if ((state->revision >= 0x8002) &&
2654             (state->autosearch_state == AS_SEARCHING_FFT)) {
2655                 if (irq_pending & 0x1) {
2656                         dprintk("dib8000_autosearch_irq: max correlation result available");
2657                         return 3;
2658                 }
2659         } else {
2660                 if (irq_pending & 0x1) {        /* failed */
2661                         dprintk("dib8000_autosearch_irq failed");
2662                         return 1;
2663                 }
2664
2665                 if (irq_pending & 0x2) {        /* succeeded */
2666                         dprintk("dib8000_autosearch_irq succeeded");
2667                         return 2;
2668                 }
2669         }
2670
2671         return 0;               // still pending
2672 }
2673
2674 static void dib8000_viterbi_state(struct dib8000_state *state, u8 onoff)
2675 {
2676         u16 tmp;
2677
2678         tmp = dib8000_read_word(state, 771);
2679         if (onoff) /* start P_restart_chd : channel_decoder */
2680                 dib8000_write_word(state, 771, tmp & 0xfffd);
2681         else /* stop P_restart_chd : channel_decoder */
2682                 dib8000_write_word(state, 771, tmp | (1<<1));
2683 }
2684
2685 static void dib8000_set_dds(struct dib8000_state *state, s32 offset_khz)
2686 {
2687         s16 unit_khz_dds_val;
2688         u32 abs_offset_khz = ABS(offset_khz);
2689         u32 dds = state->cfg.pll->ifreq & 0x1ffffff;
2690         u8 invert = !!(state->cfg.pll->ifreq & (1 << 25));
2691         u8 ratio;
2692
2693         if (state->revision == 0x8090) {
2694                 ratio = 4;
2695                 unit_khz_dds_val = (1<<26) / (dib8000_read32(state, 23) / 1000);
2696                 if (offset_khz < 0)
2697                         dds = (1 << 26) - (abs_offset_khz * unit_khz_dds_val);
2698                 else
2699                         dds = (abs_offset_khz * unit_khz_dds_val);
2700
2701                 if (invert)
2702                         dds = (1<<26) - dds;
2703         } else {
2704                 ratio = 2;
2705                 unit_khz_dds_val = (u16) (67108864 / state->cfg.pll->internal);
2706
2707                 if (offset_khz < 0)
2708                         unit_khz_dds_val *= -1;
2709
2710                 /* IF tuner */
2711                 if (invert)
2712                         dds -= abs_offset_khz * unit_khz_dds_val;
2713                 else
2714                         dds += abs_offset_khz * unit_khz_dds_val;
2715         }
2716
2717         dprintk("setting a DDS frequency offset of %c%dkHz", invert ? '-' : ' ', dds / unit_khz_dds_val);
2718
2719         if (abs_offset_khz <= (state->cfg.pll->internal / ratio)) {
2720                 /* Max dds offset is the half of the demod freq */
2721                 dib8000_write_word(state, 26, invert);
2722                 dib8000_write_word(state, 27, (u16)(dds >> 16) & 0x1ff);
2723                 dib8000_write_word(state, 28, (u16)(dds & 0xffff));
2724         }
2725 }
2726
2727 static void dib8000_set_frequency_offset(struct dib8000_state *state)
2728 {
2729         struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2730         int i;
2731         u32 current_rf;
2732         int total_dds_offset_khz;
2733
2734         if (state->fe[0]->ops.tuner_ops.get_frequency)
2735                 state->fe[0]->ops.tuner_ops.get_frequency(state->fe[0], &current_rf);
2736         else
2737                 current_rf = c->frequency;
2738         current_rf /= 1000;
2739         total_dds_offset_khz = (int)current_rf - (int)c->frequency / 1000;
2740
2741         if (c->isdbt_sb_mode) {
2742                 state->subchannel = c->isdbt_sb_subchannel;
2743
2744                 i = dib8000_read_word(state, 26) & 1; /* P_dds_invspec */
2745                 dib8000_write_word(state, 26, c->inversion ^ i);
2746
2747                 if (state->cfg.pll->ifreq == 0) { /* low if tuner */
2748                         if ((c->inversion ^ i) == 0)
2749                                 dib8000_write_word(state, 26, dib8000_read_word(state, 26) | 1);
2750                 } else {
2751                         if ((c->inversion ^ i) == 0)
2752                                 total_dds_offset_khz *= -1;
2753                 }
2754         }
2755
2756         dprintk("%dkhz tuner offset (frequency = %dHz & current_rf = %dHz) total_dds_offset_hz = %d", c->frequency - current_rf, c->frequency, current_rf, total_dds_offset_khz);
2757
2758         /* apply dds offset now */
2759         dib8000_set_dds(state, total_dds_offset_khz);
2760 }
2761
2762 static u16 LUT_isdbt_symbol_duration[4] = { 26, 101, 63 };
2763
2764 static u32 dib8000_get_symbol_duration(struct dib8000_state *state)
2765 {
2766         struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2767         u16 i;
2768
2769         switch (c->transmission_mode) {
2770         case TRANSMISSION_MODE_2K:
2771                         i = 0;
2772                         break;
2773         case TRANSMISSION_MODE_4K:
2774                         i = 2;
2775                         break;
2776         default:
2777         case TRANSMISSION_MODE_AUTO:
2778         case TRANSMISSION_MODE_8K:
2779                         i = 1;
2780                         break;
2781         }
2782
2783         return (LUT_isdbt_symbol_duration[i] / (c->bandwidth_hz / 1000)) + 1;
2784 }
2785
2786 static void dib8000_set_isdbt_loop_params(struct dib8000_state *state, enum param_loop_step loop_step)
2787 {
2788         struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2789         u16 reg_32 = 0, reg_37 = 0;
2790
2791         switch (loop_step) {
2792         case LOOP_TUNE_1:
2793                         if (c->isdbt_sb_mode)  {
2794                                 if (c->isdbt_partial_reception == 0) {
2795                                         reg_32 = ((11 - state->mode) << 12) | (6 << 8) | 0x40; /* P_timf_alpha = (11-P_mode), P_corm_alpha=6, P_corm_thres=0x40 */
2796                                         reg_37 = (3 << 5) | (0 << 4) | (10 - state->mode); /* P_ctrl_pha_off_max=3   P_ctrl_sfreq_inh =0  P_ctrl_sfreq_step = (10-P_mode)  */
2797                                 } else { /* Sound Broadcasting mode 3 seg */
2798                                         reg_32 = ((10 - state->mode) << 12) | (6 << 8) | 0x60; /* P_timf_alpha = (10-P_mode), P_corm_alpha=6, P_corm_thres=0x60 */
2799                                         reg_37 = (3 << 5) | (0 << 4) | (9 - state->mode); /* P_ctrl_pha_off_max=3   P_ctrl_sfreq_inh =0  P_ctrl_sfreq_step = (9-P_mode)  */
2800                                 }
2801                         } else { /* 13-seg start conf offset loop parameters */
2802                                 reg_32 = ((9 - state->mode) << 12) | (6 << 8) | 0x80; /* P_timf_alpha = (9-P_mode, P_corm_alpha=6, P_corm_thres=0x80 */
2803                                 reg_37 = (3 << 5) | (0 << 4) | (8 - state->mode); /* P_ctrl_pha_off_max=3   P_ctrl_sfreq_inh =0  P_ctrl_sfreq_step = 9  */
2804                         }
2805                         break;
2806         case LOOP_TUNE_2:
2807                         if (c->isdbt_sb_mode)  {
2808                                 if (c->isdbt_partial_reception == 0) {  /* Sound Broadcasting mode 1 seg */
2809                                         reg_32 = ((13-state->mode) << 12) | (6 << 8) | 0x40; /* P_timf_alpha = (13-P_mode) , P_corm_alpha=6, P_corm_thres=0x40*/
2810                                         reg_37 = (12-state->mode) | ((5 + state->mode) << 5);
2811                                 } else {  /* Sound Broadcasting mode 3 seg */
2812                                         reg_32 = ((12-state->mode) << 12) | (6 << 8) | 0x60; /* P_timf_alpha = (12-P_mode) , P_corm_alpha=6, P_corm_thres=0x60 */
2813                                         reg_37 = (11-state->mode) | ((5 + state->mode) << 5);
2814                                 }
2815                         } else {  /* 13 seg */
2816                                 reg_32 = ((11-state->mode) << 12) | (6 << 8) | 0x80; /* P_timf_alpha = 8 , P_corm_alpha=6, P_corm_thres=0x80 */
2817                                 reg_37 = ((5+state->mode) << 5) | (10 - state->mode);
2818                         }
2819                         break;
2820         }
2821         dib8000_write_word(state, 32, reg_32);
2822         dib8000_write_word(state, 37, reg_37);
2823 }
2824
2825 static void dib8000_demod_restart(struct dib8000_state *state)
2826 {
2827         dib8000_write_word(state, 770, 0x4000);
2828         dib8000_write_word(state, 770, 0x0000);
2829         return;
2830 }
2831
2832 static void dib8000_set_sync_wait(struct dib8000_state *state)
2833 {
2834         struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2835         u16 sync_wait = 64;
2836
2837         /* P_dvsy_sync_wait - reuse mode */
2838         switch (c->transmission_mode) {
2839         case TRANSMISSION_MODE_8K:
2840                         sync_wait = 256;
2841                         break;
2842         case TRANSMISSION_MODE_4K:
2843                         sync_wait = 128;
2844                         break;
2845         default:
2846         case TRANSMISSION_MODE_2K:
2847                         sync_wait =  64;
2848                         break;
2849         }
2850
2851         if (state->cfg.diversity_delay == 0)
2852                 sync_wait = (sync_wait * (1 << (c->guard_interval)) * 3) / 2 + 48; /* add 50% SFN margin + compensate for one DVSY-fifo */
2853         else
2854                 sync_wait = (sync_wait * (1 << (c->guard_interval)) * 3) / 2 + state->cfg.diversity_delay; /* add 50% SFN margin + compensate for DVSY-fifo */
2855
2856         dib8000_write_word(state, 273, (dib8000_read_word(state, 273) & 0x000f) | (sync_wait << 4));
2857 }
2858
2859 static u32 dib8000_get_timeout(struct dib8000_state *state, u32 delay, enum timeout_mode mode)
2860 {
2861         if (mode == SYMBOL_DEPENDENT_ON)
2862                 return systime() + (delay * state->symbol_duration);
2863         else
2864                 return systime() + delay;
2865 }
2866
2867 static s32 dib8000_get_status(struct dvb_frontend *fe)
2868 {
2869         struct dib8000_state *state = fe->demodulator_priv;
2870         return state->status;
2871 }
2872
2873 enum frontend_tune_state dib8000_get_tune_state(struct dvb_frontend *fe)
2874 {
2875         struct dib8000_state *state = fe->demodulator_priv;
2876         return state->tune_state;
2877 }
2878 EXPORT_SYMBOL(dib8000_get_tune_state);
2879
2880 int dib8000_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state)
2881 {
2882         struct dib8000_state *state = fe->demodulator_priv;
2883
2884         state->tune_state = tune_state;
2885         return 0;
2886 }
2887 EXPORT_SYMBOL(dib8000_set_tune_state);
2888
2889 static int dib8000_tune_restart_from_demod(struct dvb_frontend *fe)
2890 {
2891         struct dib8000_state *state = fe->demodulator_priv;
2892
2893         state->status = FE_STATUS_TUNE_PENDING;
2894         state->tune_state = CT_DEMOD_START;
2895         return 0;
2896 }
2897
2898 static u16 dib8000_read_lock(struct dvb_frontend *fe)
2899 {
2900         struct dib8000_state *state = fe->demodulator_priv;
2901
2902         if (state->revision == 0x8090)
2903                 return dib8000_read_word(state, 570);
2904         return dib8000_read_word(state, 568);
2905 }
2906
2907 static int dib8090p_init_sdram(struct dib8000_state *state)
2908 {
2909         u16 reg = 0;
2910         dprintk("init sdram");
2911
2912         reg = dib8000_read_word(state, 274) & 0xfff0;
2913         dib8000_write_word(state, 274, reg | 0x7); /* P_dintlv_delay_ram = 7 because of MobileSdram */
2914
2915         dib8000_write_word(state, 1803, (7 << 2));
2916
2917         reg = dib8000_read_word(state, 1280);
2918         dib8000_write_word(state, 1280,  reg | (1 << 2)); /* force restart P_restart_sdram */
2919         dib8000_write_word(state, 1280,  reg); /* release restart P_restart_sdram */
2920
2921         return 0;
2922 }
2923
2924 /**
2925  * is_manual_mode - Check if TMCC should be used for parameters settings
2926  * @c:  struct dvb_frontend_properties
2927  *
2928  * By default, TMCC table should be used for parameter settings on most
2929  * usercases. However, sometimes it is desirable to lock the demod to
2930  * use the manual parameters.
2931  *
2932  * On manual mode, the current dib8000_tune state machine is very restrict:
2933  * It requires that both per-layer and per-transponder parameters to be
2934  * properly specified, otherwise the device won't lock.
2935  *
2936  * Check if all those conditions are properly satisfied before allowing
2937  * the device to use the manual frequency lock mode.
2938  */
2939 static int is_manual_mode(struct dtv_frontend_properties *c)
2940 {
2941         int i, n_segs = 0;
2942
2943         /* Use auto mode on DVB-T compat mode */
2944         if (c->delivery_system != SYS_ISDBT)
2945                 return 0;
2946
2947         /*
2948          * Transmission mode is only detected on auto mode, currently
2949          */
2950         if (c->transmission_mode == TRANSMISSION_MODE_AUTO) {
2951                 dprintk("transmission mode auto");
2952                 return 0;
2953         }
2954
2955         /*
2956          * Guard interval is only detected on auto mode, currently
2957          */
2958         if (c->guard_interval == GUARD_INTERVAL_AUTO) {
2959                 dprintk("guard interval auto");
2960                 return 0;
2961         }
2962
2963         /*
2964          * If no layer is enabled, assume auto mode, as at least one
2965          * layer should be enabled
2966          */
2967         if (!c->isdbt_layer_enabled) {
2968                 dprintk("no layer modulation specified");
2969                 return 0;
2970         }
2971
2972         /*
2973          * Check if the per-layer parameters aren't auto and
2974          * disable a layer if segment count is 0 or invalid.
2975          */
2976         for (i = 0; i < 3; i++) {
2977                 if (!(c->isdbt_layer_enabled & 1 << i))
2978                         continue;
2979
2980                 if ((c->layer[i].segment_count > 13) ||
2981                     (c->layer[i].segment_count == 0)) {
2982                         c->isdbt_layer_enabled &= ~(1 << i);
2983                         continue;
2984                 }
2985
2986                 n_segs += c->layer[i].segment_count;
2987
2988                 if ((c->layer[i].modulation == QAM_AUTO) ||
2989                     (c->layer[i].fec == FEC_AUTO)) {
2990                         dprintk("layer %c has either modulation or FEC auto",
2991                                 'A' + i);
2992                         return 0;
2993                 }
2994         }
2995
2996         /*
2997          * Userspace specified a wrong number of segments.
2998          *      fallback to auto mode.
2999          */
3000         if (n_segs == 0 || n_segs > 13) {
3001                 dprintk("number of segments is invalid");
3002                 return 0;
3003         }
3004
3005         /* Everything looks ok for manual mode */
3006         return 1;
3007 }
3008
3009 static int dib8000_tune(struct dvb_frontend *fe)
3010 {
3011         struct dib8000_state *state = fe->demodulator_priv;
3012         struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
3013         enum frontend_tune_state *tune_state = &state->tune_state;
3014
3015         u16 locks, deeper_interleaver = 0, i;
3016         int ret = 1; /* 1 symbol duration (in 100us unit) delay most of the time */
3017
3018         u32 *timeout = &state->timeout;
3019         u32 now = systime();
3020 #ifdef DIB8000_AGC_FREEZE
3021         u16 agc1, agc2;
3022 #endif
3023
3024         u32 corm[4] = {0, 0, 0, 0};
3025         u8 find_index, max_value;
3026
3027 #if 0
3028         if (*tune_state < CT_DEMOD_STOP)
3029                 dprintk("IN: context status = %d, TUNE_STATE %d autosearch step = %u systime = %u", state->channel_parameters_set, *tune_state, state->autosearch_state, now);
3030 #endif
3031
3032         switch (*tune_state) {
3033         case CT_DEMOD_START: /* 30 */
3034                         dib8000_reset_stats(fe);
3035
3036                         if (state->revision == 0x8090)
3037                                 dib8090p_init_sdram(state);
3038                         state->status = FE_STATUS_TUNE_PENDING;
3039                         state->channel_parameters_set = is_manual_mode(c);
3040
3041                         dprintk("Tuning channel on %s search mode",
3042                                 state->channel_parameters_set ? "manual" : "auto");
3043
3044                         dib8000_viterbi_state(state, 0); /* force chan dec in restart */
3045
3046                         /* Layer monitor */
3047                         dib8000_write_word(state, 285, dib8000_read_word(state, 285) & 0x60);
3048
3049                         dib8000_set_frequency_offset(state);
3050                         dib8000_set_bandwidth(fe, c->bandwidth_hz / 1000);
3051
3052                         if (state->channel_parameters_set == 0) { /* The channel struct is unknown, search it ! */
3053 #ifdef DIB8000_AGC_FREEZE
3054                                 if (state->revision != 0x8090) {
3055                                         state->agc1_max = dib8000_read_word(state, 108);
3056                                         state->agc1_min = dib8000_read_word(state, 109);
3057                                         state->agc2_max = dib8000_read_word(state, 110);
3058                                         state->agc2_min = dib8000_read_word(state, 111);
3059                                         agc1 = dib8000_read_word(state, 388);
3060                                         agc2 = dib8000_read_word(state, 389);
3061                                         dib8000_write_word(state, 108, agc1);
3062                                         dib8000_write_word(state, 109, agc1);
3063                                         dib8000_write_word(state, 110, agc2);
3064                                         dib8000_write_word(state, 111, agc2);
3065                                 }
3066 #endif
3067                                 state->autosearch_state = AS_SEARCHING_FFT;
3068                                 state->found_nfft = TRANSMISSION_MODE_AUTO;
3069                                 state->found_guard = GUARD_INTERVAL_AUTO;
3070                                 *tune_state = CT_DEMOD_SEARCH_NEXT;
3071                         } else { /* we already know the channel struct so TUNE only ! */
3072                                 state->autosearch_state = AS_DONE;
3073                                 *tune_state = CT_DEMOD_STEP_3;
3074                         }
3075                         state->symbol_duration = dib8000_get_symbol_duration(state);
3076                         break;
3077
3078         case CT_DEMOD_SEARCH_NEXT: /* 51 */
3079                         dib8000_autosearch_start(fe);
3080                         if (state->revision == 0x8090)
3081                                 ret = 50;
3082                         else
3083                                 ret = 15;
3084                         *tune_state = CT_DEMOD_STEP_1;
3085                         break;
3086
3087         case CT_DEMOD_STEP_1: /* 31 */
3088                         switch (dib8000_autosearch_irq(fe)) {
3089                         case 1: /* fail */
3090                                         state->status = FE_STATUS_TUNE_FAILED;
3091                                         state->autosearch_state = AS_DONE;
3092                                         *tune_state = CT_DEMOD_STOP; /* else we are done here */
3093                                         break;
3094                         case 2: /* Succes */
3095                                         state->status = FE_STATUS_FFT_SUCCESS; /* signal to the upper layer, that there was a channel found and the parameters can be read */
3096                                         *tune_state = CT_DEMOD_STEP_3;
3097                                         if (state->autosearch_state == AS_SEARCHING_GUARD)
3098                                                 *tune_state = CT_DEMOD_STEP_2;
3099                                         else
3100                                                 state->autosearch_state = AS_DONE;
3101                                         break;
3102                         case 3: /* Autosearch FFT max correlation endded */
3103                                         *tune_state = CT_DEMOD_STEP_2;
3104                                         break;
3105                         }
3106                         break;
3107
3108         case CT_DEMOD_STEP_2:
3109                         switch (state->autosearch_state) {
3110                         case AS_SEARCHING_FFT:
3111                                         /* searching for the correct FFT */
3112                                 if (state->revision == 0x8090) {
3113                                         corm[2] = (dib8000_read_word(state, 596) << 16) | (dib8000_read_word(state, 597));
3114                                         corm[1] = (dib8000_read_word(state, 598) << 16) | (dib8000_read_word(state, 599));
3115                                         corm[0] = (dib8000_read_word(state, 600) << 16) | (dib8000_read_word(state, 601));
3116                                 } else {
3117                                         corm[2] = (dib8000_read_word(state, 594) << 16) | (dib8000_read_word(state, 595));
3118                                         corm[1] = (dib8000_read_word(state, 596) << 16) | (dib8000_read_word(state, 597));
3119                                         corm[0] = (dib8000_read_word(state, 598) << 16) | (dib8000_read_word(state, 599));
3120                                 }
3121                                         /* dprintk("corm fft: %u %u %u", corm[0], corm[1], corm[2]); */
3122
3123                                         max_value = 0;
3124                                         for (find_index = 1 ; find_index < 3 ; find_index++) {
3125                                                 if (corm[max_value] < corm[find_index])
3126                                                         max_value = find_index ;
3127                                         }
3128
3129                                         switch (max_value) {
3130                                         case 0:
3131                                                         state->found_nfft = TRANSMISSION_MODE_2K;
3132                                                         break;
3133                                         case 1:
3134                                                         state->found_nfft = TRANSMISSION_MODE_4K;
3135                                                         break;
3136                                         case 2:
3137                                         default:
3138                                                         state->found_nfft = TRANSMISSION_MODE_8K;
3139                                                         break;
3140                                         }
3141                                         /* dprintk("Autosearch FFT has found Mode %d", max_value + 1); */
3142
3143                                         *tune_state = CT_DEMOD_SEARCH_NEXT;
3144                                         state->autosearch_state = AS_SEARCHING_GUARD;
3145                                         if (state->revision == 0x8090)
3146                                                 ret = 50;
3147                                         else
3148                                                 ret = 10;
3149                                         break;
3150                         case AS_SEARCHING_GUARD:
3151                                         /* searching for the correct guard interval */
3152                                         if (state->revision == 0x8090)
3153                                                 state->found_guard = dib8000_read_word(state, 572) & 0x3;
3154                                         else
3155                                                 state->found_guard = dib8000_read_word(state, 570) & 0x3;
3156                                         /* dprintk("guard interval found=%i", state->found_guard); */
3157
3158                                         *tune_state = CT_DEMOD_STEP_3;
3159                                         break;
3160                         default:
3161                                         /* the demod should never be in this state */
3162                                         state->status = FE_STATUS_TUNE_FAILED;
3163                                         state->autosearch_state = AS_DONE;
3164                                         *tune_state = CT_DEMOD_STOP; /* else we are done here */
3165                                         break;
3166                         }
3167                         break;
3168
3169         case CT_DEMOD_STEP_3: /* 33 */
3170                         state->symbol_duration = dib8000_get_symbol_duration(state);
3171                         dib8000_set_isdbt_loop_params(state, LOOP_TUNE_1);
3172                         dib8000_set_isdbt_common_channel(state, 0, 0);/* setting the known channel parameters here */
3173                         *tune_state = CT_DEMOD_STEP_4;
3174                         break;
3175
3176         case CT_DEMOD_STEP_4: /* (34) */
3177                         dib8000_demod_restart(state);
3178
3179                         dib8000_set_sync_wait(state);
3180                         dib8000_set_diversity_in(state->fe[0], state->diversity_onoff);
3181
3182                         locks = (dib8000_read_word(state, 180) >> 6) & 0x3f; /* P_coff_winlen ? */
3183                         /* coff should lock over P_coff_winlen ofdm symbols : give 3 times this length to lock */
3184                         *timeout = dib8000_get_timeout(state, 2 * locks, SYMBOL_DEPENDENT_ON);
3185                         *tune_state = CT_DEMOD_STEP_5;
3186                         break;
3187
3188         case CT_DEMOD_STEP_5: /* (35) */
3189                         locks = dib8000_read_lock(fe);
3190                         if (locks & (0x3 << 11)) { /* coff-lock and off_cpil_lock achieved */
3191                                 dib8000_update_timf(state); /* we achieved a coff_cpil_lock - it's time to update the timf */
3192                                 if (!state->differential_constellation) {
3193                                         /* 2 times lmod4_win_len + 10 symbols (pipe delay after coff + nb to compute a 1st correlation) */
3194                                         *timeout = dib8000_get_timeout(state, (20 * ((dib8000_read_word(state, 188)>>5)&0x1f)), SYMBOL_DEPENDENT_ON);
3195                                         *tune_state = CT_DEMOD_STEP_7;
3196                                 } else {
3197                                         *tune_state = CT_DEMOD_STEP_8;
3198                                 }
3199                         } else if (now > *timeout) {
3200                                 *tune_state = CT_DEMOD_STEP_6; /* goto check for diversity input connection */
3201                         }
3202                         break;
3203
3204         case CT_DEMOD_STEP_6: /* (36)  if there is an input (diversity) */
3205                         if ((state->fe[1] != NULL) && (state->output_mode != OUTMODE_DIVERSITY)) {
3206                                 /* if there is a diversity fe in input and this fe is has not already failled : wait here until this this fe has succedeed or failled */
3207                                 if (dib8000_get_status(state->fe[1]) <= FE_STATUS_STD_SUCCESS) /* Something is locked on the input fe */
3208                                         *tune_state = CT_DEMOD_STEP_8; /* go for mpeg */
3209                                 else if (dib8000_get_status(state->fe[1]) >= FE_STATUS_TUNE_TIME_TOO_SHORT) { /* fe in input failled also, break the current one */
3210                                         *tune_state = CT_DEMOD_STOP; /* else we are done here ; step 8 will close the loops and exit */
3211                                         dib8000_viterbi_state(state, 1); /* start viterbi chandec */
3212                                         dib8000_set_isdbt_loop_params(state, LOOP_TUNE_2);
3213                                         state->status = FE_STATUS_TUNE_FAILED;
3214                                 }
3215                         } else {
3216                                 dib8000_viterbi_state(state, 1); /* start viterbi chandec */
3217                                 dib8000_set_isdbt_loop_params(state, LOOP_TUNE_2);
3218                                 *tune_state = CT_DEMOD_STOP; /* else we are done here ; step 8 will close the loops and exit */
3219                                 state->status = FE_STATUS_TUNE_FAILED;
3220                         }
3221                         break;
3222
3223         case CT_DEMOD_STEP_7: /* 37 */
3224                         locks = dib8000_read_lock(fe);
3225                         if (locks & (1<<10)) { /* lmod4_lock */
3226                                 ret = 14; /* wait for 14 symbols */
3227                                 *tune_state = CT_DEMOD_STEP_8;
3228                         } else if (now > *timeout)
3229                                 *tune_state = CT_DEMOD_STEP_6; /* goto check for diversity input connection */
3230                         break;
3231
3232         case CT_DEMOD_STEP_8: /* 38 */
3233                         dib8000_viterbi_state(state, 1); /* start viterbi chandec */
3234                         dib8000_set_isdbt_loop_params(state, LOOP_TUNE_2);
3235
3236                         /* mpeg will never lock on this condition because init_prbs is not set : search for it !*/
3237                         if (c->isdbt_sb_mode
3238                             && c->isdbt_sb_subchannel < 14
3239                             && !state->differential_constellation) {
3240                                 state->subchannel = 0;
3241                                 *tune_state = CT_DEMOD_STEP_11;
3242                         } else {
3243                                 *tune_state = CT_DEMOD_STEP_9;
3244                                 state->status = FE_STATUS_LOCKED;
3245                         }
3246                         break;
3247
3248         case CT_DEMOD_STEP_9: /* 39 */
3249                         if ((state->revision == 0x8090) || ((dib8000_read_word(state, 1291) >> 9) & 0x1)) { /* fe capable of deinterleaving : esram */
3250                                 /* defines timeout for mpeg lock depending on interleaver length of longest layer */
3251                                 for (i = 0; i < 3; i++) {
3252                                         if (c->layer[i].interleaving >= deeper_interleaver) {
3253                                                 dprintk("layer%i: time interleaver = %d ", i, c->layer[i].interleaving);
3254                                                 if (c->layer[i].segment_count > 0) { /* valid layer */
3255                                                         deeper_interleaver = c->layer[0].interleaving;
3256                                                         state->longest_intlv_layer = i;
3257                                                 }
3258                                         }
3259                                 }
3260
3261                                 if (deeper_interleaver == 0)
3262                                         locks = 2; /* locks is the tmp local variable name */
3263                                 else if (deeper_interleaver == 3)
3264                                         locks = 8;
3265                                 else
3266                                         locks = 2 * deeper_interleaver;
3267
3268                                 if (state->diversity_onoff != 0) /* because of diversity sync */
3269                                         locks *= 2;
3270
3271                                 *timeout = now + (2000 * locks); /* give the mpeg lock 800ms if sram is present */
3272                                 dprintk("Deeper interleaver mode = %d on layer %d : timeout mult factor = %d => will use timeout = %d", deeper_interleaver, state->longest_intlv_layer, locks, *timeout);
3273
3274                                 *tune_state = CT_DEMOD_STEP_10;
3275                         } else
3276                                 *tune_state = CT_DEMOD_STOP;
3277                         break;
3278
3279         case CT_DEMOD_STEP_10: /* 40 */
3280                         locks = dib8000_read_lock(fe);
3281                         if (locks&(1<<(7-state->longest_intlv_layer))) { /* mpeg lock : check the longest one */
3282                                 dprintk("Mpeg locks [ L0 : %d | L1 : %d | L2 : %d ]", (locks>>7)&0x1, (locks>>6)&0x1, (locks>>5)&0x1);
3283                                 if (c->isdbt_sb_mode
3284                                     && c->isdbt_sb_subchannel < 14
3285                                     && !state->differential_constellation)
3286                                         /* signal to the upper layer, that there was a channel found and the parameters can be read */
3287                                         state->status = FE_STATUS_DEMOD_SUCCESS;
3288                                 else
3289                                         state->status = FE_STATUS_DATA_LOCKED;
3290                                 *tune_state = CT_DEMOD_STOP;
3291                         } else if (now > *timeout) {
3292                                 if (c->isdbt_sb_mode
3293                                     && c->isdbt_sb_subchannel < 14
3294                                     && !state->differential_constellation) { /* continue to try init prbs autosearch */
3295                                         state->subchannel += 3;
3296                                         *tune_state = CT_DEMOD_STEP_11;
3297                                 } else { /* we are done mpeg of the longest interleaver xas not locking but let's try if an other layer has locked in the same time */
3298                                         if (locks & (0x7<<5)) {
3299                                                 dprintk("Mpeg locks [ L0 : %d | L1 : %d | L2 : %d ]", (locks>>7)&0x1, (locks>>6)&0x1, (locks>>5)&0x1);
3300                                                 state->status = FE_STATUS_DATA_LOCKED;
3301                                         } else
3302                                                 state->status = FE_STATUS_TUNE_FAILED;
3303                                         *tune_state = CT_DEMOD_STOP;
3304                                 }
3305                         }
3306                         break;
3307
3308         case CT_DEMOD_STEP_11:  /* 41 : init prbs autosearch */
3309                         if (state->subchannel <= 41) {
3310                                 dib8000_set_subchannel_prbs(state, dib8000_get_init_prbs(state, state->subchannel));
3311                                 *tune_state = CT_DEMOD_STEP_9;
3312                         } else {
3313                                 *tune_state = CT_DEMOD_STOP;
3314                                 state->status = FE_STATUS_TUNE_FAILED;
3315                         }
3316                         break;
3317
3318         default:
3319                         break;
3320         }
3321
3322         /* tuning is finished - cleanup the demod */
3323         switch (*tune_state) {
3324         case CT_DEMOD_STOP: /* (42) */
3325 #ifdef DIB8000_AGC_FREEZE
3326                         if ((state->revision != 0x8090) && (state->agc1_max != 0)) {
3327                                 dib8000_write_word(state, 108, state->agc1_max);
3328                                 dib8000_write_word(state, 109, state->agc1_min);
3329                                 dib8000_write_word(state, 110, state->agc2_max);
3330                                 dib8000_write_word(state, 111, state->agc2_min);
3331                                 state->agc1_max = 0;
3332                                 state->agc1_min = 0;
3333                                 state->agc2_max = 0;
3334                                 state->agc2_min = 0;
3335                         }
3336 #endif
3337                         ret = FE_CALLBACK_TIME_NEVER;
3338                         break;
3339         default:
3340                         break;
3341         }
3342
3343         if ((ret > 0) && (*tune_state > CT_DEMOD_STEP_3))
3344                 return ret * state->symbol_duration;
3345         if ((ret > 0) && (ret < state->symbol_duration))
3346                 return state->symbol_duration; /* at least one symbol */
3347         return ret;
3348 }
3349
3350 static int dib8000_wakeup(struct dvb_frontend *fe)
3351 {
3352         struct dib8000_state *state = fe->demodulator_priv;
3353         u8 index_frontend;
3354         int ret;
3355
3356         dib8000_set_power_mode(state, DIB8000_POWER_ALL);
3357         dib8000_set_adc_state(state, DIBX000_ADC_ON);
3358         if (dib8000_set_adc_state(state, DIBX000_SLOW_ADC_ON) != 0)
3359                 dprintk("could not start Slow ADC");
3360
3361         if (state->revision == 0x8090)
3362                 dib8000_sad_calib(state);
3363
3364         for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3365                 ret = state->fe[index_frontend]->ops.init(state->fe[index_frontend]);
3366                 if (ret < 0)
3367                         return ret;
3368         }
3369
3370         return 0;
3371 }
3372
3373 static int dib8000_sleep(struct dvb_frontend *fe)
3374 {
3375         struct dib8000_state *state = fe->demodulator_priv;
3376         u8 index_frontend;
3377         int ret;
3378
3379         for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3380                 ret = state->fe[index_frontend]->ops.sleep(state->fe[index_frontend]);
3381                 if (ret < 0)
3382                         return ret;
3383         }
3384
3385         if (state->revision != 0x8090)
3386                 dib8000_set_output_mode(fe, OUTMODE_HIGH_Z);
3387         dib8000_set_power_mode(state, DIB8000_POWER_INTERFACE_ONLY);
3388         return dib8000_set_adc_state(state, DIBX000_SLOW_ADC_OFF) | dib8000_set_adc_state(state, DIBX000_ADC_OFF);
3389 }
3390
3391 static int dib8000_read_status(struct dvb_frontend *fe, fe_status_t * stat);
3392
3393 static int dib8000_get_frontend(struct dvb_frontend *fe)
3394 {
3395         struct dib8000_state *state = fe->demodulator_priv;
3396         u16 i, val = 0;
3397         fe_status_t stat = 0;
3398         u8 index_frontend, sub_index_frontend;
3399
3400         fe->dtv_property_cache.bandwidth_hz = 6000000;
3401
3402         /*
3403          * If called to early, get_frontend makes dib8000_tune to either
3404          * not lock or not sync. This causes dvbv5-scan/dvbv5-zap to fail.
3405          * So, let's just return if frontend 0 has not locked.
3406          */
3407         dib8000_read_status(fe, &stat);
3408         if (!(stat & FE_HAS_SYNC))
3409                 return 0;
3410
3411         dprintk("TMCC lock");
3412         for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3413                 state->fe[index_frontend]->ops.read_status(state->fe[index_frontend], &stat);
3414                 if (stat&FE_HAS_SYNC) {
3415                         dprintk("TMCC lock on the slave%i", index_frontend);
3416                         /* synchronize the cache with the other frontends */
3417                         state->fe[index_frontend]->ops.get_frontend(state->fe[index_frontend]);
3418                         for (sub_index_frontend = 0; (sub_index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[sub_index_frontend] != NULL); sub_index_frontend++) {
3419                                 if (sub_index_frontend != index_frontend) {
3420                                         state->fe[sub_index_frontend]->dtv_property_cache.isdbt_sb_mode = state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode;
3421                                         state->fe[sub_index_frontend]->dtv_property_cache.inversion = state->fe[index_frontend]->dtv_property_cache.inversion;
3422                                         state->fe[sub_index_frontend]->dtv_property_cache.transmission_mode = state->fe[index_frontend]->dtv_property_cache.transmission_mode;
3423                                         state->fe[sub_index_frontend]->dtv_property_cache.guard_interval = state->fe[index_frontend]->dtv_property_cache.guard_interval;
3424                                         state->fe[sub_index_frontend]->dtv_property_cache.isdbt_partial_reception = state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception;
3425                                         for (i = 0; i < 3; i++) {
3426                                                 state->fe[sub_index_frontend]->dtv_property_cache.layer[i].segment_count = state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count;
3427                                                 state->fe[sub_index_frontend]->dtv_property_cache.layer[i].interleaving = state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving;
3428                                                 state->fe[sub_index_frontend]->dtv_property_cache.layer[i].fec = state->fe[index_frontend]->dtv_property_cache.layer[i].fec;
3429                                                 state->fe[sub_index_frontend]->dtv_property_cache.layer[i].modulation = state->fe[index_frontend]->dtv_property_cache.layer[i].modulation;
3430                                         }
3431                                 }
3432                         }
3433                         return 0;
3434                 }
3435         }
3436
3437         fe->dtv_property_cache.isdbt_sb_mode = dib8000_read_word(state, 508) & 0x1;
3438
3439         if (state->revision == 0x8090)
3440                 val = dib8000_read_word(state, 572);
3441         else
3442                 val = dib8000_read_word(state, 570);
3443         fe->dtv_property_cache.inversion = (val & 0x40) >> 6;
3444         switch ((val & 0x30) >> 4) {
3445         case 1:
3446                 fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_2K;
3447                 break;
3448         case 3:
3449         default:
3450                 fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_8K;
3451                 break;
3452         }
3453
3454         switch (val & 0x3) {
3455         case 0:
3456                 fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_32;
3457                 dprintk("dib8000_get_frontend GI = 1/32 ");
3458                 break;
3459         case 1:
3460                 fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_16;
3461                 dprintk("dib8000_get_frontend GI = 1/16 ");
3462                 break;
3463         case 2:
3464                 dprintk("dib8000_get_frontend GI = 1/8 ");
3465                 fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_8;
3466                 break;
3467         case 3:
3468                 dprintk("dib8000_get_frontend GI = 1/4 ");
3469                 fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_4;
3470                 break;
3471         }
3472
3473         val = dib8000_read_word(state, 505);
3474         fe->dtv_property_cache.isdbt_partial_reception = val & 1;
3475         dprintk("dib8000_get_frontend : partial_reception = %d ", fe->dtv_property_cache.isdbt_partial_reception);
3476
3477         for (i = 0; i < 3; i++) {
3478                 val = dib8000_read_word(state, 493 + i);
3479                 fe->dtv_property_cache.layer[i].segment_count = val & 0x0F;
3480                 dprintk("dib8000_get_frontend : Layer %d segments = %d ", i, fe->dtv_property_cache.layer[i].segment_count);
3481
3482                 val = dib8000_read_word(state, 499 + i) & 0x3;
3483                 /* Interleaving can be 0, 1, 2 or 4 */
3484                 if (val == 3)
3485                         val = 4;
3486                 fe->dtv_property_cache.layer[i].interleaving = val;
3487                 dprintk("dib8000_get_frontend : Layer %d time_intlv = %d ",
3488                         i, fe->dtv_property_cache.layer[i].interleaving);
3489
3490                 val = dib8000_read_word(state, 481 + i);
3491                 switch (val & 0x7) {
3492                 case 1:
3493                         fe->dtv_property_cache.layer[i].fec = FEC_1_2;
3494                         dprintk("dib8000_get_frontend : Layer %d Code Rate = 1/2 ", i);
3495                         break;
3496                 case 2:
3497                         fe->dtv_property_cache.layer[i].fec = FEC_2_3;
3498                         dprintk("dib8000_get_frontend : Layer %d Code Rate = 2/3 ", i);
3499                         break;
3500                 case 3:
3501                         fe->dtv_property_cache.layer[i].fec = FEC_3_4;
3502                         dprintk("dib8000_get_frontend : Layer %d Code Rate = 3/4 ", i);
3503                         break;
3504                 case 5:
3505                         fe->dtv_property_cache.layer[i].fec = FEC_5_6;
3506                         dprintk("dib8000_get_frontend : Layer %d Code Rate = 5/6 ", i);
3507                         break;
3508                 default:
3509                         fe->dtv_property_cache.layer[i].fec = FEC_7_8;
3510                         dprintk("dib8000_get_frontend : Layer %d Code Rate = 7/8 ", i);
3511                         break;
3512                 }
3513
3514                 val = dib8000_read_word(state, 487 + i);
3515                 switch (val & 0x3) {
3516                 case 0:
3517                         dprintk("dib8000_get_frontend : Layer %d DQPSK ", i);
3518                         fe->dtv_property_cache.layer[i].modulation = DQPSK;
3519                         break;
3520                 case 1:
3521                         fe->dtv_property_cache.layer[i].modulation = QPSK;
3522                         dprintk("dib8000_get_frontend : Layer %d QPSK ", i);
3523                         break;
3524                 case 2:
3525                         fe->dtv_property_cache.layer[i].modulation = QAM_16;
3526                         dprintk("dib8000_get_frontend : Layer %d QAM16 ", i);
3527                         break;
3528                 case 3:
3529                 default:
3530                         dprintk("dib8000_get_frontend : Layer %d QAM64 ", i);
3531                         fe->dtv_property_cache.layer[i].modulation = QAM_64;
3532                         break;
3533                 }
3534         }
3535
3536         /* synchronize the cache with the other frontends */
3537         for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3538                 state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode = fe->dtv_property_cache.isdbt_sb_mode;
3539                 state->fe[index_frontend]->dtv_property_cache.inversion = fe->dtv_property_cache.inversion;
3540                 state->fe[index_frontend]->dtv_property_cache.transmission_mode = fe->dtv_property_cache.transmission_mode;
3541                 state->fe[index_frontend]->dtv_property_cache.guard_interval = fe->dtv_property_cache.guard_interval;
3542                 state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception = fe->dtv_property_cache.isdbt_partial_reception;
3543                 for (i = 0; i < 3; i++) {
3544                         state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count = fe->dtv_property_cache.layer[i].segment_count;
3545                         state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving = fe->dtv_property_cache.layer[i].interleaving;
3546                         state->fe[index_frontend]->dtv_property_cache.layer[i].fec = fe->dtv_property_cache.layer[i].fec;
3547                         state->fe[index_frontend]->dtv_property_cache.layer[i].modulation = fe->dtv_property_cache.layer[i].modulation;
3548                 }
3549         }
3550         return 0;
3551 }
3552
3553 static int dib8000_set_frontend(struct dvb_frontend *fe)
3554 {
3555         struct dib8000_state *state = fe->demodulator_priv;
3556         struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
3557         int l, i, active, time, time_slave = FE_CALLBACK_TIME_NEVER;
3558         u8 exit_condition, index_frontend;
3559         u32 delay, callback_time;
3560
3561         if (c->frequency == 0) {
3562                 dprintk("dib8000: must at least specify frequency ");
3563                 return 0;
3564         }
3565
3566         if (c->bandwidth_hz == 0) {
3567                 dprintk("dib8000: no bandwidth specified, set to default ");
3568                 c->bandwidth_hz = 6000000;
3569         }
3570
3571         for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3572                 /* synchronization of the cache */
3573                 state->fe[index_frontend]->dtv_property_cache.delivery_system = SYS_ISDBT;
3574                 memcpy(&state->fe[index_frontend]->dtv_property_cache, &fe->dtv_property_cache, sizeof(struct dtv_frontend_properties));
3575
3576                 /* set output mode and diversity input */
3577                 if (state->revision != 0x8090) {
3578                         dib8000_set_diversity_in(state->fe[index_frontend], 1);
3579                         if (index_frontend != 0)
3580                                 dib8000_set_output_mode(state->fe[index_frontend],
3581                                                 OUTMODE_DIVERSITY);
3582                         else
3583                                 dib8000_set_output_mode(state->fe[0], OUTMODE_HIGH_Z);
3584                 } else {
3585                         dib8096p_set_diversity_in(state->fe[index_frontend], 1);
3586                         if (index_frontend != 0)
3587                                 dib8096p_set_output_mode(state->fe[index_frontend],
3588                                                 OUTMODE_DIVERSITY);
3589                         else
3590                                 dib8096p_set_output_mode(state->fe[0], OUTMODE_HIGH_Z);
3591                 }
3592
3593                 /* tune the tuner */
3594                 if (state->fe[index_frontend]->ops.tuner_ops.set_params)
3595                         state->fe[index_frontend]->ops.tuner_ops.set_params(state->fe[index_frontend]);
3596
3597                 dib8000_set_tune_state(state->fe[index_frontend], CT_AGC_START);
3598         }
3599
3600         /* turn off the diversity of the last chip */
3601         if (state->revision != 0x8090)
3602                 dib8000_set_diversity_in(state->fe[index_frontend - 1], 0);
3603         else
3604                 dib8096p_set_diversity_in(state->fe[index_frontend - 1], 0);
3605
3606         /* start up the AGC */
3607         do {
3608                 time = dib8000_agc_startup(state->fe[0]);
3609                 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3610                         time_slave = dib8000_agc_startup(state->fe[index_frontend]);
3611                         if (time == FE_CALLBACK_TIME_NEVER)
3612                                 time = time_slave;
3613                         else if ((time_slave != FE_CALLBACK_TIME_NEVER) && (time_slave > time))
3614                                 time = time_slave;
3615                 }
3616                 if (time != FE_CALLBACK_TIME_NEVER)
3617                         msleep(time / 10);
3618                 else
3619                         break;
3620                 exit_condition = 1;
3621                 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3622                         if (dib8000_get_tune_state(state->fe[index_frontend]) != CT_AGC_STOP) {
3623                                 exit_condition = 0;
3624                                 break;
3625                         }
3626                 }
3627         } while (exit_condition == 0);
3628
3629         for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3630                 dib8000_set_tune_state(state->fe[index_frontend], CT_DEMOD_START);
3631
3632         active = 1;
3633         do {
3634                 callback_time = FE_CALLBACK_TIME_NEVER;
3635                 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3636                         delay = dib8000_tune(state->fe[index_frontend]);
3637                         if (delay != FE_CALLBACK_TIME_NEVER)
3638                                 delay += systime();
3639
3640                         /* we are in autosearch */
3641                         if (state->channel_parameters_set == 0) { /* searching */
3642                                 if ((dib8000_get_status(state->fe[index_frontend]) == FE_STATUS_DEMOD_SUCCESS) || (dib8000_get_status(state->fe[index_frontend]) == FE_STATUS_FFT_SUCCESS)) {
3643                                         dprintk("autosearch succeeded on fe%i", index_frontend);
3644                                         dib8000_get_frontend(state->fe[index_frontend]); /* we read the channel parameters from the frontend which was successful */
3645                                         state->channel_parameters_set = 1;
3646
3647                                         for (l = 0; (l < MAX_NUMBER_OF_FRONTENDS) && (state->fe[l] != NULL); l++) {
3648                                                 if (l != index_frontend) { /* and for all frontend except the successful one */
3649                                                         dib8000_tune_restart_from_demod(state->fe[l]);
3650
3651                                                         state->fe[l]->dtv_property_cache.isdbt_sb_mode = state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode;
3652                                                         state->fe[l]->dtv_property_cache.inversion = state->fe[index_frontend]->dtv_property_cache.inversion;
3653                                                         state->fe[l]->dtv_property_cache.transmission_mode = state->fe[index_frontend]->dtv_property_cache.transmission_mode;
3654                                                         state->fe[l]->dtv_property_cache.guard_interval = state->fe[index_frontend]->dtv_property_cache.guard_interval;
3655                                                         state->fe[l]->dtv_property_cache.isdbt_partial_reception = state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception;
3656                                                         for (i = 0; i < 3; i++) {
3657                                                                 state->fe[l]->dtv_property_cache.layer[i].segment_count = state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count;
3658                                                                 state->fe[l]->dtv_property_cache.layer[i].interleaving = state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving;
3659                                                                 state->fe[l]->dtv_property_cache.layer[i].fec = state->fe[index_frontend]->dtv_property_cache.layer[i].fec;
3660                                                                 state->fe[l]->dtv_property_cache.layer[i].modulation = state->fe[index_frontend]->dtv_property_cache.layer[i].modulation;
3661                                                         }
3662
3663                                                 }
3664                                         }
3665                                 }
3666                         }
3667                         if (delay < callback_time)
3668                                 callback_time = delay;
3669                 }
3670                 /* tuning is done when the master frontend is done (failed or success) */
3671                 if (dib8000_get_status(state->fe[0]) == FE_STATUS_TUNE_FAILED ||
3672                                 dib8000_get_status(state->fe[0]) == FE_STATUS_LOCKED ||
3673                                 dib8000_get_status(state->fe[0]) == FE_STATUS_DATA_LOCKED) {
3674                         active = 0;
3675                         /* we need to wait for all frontends to be finished */
3676                         for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3677                                 if (dib8000_get_tune_state(state->fe[index_frontend]) != CT_DEMOD_STOP)
3678                                         active = 1;
3679                         }
3680                         if (active == 0)
3681                                 dprintk("tuning done with status %d", dib8000_get_status(state->fe[0]));
3682                 }
3683
3684                 if ((active == 1) && (callback_time == FE_CALLBACK_TIME_NEVER)) {
3685                         dprintk("strange callback time something went wrong");
3686                         active = 0;
3687                 }
3688
3689                 while ((active == 1) && (systime() < callback_time))
3690                         msleep(100);
3691         } while (active);
3692
3693         /* set output mode */
3694         if (state->revision != 0x8090)
3695                 dib8000_set_output_mode(state->fe[0], state->cfg.output_mode);
3696         else {
3697                 dib8096p_set_output_mode(state->fe[0], state->cfg.output_mode);
3698                 if (state->cfg.enMpegOutput == 0) {
3699                         dib8096p_setDibTxMux(state, MPEG_ON_DIBTX);
3700                         dib8096p_setHostBusMux(state, DIBTX_ON_HOSTBUS);
3701                 }
3702         }
3703
3704         return 0;
3705 }
3706
3707 static int dib8000_get_stats(struct dvb_frontend *fe, fe_status_t stat);
3708
3709 static int dib8000_read_status(struct dvb_frontend *fe, fe_status_t * stat)
3710 {
3711         struct dib8000_state *state = fe->demodulator_priv;
3712         u16 lock_slave = 0, lock;
3713         u8 index_frontend;
3714
3715         lock = dib8000_read_lock(fe);
3716         for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3717                 lock_slave |= dib8000_read_lock(state->fe[index_frontend]);
3718
3719         *stat = 0;
3720
3721         if (((lock >> 13) & 1) || ((lock_slave >> 13) & 1))
3722                 *stat |= FE_HAS_SIGNAL;
3723
3724         if (((lock >> 8) & 1) || ((lock_slave >> 8) & 1)) /* Equal */
3725                 *stat |= FE_HAS_CARRIER;
3726
3727         if ((((lock >> 1) & 0xf) == 0xf) || (((lock_slave >> 1) & 0xf) == 0xf)) /* TMCC_SYNC */
3728                 *stat |= FE_HAS_SYNC;
3729
3730         if ((((lock >> 12) & 1) || ((lock_slave >> 12) & 1)) && ((lock >> 5) & 7)) /* FEC MPEG */
3731                 *stat |= FE_HAS_LOCK;
3732
3733         if (((lock >> 12) & 1) || ((lock_slave >> 12) & 1)) {
3734                 lock = dib8000_read_word(state, 554); /* Viterbi Layer A */
3735                 if (lock & 0x01)
3736                         *stat |= FE_HAS_VITERBI;
3737
3738                 lock = dib8000_read_word(state, 555); /* Viterbi Layer B */
3739                 if (lock & 0x01)
3740                         *stat |= FE_HAS_VITERBI;
3741
3742                 lock = dib8000_read_word(state, 556); /* Viterbi Layer C */
3743                 if (lock & 0x01)
3744                         *stat |= FE_HAS_VITERBI;
3745         }
3746         dib8000_get_stats(fe, *stat);
3747
3748         return 0;
3749 }
3750
3751 static int dib8000_read_ber(struct dvb_frontend *fe, u32 * ber)
3752 {
3753         struct dib8000_state *state = fe->demodulator_priv;
3754
3755         /* 13 segments */
3756         if (state->revision == 0x8090)
3757                 *ber = (dib8000_read_word(state, 562) << 16) |
3758                         dib8000_read_word(state, 563);
3759         else
3760                 *ber = (dib8000_read_word(state, 560) << 16) |
3761                         dib8000_read_word(state, 561);
3762         return 0;
3763 }
3764
3765 static int dib8000_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
3766 {
3767         struct dib8000_state *state = fe->demodulator_priv;
3768
3769         /* packet error on 13 seg */
3770         if (state->revision == 0x8090)
3771                 *unc = dib8000_read_word(state, 567);
3772         else
3773                 *unc = dib8000_read_word(state, 565);
3774         return 0;
3775 }
3776
3777 static int dib8000_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
3778 {
3779         struct dib8000_state *state = fe->demodulator_priv;
3780         u8 index_frontend;
3781         u16 val;
3782
3783         *strength = 0;
3784         for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3785                 state->fe[index_frontend]->ops.read_signal_strength(state->fe[index_frontend], &val);
3786                 if (val > 65535 - *strength)
3787                         *strength = 65535;
3788                 else
3789                         *strength += val;
3790         }
3791
3792         val = 65535 - dib8000_read_word(state, 390);
3793         if (val > 65535 - *strength)
3794                 *strength = 65535;
3795         else
3796                 *strength += val;
3797         return 0;
3798 }
3799
3800 static u32 dib8000_get_snr(struct dvb_frontend *fe)
3801 {
3802         struct dib8000_state *state = fe->demodulator_priv;
3803         u32 n, s, exp;
3804         u16 val;
3805
3806         if (state->revision != 0x8090)
3807                 val = dib8000_read_word(state, 542);
3808         else
3809                 val = dib8000_read_word(state, 544);
3810         n = (val >> 6) & 0xff;
3811         exp = (val & 0x3f);
3812         if ((exp & 0x20) != 0)
3813                 exp -= 0x40;
3814         n <<= exp+16;
3815
3816         if (state->revision != 0x8090)
3817                 val = dib8000_read_word(state, 543);
3818         else
3819                 val = dib8000_read_word(state, 545);
3820         s = (val >> 6) & 0xff;
3821         exp = (val & 0x3f);
3822         if ((exp & 0x20) != 0)
3823                 exp -= 0x40;
3824         s <<= exp+16;
3825
3826         if (n > 0) {
3827                 u32 t = (s/n) << 16;
3828                 return t + ((s << 16) - n*t) / n;
3829         }
3830         return 0xffffffff;
3831 }
3832
3833 static int dib8000_read_snr(struct dvb_frontend *fe, u16 * snr)
3834 {
3835         struct dib8000_state *state = fe->demodulator_priv;
3836         u8 index_frontend;
3837         u32 snr_master;
3838
3839         snr_master = dib8000_get_snr(fe);
3840         for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3841                 snr_master += dib8000_get_snr(state->fe[index_frontend]);
3842
3843         if ((snr_master >> 16) != 0) {
3844                 snr_master = 10*intlog10(snr_master>>16);
3845                 *snr = snr_master / ((1 << 24) / 10);
3846         }
3847         else
3848                 *snr = 0;
3849
3850         return 0;
3851 }
3852
3853 struct per_layer_regs {
3854         u16 lock, ber, per;
3855 };
3856
3857 static const struct per_layer_regs per_layer_regs[] = {
3858         { 554, 560, 562 },
3859         { 555, 576, 578 },
3860         { 556, 581, 583 },
3861 };
3862
3863 struct linear_segments {
3864         unsigned x;
3865         signed y;
3866 };
3867
3868 /*
3869  * Table to estimate signal strength in dBm.
3870  * This table was empirically determinated by measuring the signal
3871  * strength generated by a DTA-2111 RF generator directly connected into
3872  * a dib8076 device (a PixelView PV-D231U stick), using a good quality
3873  * 3 meters RC6 cable and good RC6 connectors.
3874  * The real value can actually be different on other devices, depending
3875  * on several factors, like if LNA is enabled or not, if diversity is
3876  * enabled, type of connectors, etc.
3877  * Yet, it is better to use this measure in dB than a random non-linear
3878  * percentage value, especially for antenna adjustments.
3879  * On my tests, the precision of the measure using this table is about
3880  * 0.5 dB, with sounds reasonable enough.
3881  */
3882 static struct linear_segments strength_to_db_table[] = {
3883         { 55953, 108500 },      /* -22.5 dBm */
3884         { 55394, 108000 },
3885         { 53834, 107000 },
3886         { 52863, 106000 },
3887         { 52239, 105000 },
3888         { 52012, 104000 },
3889         { 51803, 103000 },
3890         { 51566, 102000 },
3891         { 51356, 101000 },
3892         { 51112, 100000 },
3893         { 50869,  99000 },
3894         { 50600,  98000 },
3895         { 50363,  97000 },
3896         { 50117,  96000 },      /* -35 dBm */
3897         { 49889,  95000 },
3898         { 49680,  94000 },
3899         { 49493,  93000 },
3900         { 49302,  92000 },
3901         { 48929,  91000 },
3902         { 48416,  90000 },
3903         { 48035,  89000 },
3904         { 47593,  88000 },
3905         { 47282,  87000 },
3906         { 46953,  86000 },
3907         { 46698,  85000 },
3908         { 45617,  84000 },
3909         { 44773,  83000 },
3910         { 43845,  82000 },
3911         { 43020,  81000 },
3912         { 42010,  80000 },      /* -51 dBm */
3913         {     0,      0 },
3914 };
3915
3916 static u32 interpolate_value(u32 value, struct linear_segments *segments,
3917                              unsigned len)
3918 {
3919         u64 tmp64;
3920         u32 dx;
3921         s32 dy;
3922         int i, ret;
3923
3924         if (value >= segments[0].x)
3925                 return segments[0].y;
3926         if (value < segments[len-1].x)
3927                 return segments[len-1].y;
3928
3929         for (i = 1; i < len - 1; i++) {
3930                 /* If value is identical, no need to interpolate */
3931                 if (value == segments[i].x)
3932                         return segments[i].y;
3933                 if (value > segments[i].x)
3934                         break;
3935         }
3936
3937         /* Linear interpolation between the two (x,y) points */
3938         dy = segments[i - 1].y - segments[i].y;
3939         dx = segments[i - 1].x - segments[i].x;
3940
3941         tmp64 = value - segments[i].x;
3942         tmp64 *= dy;
3943         do_div(tmp64, dx);
3944         ret = segments[i].y + tmp64;
3945
3946         return ret;
3947 }
3948
3949 static u32 dib8000_get_time_us(struct dvb_frontend *fe, int layer)
3950 {
3951         struct dib8000_state *state = fe->demodulator_priv;
3952         struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
3953         int ini_layer, end_layer, i;
3954         u64 time_us, tmp64;
3955         u32 tmp, denom;
3956         int guard, rate_num, rate_denum = 1, bits_per_symbol, nsegs;
3957         int interleaving = 0, fft_div;
3958
3959         if (layer >= 0) {
3960                 ini_layer = layer;
3961                 end_layer = layer + 1;
3962         } else {
3963                 ini_layer = 0;
3964                 end_layer = 3;
3965         }
3966
3967         switch (c->guard_interval) {
3968         case GUARD_INTERVAL_1_4:
3969                 guard = 4;
3970                 break;
3971         case GUARD_INTERVAL_1_8:
3972                 guard = 8;
3973                 break;
3974         case GUARD_INTERVAL_1_16:
3975                 guard = 16;
3976                 break;
3977         default:
3978         case GUARD_INTERVAL_1_32:
3979                 guard = 32;
3980                 break;
3981         }
3982
3983         switch (c->transmission_mode) {
3984         case TRANSMISSION_MODE_2K:
3985                 fft_div = 4;
3986                 break;
3987         case TRANSMISSION_MODE_4K:
3988                 fft_div = 2;
3989                 break;
3990         default:
3991         case TRANSMISSION_MODE_8K:
3992                 fft_div = 1;
3993                 break;
3994         }
3995
3996         denom = 0;
3997         for (i = ini_layer; i < end_layer; i++) {
3998                 nsegs = c->layer[i].segment_count;
3999                 if (nsegs == 0 || nsegs > 13)
4000                         continue;
4001
4002                 switch (c->layer[i].modulation) {
4003                 case DQPSK:
4004                 case QPSK:
4005                         bits_per_symbol = 2;
4006                         break;
4007                 case QAM_16:
4008                         bits_per_symbol = 4;
4009                         break;
4010                 default:
4011                 case QAM_64:
4012                         bits_per_symbol = 6;
4013                         break;
4014                 }
4015
4016                 switch (c->layer[i].fec) {
4017                 case FEC_1_2:
4018                         rate_num = 1;
4019                         rate_denum = 2;
4020                         break;
4021                 case FEC_2_3:
4022                         rate_num = 2;
4023                         rate_denum = 3;
4024                         break;
4025                 case FEC_3_4:
4026                         rate_num = 3;
4027                         rate_denum = 4;
4028                         break;
4029                 case FEC_5_6:
4030                         rate_num = 5;
4031                         rate_denum = 6;
4032                         break;
4033                 default:
4034                 case FEC_7_8:
4035                         rate_num = 7;
4036                         rate_denum = 8;
4037                         break;
4038                 }
4039
4040                 interleaving = c->layer[i].interleaving;
4041
4042                 denom += bits_per_symbol * rate_num * fft_div * nsegs * 384;
4043         }
4044
4045         /* If all goes wrong, wait for 1s for the next stats */
4046         if (!denom)
4047                 return 0;
4048
4049         /* Estimate the period for the total bit rate */
4050         time_us = rate_denum * (1008 * 1562500L);
4051         tmp64 = time_us;
4052         do_div(tmp64, guard);
4053         time_us = time_us + tmp64;
4054         time_us += denom / 2;
4055         do_div(time_us, denom);
4056
4057         tmp = 1008 * 96 * interleaving;
4058         time_us += tmp + tmp / guard;
4059
4060         return time_us;
4061 }
4062
4063 static int dib8000_get_stats(struct dvb_frontend *fe, fe_status_t stat)
4064 {
4065         struct dib8000_state *state = fe->demodulator_priv;
4066         struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
4067         int i;
4068         int show_per_stats = 0;
4069         u32 time_us = 0, snr, val;
4070         u64 blocks;
4071         s32 db;
4072         u16 strength;
4073
4074         /* Get Signal strength */
4075         dib8000_read_signal_strength(fe, &strength);
4076         val = strength;
4077         db = interpolate_value(val,
4078                                strength_to_db_table,
4079                                ARRAY_SIZE(strength_to_db_table)) - 131000;
4080         c->strength.stat[0].svalue = db;
4081
4082         /* UCB/BER/CNR measures require lock */
4083         if (!(stat & FE_HAS_LOCK)) {
4084                 c->cnr.len = 1;
4085                 c->block_count.len = 1;
4086                 c->block_error.len = 1;
4087                 c->post_bit_error.len = 1;
4088                 c->post_bit_count.len = 1;
4089                 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4090                 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4091                 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4092                 c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4093                 c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4094                 return 0;
4095         }
4096
4097         /* Check if time for stats was elapsed */
4098         if (time_after(jiffies, state->per_jiffies_stats)) {
4099                 state->per_jiffies_stats = jiffies + msecs_to_jiffies(1000);
4100
4101                 /* Get SNR */
4102                 snr = dib8000_get_snr(fe);
4103                 for (i = 1; i < MAX_NUMBER_OF_FRONTENDS; i++) {
4104                         if (state->fe[i])
4105                                 snr += dib8000_get_snr(state->fe[i]);
4106                 }
4107                 snr = snr >> 16;
4108
4109                 if (snr) {
4110                         snr = 10 * intlog10(snr);
4111                         snr = (1000L * snr) >> 24;
4112                 } else {
4113                         snr = 0;
4114                 }
4115                 c->cnr.stat[0].svalue = snr;
4116                 c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
4117
4118                 /* Get UCB measures */
4119                 dib8000_read_unc_blocks(fe, &val);
4120                 if (val < state->init_ucb)
4121                         state->init_ucb += 0x100000000LL;
4122
4123                 c->block_error.stat[0].scale = FE_SCALE_COUNTER;
4124                 c->block_error.stat[0].uvalue = val + state->init_ucb;
4125
4126                 /* Estimate the number of packets based on bitrate */
4127                 if (!time_us)
4128                         time_us = dib8000_get_time_us(fe, -1);
4129
4130                 if (time_us) {
4131                         blocks = 1250000ULL * 1000000ULL;
4132                         do_div(blocks, time_us * 8 * 204);
4133                         c->block_count.stat[0].scale = FE_SCALE_COUNTER;
4134                         c->block_count.stat[0].uvalue += blocks;
4135                 }
4136
4137                 show_per_stats = 1;
4138         }
4139
4140         /* Get post-BER measures */
4141         if (time_after(jiffies, state->ber_jiffies_stats)) {
4142                 time_us = dib8000_get_time_us(fe, -1);
4143                 state->ber_jiffies_stats = jiffies + msecs_to_jiffies((time_us + 500) / 1000);
4144
4145                 dprintk("Next all layers stats available in %u us.", time_us);
4146
4147                 dib8000_read_ber(fe, &val);
4148                 c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
4149                 c->post_bit_error.stat[0].uvalue += val;
4150
4151                 c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
4152                 c->post_bit_count.stat[0].uvalue += 100000000;
4153         }
4154
4155         if (state->revision < 0x8002)
4156                 return 0;
4157
4158         c->block_error.len = 4;
4159         c->post_bit_error.len = 4;
4160         c->post_bit_count.len = 4;
4161
4162         for (i = 0; i < 3; i++) {
4163                 unsigned nsegs = c->layer[i].segment_count;
4164
4165                 if (nsegs == 0 || nsegs > 13)
4166                         continue;
4167
4168                 time_us = 0;
4169
4170                 if (time_after(jiffies, state->ber_jiffies_stats_layer[i])) {
4171                         time_us = dib8000_get_time_us(fe, i);
4172
4173                         state->ber_jiffies_stats_layer[i] = jiffies + msecs_to_jiffies((time_us + 500) / 1000);
4174                         dprintk("Next layer %c  stats will be available in %u us\n",
4175                                 'A' + i, time_us);
4176
4177                         val = dib8000_read_word(state, per_layer_regs[i].ber);
4178                         c->post_bit_error.stat[1 + i].scale = FE_SCALE_COUNTER;
4179                         c->post_bit_error.stat[1 + i].uvalue += val;
4180
4181                         c->post_bit_count.stat[1 + i].scale = FE_SCALE_COUNTER;
4182                         c->post_bit_count.stat[1 + i].uvalue += 100000000;
4183                 }
4184
4185                 if (show_per_stats) {
4186                         val = dib8000_read_word(state, per_layer_regs[i].per);
4187
4188                         c->block_error.stat[1 + i].scale = FE_SCALE_COUNTER;
4189                         c->block_error.stat[1 + i].uvalue += val;
4190
4191                         if (!time_us)
4192                                 time_us = dib8000_get_time_us(fe, i);
4193                         if (time_us) {
4194                                 blocks = 1250000ULL * 1000000ULL;
4195                                 do_div(blocks, time_us * 8 * 204);
4196                                 c->block_count.stat[0].scale = FE_SCALE_COUNTER;
4197                                 c->block_count.stat[0].uvalue += blocks;
4198                         }
4199                 }
4200         }
4201         return 0;
4202 }
4203
4204 int dib8000_set_slave_frontend(struct dvb_frontend *fe, struct dvb_frontend *fe_slave)
4205 {
4206         struct dib8000_state *state = fe->demodulator_priv;
4207         u8 index_frontend = 1;
4208
4209         while ((index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL))
4210                 index_frontend++;
4211         if (index_frontend < MAX_NUMBER_OF_FRONTENDS) {
4212                 dprintk("set slave fe %p to index %i", fe_slave, index_frontend);
4213                 state->fe[index_frontend] = fe_slave;
4214                 return 0;
4215         }
4216
4217         dprintk("too many slave frontend");
4218         return -ENOMEM;
4219 }
4220 EXPORT_SYMBOL(dib8000_set_slave_frontend);
4221
4222 int dib8000_remove_slave_frontend(struct dvb_frontend *fe)
4223 {
4224         struct dib8000_state *state = fe->demodulator_priv;
4225         u8 index_frontend = 1;
4226
4227         while ((index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL))
4228                 index_frontend++;
4229         if (index_frontend != 1) {
4230                 dprintk("remove slave fe %p (index %i)", state->fe[index_frontend-1], index_frontend-1);
4231                 state->fe[index_frontend] = NULL;
4232                 return 0;
4233         }
4234
4235         dprintk("no frontend to be removed");
4236         return -ENODEV;
4237 }
4238 EXPORT_SYMBOL(dib8000_remove_slave_frontend);
4239
4240 struct dvb_frontend *dib8000_get_slave_frontend(struct dvb_frontend *fe, int slave_index)
4241 {
4242         struct dib8000_state *state = fe->demodulator_priv;
4243
4244         if (slave_index >= MAX_NUMBER_OF_FRONTENDS)
4245                 return NULL;
4246         return state->fe[slave_index];
4247 }
4248 EXPORT_SYMBOL(dib8000_get_slave_frontend);
4249
4250
4251 int dib8000_i2c_enumeration(struct i2c_adapter *host, int no_of_demods,
4252                 u8 default_addr, u8 first_addr, u8 is_dib8096p)
4253 {
4254         int k = 0, ret = 0;
4255         u8 new_addr = 0;
4256         struct i2c_device client = {.adap = host };
4257
4258         client.i2c_write_buffer = kzalloc(4 * sizeof(u8), GFP_KERNEL);
4259         if (!client.i2c_write_buffer) {
4260                 dprintk("%s: not enough memory", __func__);
4261                 return -ENOMEM;
4262         }
4263         client.i2c_read_buffer = kzalloc(4 * sizeof(u8), GFP_KERNEL);
4264         if (!client.i2c_read_buffer) {
4265                 dprintk("%s: not enough memory", __func__);
4266                 ret = -ENOMEM;
4267                 goto error_memory_read;
4268         }
4269         client.i2c_buffer_lock = kzalloc(sizeof(struct mutex), GFP_KERNEL);
4270         if (!client.i2c_buffer_lock) {
4271                 dprintk("%s: not enough memory", __func__);
4272                 ret = -ENOMEM;
4273                 goto error_memory_lock;
4274         }
4275         mutex_init(client.i2c_buffer_lock);
4276
4277         for (k = no_of_demods - 1; k >= 0; k--) {
4278                 /* designated i2c address */
4279                 new_addr = first_addr + (k << 1);
4280
4281                 client.addr = new_addr;
4282                 if (!is_dib8096p)
4283                         dib8000_i2c_write16(&client, 1287, 0x0003);     /* sram lead in, rdy */
4284                 if (dib8000_identify(&client) == 0) {
4285                         /* sram lead in, rdy */
4286                         if (!is_dib8096p)
4287                                 dib8000_i2c_write16(&client, 1287, 0x0003);
4288                         client.addr = default_addr;
4289                         if (dib8000_identify(&client) == 0) {
4290                                 dprintk("#%d: not identified", k);
4291                                 ret  = -EINVAL;
4292                                 goto error;
4293                         }
4294                 }
4295
4296                 /* start diversity to pull_down div_str - just for i2c-enumeration */
4297                 dib8000_i2c_write16(&client, 1286, (1 << 10) | (4 << 6));
4298
4299                 /* set new i2c address and force divstart */
4300                 dib8000_i2c_write16(&client, 1285, (new_addr << 2) | 0x2);
4301                 client.addr = new_addr;
4302                 dib8000_identify(&client);
4303
4304                 dprintk("IC %d initialized (to i2c_address 0x%x)", k, new_addr);
4305         }
4306
4307         for (k = 0; k < no_of_demods; k++) {
4308                 new_addr = first_addr | (k << 1);
4309                 client.addr = new_addr;
4310
4311                 // unforce divstr
4312                 dib8000_i2c_write16(&client, 1285, new_addr << 2);
4313
4314                 /* deactivate div - it was just for i2c-enumeration */
4315                 dib8000_i2c_write16(&client, 1286, 0);
4316         }
4317
4318 error:
4319         kfree(client.i2c_buffer_lock);
4320 error_memory_lock:
4321         kfree(client.i2c_read_buffer);
4322 error_memory_read:
4323         kfree(client.i2c_write_buffer);
4324
4325         return ret;
4326 }
4327
4328 EXPORT_SYMBOL(dib8000_i2c_enumeration);
4329 static int dib8000_fe_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings *tune)
4330 {
4331         tune->min_delay_ms = 1000;
4332         tune->step_size = 0;
4333         tune->max_drift = 0;
4334         return 0;
4335 }
4336
4337 static void dib8000_release(struct dvb_frontend *fe)
4338 {
4339         struct dib8000_state *st = fe->demodulator_priv;
4340         u8 index_frontend;
4341
4342         for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (st->fe[index_frontend] != NULL); index_frontend++)
4343                 dvb_frontend_detach(st->fe[index_frontend]);
4344
4345         dibx000_exit_i2c_master(&st->i2c_master);
4346         i2c_del_adapter(&st->dib8096p_tuner_adap);
4347         kfree(st->fe[0]);
4348         kfree(st);
4349 }
4350
4351 struct i2c_adapter *dib8000_get_i2c_master(struct dvb_frontend *fe, enum dibx000_i2c_interface intf, int gating)
4352 {
4353         struct dib8000_state *st = fe->demodulator_priv;
4354         return dibx000_get_i2c_adapter(&st->i2c_master, intf, gating);
4355 }
4356
4357 EXPORT_SYMBOL(dib8000_get_i2c_master);
4358
4359 int dib8000_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
4360 {
4361         struct dib8000_state *st = fe->demodulator_priv;
4362         u16 val = dib8000_read_word(st, 299) & 0xffef;
4363         val |= (onoff & 0x1) << 4;
4364
4365         dprintk("pid filter enabled %d", onoff);
4366         return dib8000_write_word(st, 299, val);
4367 }
4368 EXPORT_SYMBOL(dib8000_pid_filter_ctrl);
4369
4370 int dib8000_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
4371 {
4372         struct dib8000_state *st = fe->demodulator_priv;
4373         dprintk("Index %x, PID %d, OnOff %d", id, pid, onoff);
4374         return dib8000_write_word(st, 305 + id, onoff ? (1 << 13) | pid : 0);
4375 }
4376 EXPORT_SYMBOL(dib8000_pid_filter);
4377
4378 static const struct dvb_frontend_ops dib8000_ops = {
4379         .delsys = { SYS_ISDBT },
4380         .info = {
4381                  .name = "DiBcom 8000 ISDB-T",
4382                  .frequency_min = 44250000,
4383                  .frequency_max = 867250000,
4384                  .frequency_stepsize = 62500,
4385                  .caps = FE_CAN_INVERSION_AUTO |
4386                  FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
4387                  FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
4388                  FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
4389                  FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_RECOVER | FE_CAN_HIERARCHY_AUTO,
4390                  },
4391
4392         .release = dib8000_release,
4393
4394         .init = dib8000_wakeup,
4395         .sleep = dib8000_sleep,
4396
4397         .set_frontend = dib8000_set_frontend,
4398         .get_tune_settings = dib8000_fe_get_tune_settings,
4399         .get_frontend = dib8000_get_frontend,
4400
4401         .read_status = dib8000_read_status,
4402         .read_ber = dib8000_read_ber,
4403         .read_signal_strength = dib8000_read_signal_strength,
4404         .read_snr = dib8000_read_snr,
4405         .read_ucblocks = dib8000_read_unc_blocks,
4406 };
4407
4408 struct dvb_frontend *dib8000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib8000_config *cfg)
4409 {
4410         struct dvb_frontend *fe;
4411         struct dib8000_state *state;
4412
4413         dprintk("dib8000_attach");
4414
4415         state = kzalloc(sizeof(struct dib8000_state), GFP_KERNEL);
4416         if (state == NULL)
4417                 return NULL;
4418         fe = kzalloc(sizeof(struct dvb_frontend), GFP_KERNEL);
4419         if (fe == NULL)
4420                 goto error;
4421
4422         memcpy(&state->cfg, cfg, sizeof(struct dib8000_config));
4423         state->i2c.adap = i2c_adap;
4424         state->i2c.addr = i2c_addr;
4425         state->i2c.i2c_write_buffer = state->i2c_write_buffer;
4426         state->i2c.i2c_read_buffer = state->i2c_read_buffer;
4427         mutex_init(&state->i2c_buffer_lock);
4428         state->i2c.i2c_buffer_lock = &state->i2c_buffer_lock;
4429         state->gpio_val = cfg->gpio_val;
4430         state->gpio_dir = cfg->gpio_dir;
4431
4432         /* Ensure the output mode remains at the previous default if it's
4433          * not specifically set by the caller.
4434          */
4435         if ((state->cfg.output_mode != OUTMODE_MPEG2_SERIAL) && (state->cfg.output_mode != OUTMODE_MPEG2_PAR_GATED_CLK))
4436                 state->cfg.output_mode = OUTMODE_MPEG2_FIFO;
4437
4438         state->fe[0] = fe;
4439         fe->demodulator_priv = state;
4440         memcpy(&state->fe[0]->ops, &dib8000_ops, sizeof(struct dvb_frontend_ops));
4441
4442         state->timf_default = cfg->pll->timf;
4443
4444         if (dib8000_identify(&state->i2c) == 0)
4445                 goto error;
4446
4447         dibx000_init_i2c_master(&state->i2c_master, DIB8000, state->i2c.adap, state->i2c.addr);
4448
4449         /* init 8096p tuner adapter */
4450         strncpy(state->dib8096p_tuner_adap.name, "DiB8096P tuner interface",
4451                         sizeof(state->dib8096p_tuner_adap.name));
4452         state->dib8096p_tuner_adap.algo = &dib8096p_tuner_xfer_algo;
4453         state->dib8096p_tuner_adap.algo_data = NULL;
4454         state->dib8096p_tuner_adap.dev.parent = state->i2c.adap->dev.parent;
4455         i2c_set_adapdata(&state->dib8096p_tuner_adap, state);
4456         i2c_add_adapter(&state->dib8096p_tuner_adap);
4457
4458         dib8000_reset(fe);
4459
4460         dib8000_write_word(state, 285, (dib8000_read_word(state, 285) & ~0x60) | (3 << 5));     /* ber_rs_len = 3 */
4461         state->current_demod_bw = 6000;
4462
4463         return fe;
4464
4465 error:
4466         kfree(state);
4467         return NULL;
4468 }
4469
4470 EXPORT_SYMBOL(dib8000_attach);
4471
4472 MODULE_AUTHOR("Olivier Grenie <Olivier.Grenie@dibcom.fr, " "Patrick Boettcher <pboettcher@dibcom.fr>");
4473 MODULE_DESCRIPTION("Driver for the DiBcom 8000 ISDB-T demodulator");
4474 MODULE_LICENSE("GPL");