]> Git Repo - J-linux.git/blob - drivers/media/dvb-frontends/dib7000p.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / drivers / media / dvb-frontends / dib7000p.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Linux-DVB Driver for DiBcom's second generation DiB7000P (PC).
4  *
5  * Copyright (C) 2005-7 DiBcom (http://www.dibcom.fr/)
6  */
7
8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
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 <linux/int_log.h>
17 #include <media/dvb_frontend.h>
18
19 #include "dib7000p.h"
20
21 static int debug;
22 module_param(debug, int, 0644);
23 MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
24
25 static int buggy_sfn_workaround;
26 module_param(buggy_sfn_workaround, int, 0644);
27 MODULE_PARM_DESC(buggy_sfn_workaround, "Enable work-around for buggy SFNs (default: 0)");
28
29 #define dprintk(fmt, arg...) do {                                       \
30         if (debug)                                                      \
31                 printk(KERN_DEBUG pr_fmt("%s: " fmt),                   \
32                        __func__, ##arg);                                \
33 } while (0)
34
35 struct dib7000p_state {
36         struct dvb_frontend demod;
37         struct dib7000p_config cfg;
38
39         u8 i2c_addr;
40         struct i2c_adapter *i2c_adap;
41
42         struct dibx000_i2c_master i2c_master;
43
44         u16 wbd_ref;
45
46         u8 current_band;
47         u32 current_bandwidth;
48         struct dibx000_agc_config *current_agc;
49         u32 timf;
50
51         u8 div_force_off:1;
52         u8 div_state:1;
53         u16 div_sync_wait;
54
55         u8 agc_state;
56
57         u16 gpio_dir;
58         u16 gpio_val;
59
60         u8 sfn_workaround_active:1;
61
62 #define SOC7090 0x7090
63         u16 version;
64
65         u16 tuner_enable;
66         struct i2c_adapter dib7090_tuner_adap;
67
68         /* for the I2C transfer */
69         struct i2c_msg msg[2];
70         u8 i2c_write_buffer[4];
71         u8 i2c_read_buffer[2];
72         struct mutex i2c_buffer_lock;
73
74         u8 input_mode_mpeg;
75
76         /* for DVBv5 stats */
77         s64 old_ucb;
78         unsigned long per_jiffies_stats;
79         unsigned long ber_jiffies_stats;
80         unsigned long get_stats_time;
81 };
82
83 enum dib7000p_power_mode {
84         DIB7000P_POWER_ALL = 0,
85         DIB7000P_POWER_ANALOG_ADC,
86         DIB7000P_POWER_INTERFACE_ONLY,
87 };
88
89 /* dib7090 specific functions */
90 static int dib7090_set_output_mode(struct dvb_frontend *fe, int mode);
91 static int dib7090_set_diversity_in(struct dvb_frontend *fe, int onoff);
92 static void dib7090_setDibTxMux(struct dib7000p_state *state, int mode);
93 static void dib7090_setHostBusMux(struct dib7000p_state *state, int mode);
94
95 static u16 dib7000p_read_word(struct dib7000p_state *state, u16 reg)
96 {
97         u16 ret;
98
99         if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
100                 dprintk("could not acquire lock\n");
101                 return 0;
102         }
103
104         state->i2c_write_buffer[0] = reg >> 8;
105         state->i2c_write_buffer[1] = reg & 0xff;
106
107         memset(state->msg, 0, 2 * sizeof(struct i2c_msg));
108         state->msg[0].addr = state->i2c_addr >> 1;
109         state->msg[0].flags = 0;
110         state->msg[0].buf = state->i2c_write_buffer;
111         state->msg[0].len = 2;
112         state->msg[1].addr = state->i2c_addr >> 1;
113         state->msg[1].flags = I2C_M_RD;
114         state->msg[1].buf = state->i2c_read_buffer;
115         state->msg[1].len = 2;
116
117         if (i2c_transfer(state->i2c_adap, state->msg, 2) != 2)
118                 dprintk("i2c read error on %d\n", reg);
119
120         ret = (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
121         mutex_unlock(&state->i2c_buffer_lock);
122         return ret;
123 }
124
125 static int dib7000p_write_word(struct dib7000p_state *state, u16 reg, u16 val)
126 {
127         int ret;
128
129         if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
130                 dprintk("could not acquire lock\n");
131                 return -EINVAL;
132         }
133
134         state->i2c_write_buffer[0] = (reg >> 8) & 0xff;
135         state->i2c_write_buffer[1] = reg & 0xff;
136         state->i2c_write_buffer[2] = (val >> 8) & 0xff;
137         state->i2c_write_buffer[3] = val & 0xff;
138
139         memset(&state->msg[0], 0, sizeof(struct i2c_msg));
140         state->msg[0].addr = state->i2c_addr >> 1;
141         state->msg[0].flags = 0;
142         state->msg[0].buf = state->i2c_write_buffer;
143         state->msg[0].len = 4;
144
145         ret = (i2c_transfer(state->i2c_adap, state->msg, 1) != 1 ?
146                         -EREMOTEIO : 0);
147         mutex_unlock(&state->i2c_buffer_lock);
148         return ret;
149 }
150
151 static void dib7000p_write_tab(struct dib7000p_state *state, u16 * buf)
152 {
153         u16 l = 0, r, *n;
154         n = buf;
155         l = *n++;
156         while (l) {
157                 r = *n++;
158
159                 do {
160                         dib7000p_write_word(state, r, *n++);
161                         r++;
162                 } while (--l);
163                 l = *n++;
164         }
165 }
166
167 static int dib7000p_set_output_mode(struct dib7000p_state *state, int mode)
168 {
169         int ret = 0;
170         u16 outreg, fifo_threshold, smo_mode;
171
172         outreg = 0;
173         fifo_threshold = 1792;
174         smo_mode = (dib7000p_read_word(state, 235) & 0x0050) | (1 << 1);
175
176         dprintk("setting output mode for demod %p to %d\n", &state->demod, mode);
177
178         switch (mode) {
179         case OUTMODE_MPEG2_PAR_GATED_CLK:
180                 outreg = (1 << 10);     /* 0x0400 */
181                 break;
182         case OUTMODE_MPEG2_PAR_CONT_CLK:
183                 outreg = (1 << 10) | (1 << 6);  /* 0x0440 */
184                 break;
185         case OUTMODE_MPEG2_SERIAL:
186                 outreg = (1 << 10) | (2 << 6) | (0 << 1);       /* 0x0480 */
187                 break;
188         case OUTMODE_DIVERSITY:
189                 if (state->cfg.hostbus_diversity)
190                         outreg = (1 << 10) | (4 << 6);  /* 0x0500 */
191                 else
192                         outreg = (1 << 11);
193                 break;
194         case OUTMODE_MPEG2_FIFO:
195                 smo_mode |= (3 << 1);
196                 fifo_threshold = 512;
197                 outreg = (1 << 10) | (5 << 6);
198                 break;
199         case OUTMODE_ANALOG_ADC:
200                 outreg = (1 << 10) | (3 << 6);
201                 break;
202         case OUTMODE_HIGH_Z:
203                 outreg = 0;
204                 break;
205         default:
206                 dprintk("Unhandled output_mode passed to be set for demod %p\n", &state->demod);
207                 break;
208         }
209
210         if (state->cfg.output_mpeg2_in_188_bytes)
211                 smo_mode |= (1 << 5);
212
213         ret |= dib7000p_write_word(state, 235, smo_mode);
214         ret |= dib7000p_write_word(state, 236, fifo_threshold); /* synchronous fread */
215         if (state->version != SOC7090)
216                 ret |= dib7000p_write_word(state, 1286, outreg);        /* P_Div_active */
217
218         return ret;
219 }
220
221 static int dib7000p_set_diversity_in(struct dvb_frontend *demod, int onoff)
222 {
223         struct dib7000p_state *state = demod->demodulator_priv;
224
225         if (state->div_force_off) {
226                 dprintk("diversity combination deactivated - forced by COFDM parameters\n");
227                 onoff = 0;
228                 dib7000p_write_word(state, 207, 0);
229         } else
230                 dib7000p_write_word(state, 207, (state->div_sync_wait << 4) | (1 << 2) | (2 << 0));
231
232         state->div_state = (u8) onoff;
233
234         if (onoff) {
235                 dib7000p_write_word(state, 204, 6);
236                 dib7000p_write_word(state, 205, 16);
237                 /* P_dvsy_sync_mode = 0, P_dvsy_sync_enable=1, P_dvcb_comb_mode=2 */
238         } else {
239                 dib7000p_write_word(state, 204, 1);
240                 dib7000p_write_word(state, 205, 0);
241         }
242
243         return 0;
244 }
245
246 static int dib7000p_set_power_mode(struct dib7000p_state *state, enum dib7000p_power_mode mode)
247 {
248         /* by default everything is powered off */
249         u16 reg_774 = 0x3fff, reg_775 = 0xffff, reg_776 = 0x0007, reg_899 = 0x0003, reg_1280 = (0xfe00) | (dib7000p_read_word(state, 1280) & 0x01ff);
250
251         /* now, depending on the requested mode, we power on */
252         switch (mode) {
253                 /* power up everything in the demod */
254         case DIB7000P_POWER_ALL:
255                 reg_774 = 0x0000;
256                 reg_775 = 0x0000;
257                 reg_776 = 0x0;
258                 reg_899 = 0x0;
259                 if (state->version == SOC7090)
260                         reg_1280 &= 0x001f;
261                 else
262                         reg_1280 &= 0x01ff;
263                 break;
264
265         case DIB7000P_POWER_ANALOG_ADC:
266                 /* dem, cfg, iqc, sad, agc */
267                 reg_774 &= ~((1 << 15) | (1 << 14) | (1 << 11) | (1 << 10) | (1 << 9));
268                 /* nud */
269                 reg_776 &= ~((1 << 0));
270                 /* Dout */
271                 if (state->version != SOC7090)
272                         reg_1280 &= ~((1 << 11));
273                 reg_1280 &= ~(1 << 6);
274                 fallthrough;
275         case DIB7000P_POWER_INTERFACE_ONLY:
276                 /* just leave power on the control-interfaces: GPIO and (I2C or SDIO) */
277                 /* TODO power up either SDIO or I2C */
278                 if (state->version == SOC7090)
279                         reg_1280 &= ~((1 << 7) | (1 << 5));
280                 else
281                         reg_1280 &= ~((1 << 14) | (1 << 13) | (1 << 12) | (1 << 10));
282                 break;
283
284 /* TODO following stuff is just converted from the dib7000-driver - check when is used what */
285         }
286
287         dib7000p_write_word(state, 774, reg_774);
288         dib7000p_write_word(state, 775, reg_775);
289         dib7000p_write_word(state, 776, reg_776);
290         dib7000p_write_word(state, 1280, reg_1280);
291         if (state->version != SOC7090)
292                 dib7000p_write_word(state, 899, reg_899);
293
294         return 0;
295 }
296
297 static void dib7000p_set_adc_state(struct dib7000p_state *state, enum dibx000_adc_states no)
298 {
299         u16 reg_908 = 0, reg_909 = 0;
300         u16 reg;
301
302         if (state->version != SOC7090) {
303                 reg_908 = dib7000p_read_word(state, 908);
304                 reg_909 = dib7000p_read_word(state, 909);
305         }
306
307         switch (no) {
308         case DIBX000_SLOW_ADC_ON:
309                 if (state->version == SOC7090) {
310                         reg = dib7000p_read_word(state, 1925);
311
312                         dib7000p_write_word(state, 1925, reg | (1 << 4) | (1 << 2));    /* en_slowAdc = 1 & reset_sladc = 1 */
313
314                         reg = dib7000p_read_word(state, 1925);  /* read access to make it works... strange ... */
315                         msleep(200);
316                         dib7000p_write_word(state, 1925, reg & ~(1 << 4));      /* en_slowAdc = 1 & reset_sladc = 0 */
317
318                         reg = dib7000p_read_word(state, 72) & ~((0x3 << 14) | (0x3 << 12));
319                         dib7000p_write_word(state, 72, reg | (1 << 14) | (3 << 12) | 524);      /* ref = Vin1 => Vbg ; sel = Vin0 or Vin3 ; (Vin2 = Vcm) */
320                 } else {
321                         reg_909 |= (1 << 1) | (1 << 0);
322                         dib7000p_write_word(state, 909, reg_909);
323                         reg_909 &= ~(1 << 1);
324                 }
325                 break;
326
327         case DIBX000_SLOW_ADC_OFF:
328                 if (state->version == SOC7090) {
329                         reg = dib7000p_read_word(state, 1925);
330                         dib7000p_write_word(state, 1925, (reg & ~(1 << 2)) | (1 << 4)); /* reset_sladc = 1 en_slowAdc = 0 */
331                 } else
332                         reg_909 |= (1 << 1) | (1 << 0);
333                 break;
334
335         case DIBX000_ADC_ON:
336                 reg_908 &= 0x0fff;
337                 reg_909 &= 0x0003;
338                 break;
339
340         case DIBX000_ADC_OFF:
341                 reg_908 |= (1 << 14) | (1 << 13) | (1 << 12);
342                 reg_909 |= (1 << 5) | (1 << 4) | (1 << 3) | (1 << 2);
343                 break;
344
345         case DIBX000_VBG_ENABLE:
346                 reg_908 &= ~(1 << 15);
347                 break;
348
349         case DIBX000_VBG_DISABLE:
350                 reg_908 |= (1 << 15);
351                 break;
352
353         default:
354                 break;
355         }
356
357 //      dprintk( "908: %x, 909: %x\n", reg_908, reg_909);
358
359         reg_909 |= (state->cfg.disable_sample_and_hold & 1) << 4;
360         reg_908 |= (state->cfg.enable_current_mirror & 1) << 7;
361
362         if (state->version != SOC7090) {
363                 dib7000p_write_word(state, 908, reg_908);
364                 dib7000p_write_word(state, 909, reg_909);
365         }
366 }
367
368 static int dib7000p_set_bandwidth(struct dib7000p_state *state, u32 bw)
369 {
370         u32 timf;
371
372         // store the current bandwidth for later use
373         state->current_bandwidth = bw;
374
375         if (state->timf == 0) {
376                 dprintk("using default timf\n");
377                 timf = state->cfg.bw->timf;
378         } else {
379                 dprintk("using updated timf\n");
380                 timf = state->timf;
381         }
382
383         timf = timf * (bw / 50) / 160;
384
385         dib7000p_write_word(state, 23, (u16) ((timf >> 16) & 0xffff));
386         dib7000p_write_word(state, 24, (u16) ((timf) & 0xffff));
387
388         return 0;
389 }
390
391 static int dib7000p_sad_calib(struct dib7000p_state *state)
392 {
393 /* internal */
394         dib7000p_write_word(state, 73, (0 << 1) | (0 << 0));
395
396         if (state->version == SOC7090)
397                 dib7000p_write_word(state, 74, 2048);
398         else
399                 dib7000p_write_word(state, 74, 776);
400
401         /* do the calibration */
402         dib7000p_write_word(state, 73, (1 << 0));
403         dib7000p_write_word(state, 73, (0 << 0));
404
405         msleep(1);
406
407         return 0;
408 }
409
410 static int dib7000p_set_wbd_ref(struct dvb_frontend *demod, u16 value)
411 {
412         struct dib7000p_state *state = demod->demodulator_priv;
413         if (value > 4095)
414                 value = 4095;
415         state->wbd_ref = value;
416         return dib7000p_write_word(state, 105, (dib7000p_read_word(state, 105) & 0xf000) | value);
417 }
418
419 static int dib7000p_get_agc_values(struct dvb_frontend *fe,
420                 u16 *agc_global, u16 *agc1, u16 *agc2, u16 *wbd)
421 {
422         struct dib7000p_state *state = fe->demodulator_priv;
423
424         if (agc_global != NULL)
425                 *agc_global = dib7000p_read_word(state, 394);
426         if (agc1 != NULL)
427                 *agc1 = dib7000p_read_word(state, 392);
428         if (agc2 != NULL)
429                 *agc2 = dib7000p_read_word(state, 393);
430         if (wbd != NULL)
431                 *wbd = dib7000p_read_word(state, 397);
432
433         return 0;
434 }
435
436 static int dib7000p_set_agc1_min(struct dvb_frontend *fe, u16 v)
437 {
438         struct dib7000p_state *state = fe->demodulator_priv;
439         return dib7000p_write_word(state, 108,  v);
440 }
441
442 static void dib7000p_reset_pll(struct dib7000p_state *state)
443 {
444         struct dibx000_bandwidth_config *bw = &state->cfg.bw[0];
445         u16 clk_cfg0;
446
447         if (state->version == SOC7090) {
448                 dib7000p_write_word(state, 1856, (!bw->pll_reset << 13) | (bw->pll_range << 12) | (bw->pll_ratio << 6) | (bw->pll_prediv));
449
450                 while (((dib7000p_read_word(state, 1856) >> 15) & 0x1) != 1)
451                         ;
452
453                 dib7000p_write_word(state, 1857, dib7000p_read_word(state, 1857) | (!bw->pll_bypass << 15));
454         } else {
455                 /* force PLL bypass */
456                 clk_cfg0 = (1 << 15) | ((bw->pll_ratio & 0x3f) << 9) |
457                         (bw->modulo << 7) | (bw->ADClkSrc << 6) | (bw->IO_CLK_en_core << 5) | (bw->bypclk_div << 2) | (bw->enable_refdiv << 1) | (0 << 0);
458
459                 dib7000p_write_word(state, 900, clk_cfg0);
460
461                 /* P_pll_cfg */
462                 dib7000p_write_word(state, 903, (bw->pll_prediv << 5) | (((bw->pll_ratio >> 6) & 0x3) << 3) | (bw->pll_range << 1) | bw->pll_reset);
463                 clk_cfg0 = (bw->pll_bypass << 15) | (clk_cfg0 & 0x7fff);
464                 dib7000p_write_word(state, 900, clk_cfg0);
465         }
466
467         dib7000p_write_word(state, 18, (u16) (((bw->internal * 1000) >> 16) & 0xffff));
468         dib7000p_write_word(state, 19, (u16) ((bw->internal * 1000) & 0xffff));
469         dib7000p_write_word(state, 21, (u16) ((bw->ifreq >> 16) & 0xffff));
470         dib7000p_write_word(state, 22, (u16) ((bw->ifreq) & 0xffff));
471
472         dib7000p_write_word(state, 72, bw->sad_cfg);
473 }
474
475 static u32 dib7000p_get_internal_freq(struct dib7000p_state *state)
476 {
477         u32 internal = (u32) dib7000p_read_word(state, 18) << 16;
478         internal |= (u32) dib7000p_read_word(state, 19);
479         internal /= 1000;
480
481         return internal;
482 }
483
484 static int dib7000p_update_pll(struct dvb_frontend *fe, struct dibx000_bandwidth_config *bw)
485 {
486         struct dib7000p_state *state = fe->demodulator_priv;
487         u16 reg_1857, reg_1856 = dib7000p_read_word(state, 1856);
488         u8 loopdiv, prediv;
489         u32 internal, xtal;
490
491         /* get back old values */
492         prediv = reg_1856 & 0x3f;
493         loopdiv = (reg_1856 >> 6) & 0x3f;
494
495         if (loopdiv && bw && (bw->pll_prediv != prediv || bw->pll_ratio != loopdiv)) {
496                 dprintk("Updating pll (prediv: old =  %d new = %d ; loopdiv : old = %d new = %d)\n", prediv, bw->pll_prediv, loopdiv, bw->pll_ratio);
497                 reg_1856 &= 0xf000;
498                 reg_1857 = dib7000p_read_word(state, 1857);
499                 dib7000p_write_word(state, 1857, reg_1857 & ~(1 << 15));
500
501                 dib7000p_write_word(state, 1856, reg_1856 | ((bw->pll_ratio & 0x3f) << 6) | (bw->pll_prediv & 0x3f));
502
503                 /* write new system clk into P_sec_len */
504                 internal = dib7000p_get_internal_freq(state);
505                 xtal = (internal / loopdiv) * prediv;
506                 internal = 1000 * (xtal / bw->pll_prediv) * bw->pll_ratio;      /* new internal */
507                 dib7000p_write_word(state, 18, (u16) ((internal >> 16) & 0xffff));
508                 dib7000p_write_word(state, 19, (u16) (internal & 0xffff));
509
510                 dib7000p_write_word(state, 1857, reg_1857 | (1 << 15));
511
512                 while (((dib7000p_read_word(state, 1856) >> 15) & 0x1) != 1)
513                         dprintk("Waiting for PLL to lock\n");
514
515                 return 0;
516         }
517         return -EIO;
518 }
519
520 static int dib7000p_reset_gpio(struct dib7000p_state *st)
521 {
522         /* reset the GPIOs */
523         dprintk("gpio dir: %x: val: %x, pwm_pos: %x\n", st->gpio_dir, st->gpio_val, st->cfg.gpio_pwm_pos);
524
525         dib7000p_write_word(st, 1029, st->gpio_dir);
526         dib7000p_write_word(st, 1030, st->gpio_val);
527
528         /* TODO 1031 is P_gpio_od */
529
530         dib7000p_write_word(st, 1032, st->cfg.gpio_pwm_pos);
531
532         dib7000p_write_word(st, 1037, st->cfg.pwm_freq_div);
533         return 0;
534 }
535
536 static int dib7000p_cfg_gpio(struct dib7000p_state *st, u8 num, u8 dir, u8 val)
537 {
538         st->gpio_dir = dib7000p_read_word(st, 1029);
539         st->gpio_dir &= ~(1 << num);    /* reset the direction bit */
540         st->gpio_dir |= (dir & 0x1) << num;     /* set the new direction */
541         dib7000p_write_word(st, 1029, st->gpio_dir);
542
543         st->gpio_val = dib7000p_read_word(st, 1030);
544         st->gpio_val &= ~(1 << num);    /* reset the direction bit */
545         st->gpio_val |= (val & 0x01) << num;    /* set the new value */
546         dib7000p_write_word(st, 1030, st->gpio_val);
547
548         return 0;
549 }
550
551 static int dib7000p_set_gpio(struct dvb_frontend *demod, u8 num, u8 dir, u8 val)
552 {
553         struct dib7000p_state *state = demod->demodulator_priv;
554         return dib7000p_cfg_gpio(state, num, dir, val);
555 }
556
557 static u16 dib7000p_defaults[] = {
558         // auto search configuration
559         3, 2,
560         0x0004,
561         (1<<3)|(1<<11)|(1<<12)|(1<<13),
562         0x0814,                 /* Equal Lock */
563
564         12, 6,
565         0x001b,
566         0x7740,
567         0x005b,
568         0x8d80,
569         0x01c9,
570         0xc380,
571         0x0000,
572         0x0080,
573         0x0000,
574         0x0090,
575         0x0001,
576         0xd4c0,
577
578         1, 26,
579         0x6680,
580
581         /* set ADC level to -16 */
582         11, 79,
583         (1 << 13) - 825 - 117,
584         (1 << 13) - 837 - 117,
585         (1 << 13) - 811 - 117,
586         (1 << 13) - 766 - 117,
587         (1 << 13) - 737 - 117,
588         (1 << 13) - 693 - 117,
589         (1 << 13) - 648 - 117,
590         (1 << 13) - 619 - 117,
591         (1 << 13) - 575 - 117,
592         (1 << 13) - 531 - 117,
593         (1 << 13) - 501 - 117,
594
595         1, 142,
596         0x0410,
597
598         /* disable power smoothing */
599         8, 145,
600         0,
601         0,
602         0,
603         0,
604         0,
605         0,
606         0,
607         0,
608
609         1, 154,
610         1 << 13,
611
612         1, 168,
613         0x0ccd,
614
615         1, 183,
616         0x200f,
617
618         1, 212,
619                 0x169,
620
621         5, 187,
622         0x023d,
623         0x00a4,
624         0x00a4,
625         0x7ff0,
626         0x3ccc,
627
628         1, 198,
629         0x800,
630
631         1, 222,
632         0x0010,
633
634         1, 235,
635         0x0062,
636
637         0,
638 };
639
640 static void dib7000p_reset_stats(struct dvb_frontend *fe);
641
642 static int dib7000p_demod_reset(struct dib7000p_state *state)
643 {
644         dib7000p_set_power_mode(state, DIB7000P_POWER_ALL);
645
646         if (state->version == SOC7090)
647                 dibx000_reset_i2c_master(&state->i2c_master);
648
649         dib7000p_set_adc_state(state, DIBX000_VBG_ENABLE);
650
651         /* restart all parts */
652         dib7000p_write_word(state, 770, 0xffff);
653         dib7000p_write_word(state, 771, 0xffff);
654         dib7000p_write_word(state, 772, 0x001f);
655         dib7000p_write_word(state, 1280, 0x001f - ((1 << 4) | (1 << 3)));
656
657         dib7000p_write_word(state, 770, 0);
658         dib7000p_write_word(state, 771, 0);
659         dib7000p_write_word(state, 772, 0);
660         dib7000p_write_word(state, 1280, 0);
661
662         if (state->version != SOC7090) {
663                 dib7000p_write_word(state,  898, 0x0003);
664                 dib7000p_write_word(state,  898, 0);
665         }
666
667         /* default */
668         dib7000p_reset_pll(state);
669
670         if (dib7000p_reset_gpio(state) != 0)
671                 dprintk("GPIO reset was not successful.\n");
672
673         if (state->version == SOC7090) {
674                 dib7000p_write_word(state, 899, 0);
675
676                 /* impulse noise */
677                 dib7000p_write_word(state, 42, (1<<5) | 3); /* P_iqc_thsat_ipc = 1 ; P_iqc_win2 = 3 */
678                 dib7000p_write_word(state, 43, 0x2d4); /*-300 fag P_iqc_dect_min = -280 */
679                 dib7000p_write_word(state, 44, 300); /* 300 fag P_iqc_dect_min = +280 */
680                 dib7000p_write_word(state, 273, (0<<6) | 30);
681         }
682         if (dib7000p_set_output_mode(state, OUTMODE_HIGH_Z) != 0)
683                 dprintk("OUTPUT_MODE could not be reset.\n");
684
685         dib7000p_set_adc_state(state, DIBX000_SLOW_ADC_ON);
686         dib7000p_sad_calib(state);
687         dib7000p_set_adc_state(state, DIBX000_SLOW_ADC_OFF);
688
689         /* unforce divstr regardless whether i2c enumeration was done or not */
690         dib7000p_write_word(state, 1285, dib7000p_read_word(state, 1285) & ~(1 << 1));
691
692         dib7000p_set_bandwidth(state, 8000);
693
694         if (state->version == SOC7090) {
695                 dib7000p_write_word(state, 36, 0x0755);/* P_iqc_impnc_on =1 & P_iqc_corr_inh = 1 for impulsive noise */
696         } else {
697                 if (state->cfg.tuner_is_baseband)
698                         dib7000p_write_word(state, 36, 0x0755);
699                 else
700                         dib7000p_write_word(state, 36, 0x1f55);
701         }
702
703         dib7000p_write_tab(state, dib7000p_defaults);
704         if (state->version != SOC7090) {
705                 dib7000p_write_word(state, 901, 0x0006);
706                 dib7000p_write_word(state, 902, (3 << 10) | (1 << 6));
707                 dib7000p_write_word(state, 905, 0x2c8e);
708         }
709
710         dib7000p_set_power_mode(state, DIB7000P_POWER_INTERFACE_ONLY);
711
712         return 0;
713 }
714
715 static void dib7000p_pll_clk_cfg(struct dib7000p_state *state)
716 {
717         u16 tmp = 0;
718         tmp = dib7000p_read_word(state, 903);
719         dib7000p_write_word(state, 903, (tmp | 0x1));
720         tmp = dib7000p_read_word(state, 900);
721         dib7000p_write_word(state, 900, (tmp & 0x7fff) | (1 << 6));
722 }
723
724 static void dib7000p_restart_agc(struct dib7000p_state *state)
725 {
726         // P_restart_iqc & P_restart_agc
727         dib7000p_write_word(state, 770, (1 << 11) | (1 << 9));
728         dib7000p_write_word(state, 770, 0x0000);
729 }
730
731 static int dib7000p_update_lna(struct dib7000p_state *state)
732 {
733         u16 dyn_gain;
734
735         if (state->cfg.update_lna) {
736                 dyn_gain = dib7000p_read_word(state, 394);
737                 if (state->cfg.update_lna(&state->demod, dyn_gain)) {
738                         dib7000p_restart_agc(state);
739                         return 1;
740                 }
741         }
742
743         return 0;
744 }
745
746 static int dib7000p_set_agc_config(struct dib7000p_state *state, u8 band)
747 {
748         struct dibx000_agc_config *agc = NULL;
749         int i;
750         if (state->current_band == band && state->current_agc != NULL)
751                 return 0;
752         state->current_band = band;
753
754         for (i = 0; i < state->cfg.agc_config_count; i++)
755                 if (state->cfg.agc[i].band_caps & band) {
756                         agc = &state->cfg.agc[i];
757                         break;
758                 }
759
760         if (agc == NULL) {
761                 dprintk("no valid AGC configuration found for band 0x%02x\n", band);
762                 return -EINVAL;
763         }
764
765         state->current_agc = agc;
766
767         /* AGC */
768         dib7000p_write_word(state, 75, agc->setup);
769         dib7000p_write_word(state, 76, agc->inv_gain);
770         dib7000p_write_word(state, 77, agc->time_stabiliz);
771         dib7000p_write_word(state, 100, (agc->alpha_level << 12) | agc->thlock);
772
773         // Demod AGC loop configuration
774         dib7000p_write_word(state, 101, (agc->alpha_mant << 5) | agc->alpha_exp);
775         dib7000p_write_word(state, 102, (agc->beta_mant << 6) | agc->beta_exp);
776
777         /* AGC continued */
778         dprintk("WBD: ref: %d, sel: %d, active: %d, alpha: %d\n",
779                 state->wbd_ref != 0 ? state->wbd_ref : agc->wbd_ref, agc->wbd_sel, !agc->perform_agc_softsplit, agc->wbd_sel);
780
781         if (state->wbd_ref != 0)
782                 dib7000p_write_word(state, 105, (agc->wbd_inv << 12) | state->wbd_ref);
783         else
784                 dib7000p_write_word(state, 105, (agc->wbd_inv << 12) | agc->wbd_ref);
785
786         dib7000p_write_word(state, 106, (agc->wbd_sel << 13) | (agc->wbd_alpha << 9) | (agc->perform_agc_softsplit << 8));
787
788         dib7000p_write_word(state, 107, agc->agc1_max);
789         dib7000p_write_word(state, 108, agc->agc1_min);
790         dib7000p_write_word(state, 109, agc->agc2_max);
791         dib7000p_write_word(state, 110, agc->agc2_min);
792         dib7000p_write_word(state, 111, (agc->agc1_pt1 << 8) | agc->agc1_pt2);
793         dib7000p_write_word(state, 112, agc->agc1_pt3);
794         dib7000p_write_word(state, 113, (agc->agc1_slope1 << 8) | agc->agc1_slope2);
795         dib7000p_write_word(state, 114, (agc->agc2_pt1 << 8) | agc->agc2_pt2);
796         dib7000p_write_word(state, 115, (agc->agc2_slope1 << 8) | agc->agc2_slope2);
797         return 0;
798 }
799
800 static int dib7000p_set_dds(struct dib7000p_state *state, s32 offset_khz)
801 {
802         u32 internal = dib7000p_get_internal_freq(state);
803         s32 unit_khz_dds_val;
804         u32 abs_offset_khz = abs(offset_khz);
805         u32 dds = state->cfg.bw->ifreq & 0x1ffffff;
806         u8 invert = !!(state->cfg.bw->ifreq & (1 << 25));
807         if (internal == 0) {
808                 pr_warn("DIB7000P: dib7000p_get_internal_freq returned 0\n");
809                 return -1;
810         }
811         /* 2**26 / Fsampling is the unit 1KHz offset */
812         unit_khz_dds_val = 67108864 / (internal);
813
814         dprintk("setting a frequency offset of %dkHz internal freq = %d invert = %d\n", offset_khz, internal, invert);
815
816         if (offset_khz < 0)
817                 unit_khz_dds_val *= -1;
818
819         /* IF tuner */
820         if (invert)
821                 dds -= (abs_offset_khz * unit_khz_dds_val);     /* /100 because of /100 on the unit_khz_dds_val line calc for better accuracy */
822         else
823                 dds += (abs_offset_khz * unit_khz_dds_val);
824
825         if (abs_offset_khz <= (internal / 2)) { /* Max dds offset is the half of the demod freq */
826                 dib7000p_write_word(state, 21, (u16) (((dds >> 16) & 0x1ff) | (0 << 10) | (invert << 9)));
827                 dib7000p_write_word(state, 22, (u16) (dds & 0xffff));
828         }
829         return 0;
830 }
831
832 static int dib7000p_agc_startup(struct dvb_frontend *demod)
833 {
834         struct dtv_frontend_properties *ch = &demod->dtv_property_cache;
835         struct dib7000p_state *state = demod->demodulator_priv;
836         int ret = -1;
837         u8 *agc_state = &state->agc_state;
838         u8 agc_split;
839         u16 reg;
840         u32 upd_demod_gain_period = 0x1000;
841         s32 frequency_offset = 0;
842
843         switch (state->agc_state) {
844         case 0:
845                 dib7000p_set_power_mode(state, DIB7000P_POWER_ALL);
846                 if (state->version == SOC7090) {
847                         reg = dib7000p_read_word(state, 0x79b) & 0xff00;
848                         dib7000p_write_word(state, 0x79a, upd_demod_gain_period & 0xFFFF);      /* lsb */
849                         dib7000p_write_word(state, 0x79b, reg | (1 << 14) | ((upd_demod_gain_period >> 16) & 0xFF));
850
851                         /* enable adc i & q */
852                         reg = dib7000p_read_word(state, 0x780);
853                         dib7000p_write_word(state, 0x780, (reg | (0x3)) & (~(1 << 7)));
854                 } else {
855                         dib7000p_set_adc_state(state, DIBX000_ADC_ON);
856                         dib7000p_pll_clk_cfg(state);
857                 }
858
859                 if (dib7000p_set_agc_config(state, BAND_OF_FREQUENCY(ch->frequency / 1000)) != 0)
860                         return -1;
861
862                 if (demod->ops.tuner_ops.get_frequency) {
863                         u32 frequency_tuner;
864
865                         demod->ops.tuner_ops.get_frequency(demod, &frequency_tuner);
866                         frequency_offset = (s32)frequency_tuner / 1000 - ch->frequency / 1000;
867                 }
868
869                 if (dib7000p_set_dds(state, frequency_offset) < 0)
870                         return -1;
871
872                 ret = 7;
873                 (*agc_state)++;
874                 break;
875
876         case 1:
877                 if (state->cfg.agc_control)
878                         state->cfg.agc_control(&state->demod, 1);
879
880                 dib7000p_write_word(state, 78, 32768);
881                 if (!state->current_agc->perform_agc_softsplit) {
882                         /* we are using the wbd - so slow AGC startup */
883                         /* force 0 split on WBD and restart AGC */
884                         dib7000p_write_word(state, 106, (state->current_agc->wbd_sel << 13) | (state->current_agc->wbd_alpha << 9) | (1 << 8));
885                         (*agc_state)++;
886                         ret = 5;
887                 } else {
888                         /* default AGC startup */
889                         (*agc_state) = 4;
890                         /* wait AGC rough lock time */
891                         ret = 7;
892                 }
893
894                 dib7000p_restart_agc(state);
895                 break;
896
897         case 2:         /* fast split search path after 5sec */
898                 dib7000p_write_word(state, 75, state->current_agc->setup | (1 << 4));   /* freeze AGC loop */
899                 dib7000p_write_word(state, 106, (state->current_agc->wbd_sel << 13) | (2 << 9) | (0 << 8));     /* fast split search 0.25kHz */
900                 (*agc_state)++;
901                 ret = 14;
902                 break;
903
904         case 3:         /* split search ended */
905                 agc_split = (u8) dib7000p_read_word(state, 396);        /* store the split value for the next time */
906                 dib7000p_write_word(state, 78, dib7000p_read_word(state, 394)); /* set AGC gain start value */
907
908                 dib7000p_write_word(state, 75, state->current_agc->setup);      /* std AGC loop */
909                 dib7000p_write_word(state, 106, (state->current_agc->wbd_sel << 13) | (state->current_agc->wbd_alpha << 9) | agc_split);        /* standard split search */
910
911                 dib7000p_restart_agc(state);
912
913                 dprintk("SPLIT %p: %u\n", demod, agc_split);
914
915                 (*agc_state)++;
916                 ret = 5;
917                 break;
918
919         case 4:         /* LNA startup */
920                 ret = 7;
921
922                 if (dib7000p_update_lna(state))
923                         ret = 5;
924                 else
925                         (*agc_state)++;
926                 break;
927
928         case 5:
929                 if (state->cfg.agc_control)
930                         state->cfg.agc_control(&state->demod, 0);
931                 (*agc_state)++;
932                 break;
933         default:
934                 break;
935         }
936         return ret;
937 }
938
939 static void dib7000p_update_timf(struct dib7000p_state *state)
940 {
941         u32 timf = (dib7000p_read_word(state, 427) << 16) | dib7000p_read_word(state, 428);
942         state->timf = timf * 160 / (state->current_bandwidth / 50);
943         dib7000p_write_word(state, 23, (u16) (timf >> 16));
944         dib7000p_write_word(state, 24, (u16) (timf & 0xffff));
945         dprintk("updated timf_frequency: %d (default: %d)\n", state->timf, state->cfg.bw->timf);
946
947 }
948
949 static u32 dib7000p_ctrl_timf(struct dvb_frontend *fe, u8 op, u32 timf)
950 {
951         struct dib7000p_state *state = fe->demodulator_priv;
952         switch (op) {
953         case DEMOD_TIMF_SET:
954                 state->timf = timf;
955                 break;
956         case DEMOD_TIMF_UPDATE:
957                 dib7000p_update_timf(state);
958                 break;
959         case DEMOD_TIMF_GET:
960                 break;
961         }
962         dib7000p_set_bandwidth(state, state->current_bandwidth);
963         return state->timf;
964 }
965
966 static void dib7000p_set_channel(struct dib7000p_state *state,
967                                  struct dtv_frontend_properties *ch, u8 seq)
968 {
969         u16 value, est[4];
970
971         dib7000p_set_bandwidth(state, BANDWIDTH_TO_KHZ(ch->bandwidth_hz));
972
973         /* nfft, guard, qam, alpha */
974         value = 0;
975         switch (ch->transmission_mode) {
976         case TRANSMISSION_MODE_2K:
977                 value |= (0 << 7);
978                 break;
979         case TRANSMISSION_MODE_4K:
980                 value |= (2 << 7);
981                 break;
982         default:
983         case TRANSMISSION_MODE_8K:
984                 value |= (1 << 7);
985                 break;
986         }
987         switch (ch->guard_interval) {
988         case GUARD_INTERVAL_1_32:
989                 value |= (0 << 5);
990                 break;
991         case GUARD_INTERVAL_1_16:
992                 value |= (1 << 5);
993                 break;
994         case GUARD_INTERVAL_1_4:
995                 value |= (3 << 5);
996                 break;
997         default:
998         case GUARD_INTERVAL_1_8:
999                 value |= (2 << 5);
1000                 break;
1001         }
1002         switch (ch->modulation) {
1003         case QPSK:
1004                 value |= (0 << 3);
1005                 break;
1006         case QAM_16:
1007                 value |= (1 << 3);
1008                 break;
1009         default:
1010         case QAM_64:
1011                 value |= (2 << 3);
1012                 break;
1013         }
1014         switch (HIERARCHY_1) {
1015         case HIERARCHY_2:
1016                 value |= 2;
1017                 break;
1018         case HIERARCHY_4:
1019                 value |= 4;
1020                 break;
1021         default:
1022         case HIERARCHY_1:
1023                 value |= 1;
1024                 break;
1025         }
1026         dib7000p_write_word(state, 0, value);
1027         dib7000p_write_word(state, 5, (seq << 4) | 1);  /* do not force tps, search list 0 */
1028
1029         /* P_dintl_native, P_dintlv_inv, P_hrch, P_code_rate, P_select_hp */
1030         value = 0;
1031         if (1 != 0)
1032                 value |= (1 << 6);
1033         if (ch->hierarchy == 1)
1034                 value |= (1 << 4);
1035         if (1 == 1)
1036                 value |= 1;
1037         switch ((ch->hierarchy == 0 || 1 == 1) ? ch->code_rate_HP : ch->code_rate_LP) {
1038         case FEC_2_3:
1039                 value |= (2 << 1);
1040                 break;
1041         case FEC_3_4:
1042                 value |= (3 << 1);
1043                 break;
1044         case FEC_5_6:
1045                 value |= (5 << 1);
1046                 break;
1047         case FEC_7_8:
1048                 value |= (7 << 1);
1049                 break;
1050         default:
1051         case FEC_1_2:
1052                 value |= (1 << 1);
1053                 break;
1054         }
1055         dib7000p_write_word(state, 208, value);
1056
1057         /* offset loop parameters */
1058         dib7000p_write_word(state, 26, 0x6680);
1059         dib7000p_write_word(state, 32, 0x0003);
1060         dib7000p_write_word(state, 29, 0x1273);
1061         dib7000p_write_word(state, 33, 0x0005);
1062
1063         /* P_dvsy_sync_wait */
1064         switch (ch->transmission_mode) {
1065         case TRANSMISSION_MODE_8K:
1066                 value = 256;
1067                 break;
1068         case TRANSMISSION_MODE_4K:
1069                 value = 128;
1070                 break;
1071         case TRANSMISSION_MODE_2K:
1072         default:
1073                 value = 64;
1074                 break;
1075         }
1076         switch (ch->guard_interval) {
1077         case GUARD_INTERVAL_1_16:
1078                 value *= 2;
1079                 break;
1080         case GUARD_INTERVAL_1_8:
1081                 value *= 4;
1082                 break;
1083         case GUARD_INTERVAL_1_4:
1084                 value *= 8;
1085                 break;
1086         default:
1087         case GUARD_INTERVAL_1_32:
1088                 value *= 1;
1089                 break;
1090         }
1091         if (state->cfg.diversity_delay == 0)
1092                 state->div_sync_wait = (value * 3) / 2 + 48;
1093         else
1094                 state->div_sync_wait = (value * 3) / 2 + state->cfg.diversity_delay;
1095
1096         /* deactivate the possibility of diversity reception if extended interleaver */
1097         state->div_force_off = !1 && ch->transmission_mode != TRANSMISSION_MODE_8K;
1098         dib7000p_set_diversity_in(&state->demod, state->div_state);
1099
1100         /* channel estimation fine configuration */
1101         switch (ch->modulation) {
1102         case QAM_64:
1103                 est[0] = 0x0148;        /* P_adp_regul_cnt 0.04 */
1104                 est[1] = 0xfff0;        /* P_adp_noise_cnt -0.002 */
1105                 est[2] = 0x00a4;        /* P_adp_regul_ext 0.02 */
1106                 est[3] = 0xfff8;        /* P_adp_noise_ext -0.001 */
1107                 break;
1108         case QAM_16:
1109                 est[0] = 0x023d;        /* P_adp_regul_cnt 0.07 */
1110                 est[1] = 0xffdf;        /* P_adp_noise_cnt -0.004 */
1111                 est[2] = 0x00a4;        /* P_adp_regul_ext 0.02 */
1112                 est[3] = 0xfff0;        /* P_adp_noise_ext -0.002 */
1113                 break;
1114         default:
1115                 est[0] = 0x099a;        /* P_adp_regul_cnt 0.3 */
1116                 est[1] = 0xffae;        /* P_adp_noise_cnt -0.01 */
1117                 est[2] = 0x0333;        /* P_adp_regul_ext 0.1 */
1118                 est[3] = 0xfff8;        /* P_adp_noise_ext -0.002 */
1119                 break;
1120         }
1121         for (value = 0; value < 4; value++)
1122                 dib7000p_write_word(state, 187 + value, est[value]);
1123 }
1124
1125 static int dib7000p_autosearch_start(struct dvb_frontend *demod)
1126 {
1127         struct dtv_frontend_properties *ch = &demod->dtv_property_cache;
1128         struct dib7000p_state *state = demod->demodulator_priv;
1129         struct dtv_frontend_properties schan;
1130         u32 value, factor;
1131         u32 internal = dib7000p_get_internal_freq(state);
1132
1133         schan = *ch;
1134         schan.modulation = QAM_64;
1135         schan.guard_interval = GUARD_INTERVAL_1_32;
1136         schan.transmission_mode = TRANSMISSION_MODE_8K;
1137         schan.code_rate_HP = FEC_2_3;
1138         schan.code_rate_LP = FEC_3_4;
1139         schan.hierarchy = 0;
1140
1141         dib7000p_set_channel(state, &schan, 7);
1142
1143         factor = BANDWIDTH_TO_KHZ(ch->bandwidth_hz);
1144         if (factor >= 5000) {
1145                 if (state->version == SOC7090)
1146                         factor = 2;
1147                 else
1148                         factor = 1;
1149         } else
1150                 factor = 6;
1151
1152         value = 30 * internal * factor;
1153         dib7000p_write_word(state, 6, (u16) ((value >> 16) & 0xffff));
1154         dib7000p_write_word(state, 7, (u16) (value & 0xffff));
1155         value = 100 * internal * factor;
1156         dib7000p_write_word(state, 8, (u16) ((value >> 16) & 0xffff));
1157         dib7000p_write_word(state, 9, (u16) (value & 0xffff));
1158         value = 500 * internal * factor;
1159         dib7000p_write_word(state, 10, (u16) ((value >> 16) & 0xffff));
1160         dib7000p_write_word(state, 11, (u16) (value & 0xffff));
1161
1162         value = dib7000p_read_word(state, 0);
1163         dib7000p_write_word(state, 0, (u16) ((1 << 9) | value));
1164         dib7000p_read_word(state, 1284);
1165         dib7000p_write_word(state, 0, (u16) value);
1166
1167         return 0;
1168 }
1169
1170 static int dib7000p_autosearch_is_irq(struct dvb_frontend *demod)
1171 {
1172         struct dib7000p_state *state = demod->demodulator_priv;
1173         u16 irq_pending = dib7000p_read_word(state, 1284);
1174
1175         if (irq_pending & 0x1)
1176                 return 1;
1177
1178         if (irq_pending & 0x2)
1179                 return 2;
1180
1181         return 0;
1182 }
1183
1184 static void dib7000p_spur_protect(struct dib7000p_state *state, u32 rf_khz, u32 bw)
1185 {
1186         static const s16 notch[] = { 16143, 14402, 12238, 9713, 6902, 3888, 759, -2392 };
1187         static const u8 sine[] = { 0, 2, 3, 5, 6, 8, 9, 11, 13, 14, 16, 17, 19, 20, 22,
1188                 24, 25, 27, 28, 30, 31, 33, 34, 36, 38, 39, 41, 42, 44, 45, 47, 48, 50, 51,
1189                 53, 55, 56, 58, 59, 61, 62, 64, 65, 67, 68, 70, 71, 73, 74, 76, 77, 79, 80,
1190                 82, 83, 85, 86, 88, 89, 91, 92, 94, 95, 97, 98, 99, 101, 102, 104, 105,
1191                 107, 108, 109, 111, 112, 114, 115, 117, 118, 119, 121, 122, 123, 125, 126,
1192                 128, 129, 130, 132, 133, 134, 136, 137, 138, 140, 141, 142, 144, 145, 146,
1193                 147, 149, 150, 151, 152, 154, 155, 156, 157, 159, 160, 161, 162, 164, 165,
1194                 166, 167, 168, 170, 171, 172, 173, 174, 175, 177, 178, 179, 180, 181, 182,
1195                 183, 184, 185, 186, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198,
1196                 199, 200, 201, 202, 203, 204, 205, 206, 207, 207, 208, 209, 210, 211, 212,
1197                 213, 214, 215, 215, 216, 217, 218, 219, 220, 220, 221, 222, 223, 224, 224,
1198                 225, 226, 227, 227, 228, 229, 229, 230, 231, 231, 232, 233, 233, 234, 235,
1199                 235, 236, 237, 237, 238, 238, 239, 239, 240, 241, 241, 242, 242, 243, 243,
1200                 244, 244, 245, 245, 245, 246, 246, 247, 247, 248, 248, 248, 249, 249, 249,
1201                 250, 250, 250, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 254,
1202                 254, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
1203                 255, 255, 255, 255, 255, 255
1204         };
1205
1206         u32 xtal = state->cfg.bw->xtal_hz / 1000;
1207         int f_rel = DIV_ROUND_CLOSEST(rf_khz, xtal) * xtal - rf_khz;
1208         int k;
1209         int coef_re[8], coef_im[8];
1210         int bw_khz = bw;
1211         u32 pha;
1212
1213         dprintk("relative position of the Spur: %dk (RF: %dk, XTAL: %dk)\n", f_rel, rf_khz, xtal);
1214
1215         if (f_rel < -bw_khz / 2 || f_rel > bw_khz / 2)
1216                 return;
1217
1218         bw_khz /= 100;
1219
1220         dib7000p_write_word(state, 142, 0x0610);
1221
1222         for (k = 0; k < 8; k++) {
1223                 pha = ((f_rel * (k + 1) * 112 * 80 / bw_khz) / 1000) & 0x3ff;
1224
1225                 if (pha == 0) {
1226                         coef_re[k] = 256;
1227                         coef_im[k] = 0;
1228                 } else if (pha < 256) {
1229                         coef_re[k] = sine[256 - (pha & 0xff)];
1230                         coef_im[k] = sine[pha & 0xff];
1231                 } else if (pha == 256) {
1232                         coef_re[k] = 0;
1233                         coef_im[k] = 256;
1234                 } else if (pha < 512) {
1235                         coef_re[k] = -sine[pha & 0xff];
1236                         coef_im[k] = sine[256 - (pha & 0xff)];
1237                 } else if (pha == 512) {
1238                         coef_re[k] = -256;
1239                         coef_im[k] = 0;
1240                 } else if (pha < 768) {
1241                         coef_re[k] = -sine[256 - (pha & 0xff)];
1242                         coef_im[k] = -sine[pha & 0xff];
1243                 } else if (pha == 768) {
1244                         coef_re[k] = 0;
1245                         coef_im[k] = -256;
1246                 } else {
1247                         coef_re[k] = sine[pha & 0xff];
1248                         coef_im[k] = -sine[256 - (pha & 0xff)];
1249                 }
1250
1251                 coef_re[k] *= notch[k];
1252                 coef_re[k] += (1 << 14);
1253                 if (coef_re[k] >= (1 << 24))
1254                         coef_re[k] = (1 << 24) - 1;
1255                 coef_re[k] /= (1 << 15);
1256
1257                 coef_im[k] *= notch[k];
1258                 coef_im[k] += (1 << 14);
1259                 if (coef_im[k] >= (1 << 24))
1260                         coef_im[k] = (1 << 24) - 1;
1261                 coef_im[k] /= (1 << 15);
1262
1263                 dprintk("PALF COEF: %d re: %d im: %d\n", k, coef_re[k], coef_im[k]);
1264
1265                 dib7000p_write_word(state, 143, (0 << 14) | (k << 10) | (coef_re[k] & 0x3ff));
1266                 dib7000p_write_word(state, 144, coef_im[k] & 0x3ff);
1267                 dib7000p_write_word(state, 143, (1 << 14) | (k << 10) | (coef_re[k] & 0x3ff));
1268         }
1269         dib7000p_write_word(state, 143, 0);
1270 }
1271
1272 static int dib7000p_tune(struct dvb_frontend *demod)
1273 {
1274         struct dtv_frontend_properties *ch = &demod->dtv_property_cache;
1275         struct dib7000p_state *state = demod->demodulator_priv;
1276         u16 tmp = 0;
1277
1278         if (ch != NULL)
1279                 dib7000p_set_channel(state, ch, 0);
1280         else
1281                 return -EINVAL;
1282
1283         // restart demod
1284         dib7000p_write_word(state, 770, 0x4000);
1285         dib7000p_write_word(state, 770, 0x0000);
1286         msleep(45);
1287
1288         /* P_ctrl_inh_cor=0, P_ctrl_alpha_cor=4, P_ctrl_inh_isi=0, P_ctrl_alpha_isi=3, P_ctrl_inh_cor4=1, P_ctrl_alpha_cor4=3 */
1289         tmp = (0 << 14) | (4 << 10) | (0 << 9) | (3 << 5) | (1 << 4) | (0x3);
1290         if (state->sfn_workaround_active) {
1291                 dprintk("SFN workaround is active\n");
1292                 tmp |= (1 << 9);
1293                 dib7000p_write_word(state, 166, 0x4000);
1294         } else {
1295                 dib7000p_write_word(state, 166, 0x0000);
1296         }
1297         dib7000p_write_word(state, 29, tmp);
1298
1299         // never achieved a lock with that bandwidth so far - wait for osc-freq to update
1300         if (state->timf == 0)
1301                 msleep(200);
1302
1303         /* offset loop parameters */
1304
1305         /* P_timf_alpha, P_corm_alpha=6, P_corm_thres=0x80 */
1306         tmp = (6 << 8) | 0x80;
1307         switch (ch->transmission_mode) {
1308         case TRANSMISSION_MODE_2K:
1309                 tmp |= (2 << 12);
1310                 break;
1311         case TRANSMISSION_MODE_4K:
1312                 tmp |= (3 << 12);
1313                 break;
1314         default:
1315         case TRANSMISSION_MODE_8K:
1316                 tmp |= (4 << 12);
1317                 break;
1318         }
1319         dib7000p_write_word(state, 26, tmp);    /* timf_a(6xxx) */
1320
1321         /* P_ctrl_freeze_pha_shift=0, P_ctrl_pha_off_max */
1322         tmp = (0 << 4);
1323         switch (ch->transmission_mode) {
1324         case TRANSMISSION_MODE_2K:
1325                 tmp |= 0x6;
1326                 break;
1327         case TRANSMISSION_MODE_4K:
1328                 tmp |= 0x7;
1329                 break;
1330         default:
1331         case TRANSMISSION_MODE_8K:
1332                 tmp |= 0x8;
1333                 break;
1334         }
1335         dib7000p_write_word(state, 32, tmp);
1336
1337         /* P_ctrl_sfreq_inh=0, P_ctrl_sfreq_step */
1338         tmp = (0 << 4);
1339         switch (ch->transmission_mode) {
1340         case TRANSMISSION_MODE_2K:
1341                 tmp |= 0x6;
1342                 break;
1343         case TRANSMISSION_MODE_4K:
1344                 tmp |= 0x7;
1345                 break;
1346         default:
1347         case TRANSMISSION_MODE_8K:
1348                 tmp |= 0x8;
1349                 break;
1350         }
1351         dib7000p_write_word(state, 33, tmp);
1352
1353         tmp = dib7000p_read_word(state, 509);
1354         if (!((tmp >> 6) & 0x1)) {
1355                 /* restart the fec */
1356                 tmp = dib7000p_read_word(state, 771);
1357                 dib7000p_write_word(state, 771, tmp | (1 << 1));
1358                 dib7000p_write_word(state, 771, tmp);
1359                 msleep(40);
1360                 tmp = dib7000p_read_word(state, 509);
1361         }
1362         // we achieved a lock - it's time to update the osc freq
1363         if ((tmp >> 6) & 0x1) {
1364                 dib7000p_update_timf(state);
1365                 /* P_timf_alpha += 2 */
1366                 tmp = dib7000p_read_word(state, 26);
1367                 dib7000p_write_word(state, 26, (tmp & ~(0xf << 12)) | ((((tmp >> 12) & 0xf) + 5) << 12));
1368         }
1369
1370         if (state->cfg.spur_protect)
1371                 dib7000p_spur_protect(state, ch->frequency / 1000, BANDWIDTH_TO_KHZ(ch->bandwidth_hz));
1372
1373         dib7000p_set_bandwidth(state, BANDWIDTH_TO_KHZ(ch->bandwidth_hz));
1374
1375         dib7000p_reset_stats(demod);
1376
1377         return 0;
1378 }
1379
1380 static int dib7000p_wakeup(struct dvb_frontend *demod)
1381 {
1382         struct dib7000p_state *state = demod->demodulator_priv;
1383         dib7000p_set_power_mode(state, DIB7000P_POWER_ALL);
1384         dib7000p_set_adc_state(state, DIBX000_SLOW_ADC_ON);
1385         if (state->version == SOC7090)
1386                 dib7000p_sad_calib(state);
1387         return 0;
1388 }
1389
1390 static int dib7000p_sleep(struct dvb_frontend *demod)
1391 {
1392         struct dib7000p_state *state = demod->demodulator_priv;
1393         if (state->version == SOC7090)
1394                 return dib7000p_set_power_mode(state, DIB7000P_POWER_INTERFACE_ONLY);
1395         return dib7000p_set_output_mode(state, OUTMODE_HIGH_Z) | dib7000p_set_power_mode(state, DIB7000P_POWER_INTERFACE_ONLY);
1396 }
1397
1398 static int dib7000p_identify(struct dib7000p_state *st)
1399 {
1400         u16 value;
1401         dprintk("checking demod on I2C address: %d (%x)\n", st->i2c_addr, st->i2c_addr);
1402
1403         if ((value = dib7000p_read_word(st, 768)) != 0x01b3) {
1404                 dprintk("wrong Vendor ID (read=0x%x)\n", value);
1405                 return -EREMOTEIO;
1406         }
1407
1408         if ((value = dib7000p_read_word(st, 769)) != 0x4000) {
1409                 dprintk("wrong Device ID (%x)\n", value);
1410                 return -EREMOTEIO;
1411         }
1412
1413         return 0;
1414 }
1415
1416 static int dib7000p_get_frontend(struct dvb_frontend *fe,
1417                                  struct dtv_frontend_properties *fep)
1418 {
1419         struct dib7000p_state *state = fe->demodulator_priv;
1420         u16 tps = dib7000p_read_word(state, 463);
1421
1422         fep->inversion = INVERSION_AUTO;
1423
1424         fep->bandwidth_hz = BANDWIDTH_TO_HZ(state->current_bandwidth);
1425
1426         switch ((tps >> 8) & 0x3) {
1427         case 0:
1428                 fep->transmission_mode = TRANSMISSION_MODE_2K;
1429                 break;
1430         case 1:
1431                 fep->transmission_mode = TRANSMISSION_MODE_8K;
1432                 break;
1433         /* case 2: fep->transmission_mode = TRANSMISSION_MODE_4K; break; */
1434         }
1435
1436         switch (tps & 0x3) {
1437         case 0:
1438                 fep->guard_interval = GUARD_INTERVAL_1_32;
1439                 break;
1440         case 1:
1441                 fep->guard_interval = GUARD_INTERVAL_1_16;
1442                 break;
1443         case 2:
1444                 fep->guard_interval = GUARD_INTERVAL_1_8;
1445                 break;
1446         case 3:
1447                 fep->guard_interval = GUARD_INTERVAL_1_4;
1448                 break;
1449         }
1450
1451         switch ((tps >> 14) & 0x3) {
1452         case 0:
1453                 fep->modulation = QPSK;
1454                 break;
1455         case 1:
1456                 fep->modulation = QAM_16;
1457                 break;
1458         case 2:
1459         default:
1460                 fep->modulation = QAM_64;
1461                 break;
1462         }
1463
1464         /* as long as the frontend_param structure is fixed for hierarchical transmission I refuse to use it */
1465         /* (tps >> 13) & 0x1 == hrch is used, (tps >> 10) & 0x7 == alpha */
1466
1467         fep->hierarchy = HIERARCHY_NONE;
1468         switch ((tps >> 5) & 0x7) {
1469         case 1:
1470                 fep->code_rate_HP = FEC_1_2;
1471                 break;
1472         case 2:
1473                 fep->code_rate_HP = FEC_2_3;
1474                 break;
1475         case 3:
1476                 fep->code_rate_HP = FEC_3_4;
1477                 break;
1478         case 5:
1479                 fep->code_rate_HP = FEC_5_6;
1480                 break;
1481         case 7:
1482         default:
1483                 fep->code_rate_HP = FEC_7_8;
1484                 break;
1485
1486         }
1487
1488         switch ((tps >> 2) & 0x7) {
1489         case 1:
1490                 fep->code_rate_LP = FEC_1_2;
1491                 break;
1492         case 2:
1493                 fep->code_rate_LP = FEC_2_3;
1494                 break;
1495         case 3:
1496                 fep->code_rate_LP = FEC_3_4;
1497                 break;
1498         case 5:
1499                 fep->code_rate_LP = FEC_5_6;
1500                 break;
1501         case 7:
1502         default:
1503                 fep->code_rate_LP = FEC_7_8;
1504                 break;
1505         }
1506
1507         /* native interleaver: (dib7000p_read_word(state, 464) >>  5) & 0x1 */
1508
1509         return 0;
1510 }
1511
1512 static int dib7000p_set_frontend(struct dvb_frontend *fe)
1513 {
1514         struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
1515         struct dib7000p_state *state = fe->demodulator_priv;
1516         int time, ret;
1517
1518         if (state->version == SOC7090)
1519                 dib7090_set_diversity_in(fe, 0);
1520         else
1521                 dib7000p_set_output_mode(state, OUTMODE_HIGH_Z);
1522
1523         /* maybe the parameter has been changed */
1524         state->sfn_workaround_active = buggy_sfn_workaround;
1525
1526         if (fe->ops.tuner_ops.set_params)
1527                 fe->ops.tuner_ops.set_params(fe);
1528
1529         /* start up the AGC */
1530         state->agc_state = 0;
1531         do {
1532                 time = dib7000p_agc_startup(fe);
1533                 if (time != -1)
1534                         msleep(time);
1535         } while (time != -1);
1536
1537         if (fep->transmission_mode == TRANSMISSION_MODE_AUTO ||
1538                 fep->guard_interval == GUARD_INTERVAL_AUTO || fep->modulation == QAM_AUTO || fep->code_rate_HP == FEC_AUTO) {
1539                 int i = 800, found;
1540
1541                 dib7000p_autosearch_start(fe);
1542                 do {
1543                         msleep(1);
1544                         found = dib7000p_autosearch_is_irq(fe);
1545                 } while (found == 0 && i--);
1546
1547                 dprintk("autosearch returns: %d\n", found);
1548                 if (found == 0 || found == 1)
1549                         return 0;
1550
1551                 dib7000p_get_frontend(fe, fep);
1552         }
1553
1554         ret = dib7000p_tune(fe);
1555
1556         /* make this a config parameter */
1557         if (state->version == SOC7090) {
1558                 dib7090_set_output_mode(fe, state->cfg.output_mode);
1559                 if (state->cfg.enMpegOutput == 0) {
1560                         dib7090_setDibTxMux(state, MPEG_ON_DIBTX);
1561                         dib7090_setHostBusMux(state, DIBTX_ON_HOSTBUS);
1562                 }
1563         } else
1564                 dib7000p_set_output_mode(state, state->cfg.output_mode);
1565
1566         return ret;
1567 }
1568
1569 static int dib7000p_get_stats(struct dvb_frontend *fe, enum fe_status stat);
1570
1571 static int dib7000p_read_status(struct dvb_frontend *fe, enum fe_status *stat)
1572 {
1573         struct dib7000p_state *state = fe->demodulator_priv;
1574         u16 lock = dib7000p_read_word(state, 509);
1575
1576         *stat = 0;
1577
1578         if (lock & 0x8000)
1579                 *stat |= FE_HAS_SIGNAL;
1580         if (lock & 0x3000)
1581                 *stat |= FE_HAS_CARRIER;
1582         if (lock & 0x0100)
1583                 *stat |= FE_HAS_VITERBI;
1584         if (lock & 0x0010)
1585                 *stat |= FE_HAS_SYNC;
1586         if ((lock & 0x0038) == 0x38)
1587                 *stat |= FE_HAS_LOCK;
1588
1589         dib7000p_get_stats(fe, *stat);
1590
1591         return 0;
1592 }
1593
1594 static int dib7000p_read_ber(struct dvb_frontend *fe, u32 * ber)
1595 {
1596         struct dib7000p_state *state = fe->demodulator_priv;
1597         *ber = (dib7000p_read_word(state, 500) << 16) | dib7000p_read_word(state, 501);
1598         return 0;
1599 }
1600
1601 static int dib7000p_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
1602 {
1603         struct dib7000p_state *state = fe->demodulator_priv;
1604         *unc = dib7000p_read_word(state, 506);
1605         return 0;
1606 }
1607
1608 static int dib7000p_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
1609 {
1610         struct dib7000p_state *state = fe->demodulator_priv;
1611         u16 val = dib7000p_read_word(state, 394);
1612         *strength = 65535 - val;
1613         return 0;
1614 }
1615
1616 static u32 dib7000p_get_snr(struct dvb_frontend *fe)
1617 {
1618         struct dib7000p_state *state = fe->demodulator_priv;
1619         u16 val;
1620         s32 signal_mant, signal_exp, noise_mant, noise_exp;
1621         u32 result = 0;
1622
1623         val = dib7000p_read_word(state, 479);
1624         noise_mant = (val >> 4) & 0xff;
1625         noise_exp = ((val & 0xf) << 2);
1626         val = dib7000p_read_word(state, 480);
1627         noise_exp += ((val >> 14) & 0x3);
1628         if ((noise_exp & 0x20) != 0)
1629                 noise_exp -= 0x40;
1630
1631         signal_mant = (val >> 6) & 0xFF;
1632         signal_exp = (val & 0x3F);
1633         if ((signal_exp & 0x20) != 0)
1634                 signal_exp -= 0x40;
1635
1636         if (signal_mant != 0)
1637                 result = intlog10(2) * 10 * signal_exp + 10 * intlog10(signal_mant);
1638         else
1639                 result = intlog10(2) * 10 * signal_exp - 100;
1640
1641         if (noise_mant != 0)
1642                 result -= intlog10(2) * 10 * noise_exp + 10 * intlog10(noise_mant);
1643         else
1644                 result -= intlog10(2) * 10 * noise_exp - 100;
1645
1646         return result;
1647 }
1648
1649 static int dib7000p_read_snr(struct dvb_frontend *fe, u16 *snr)
1650 {
1651         u32 result;
1652
1653         result = dib7000p_get_snr(fe);
1654
1655         *snr = result / ((1 << 24) / 10);
1656         return 0;
1657 }
1658
1659 static void dib7000p_reset_stats(struct dvb_frontend *demod)
1660 {
1661         struct dib7000p_state *state = demod->demodulator_priv;
1662         struct dtv_frontend_properties *c = &demod->dtv_property_cache;
1663         u32 ucb;
1664
1665         memset(&c->strength, 0, sizeof(c->strength));
1666         memset(&c->cnr, 0, sizeof(c->cnr));
1667         memset(&c->post_bit_error, 0, sizeof(c->post_bit_error));
1668         memset(&c->post_bit_count, 0, sizeof(c->post_bit_count));
1669         memset(&c->block_error, 0, sizeof(c->block_error));
1670
1671         c->strength.len = 1;
1672         c->cnr.len = 1;
1673         c->block_error.len = 1;
1674         c->block_count.len = 1;
1675         c->post_bit_error.len = 1;
1676         c->post_bit_count.len = 1;
1677
1678         c->strength.stat[0].scale = FE_SCALE_DECIBEL;
1679         c->strength.stat[0].uvalue = 0;
1680
1681         c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1682         c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1683         c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1684         c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1685         c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1686
1687         dib7000p_read_unc_blocks(demod, &ucb);
1688
1689         state->old_ucb = ucb;
1690         state->ber_jiffies_stats = 0;
1691         state->per_jiffies_stats = 0;
1692 }
1693
1694 struct linear_segments {
1695         unsigned x;
1696         signed y;
1697 };
1698
1699 /*
1700  * Table to estimate signal strength in dBm.
1701  * This table should be empirically determinated by measuring the signal
1702  * strength generated by a RF generator directly connected into
1703  * a device.
1704  * This table was determinated by measuring the signal strength generated
1705  * by a DTA-2111 RF generator directly connected into a dib7000p device
1706  * (a Hauppauge Nova-TD stick), using a good quality 3 meters length
1707  * RC6 cable and good RC6 connectors, connected directly to antenna 1.
1708  * As the minimum output power of DTA-2111 is -31dBm, a 16 dBm attenuator
1709  * were used, for the lower power values.
1710  * The real value can actually be on other devices, or even at the
1711  * second antena input, depending on several factors, like if LNA
1712  * is enabled or not, if diversity is enabled, type of connectors, etc.
1713  * Yet, it is better to use this measure in dB than a random non-linear
1714  * percentage value, especially for antenna adjustments.
1715  * On my tests, the precision of the measure using this table is about
1716  * 0.5 dB, with sounds reasonable enough to adjust antennas.
1717  */
1718 #define DB_OFFSET 131000
1719
1720 static struct linear_segments strength_to_db_table[] = {
1721         { 63630, DB_OFFSET - 20500},
1722         { 62273, DB_OFFSET - 21000},
1723         { 60162, DB_OFFSET - 22000},
1724         { 58730, DB_OFFSET - 23000},
1725         { 58294, DB_OFFSET - 24000},
1726         { 57778, DB_OFFSET - 25000},
1727         { 57320, DB_OFFSET - 26000},
1728         { 56779, DB_OFFSET - 27000},
1729         { 56293, DB_OFFSET - 28000},
1730         { 55724, DB_OFFSET - 29000},
1731         { 55145, DB_OFFSET - 30000},
1732         { 54680, DB_OFFSET - 31000},
1733         { 54293, DB_OFFSET - 32000},
1734         { 53813, DB_OFFSET - 33000},
1735         { 53427, DB_OFFSET - 34000},
1736         { 52981, DB_OFFSET - 35000},
1737
1738         { 52636, DB_OFFSET - 36000},
1739         { 52014, DB_OFFSET - 37000},
1740         { 51674, DB_OFFSET - 38000},
1741         { 50692, DB_OFFSET - 39000},
1742         { 49824, DB_OFFSET - 40000},
1743         { 49052, DB_OFFSET - 41000},
1744         { 48436, DB_OFFSET - 42000},
1745         { 47836, DB_OFFSET - 43000},
1746         { 47368, DB_OFFSET - 44000},
1747         { 46468, DB_OFFSET - 45000},
1748         { 45597, DB_OFFSET - 46000},
1749         { 44586, DB_OFFSET - 47000},
1750         { 43667, DB_OFFSET - 48000},
1751         { 42673, DB_OFFSET - 49000},
1752         { 41816, DB_OFFSET - 50000},
1753         { 40876, DB_OFFSET - 51000},
1754         {     0,      0},
1755 };
1756
1757 static u32 interpolate_value(u32 value, struct linear_segments *segments,
1758                              unsigned len)
1759 {
1760         u64 tmp64;
1761         u32 dx;
1762         s32 dy;
1763         int i, ret;
1764
1765         if (value >= segments[0].x)
1766                 return segments[0].y;
1767         if (value < segments[len-1].x)
1768                 return segments[len-1].y;
1769
1770         for (i = 1; i < len - 1; i++) {
1771                 /* If value is identical, no need to interpolate */
1772                 if (value == segments[i].x)
1773                         return segments[i].y;
1774                 if (value > segments[i].x)
1775                         break;
1776         }
1777
1778         /* Linear interpolation between the two (x,y) points */
1779         dy = segments[i - 1].y - segments[i].y;
1780         dx = segments[i - 1].x - segments[i].x;
1781
1782         tmp64 = value - segments[i].x;
1783         tmp64 *= dy;
1784         do_div(tmp64, dx);
1785         ret = segments[i].y + tmp64;
1786
1787         return ret;
1788 }
1789
1790 /* FIXME: may require changes - this one was borrowed from dib8000 */
1791 static u32 dib7000p_get_time_us(struct dvb_frontend *demod)
1792 {
1793         struct dtv_frontend_properties *c = &demod->dtv_property_cache;
1794         u64 time_us, tmp64;
1795         u32 tmp, denom;
1796         int guard, rate_num, rate_denum = 1, bits_per_symbol;
1797         int interleaving = 0, fft_div;
1798
1799         switch (c->guard_interval) {
1800         case GUARD_INTERVAL_1_4:
1801                 guard = 4;
1802                 break;
1803         case GUARD_INTERVAL_1_8:
1804                 guard = 8;
1805                 break;
1806         case GUARD_INTERVAL_1_16:
1807                 guard = 16;
1808                 break;
1809         default:
1810         case GUARD_INTERVAL_1_32:
1811                 guard = 32;
1812                 break;
1813         }
1814
1815         switch (c->transmission_mode) {
1816         case TRANSMISSION_MODE_2K:
1817                 fft_div = 4;
1818                 break;
1819         case TRANSMISSION_MODE_4K:
1820                 fft_div = 2;
1821                 break;
1822         default:
1823         case TRANSMISSION_MODE_8K:
1824                 fft_div = 1;
1825                 break;
1826         }
1827
1828         switch (c->modulation) {
1829         case DQPSK:
1830         case QPSK:
1831                 bits_per_symbol = 2;
1832                 break;
1833         case QAM_16:
1834                 bits_per_symbol = 4;
1835                 break;
1836         default:
1837         case QAM_64:
1838                 bits_per_symbol = 6;
1839                 break;
1840         }
1841
1842         switch ((c->hierarchy == 0 || 1 == 1) ? c->code_rate_HP : c->code_rate_LP) {
1843         case FEC_1_2:
1844                 rate_num = 1;
1845                 rate_denum = 2;
1846                 break;
1847         case FEC_2_3:
1848                 rate_num = 2;
1849                 rate_denum = 3;
1850                 break;
1851         case FEC_3_4:
1852                 rate_num = 3;
1853                 rate_denum = 4;
1854                 break;
1855         case FEC_5_6:
1856                 rate_num = 5;
1857                 rate_denum = 6;
1858                 break;
1859         default:
1860         case FEC_7_8:
1861                 rate_num = 7;
1862                 rate_denum = 8;
1863                 break;
1864         }
1865
1866         denom = bits_per_symbol * rate_num * fft_div * 384;
1867
1868         /*
1869          * FIXME: check if the math makes sense. If so, fill the
1870          * interleaving var.
1871          */
1872
1873         /* If calculus gets wrong, wait for 1s for the next stats */
1874         if (!denom)
1875                 return 0;
1876
1877         /* Estimate the period for the total bit rate */
1878         time_us = rate_denum * (1008 * 1562500L);
1879         tmp64 = time_us;
1880         do_div(tmp64, guard);
1881         time_us = time_us + tmp64;
1882         time_us += denom / 2;
1883         do_div(time_us, denom);
1884
1885         tmp = 1008 * 96 * interleaving;
1886         time_us += tmp + tmp / guard;
1887
1888         return time_us;
1889 }
1890
1891 static int dib7000p_get_stats(struct dvb_frontend *demod, enum fe_status stat)
1892 {
1893         struct dib7000p_state *state = demod->demodulator_priv;
1894         struct dtv_frontend_properties *c = &demod->dtv_property_cache;
1895         int show_per_stats = 0;
1896         u32 time_us = 0, val, snr;
1897         u64 blocks, ucb;
1898         s32 db;
1899         u16 strength;
1900
1901         /* Get Signal strength */
1902         dib7000p_read_signal_strength(demod, &strength);
1903         val = strength;
1904         db = interpolate_value(val,
1905                                strength_to_db_table,
1906                                ARRAY_SIZE(strength_to_db_table)) - DB_OFFSET;
1907         c->strength.stat[0].svalue = db;
1908
1909         /* UCB/BER/CNR measures require lock */
1910         if (!(stat & FE_HAS_LOCK)) {
1911                 c->cnr.len = 1;
1912                 c->block_count.len = 1;
1913                 c->block_error.len = 1;
1914                 c->post_bit_error.len = 1;
1915                 c->post_bit_count.len = 1;
1916                 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1917                 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1918                 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1919                 c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1920                 c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1921                 return 0;
1922         }
1923
1924         /* Check if time for stats was elapsed */
1925         if (time_after(jiffies, state->per_jiffies_stats)) {
1926                 state->per_jiffies_stats = jiffies + msecs_to_jiffies(1000);
1927
1928                 /* Get SNR */
1929                 snr = dib7000p_get_snr(demod);
1930                 if (snr)
1931                         snr = (1000L * snr) >> 24;
1932                 else
1933                         snr = 0;
1934                 c->cnr.stat[0].svalue = snr;
1935                 c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
1936
1937                 /* Get UCB measures */
1938                 dib7000p_read_unc_blocks(demod, &val);
1939                 ucb = val - state->old_ucb;
1940                 if (val < state->old_ucb)
1941                         ucb += 0x100000000LL;
1942
1943                 c->block_error.stat[0].scale = FE_SCALE_COUNTER;
1944                 c->block_error.stat[0].uvalue = ucb;
1945
1946                 /* Estimate the number of packets based on bitrate */
1947                 if (!time_us)
1948                         time_us = dib7000p_get_time_us(demod);
1949
1950                 if (time_us) {
1951                         blocks = 1250000ULL * 1000000ULL;
1952                         do_div(blocks, time_us * 8 * 204);
1953                         c->block_count.stat[0].scale = FE_SCALE_COUNTER;
1954                         c->block_count.stat[0].uvalue += blocks;
1955                 }
1956
1957                 show_per_stats = 1;
1958         }
1959
1960         /* Get post-BER measures */
1961         if (time_after(jiffies, state->ber_jiffies_stats)) {
1962                 time_us = dib7000p_get_time_us(demod);
1963                 state->ber_jiffies_stats = jiffies + msecs_to_jiffies((time_us + 500) / 1000);
1964
1965                 dprintk("Next all layers stats available in %u us.\n", time_us);
1966
1967                 dib7000p_read_ber(demod, &val);
1968                 c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
1969                 c->post_bit_error.stat[0].uvalue += val;
1970
1971                 c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
1972                 c->post_bit_count.stat[0].uvalue += 100000000;
1973         }
1974
1975         /* Get PER measures */
1976         if (show_per_stats) {
1977                 dib7000p_read_unc_blocks(demod, &val);
1978
1979                 c->block_error.stat[0].scale = FE_SCALE_COUNTER;
1980                 c->block_error.stat[0].uvalue += val;
1981
1982                 time_us = dib7000p_get_time_us(demod);
1983                 if (time_us) {
1984                         blocks = 1250000ULL * 1000000ULL;
1985                         do_div(blocks, time_us * 8 * 204);
1986                         c->block_count.stat[0].scale = FE_SCALE_COUNTER;
1987                         c->block_count.stat[0].uvalue += blocks;
1988                 }
1989         }
1990         return 0;
1991 }
1992
1993 static int dib7000p_fe_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings *tune)
1994 {
1995         tune->min_delay_ms = 1000;
1996         return 0;
1997 }
1998
1999 static void dib7000p_release(struct dvb_frontend *demod)
2000 {
2001         struct dib7000p_state *st = demod->demodulator_priv;
2002         dibx000_exit_i2c_master(&st->i2c_master);
2003         i2c_del_adapter(&st->dib7090_tuner_adap);
2004         kfree(st);
2005 }
2006
2007 static int dib7000pc_detection(struct i2c_adapter *i2c_adap)
2008 {
2009         u8 *tx, *rx;
2010         struct i2c_msg msg[2] = {
2011                 {.addr = 18 >> 1, .flags = 0, .len = 2},
2012                 {.addr = 18 >> 1, .flags = I2C_M_RD, .len = 2},
2013         };
2014         int ret = 0;
2015
2016         tx = kzalloc(2, GFP_KERNEL);
2017         if (!tx)
2018                 return -ENOMEM;
2019         rx = kzalloc(2, GFP_KERNEL);
2020         if (!rx) {
2021                 ret = -ENOMEM;
2022                 goto rx_memory_error;
2023         }
2024
2025         msg[0].buf = tx;
2026         msg[1].buf = rx;
2027
2028         tx[0] = 0x03;
2029         tx[1] = 0x00;
2030
2031         if (i2c_transfer(i2c_adap, msg, 2) == 2)
2032                 if (rx[0] == 0x01 && rx[1] == 0xb3) {
2033                         dprintk("-D-  DiB7000PC detected\n");
2034                         ret = 1;
2035                         goto out;
2036                 }
2037
2038         msg[0].addr = msg[1].addr = 0x40;
2039
2040         if (i2c_transfer(i2c_adap, msg, 2) == 2)
2041                 if (rx[0] == 0x01 && rx[1] == 0xb3) {
2042                         dprintk("-D-  DiB7000PC detected\n");
2043                         ret = 1;
2044                         goto out;
2045                 }
2046
2047         dprintk("-D-  DiB7000PC not detected\n");
2048
2049 out:
2050         kfree(rx);
2051 rx_memory_error:
2052         kfree(tx);
2053         return ret;
2054 }
2055
2056 static struct i2c_adapter *dib7000p_get_i2c_master(struct dvb_frontend *demod, enum dibx000_i2c_interface intf, int gating)
2057 {
2058         struct dib7000p_state *st = demod->demodulator_priv;
2059         return dibx000_get_i2c_adapter(&st->i2c_master, intf, gating);
2060 }
2061
2062 static int dib7000p_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
2063 {
2064         struct dib7000p_state *state = fe->demodulator_priv;
2065         u16 val = dib7000p_read_word(state, 235) & 0xffef;
2066         val |= (onoff & 0x1) << 4;
2067         dprintk("PID filter enabled %d\n", onoff);
2068         return dib7000p_write_word(state, 235, val);
2069 }
2070
2071 static int dib7000p_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
2072 {
2073         struct dib7000p_state *state = fe->demodulator_priv;
2074         dprintk("PID filter: index %x, PID %d, OnOff %d\n", id, pid, onoff);
2075         return dib7000p_write_word(state, 241 + id, onoff ? (1 << 13) | pid : 0);
2076 }
2077
2078 static int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib7000p_config cfg[])
2079 {
2080         struct dib7000p_state *dpst;
2081         int k = 0;
2082         u8 new_addr = 0;
2083
2084         dpst = kzalloc(sizeof(struct dib7000p_state), GFP_KERNEL);
2085         if (!dpst)
2086                 return -ENOMEM;
2087
2088         dpst->i2c_adap = i2c;
2089         mutex_init(&dpst->i2c_buffer_lock);
2090
2091         for (k = no_of_demods - 1; k >= 0; k--) {
2092                 dpst->cfg = cfg[k];
2093
2094                 /* designated i2c address */
2095                 if (cfg[k].default_i2c_addr != 0)
2096                         new_addr = cfg[k].default_i2c_addr + (k << 1);
2097                 else
2098                         new_addr = (0x40 + k) << 1;
2099                 dpst->i2c_addr = new_addr;
2100                 dib7000p_write_word(dpst, 1287, 0x0003);        /* sram lead in, rdy */
2101                 if (dib7000p_identify(dpst) != 0) {
2102                         dpst->i2c_addr = default_addr;
2103                         dib7000p_write_word(dpst, 1287, 0x0003);        /* sram lead in, rdy */
2104                         if (dib7000p_identify(dpst) != 0) {
2105                                 dprintk("DiB7000P #%d: not identified\n", k);
2106                                 kfree(dpst);
2107                                 return -EIO;
2108                         }
2109                 }
2110
2111                 /* start diversity to pull_down div_str - just for i2c-enumeration */
2112                 dib7000p_set_output_mode(dpst, OUTMODE_DIVERSITY);
2113
2114                 /* set new i2c address and force divstart */
2115                 dib7000p_write_word(dpst, 1285, (new_addr << 2) | 0x2);
2116
2117                 dprintk("IC %d initialized (to i2c_address 0x%x)\n", k, new_addr);
2118         }
2119
2120         for (k = 0; k < no_of_demods; k++) {
2121                 dpst->cfg = cfg[k];
2122                 if (cfg[k].default_i2c_addr != 0)
2123                         dpst->i2c_addr = (cfg[k].default_i2c_addr + k) << 1;
2124                 else
2125                         dpst->i2c_addr = (0x40 + k) << 1;
2126
2127                 // unforce divstr
2128                 dib7000p_write_word(dpst, 1285, dpst->i2c_addr << 2);
2129
2130                 /* deactivate div - it was just for i2c-enumeration */
2131                 dib7000p_set_output_mode(dpst, OUTMODE_HIGH_Z);
2132         }
2133
2134         kfree(dpst);
2135         return 0;
2136 }
2137
2138 static const s32 lut_1000ln_mant[] = {
2139         6908, 6956, 7003, 7047, 7090, 7131, 7170, 7208, 7244, 7279, 7313, 7346, 7377, 7408, 7438, 7467, 7495, 7523, 7549, 7575, 7600
2140 };
2141
2142 static s32 dib7000p_get_adc_power(struct dvb_frontend *fe)
2143 {
2144         struct dib7000p_state *state = fe->demodulator_priv;
2145         u32 tmp_val = 0, exp = 0, mant = 0;
2146         s32 pow_i;
2147         u16 buf[2];
2148         u8 ix = 0;
2149
2150         buf[0] = dib7000p_read_word(state, 0x184);
2151         buf[1] = dib7000p_read_word(state, 0x185);
2152         pow_i = (buf[0] << 16) | buf[1];
2153         dprintk("raw pow_i = %d\n", pow_i);
2154
2155         tmp_val = pow_i;
2156         while (tmp_val >>= 1)
2157                 exp++;
2158
2159         mant = (pow_i * 1000 / (1 << exp));
2160         dprintk(" mant = %d exp = %d\n", mant / 1000, exp);
2161
2162         ix = (u8) ((mant - 1000) / 100);        /* index of the LUT */
2163         dprintk(" ix = %d\n", ix);
2164
2165         pow_i = (lut_1000ln_mant[ix] + 693 * (exp - 20) - 6908);
2166         pow_i = (pow_i << 8) / 1000;
2167         dprintk(" pow_i = %d\n", pow_i);
2168
2169         return pow_i;
2170 }
2171
2172 static int map_addr_to_serpar_number(struct i2c_msg *msg)
2173 {
2174         if ((msg->buf[0] <= 15))
2175                 msg->buf[0] -= 1;
2176         else if (msg->buf[0] == 17)
2177                 msg->buf[0] = 15;
2178         else if (msg->buf[0] == 16)
2179                 msg->buf[0] = 17;
2180         else if (msg->buf[0] == 19)
2181                 msg->buf[0] = 16;
2182         else if (msg->buf[0] >= 21 && msg->buf[0] <= 25)
2183                 msg->buf[0] -= 3;
2184         else if (msg->buf[0] == 28)
2185                 msg->buf[0] = 23;
2186         else
2187                 return -EINVAL;
2188         return 0;
2189 }
2190
2191 static int w7090p_tuner_write_serpar(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
2192 {
2193         struct dib7000p_state *state = i2c_get_adapdata(i2c_adap);
2194         u8 n_overflow = 1;
2195         u16 i = 1000;
2196         u16 serpar_num = msg[0].buf[0];
2197
2198         while (n_overflow == 1 && i) {
2199                 n_overflow = (dib7000p_read_word(state, 1984) >> 1) & 0x1;
2200                 i--;
2201                 if (i == 0)
2202                         dprintk("Tuner ITF: write busy (overflow)\n");
2203         }
2204         dib7000p_write_word(state, 1985, (1 << 6) | (serpar_num & 0x3f));
2205         dib7000p_write_word(state, 1986, (msg[0].buf[1] << 8) | msg[0].buf[2]);
2206
2207         return num;
2208 }
2209
2210 static int w7090p_tuner_read_serpar(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
2211 {
2212         struct dib7000p_state *state = i2c_get_adapdata(i2c_adap);
2213         u8 n_overflow = 1, n_empty = 1;
2214         u16 i = 1000;
2215         u16 serpar_num = msg[0].buf[0];
2216         u16 read_word;
2217
2218         while (n_overflow == 1 && i) {
2219                 n_overflow = (dib7000p_read_word(state, 1984) >> 1) & 0x1;
2220                 i--;
2221                 if (i == 0)
2222                         dprintk("TunerITF: read busy (overflow)\n");
2223         }
2224         dib7000p_write_word(state, 1985, (0 << 6) | (serpar_num & 0x3f));
2225
2226         i = 1000;
2227         while (n_empty == 1 && i) {
2228                 n_empty = dib7000p_read_word(state, 1984) & 0x1;
2229                 i--;
2230                 if (i == 0)
2231                         dprintk("TunerITF: read busy (empty)\n");
2232         }
2233         read_word = dib7000p_read_word(state, 1987);
2234         msg[1].buf[0] = (read_word >> 8) & 0xff;
2235         msg[1].buf[1] = (read_word) & 0xff;
2236
2237         return num;
2238 }
2239
2240 static int w7090p_tuner_rw_serpar(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
2241 {
2242         if (map_addr_to_serpar_number(&msg[0]) == 0) {  /* else = Tuner regs to ignore : DIG_CFG, CTRL_RF_LT, PLL_CFG, PWM1_REG, ADCCLK, DIG_CFG_3; SLEEP_EN... */
2243                 if (num == 1) { /* write */
2244                         return w7090p_tuner_write_serpar(i2c_adap, msg, 1);
2245                 } else {        /* read */
2246                         return w7090p_tuner_read_serpar(i2c_adap, msg, 2);
2247                 }
2248         }
2249         return num;
2250 }
2251
2252 static int dib7090p_rw_on_apb(struct i2c_adapter *i2c_adap,
2253                 struct i2c_msg msg[], int num, u16 apb_address)
2254 {
2255         struct dib7000p_state *state = i2c_get_adapdata(i2c_adap);
2256         u16 word;
2257
2258         if (num == 1) {         /* write */
2259                 dib7000p_write_word(state, apb_address, ((msg[0].buf[1] << 8) | (msg[0].buf[2])));
2260         } else {
2261                 word = dib7000p_read_word(state, apb_address);
2262                 msg[1].buf[0] = (word >> 8) & 0xff;
2263                 msg[1].buf[1] = (word) & 0xff;
2264         }
2265
2266         return num;
2267 }
2268
2269 static int dib7090_tuner_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
2270 {
2271         struct dib7000p_state *state = i2c_get_adapdata(i2c_adap);
2272
2273         u16 apb_address = 0, word;
2274         int i = 0;
2275         switch (msg[0].buf[0]) {
2276         case 0x12:
2277                 apb_address = 1920;
2278                 break;
2279         case 0x14:
2280                 apb_address = 1921;
2281                 break;
2282         case 0x24:
2283                 apb_address = 1922;
2284                 break;
2285         case 0x1a:
2286                 apb_address = 1923;
2287                 break;
2288         case 0x22:
2289                 apb_address = 1924;
2290                 break;
2291         case 0x33:
2292                 apb_address = 1926;
2293                 break;
2294         case 0x34:
2295                 apb_address = 1927;
2296                 break;
2297         case 0x35:
2298                 apb_address = 1928;
2299                 break;
2300         case 0x36:
2301                 apb_address = 1929;
2302                 break;
2303         case 0x37:
2304                 apb_address = 1930;
2305                 break;
2306         case 0x38:
2307                 apb_address = 1931;
2308                 break;
2309         case 0x39:
2310                 apb_address = 1932;
2311                 break;
2312         case 0x2a:
2313                 apb_address = 1935;
2314                 break;
2315         case 0x2b:
2316                 apb_address = 1936;
2317                 break;
2318         case 0x2c:
2319                 apb_address = 1937;
2320                 break;
2321         case 0x2d:
2322                 apb_address = 1938;
2323                 break;
2324         case 0x2e:
2325                 apb_address = 1939;
2326                 break;
2327         case 0x2f:
2328                 apb_address = 1940;
2329                 break;
2330         case 0x30:
2331                 apb_address = 1941;
2332                 break;
2333         case 0x31:
2334                 apb_address = 1942;
2335                 break;
2336         case 0x32:
2337                 apb_address = 1943;
2338                 break;
2339         case 0x3e:
2340                 apb_address = 1944;
2341                 break;
2342         case 0x3f:
2343                 apb_address = 1945;
2344                 break;
2345         case 0x40:
2346                 apb_address = 1948;
2347                 break;
2348         case 0x25:
2349                 apb_address = 914;
2350                 break;
2351         case 0x26:
2352                 apb_address = 915;
2353                 break;
2354         case 0x27:
2355                 apb_address = 917;
2356                 break;
2357         case 0x28:
2358                 apb_address = 916;
2359                 break;
2360         case 0x1d:
2361                 i = ((dib7000p_read_word(state, 72) >> 12) & 0x3);
2362                 word = dib7000p_read_word(state, 384 + i);
2363                 msg[1].buf[0] = (word >> 8) & 0xff;
2364                 msg[1].buf[1] = (word) & 0xff;
2365                 return num;
2366         case 0x1f:
2367                 if (num == 1) { /* write */
2368                         word = (u16) ((msg[0].buf[1] << 8) | msg[0].buf[2]);
2369                         word &= 0x3;
2370                         word = (dib7000p_read_word(state, 72) & ~(3 << 12)) | (word << 12);
2371                         dib7000p_write_word(state, 72, word);   /* Set the proper input */
2372                         return num;
2373                 }
2374         }
2375
2376         if (apb_address != 0)   /* R/W access via APB */
2377                 return dib7090p_rw_on_apb(i2c_adap, msg, num, apb_address);
2378         else                    /* R/W access via SERPAR  */
2379                 return w7090p_tuner_rw_serpar(i2c_adap, msg, num);
2380
2381         return 0;
2382 }
2383
2384 static u32 dib7000p_i2c_func(struct i2c_adapter *adapter)
2385 {
2386         return I2C_FUNC_I2C;
2387 }
2388
2389 static const struct i2c_algorithm dib7090_tuner_xfer_algo = {
2390         .master_xfer = dib7090_tuner_xfer,
2391         .functionality = dib7000p_i2c_func,
2392 };
2393
2394 static struct i2c_adapter *dib7090_get_i2c_tuner(struct dvb_frontend *fe)
2395 {
2396         struct dib7000p_state *st = fe->demodulator_priv;
2397         return &st->dib7090_tuner_adap;
2398 }
2399
2400 static int dib7090_host_bus_drive(struct dib7000p_state *state, u8 drive)
2401 {
2402         u16 reg;
2403
2404         /* drive host bus 2, 3, 4 */
2405         reg = dib7000p_read_word(state, 1798) & ~((0x7) | (0x7 << 6) | (0x7 << 12));
2406         reg |= (drive << 12) | (drive << 6) | drive;
2407         dib7000p_write_word(state, 1798, reg);
2408
2409         /* drive host bus 5,6 */
2410         reg = dib7000p_read_word(state, 1799) & ~((0x7 << 2) | (0x7 << 8));
2411         reg |= (drive << 8) | (drive << 2);
2412         dib7000p_write_word(state, 1799, reg);
2413
2414         /* drive host bus 7, 8, 9 */
2415         reg = dib7000p_read_word(state, 1800) & ~((0x7) | (0x7 << 6) | (0x7 << 12));
2416         reg |= (drive << 12) | (drive << 6) | drive;
2417         dib7000p_write_word(state, 1800, reg);
2418
2419         /* drive host bus 10, 11 */
2420         reg = dib7000p_read_word(state, 1801) & ~((0x7 << 2) | (0x7 << 8));
2421         reg |= (drive << 8) | (drive << 2);
2422         dib7000p_write_word(state, 1801, reg);
2423
2424         /* drive host bus 12, 13, 14 */
2425         reg = dib7000p_read_word(state, 1802) & ~((0x7) | (0x7 << 6) | (0x7 << 12));
2426         reg |= (drive << 12) | (drive << 6) | drive;
2427         dib7000p_write_word(state, 1802, reg);
2428
2429         return 0;
2430 }
2431
2432 static u32 dib7090_calcSyncFreq(u32 P_Kin, u32 P_Kout, u32 insertExtSynchro, u32 syncSize)
2433 {
2434         u32 quantif = 3;
2435         u32 nom = (insertExtSynchro * P_Kin + syncSize);
2436         u32 denom = P_Kout;
2437         u32 syncFreq = ((nom << quantif) / denom);
2438
2439         if ((syncFreq & ((1 << quantif) - 1)) != 0)
2440                 syncFreq = (syncFreq >> quantif) + 1;
2441         else
2442                 syncFreq = (syncFreq >> quantif);
2443
2444         if (syncFreq != 0)
2445                 syncFreq = syncFreq - 1;
2446
2447         return syncFreq;
2448 }
2449
2450 static int dib7090_cfg_DibTx(struct dib7000p_state *state, u32 P_Kin, u32 P_Kout, u32 insertExtSynchro, u32 synchroMode, u32 syncWord, u32 syncSize)
2451 {
2452         dprintk("Configure DibStream Tx\n");
2453
2454         dib7000p_write_word(state, 1615, 1);
2455         dib7000p_write_word(state, 1603, P_Kin);
2456         dib7000p_write_word(state, 1605, P_Kout);
2457         dib7000p_write_word(state, 1606, insertExtSynchro);
2458         dib7000p_write_word(state, 1608, synchroMode);
2459         dib7000p_write_word(state, 1609, (syncWord >> 16) & 0xffff);
2460         dib7000p_write_word(state, 1610, syncWord & 0xffff);
2461         dib7000p_write_word(state, 1612, syncSize);
2462         dib7000p_write_word(state, 1615, 0);
2463
2464         return 0;
2465 }
2466
2467 static int dib7090_cfg_DibRx(struct dib7000p_state *state, u32 P_Kin, u32 P_Kout, u32 synchroMode, u32 insertExtSynchro, u32 syncWord, u32 syncSize,
2468                 u32 dataOutRate)
2469 {
2470         u32 syncFreq;
2471
2472         dprintk("Configure DibStream Rx\n");
2473         if ((P_Kin != 0) && (P_Kout != 0)) {
2474                 syncFreq = dib7090_calcSyncFreq(P_Kin, P_Kout, insertExtSynchro, syncSize);
2475                 dib7000p_write_word(state, 1542, syncFreq);
2476         }
2477         dib7000p_write_word(state, 1554, 1);
2478         dib7000p_write_word(state, 1536, P_Kin);
2479         dib7000p_write_word(state, 1537, P_Kout);
2480         dib7000p_write_word(state, 1539, synchroMode);
2481         dib7000p_write_word(state, 1540, (syncWord >> 16) & 0xffff);
2482         dib7000p_write_word(state, 1541, syncWord & 0xffff);
2483         dib7000p_write_word(state, 1543, syncSize);
2484         dib7000p_write_word(state, 1544, dataOutRate);
2485         dib7000p_write_word(state, 1554, 0);
2486
2487         return 0;
2488 }
2489
2490 static void dib7090_enMpegMux(struct dib7000p_state *state, int onoff)
2491 {
2492         u16 reg_1287 = dib7000p_read_word(state, 1287);
2493
2494         switch (onoff) {
2495         case 1:
2496                         reg_1287 &= ~(1<<7);
2497                         break;
2498         case 0:
2499                         reg_1287 |= (1<<7);
2500                         break;
2501         }
2502
2503         dib7000p_write_word(state, 1287, reg_1287);
2504 }
2505
2506 static void dib7090_configMpegMux(struct dib7000p_state *state,
2507                 u16 pulseWidth, u16 enSerialMode, u16 enSerialClkDiv2)
2508 {
2509         dprintk("Enable Mpeg mux\n");
2510
2511         dib7090_enMpegMux(state, 0);
2512
2513         /* If the input mode is MPEG do not divide the serial clock */
2514         if ((enSerialMode == 1) && (state->input_mode_mpeg == 1))
2515                 enSerialClkDiv2 = 0;
2516
2517         dib7000p_write_word(state, 1287, ((pulseWidth & 0x1f) << 2)
2518                         | ((enSerialMode & 0x1) << 1)
2519                         | (enSerialClkDiv2 & 0x1));
2520
2521         dib7090_enMpegMux(state, 1);
2522 }
2523
2524 static void dib7090_setDibTxMux(struct dib7000p_state *state, int mode)
2525 {
2526         u16 reg_1288 = dib7000p_read_word(state, 1288) & ~(0x7 << 7);
2527
2528         switch (mode) {
2529         case MPEG_ON_DIBTX:
2530                         dprintk("SET MPEG ON DIBSTREAM TX\n");
2531                         dib7090_cfg_DibTx(state, 8, 5, 0, 0, 0, 0);
2532                         reg_1288 |= (1<<9);
2533                         break;
2534         case DIV_ON_DIBTX:
2535                         dprintk("SET DIV_OUT ON DIBSTREAM TX\n");
2536                         dib7090_cfg_DibTx(state, 5, 5, 0, 0, 0, 0);
2537                         reg_1288 |= (1<<8);
2538                         break;
2539         case ADC_ON_DIBTX:
2540                         dprintk("SET ADC_OUT ON DIBSTREAM TX\n");
2541                         dib7090_cfg_DibTx(state, 20, 5, 10, 0, 0, 0);
2542                         reg_1288 |= (1<<7);
2543                         break;
2544         default:
2545                         break;
2546         }
2547         dib7000p_write_word(state, 1288, reg_1288);
2548 }
2549
2550 static void dib7090_setHostBusMux(struct dib7000p_state *state, int mode)
2551 {
2552         u16 reg_1288 = dib7000p_read_word(state, 1288) & ~(0x7 << 4);
2553
2554         switch (mode) {
2555         case DEMOUT_ON_HOSTBUS:
2556                         dprintk("SET DEM OUT OLD INTERF ON HOST BUS\n");
2557                         dib7090_enMpegMux(state, 0);
2558                         reg_1288 |= (1<<6);
2559                         break;
2560         case DIBTX_ON_HOSTBUS:
2561                         dprintk("SET DIBSTREAM TX ON HOST BUS\n");
2562                         dib7090_enMpegMux(state, 0);
2563                         reg_1288 |= (1<<5);
2564                         break;
2565         case MPEG_ON_HOSTBUS:
2566                         dprintk("SET MPEG MUX ON HOST BUS\n");
2567                         reg_1288 |= (1<<4);
2568                         break;
2569         default:
2570                         break;
2571         }
2572         dib7000p_write_word(state, 1288, reg_1288);
2573 }
2574
2575 static int dib7090_set_diversity_in(struct dvb_frontend *fe, int onoff)
2576 {
2577         struct dib7000p_state *state = fe->demodulator_priv;
2578         u16 reg_1287;
2579
2580         switch (onoff) {
2581         case 0: /* only use the internal way - not the diversity input */
2582                         dprintk("%s mode OFF : by default Enable Mpeg INPUT\n", __func__);
2583                         dib7090_cfg_DibRx(state, 8, 5, 0, 0, 0, 8, 0);
2584
2585                         /* Do not divide the serial clock of MPEG MUX */
2586                         /* in SERIAL MODE in case input mode MPEG is used */
2587                         reg_1287 = dib7000p_read_word(state, 1287);
2588                         /* enSerialClkDiv2 == 1 ? */
2589                         if ((reg_1287 & 0x1) == 1) {
2590                                 /* force enSerialClkDiv2 = 0 */
2591                                 reg_1287 &= ~0x1;
2592                                 dib7000p_write_word(state, 1287, reg_1287);
2593                         }
2594                         state->input_mode_mpeg = 1;
2595                         break;
2596         case 1: /* both ways */
2597         case 2: /* only the diversity input */
2598                         dprintk("%s ON : Enable diversity INPUT\n", __func__);
2599                         dib7090_cfg_DibRx(state, 5, 5, 0, 0, 0, 0, 0);
2600                         state->input_mode_mpeg = 0;
2601                         break;
2602         }
2603
2604         dib7000p_set_diversity_in(&state->demod, onoff);
2605         return 0;
2606 }
2607
2608 static int dib7090_set_output_mode(struct dvb_frontend *fe, int mode)
2609 {
2610         struct dib7000p_state *state = fe->demodulator_priv;
2611
2612         u16 outreg, smo_mode, fifo_threshold;
2613         u8 prefer_mpeg_mux_use = 1;
2614         int ret = 0;
2615
2616         dib7090_host_bus_drive(state, 1);
2617
2618         fifo_threshold = 1792;
2619         smo_mode = (dib7000p_read_word(state, 235) & 0x0050) | (1 << 1);
2620         outreg = dib7000p_read_word(state, 1286) & ~((1 << 10) | (0x7 << 6) | (1 << 1));
2621
2622         switch (mode) {
2623         case OUTMODE_HIGH_Z:
2624                 outreg = 0;
2625                 break;
2626
2627         case OUTMODE_MPEG2_SERIAL:
2628                 if (prefer_mpeg_mux_use) {
2629                         dprintk("setting output mode TS_SERIAL using Mpeg Mux\n");
2630                         dib7090_configMpegMux(state, 3, 1, 1);
2631                         dib7090_setHostBusMux(state, MPEG_ON_HOSTBUS);
2632                 } else {/* Use Smooth block */
2633                         dprintk("setting output mode TS_SERIAL using Smooth bloc\n");
2634                         dib7090_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
2635                         outreg |= (2<<6) | (0 << 1);
2636                 }
2637                 break;
2638
2639         case OUTMODE_MPEG2_PAR_GATED_CLK:
2640                 if (prefer_mpeg_mux_use) {
2641                         dprintk("setting output mode TS_PARALLEL_GATED using Mpeg Mux\n");
2642                         dib7090_configMpegMux(state, 2, 0, 0);
2643                         dib7090_setHostBusMux(state, MPEG_ON_HOSTBUS);
2644                 } else { /* Use Smooth block */
2645                         dprintk("setting output mode TS_PARALLEL_GATED using Smooth block\n");
2646                         dib7090_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
2647                         outreg |= (0<<6);
2648                 }
2649                 break;
2650
2651         case OUTMODE_MPEG2_PAR_CONT_CLK:        /* Using Smooth block only */
2652                 dprintk("setting output mode TS_PARALLEL_CONT using Smooth block\n");
2653                 dib7090_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
2654                 outreg |= (1<<6);
2655                 break;
2656
2657         case OUTMODE_MPEG2_FIFO:        /* Using Smooth block because not supported by new Mpeg Mux bloc */
2658                 dprintk("setting output mode TS_FIFO using Smooth block\n");
2659                 dib7090_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
2660                 outreg |= (5<<6);
2661                 smo_mode |= (3 << 1);
2662                 fifo_threshold = 512;
2663                 break;
2664
2665         case OUTMODE_DIVERSITY:
2666                 dprintk("setting output mode MODE_DIVERSITY\n");
2667                 dib7090_setDibTxMux(state, DIV_ON_DIBTX);
2668                 dib7090_setHostBusMux(state, DIBTX_ON_HOSTBUS);
2669                 break;
2670
2671         case OUTMODE_ANALOG_ADC:
2672                 dprintk("setting output mode MODE_ANALOG_ADC\n");
2673                 dib7090_setDibTxMux(state, ADC_ON_DIBTX);
2674                 dib7090_setHostBusMux(state, DIBTX_ON_HOSTBUS);
2675                 break;
2676         }
2677         if (mode != OUTMODE_HIGH_Z)
2678                 outreg |= (1 << 10);
2679
2680         if (state->cfg.output_mpeg2_in_188_bytes)
2681                 smo_mode |= (1 << 5);
2682
2683         ret |= dib7000p_write_word(state, 235, smo_mode);
2684         ret |= dib7000p_write_word(state, 236, fifo_threshold); /* synchronous fread */
2685         ret |= dib7000p_write_word(state, 1286, outreg);
2686
2687         return ret;
2688 }
2689
2690 static int dib7090_tuner_sleep(struct dvb_frontend *fe, int onoff)
2691 {
2692         struct dib7000p_state *state = fe->demodulator_priv;
2693         u16 en_cur_state;
2694
2695         dprintk("sleep dib7090: %d\n", onoff);
2696
2697         en_cur_state = dib7000p_read_word(state, 1922);
2698
2699         if (en_cur_state > 0xff)
2700                 state->tuner_enable = en_cur_state;
2701
2702         if (onoff)
2703                 en_cur_state &= 0x00ff;
2704         else {
2705                 if (state->tuner_enable != 0)
2706                         en_cur_state = state->tuner_enable;
2707         }
2708
2709         dib7000p_write_word(state, 1922, en_cur_state);
2710
2711         return 0;
2712 }
2713
2714 static int dib7090_get_adc_power(struct dvb_frontend *fe)
2715 {
2716         return dib7000p_get_adc_power(fe);
2717 }
2718
2719 static int dib7090_slave_reset(struct dvb_frontend *fe)
2720 {
2721         struct dib7000p_state *state = fe->demodulator_priv;
2722         u16 reg;
2723
2724         reg = dib7000p_read_word(state, 1794);
2725         dib7000p_write_word(state, 1794, reg | (4 << 12));
2726
2727         dib7000p_write_word(state, 1032, 0xffff);
2728         return 0;
2729 }
2730
2731 static const struct dvb_frontend_ops dib7000p_ops;
2732 static struct dvb_frontend *dib7000p_init(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib7000p_config *cfg)
2733 {
2734         struct dvb_frontend *demod;
2735         struct dib7000p_state *st;
2736         st = kzalloc(sizeof(struct dib7000p_state), GFP_KERNEL);
2737         if (st == NULL)
2738                 return NULL;
2739
2740         memcpy(&st->cfg, cfg, sizeof(struct dib7000p_config));
2741         st->i2c_adap = i2c_adap;
2742         st->i2c_addr = i2c_addr;
2743         st->gpio_val = cfg->gpio_val;
2744         st->gpio_dir = cfg->gpio_dir;
2745
2746         /* Ensure the output mode remains at the previous default if it's
2747          * not specifically set by the caller.
2748          */
2749         if ((st->cfg.output_mode != OUTMODE_MPEG2_SERIAL) && (st->cfg.output_mode != OUTMODE_MPEG2_PAR_GATED_CLK))
2750                 st->cfg.output_mode = OUTMODE_MPEG2_FIFO;
2751
2752         demod = &st->demod;
2753         demod->demodulator_priv = st;
2754         memcpy(&st->demod.ops, &dib7000p_ops, sizeof(struct dvb_frontend_ops));
2755         mutex_init(&st->i2c_buffer_lock);
2756
2757         dib7000p_write_word(st, 1287, 0x0003);  /* sram lead in, rdy */
2758
2759         if (dib7000p_identify(st) != 0)
2760                 goto error;
2761
2762         st->version = dib7000p_read_word(st, 897);
2763
2764         /* FIXME: make sure the dev.parent field is initialized, or else
2765            request_firmware() will hit an OOPS (this should be moved somewhere
2766            more common) */
2767         st->i2c_master.gated_tuner_i2c_adap.dev.parent = i2c_adap->dev.parent;
2768
2769         dibx000_init_i2c_master(&st->i2c_master, DIB7000P, st->i2c_adap, st->i2c_addr);
2770
2771         /* init 7090 tuner adapter */
2772         strscpy(st->dib7090_tuner_adap.name, "DiB7090 tuner interface",
2773                 sizeof(st->dib7090_tuner_adap.name));
2774         st->dib7090_tuner_adap.algo = &dib7090_tuner_xfer_algo;
2775         st->dib7090_tuner_adap.algo_data = NULL;
2776         st->dib7090_tuner_adap.dev.parent = st->i2c_adap->dev.parent;
2777         i2c_set_adapdata(&st->dib7090_tuner_adap, st);
2778         i2c_add_adapter(&st->dib7090_tuner_adap);
2779
2780         dib7000p_demod_reset(st);
2781
2782         dib7000p_reset_stats(demod);
2783
2784         if (st->version == SOC7090) {
2785                 dib7090_set_output_mode(demod, st->cfg.output_mode);
2786                 dib7090_set_diversity_in(demod, 0);
2787         }
2788
2789         return demod;
2790
2791 error:
2792         kfree(st);
2793         return NULL;
2794 }
2795
2796 void *dib7000p_attach(struct dib7000p_ops *ops)
2797 {
2798         if (!ops)
2799                 return NULL;
2800
2801         ops->slave_reset = dib7090_slave_reset;
2802         ops->get_adc_power = dib7090_get_adc_power;
2803         ops->dib7000pc_detection = dib7000pc_detection;
2804         ops->get_i2c_tuner = dib7090_get_i2c_tuner;
2805         ops->tuner_sleep = dib7090_tuner_sleep;
2806         ops->init = dib7000p_init;
2807         ops->set_agc1_min = dib7000p_set_agc1_min;
2808         ops->set_gpio = dib7000p_set_gpio;
2809         ops->i2c_enumeration = dib7000p_i2c_enumeration;
2810         ops->pid_filter = dib7000p_pid_filter;
2811         ops->pid_filter_ctrl = dib7000p_pid_filter_ctrl;
2812         ops->get_i2c_master = dib7000p_get_i2c_master;
2813         ops->update_pll = dib7000p_update_pll;
2814         ops->ctrl_timf = dib7000p_ctrl_timf;
2815         ops->get_agc_values = dib7000p_get_agc_values;
2816         ops->set_wbd_ref = dib7000p_set_wbd_ref;
2817
2818         return ops;
2819 }
2820 EXPORT_SYMBOL_GPL(dib7000p_attach);
2821
2822 static const struct dvb_frontend_ops dib7000p_ops = {
2823         .delsys = { SYS_DVBT },
2824         .info = {
2825                  .name = "DiBcom 7000PC",
2826                  .frequency_min_hz =  44250 * kHz,
2827                  .frequency_max_hz = 867250 * kHz,
2828                  .frequency_stepsize_hz = 62500,
2829                  .caps = FE_CAN_INVERSION_AUTO |
2830                  FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
2831                  FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
2832                  FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
2833                  FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_RECOVER | FE_CAN_HIERARCHY_AUTO,
2834                  },
2835
2836         .release = dib7000p_release,
2837
2838         .init = dib7000p_wakeup,
2839         .sleep = dib7000p_sleep,
2840
2841         .set_frontend = dib7000p_set_frontend,
2842         .get_tune_settings = dib7000p_fe_get_tune_settings,
2843         .get_frontend = dib7000p_get_frontend,
2844
2845         .read_status = dib7000p_read_status,
2846         .read_ber = dib7000p_read_ber,
2847         .read_signal_strength = dib7000p_read_signal_strength,
2848         .read_snr = dib7000p_read_snr,
2849         .read_ucblocks = dib7000p_read_unc_blocks,
2850 };
2851
2852 MODULE_AUTHOR("Olivier Grenie <[email protected]>");
2853 MODULE_AUTHOR("Patrick Boettcher <[email protected]>");
2854 MODULE_DESCRIPTION("Driver for the DiBcom 7000PC COFDM demodulator");
2855 MODULE_LICENSE("GPL");
This page took 0.191931 seconds and 4 git commands to generate.