Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
dib8000.c
Go to the documentation of this file.
1 /*
2  * Linux-DVB Driver for DiBcom's DiB8000 chip (ISDB-T).
3  *
4  * Copyright (C) 2009 DiBcom (http://www.dibcom.fr/)
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation, version 2.
9  */
10 #include <linux/kernel.h>
11 #include <linux/slab.h>
12 #include <linux/i2c.h>
13 #include <linux/mutex.h>
14 
15 #include "dvb_math.h"
16 
17 #include "dvb_frontend.h"
18 
19 #include "dib8000.h"
20 
21 #define LAYER_ALL -1
22 #define LAYER_A 1
23 #define LAYER_B 2
24 #define LAYER_C 3
25 
26 #define FE_CALLBACK_TIME_NEVER 0xffffffff
27 #define MAX_NUMBER_OF_FRONTENDS 6
28 
29 static int debug;
30 module_param(debug, int, 0644);
31 MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
32 
33 #define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiB8000: "); printk(args); printk("\n"); } } while (0)
34 
35 #define FE_STATUS_TUNE_FAILED 0
36 
37 struct i2c_device {
38  struct i2c_adapter *adap;
43 };
44 
45 struct dib8000_state {
47 
48  struct i2c_device i2c;
49 
51 
53 
59 
63 
67 
71 
76 
78 
79  /* for the I2C transfer */
80  struct i2c_msg msg[2];
85 
88 };
89 
93 };
94 
95 static u16 dib8000_i2c_read16(struct i2c_device *i2c, u16 reg)
96 {
97  u16 ret;
98  struct i2c_msg msg[2] = {
99  {.addr = i2c->addr >> 1, .flags = 0, .len = 2},
100  {.addr = i2c->addr >> 1, .flags = I2C_M_RD, .len = 2},
101  };
102 
104  dprintk("could not acquire lock");
105  return 0;
106  }
107 
108  msg[0].buf = i2c->i2c_write_buffer;
109  msg[0].buf[0] = reg >> 8;
110  msg[0].buf[1] = reg & 0xff;
111  msg[1].buf = i2c->i2c_read_buffer;
112 
113  if (i2c_transfer(i2c->adap, msg, 2) != 2)
114  dprintk("i2c read error on %d", reg);
115 
116  ret = (msg[1].buf[0] << 8) | msg[1].buf[1];
118  return ret;
119 }
120 
121 static u16 dib8000_read_word(struct dib8000_state *state, u16 reg)
122 {
123  u16 ret;
124 
125  if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
126  dprintk("could not acquire lock");
127  return 0;
128  }
129 
130  state->i2c_write_buffer[0] = reg >> 8;
131  state->i2c_write_buffer[1] = reg & 0xff;
132 
133  memset(state->msg, 0, 2 * sizeof(struct i2c_msg));
134  state->msg[0].addr = state->i2c.addr >> 1;
135  state->msg[0].flags = 0;
136  state->msg[0].buf = state->i2c_write_buffer;
137  state->msg[0].len = 2;
138  state->msg[1].addr = state->i2c.addr >> 1;
139  state->msg[1].flags = I2C_M_RD;
140  state->msg[1].buf = state->i2c_read_buffer;
141  state->msg[1].len = 2;
142 
143  if (i2c_transfer(state->i2c.adap, state->msg, 2) != 2)
144  dprintk("i2c read error on %d", reg);
145 
146  ret = (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
147  mutex_unlock(&state->i2c_buffer_lock);
148 
149  return ret;
150 }
151 
152 static u32 dib8000_read32(struct dib8000_state *state, u16 reg)
153 {
154  u16 rw[2];
155 
156  rw[0] = dib8000_read_word(state, reg + 0);
157  rw[1] = dib8000_read_word(state, reg + 1);
158 
159  return ((rw[0] << 16) | (rw[1]));
160 }
161 
162 static int dib8000_i2c_write16(struct i2c_device *i2c, u16 reg, u16 val)
163 {
164  struct i2c_msg msg = {.addr = i2c->addr >> 1, .flags = 0, .len = 4};
165  int ret = 0;
166 
168  dprintk("could not acquire lock");
169  return -EINVAL;
170  }
171 
172  msg.buf = i2c->i2c_write_buffer;
173  msg.buf[0] = (reg >> 8) & 0xff;
174  msg.buf[1] = reg & 0xff;
175  msg.buf[2] = (val >> 8) & 0xff;
176  msg.buf[3] = val & 0xff;
177 
178  ret = i2c_transfer(i2c->adap, &msg, 1) != 1 ? -EREMOTEIO : 0;
180 
181  return ret;
182 }
183 
184 static int dib8000_write_word(struct dib8000_state *state, u16 reg, u16 val)
185 {
186  int ret;
187 
188  if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
189  dprintk("could not acquire lock");
190  return -EINVAL;
191  }
192 
193  state->i2c_write_buffer[0] = (reg >> 8) & 0xff;
194  state->i2c_write_buffer[1] = reg & 0xff;
195  state->i2c_write_buffer[2] = (val >> 8) & 0xff;
196  state->i2c_write_buffer[3] = val & 0xff;
197 
198  memset(&state->msg[0], 0, sizeof(struct i2c_msg));
199  state->msg[0].addr = state->i2c.addr >> 1;
200  state->msg[0].flags = 0;
201  state->msg[0].buf = state->i2c_write_buffer;
202  state->msg[0].len = 4;
203 
204  ret = (i2c_transfer(state->i2c.adap, state->msg, 1) != 1 ?
205  -EREMOTEIO : 0);
206  mutex_unlock(&state->i2c_buffer_lock);
207 
208  return ret;
209 }
210 
211 static const s16 coeff_2k_sb_1seg_dqpsk[8] = {
212  (769 << 5) | 0x0a, (745 << 5) | 0x03, (595 << 5) | 0x0d, (769 << 5) | 0x0a, (920 << 5) | 0x09, (784 << 5) | 0x02, (519 << 5) | 0x0c,
213  (920 << 5) | 0x09
214 };
215 
216 static const s16 coeff_2k_sb_1seg[8] = {
217  (692 << 5) | 0x0b, (683 << 5) | 0x01, (519 << 5) | 0x09, (692 << 5) | 0x0b, 0 | 0x1f, 0 | 0x1f, 0 | 0x1f, 0 | 0x1f
218 };
219 
220 static const s16 coeff_2k_sb_3seg_0dqpsk_1dqpsk[8] = {
221  (832 << 5) | 0x10, (912 << 5) | 0x05, (900 << 5) | 0x12, (832 << 5) | 0x10, (-931 << 5) | 0x0f, (912 << 5) | 0x04, (807 << 5) | 0x11,
222  (-931 << 5) | 0x0f
223 };
224 
225 static const s16 coeff_2k_sb_3seg_0dqpsk[8] = {
226  (622 << 5) | 0x0c, (941 << 5) | 0x04, (796 << 5) | 0x10, (622 << 5) | 0x0c, (982 << 5) | 0x0c, (519 << 5) | 0x02, (572 << 5) | 0x0e,
227  (982 << 5) | 0x0c
228 };
229 
230 static const s16 coeff_2k_sb_3seg_1dqpsk[8] = {
231  (699 << 5) | 0x14, (607 << 5) | 0x04, (944 << 5) | 0x13, (699 << 5) | 0x14, (-720 << 5) | 0x0d, (640 << 5) | 0x03, (866 << 5) | 0x12,
232  (-720 << 5) | 0x0d
233 };
234 
235 static const s16 coeff_2k_sb_3seg[8] = {
236  (664 << 5) | 0x0c, (925 << 5) | 0x03, (937 << 5) | 0x10, (664 << 5) | 0x0c, (-610 << 5) | 0x0a, (697 << 5) | 0x01, (836 << 5) | 0x0e,
237  (-610 << 5) | 0x0a
238 };
239 
240 static const s16 coeff_4k_sb_1seg_dqpsk[8] = {
241  (-955 << 5) | 0x0e, (687 << 5) | 0x04, (818 << 5) | 0x10, (-955 << 5) | 0x0e, (-922 << 5) | 0x0d, (750 << 5) | 0x03, (665 << 5) | 0x0f,
242  (-922 << 5) | 0x0d
243 };
244 
245 static const s16 coeff_4k_sb_1seg[8] = {
246  (638 << 5) | 0x0d, (683 << 5) | 0x02, (638 << 5) | 0x0d, (638 << 5) | 0x0d, (-655 << 5) | 0x0a, (517 << 5) | 0x00, (698 << 5) | 0x0d,
247  (-655 << 5) | 0x0a
248 };
249 
250 static const s16 coeff_4k_sb_3seg_0dqpsk_1dqpsk[8] = {
251  (-707 << 5) | 0x14, (910 << 5) | 0x06, (889 << 5) | 0x16, (-707 << 5) | 0x14, (-958 << 5) | 0x13, (993 << 5) | 0x05, (523 << 5) | 0x14,
252  (-958 << 5) | 0x13
253 };
254 
255 static const s16 coeff_4k_sb_3seg_0dqpsk[8] = {
256  (-723 << 5) | 0x13, (910 << 5) | 0x05, (777 << 5) | 0x14, (-723 << 5) | 0x13, (-568 << 5) | 0x0f, (547 << 5) | 0x03, (696 << 5) | 0x12,
257  (-568 << 5) | 0x0f
258 };
259 
260 static const s16 coeff_4k_sb_3seg_1dqpsk[8] = {
261  (-940 << 5) | 0x15, (607 << 5) | 0x05, (915 << 5) | 0x16, (-940 << 5) | 0x15, (-848 << 5) | 0x13, (683 << 5) | 0x04, (543 << 5) | 0x14,
262  (-848 << 5) | 0x13
263 };
264 
265 static const s16 coeff_4k_sb_3seg[8] = {
266  (612 << 5) | 0x12, (910 << 5) | 0x04, (864 << 5) | 0x14, (612 << 5) | 0x12, (-869 << 5) | 0x13, (683 << 5) | 0x02, (869 << 5) | 0x12,
267  (-869 << 5) | 0x13
268 };
269 
270 static const s16 coeff_8k_sb_1seg_dqpsk[8] = {
271  (-835 << 5) | 0x12, (684 << 5) | 0x05, (735 << 5) | 0x14, (-835 << 5) | 0x12, (-598 << 5) | 0x10, (781 << 5) | 0x04, (739 << 5) | 0x13,
272  (-598 << 5) | 0x10
273 };
274 
275 static const s16 coeff_8k_sb_1seg[8] = {
276  (673 << 5) | 0x0f, (683 << 5) | 0x03, (808 << 5) | 0x12, (673 << 5) | 0x0f, (585 << 5) | 0x0f, (512 << 5) | 0x01, (780 << 5) | 0x0f,
277  (585 << 5) | 0x0f
278 };
279 
280 static const s16 coeff_8k_sb_3seg_0dqpsk_1dqpsk[8] = {
281  (863 << 5) | 0x17, (930 << 5) | 0x07, (878 << 5) | 0x19, (863 << 5) | 0x17, (0 << 5) | 0x14, (521 << 5) | 0x05, (980 << 5) | 0x18,
282  (0 << 5) | 0x14
283 };
284 
285 static const s16 coeff_8k_sb_3seg_0dqpsk[8] = {
286  (-924 << 5) | 0x17, (910 << 5) | 0x06, (774 << 5) | 0x17, (-924 << 5) | 0x17, (-877 << 5) | 0x15, (565 << 5) | 0x04, (553 << 5) | 0x15,
287  (-877 << 5) | 0x15
288 };
289 
290 static const s16 coeff_8k_sb_3seg_1dqpsk[8] = {
291  (-921 << 5) | 0x19, (607 << 5) | 0x06, (881 << 5) | 0x19, (-921 << 5) | 0x19, (-921 << 5) | 0x14, (713 << 5) | 0x05, (1018 << 5) | 0x18,
292  (-921 << 5) | 0x14
293 };
294 
295 static const s16 coeff_8k_sb_3seg[8] = {
296  (514 << 5) | 0x14, (910 << 5) | 0x05, (861 << 5) | 0x17, (514 << 5) | 0x14, (690 << 5) | 0x14, (683 << 5) | 0x03, (662 << 5) | 0x15,
297  (690 << 5) | 0x14
298 };
299 
300 static const s16 ana_fe_coeff_3seg[24] = {
301  81, 80, 78, 74, 68, 61, 54, 45, 37, 28, 19, 11, 4, 1022, 1017, 1013, 1010, 1008, 1008, 1008, 1008, 1010, 1014, 1017
302 };
303 
304 static const s16 ana_fe_coeff_1seg[24] = {
305  249, 226, 164, 82, 5, 981, 970, 988, 1018, 20, 31, 26, 8, 1012, 1000, 1018, 1012, 8, 15, 14, 9, 3, 1017, 1003
306 };
307 
308 static const s16 ana_fe_coeff_13seg[24] = {
309  396, 305, 105, -51, -77, -12, 41, 31, -11, -30, -11, 14, 15, -2, -13, -7, 5, 8, 1, -6, -7, -3, 0, 1
310 };
311 
312 static u16 fft_to_mode(struct dib8000_state *state)
313 {
314  u16 mode;
315  switch (state->fe[0]->dtv_property_cache.transmission_mode) {
317  mode = 1;
318  break;
320  mode = 2;
321  break;
322  default:
325  mode = 3;
326  break;
327  }
328  return mode;
329 }
330 
331 static void dib8000_set_acquisition_mode(struct dib8000_state *state)
332 {
333  u16 nud = dib8000_read_word(state, 298);
334  nud |= (1 << 3) | (1 << 0);
335  dprintk("acquisition mode activated");
336  dib8000_write_word(state, 298, nud);
337 }
338 static int dib8000_set_output_mode(struct dvb_frontend *fe, int mode)
339 {
340  struct dib8000_state *state = fe->demodulator_priv;
341 
342  u16 outreg, fifo_threshold, smo_mode, sram = 0x0205; /* by default SDRAM deintlv is enabled */
343 
344  outreg = 0;
345  fifo_threshold = 1792;
346  smo_mode = (dib8000_read_word(state, 299) & 0x0050) | (1 << 1);
347 
348  dprintk("-I- Setting output mode for demod %p to %d",
349  &state->fe[0], mode);
350 
351  switch (mode) {
352  case OUTMODE_MPEG2_PAR_GATED_CLK: // STBs with parallel gated clock
353  outreg = (1 << 10); /* 0x0400 */
354  break;
355  case OUTMODE_MPEG2_PAR_CONT_CLK: // STBs with parallel continues clock
356  outreg = (1 << 10) | (1 << 6); /* 0x0440 */
357  break;
358  case OUTMODE_MPEG2_SERIAL: // STBs with serial input
359  outreg = (1 << 10) | (2 << 6) | (0 << 1); /* 0x0482 */
360  break;
361  case OUTMODE_DIVERSITY:
362  if (state->cfg.hostbus_diversity) {
363  outreg = (1 << 10) | (4 << 6); /* 0x0500 */
364  sram &= 0xfdff;
365  } else
366  sram |= 0x0c00;
367  break;
368  case OUTMODE_MPEG2_FIFO: // e.g. USB feeding
369  smo_mode |= (3 << 1);
370  fifo_threshold = 512;
371  outreg = (1 << 10) | (5 << 6);
372  break;
373  case OUTMODE_HIGH_Z: // disable
374  outreg = 0;
375  break;
376 
377  case OUTMODE_ANALOG_ADC:
378  outreg = (1 << 10) | (3 << 6);
379  dib8000_set_acquisition_mode(state);
380  break;
381 
382  default:
383  dprintk("Unhandled output_mode passed to be set for demod %p",
384  &state->fe[0]);
385  return -EINVAL;
386  }
387 
388  if (state->cfg.output_mpeg2_in_188_bytes)
389  smo_mode |= (1 << 5);
390 
391  dib8000_write_word(state, 299, smo_mode);
392  dib8000_write_word(state, 300, fifo_threshold); /* synchronous fread */
393  dib8000_write_word(state, 1286, outreg);
394  dib8000_write_word(state, 1291, sram);
395 
396  return 0;
397 }
398 
399 static int dib8000_set_diversity_in(struct dvb_frontend *fe, int onoff)
400 {
401  struct dib8000_state *state = fe->demodulator_priv;
402  u16 sync_wait = dib8000_read_word(state, 273) & 0xfff0;
403 
404  if (!state->differential_constellation) {
405  dib8000_write_word(state, 272, 1 << 9); //dvsy_off_lmod4 = 1
406  dib8000_write_word(state, 273, sync_wait | (1 << 2) | 2); // sync_enable = 1; comb_mode = 2
407  } else {
408  dib8000_write_word(state, 272, 0); //dvsy_off_lmod4 = 0
409  dib8000_write_word(state, 273, sync_wait); // sync_enable = 0; comb_mode = 0
410  }
411  state->diversity_onoff = onoff;
412 
413  switch (onoff) {
414  case 0: /* only use the internal way - not the diversity input */
415  dib8000_write_word(state, 270, 1);
416  dib8000_write_word(state, 271, 0);
417  break;
418  case 1: /* both ways */
419  dib8000_write_word(state, 270, 6);
420  dib8000_write_word(state, 271, 6);
421  break;
422  case 2: /* only the diversity input */
423  dib8000_write_word(state, 270, 0);
424  dib8000_write_word(state, 271, 1);
425  break;
426  }
427  return 0;
428 }
429 
430 static void dib8000_set_power_mode(struct dib8000_state *state, enum dib8000_power_mode mode)
431 {
432  /* by default everything is going to be powered off */
433  u16 reg_774 = 0x3fff, reg_775 = 0xffff, reg_776 = 0xffff,
434  reg_900 = (dib8000_read_word(state, 900) & 0xfffc) | 0x3,
435  reg_1280;
436 
437  if (state->revision != 0x8090)
438  reg_1280 = (dib8000_read_word(state, 1280) & 0x00ff) | 0xff00;
439  else
440  reg_1280 = (dib8000_read_word(state, 1280) & 0x707f) | 0x8f80;
441 
442  /* now, depending on the requested mode, we power on */
443  switch (mode) {
444  /* power up everything in the demod */
445  case DIB8000_POWER_ALL:
446  reg_774 = 0x0000;
447  reg_775 = 0x0000;
448  reg_776 = 0x0000;
449  reg_900 &= 0xfffc;
450  if (state->revision != 0x8090)
451  reg_1280 &= 0x00ff;
452  else
453  reg_1280 &= 0x707f;
454  break;
456  if (state->revision != 0x8090)
457  reg_1280 &= 0x00ff;
458  else
459  reg_1280 &= 0xfa7b;
460  break;
461  }
462 
463  dprintk("powermode : 774 : %x ; 775 : %x; 776 : %x ; 900 : %x; 1280 : %x", reg_774, reg_775, reg_776, reg_900, reg_1280);
464  dib8000_write_word(state, 774, reg_774);
465  dib8000_write_word(state, 775, reg_775);
466  dib8000_write_word(state, 776, reg_776);
467  dib8000_write_word(state, 900, reg_900);
468  dib8000_write_word(state, 1280, reg_1280);
469 }
470 
471 static int dib8000_init_sdram(struct dib8000_state *state)
472 {
473  u16 reg = 0;
474  dprintk("Init sdram");
475 
476  reg = dib8000_read_word(state, 274)&0xfff0;
477  /* P_dintlv_delay_ram = 7 because of MobileSdram */
478  dib8000_write_word(state, 274, reg | 0x7);
479 
480  dib8000_write_word(state, 1803, (7<<2));
481 
482  reg = dib8000_read_word(state, 1280);
483  /* force restart P_restart_sdram */
484  dib8000_write_word(state, 1280, reg | (1<<2));
485 
486  /* release restart P_restart_sdram */
487  dib8000_write_word(state, 1280, reg);
488 
489  return 0;
490 }
491 
492 static int dib8000_set_adc_state(struct dib8000_state *state, enum dibx000_adc_states no)
493 {
494  int ret = 0;
495  u16 reg, reg_907 = dib8000_read_word(state, 907);
496  u16 reg_908 = dib8000_read_word(state, 908);
497 
498  switch (no) {
499  case DIBX000_SLOW_ADC_ON:
500  if (state->revision != 0x8090) {
501  reg_908 |= (1 << 1) | (1 << 0);
502  ret |= dib8000_write_word(state, 908, reg_908);
503  reg_908 &= ~(1 << 1);
504  } else {
505  reg = dib8000_read_word(state, 1925);
506  /* en_slowAdc = 1 & reset_sladc = 1 */
507  dib8000_write_word(state, 1925, reg |
508  (1<<4) | (1<<2));
509 
510  /* read acces to make it works... strange ... */
511  reg = dib8000_read_word(state, 1925);
512  msleep(20);
513  /* en_slowAdc = 1 & reset_sladc = 0 */
514  dib8000_write_word(state, 1925, reg & ~(1<<4));
515 
516  reg = dib8000_read_word(state, 921) & ~((0x3 << 14)
517  | (0x3 << 12));
518  /* ref = Vin1 => Vbg ; sel = Vin0 or Vin3 ;
519  (Vin2 = Vcm) */
520  dib8000_write_word(state, 921, reg | (1 << 14)
521  | (3 << 12));
522  }
523  break;
524 
526  if (state->revision == 0x8090) {
527  reg = dib8000_read_word(state, 1925);
528  /* reset_sladc = 1 en_slowAdc = 0 */
529  dib8000_write_word(state, 1925,
530  (reg & ~(1<<2)) | (1<<4));
531  }
532  reg_908 |= (1 << 1) | (1 << 0);
533  break;
534 
535  case DIBX000_ADC_ON:
536  reg_907 &= 0x0fff;
537  reg_908 &= 0x0003;
538  break;
539 
540  case DIBX000_ADC_OFF: // leave the VBG voltage on
541  reg_907 |= (1 << 14) | (1 << 13) | (1 << 12);
542  reg_908 |= (1 << 5) | (1 << 4) | (1 << 3) | (1 << 2);
543  break;
544 
545  case DIBX000_VBG_ENABLE:
546  reg_907 &= ~(1 << 15);
547  break;
548 
549  case DIBX000_VBG_DISABLE:
550  reg_907 |= (1 << 15);
551  break;
552 
553  default:
554  break;
555  }
556 
557  ret |= dib8000_write_word(state, 907, reg_907);
558  ret |= dib8000_write_word(state, 908, reg_908);
559 
560  return ret;
561 }
562 
563 static int dib8000_set_bandwidth(struct dvb_frontend *fe, u32 bw)
564 {
565  struct dib8000_state *state = fe->demodulator_priv;
566  u32 timf;
567 
568  if (bw == 0)
569  bw = 6000;
570 
571  if (state->timf == 0) {
572  dprintk("using default timf");
573  timf = state->timf_default;
574  } else {
575  dprintk("using updated timf");
576  timf = state->timf;
577  }
578 
579  dib8000_write_word(state, 29, (u16) ((timf >> 16) & 0xffff));
580  dib8000_write_word(state, 30, (u16) ((timf) & 0xffff));
581 
582  return 0;
583 }
584 
585 static int dib8000_sad_calib(struct dib8000_state *state)
586 {
587  if (state->revision == 0x8090) {
588  dprintk("%s: the sad calibration is not needed for the dib8096P",
589  __func__);
590  return 0;
591  }
592  /* internal */
593  dib8000_write_word(state, 923, (0 << 1) | (0 << 0));
594  dib8000_write_word(state, 924, 776); // 0.625*3.3 / 4096
595 
596  /* do the calibration */
597  dib8000_write_word(state, 923, (1 << 0));
598  dib8000_write_word(state, 923, (0 << 0));
599 
600  msleep(1);
601  return 0;
602 }
603 
605 {
606  struct dib8000_state *state = fe->demodulator_priv;
607  if (value > 4095)
608  value = 4095;
609  state->wbd_ref = value;
610  return dib8000_write_word(state, 106, value);
611 }
612 
614 static void dib8000_reset_pll_common(struct dib8000_state *state, const struct dibx000_bandwidth_config *bw)
615 {
616  dprintk("ifreq: %d %x, inversion: %d", bw->ifreq, bw->ifreq, bw->ifreq >> 25);
617  if (state->revision != 0x8090) {
618  dib8000_write_word(state, 23,
619  (u16) (((bw->internal * 1000) >> 16) & 0xffff));
620  dib8000_write_word(state, 24,
621  (u16) ((bw->internal * 1000) & 0xffff));
622  } else {
623  dib8000_write_word(state, 23, (u16) (((bw->internal / 2 * 1000) >> 16) & 0xffff));
624  dib8000_write_word(state, 24,
625  (u16) ((bw->internal / 2 * 1000) & 0xffff));
626  }
627  dib8000_write_word(state, 27, (u16) ((bw->ifreq >> 16) & 0x01ff));
628  dib8000_write_word(state, 28, (u16) (bw->ifreq & 0xffff));
629  dib8000_write_word(state, 26, (u16) ((bw->ifreq >> 25) & 0x0003));
630 
631  if (state->revision != 0x8090)
632  dib8000_write_word(state, 922, bw->sad_cfg);
633 }
634 
635 static void dib8000_reset_pll(struct dib8000_state *state)
636 {
637  const struct dibx000_bandwidth_config *pll = state->cfg.pll;
638  u16 clk_cfg1, reg;
639 
640  if (state->revision != 0x8090) {
641  dib8000_write_word(state, 901,
642  (pll->pll_prediv << 8) | (pll->pll_ratio << 0));
643 
644  clk_cfg1 = (1 << 10) | (0 << 9) | (pll->IO_CLK_en_core << 8) |
645  (pll->bypclk_div << 5) | (pll->enable_refdiv << 4) |
646  (1 << 3) | (pll->pll_range << 1) |
647  (pll->pll_reset << 0);
648 
649  dib8000_write_word(state, 902, clk_cfg1);
650  clk_cfg1 = (clk_cfg1 & 0xfff7) | (pll->pll_bypass << 3);
651  dib8000_write_word(state, 902, clk_cfg1);
652 
653  dprintk("clk_cfg1: 0x%04x", clk_cfg1);
654 
655  /* smpl_cfg: P_refclksel=2, P_ensmplsel=1 nodivsmpl=1 */
656  if (state->cfg.pll->ADClkSrc == 0)
657  dib8000_write_word(state, 904,
658  (0 << 15) | (0 << 12) | (0 << 10) |
659  (pll->modulo << 8) |
660  (pll->ADClkSrc << 7) | (0 << 1));
661  else if (state->cfg.refclksel != 0)
662  dib8000_write_word(state, 904, (0 << 15) | (1 << 12) |
663  ((state->cfg.refclksel & 0x3) << 10) |
664  (pll->modulo << 8) |
665  (pll->ADClkSrc << 7) | (0 << 1));
666  else
667  dib8000_write_word(state, 904, (0 << 15) | (1 << 12) |
668  (3 << 10) | (pll->modulo << 8) |
669  (pll->ADClkSrc << 7) | (0 << 1));
670  } else {
671  dib8000_write_word(state, 1856, (!pll->pll_reset<<13) |
672  (pll->pll_range<<12) | (pll->pll_ratio<<6) |
673  (pll->pll_prediv));
674 
675  reg = dib8000_read_word(state, 1857);
676  dib8000_write_word(state, 1857, reg|(!pll->pll_bypass<<15));
677 
678  reg = dib8000_read_word(state, 1858); /* Force clk out pll /2 */
679  dib8000_write_word(state, 1858, reg | 1);
680 
681  dib8000_write_word(state, 904, (pll->modulo << 8));
682  }
683 
684  dib8000_reset_pll_common(state, pll);
685 }
686 
688  struct dibx000_bandwidth_config *pll)
689 {
690  struct dib8000_state *state = fe->demodulator_priv;
691  u16 reg_1857, reg_1856 = dib8000_read_word(state, 1856);
692  u8 loopdiv, prediv;
693  u32 internal, xtal;
694 
695  /* get back old values */
696  prediv = reg_1856 & 0x3f;
697  loopdiv = (reg_1856 >> 6) & 0x3f;
698 
699  if ((pll != NULL) && (pll->pll_prediv != prediv ||
700  pll->pll_ratio != loopdiv)) {
701  dprintk("Updating pll (prediv: old = %d new = %d ; loopdiv : old = %d new = %d)", prediv, pll->pll_prediv, loopdiv, pll->pll_ratio);
702  reg_1856 &= 0xf000;
703  reg_1857 = dib8000_read_word(state, 1857);
704  /* disable PLL */
705  dib8000_write_word(state, 1857, reg_1857 & ~(1 << 15));
706 
707  dib8000_write_word(state, 1856, reg_1856 |
708  ((pll->pll_ratio & 0x3f) << 6) |
709  (pll->pll_prediv & 0x3f));
710 
711  /* write new system clk into P_sec_len */
712  internal = dib8000_read32(state, 23) / 1000;
713  dprintk("Old Internal = %d", internal);
714  xtal = 2 * (internal / loopdiv) * prediv;
715  internal = 1000 * (xtal/pll->pll_prediv) * pll->pll_ratio;
716  dprintk("Xtal = %d , New Fmem = %d New Fdemod = %d, New Fsampling = %d", xtal, internal/1000, internal/2000, internal/8000);
717  dprintk("New Internal = %d", internal);
718 
719  dib8000_write_word(state, 23,
720  (u16) (((internal / 2) >> 16) & 0xffff));
721  dib8000_write_word(state, 24, (u16) ((internal / 2) & 0xffff));
722  /* enable PLL */
723  dib8000_write_word(state, 1857, reg_1857 | (1 << 15));
724 
725  while (((dib8000_read_word(state, 1856)>>15)&0x1) != 1)
726  dprintk("Waiting for PLL to lock");
727 
728  /* verify */
729  reg_1856 = dib8000_read_word(state, 1856);
730  dprintk("PLL Updated with prediv = %d and loopdiv = %d",
731  reg_1856&0x3f, (reg_1856>>6)&0x3f);
732 
733  return 0;
734  }
735  return -EINVAL;
736 }
738 
739 
740 static int dib8000_reset_gpio(struct dib8000_state *st)
741 {
742  /* reset the GPIOs */
743  dib8000_write_word(st, 1029, st->cfg.gpio_dir);
744  dib8000_write_word(st, 1030, st->cfg.gpio_val);
745 
746  /* TODO 782 is P_gpio_od */
747 
748  dib8000_write_word(st, 1032, st->cfg.gpio_pwm_pos);
749 
750  dib8000_write_word(st, 1037, st->cfg.pwm_freq_div);
751  return 0;
752 }
753 
754 static int dib8000_cfg_gpio(struct dib8000_state *st, u8 num, u8 dir, u8 val)
755 {
756  st->cfg.gpio_dir = dib8000_read_word(st, 1029);
757  st->cfg.gpio_dir &= ~(1 << num); /* reset the direction bit */
758  st->cfg.gpio_dir |= (dir & 0x1) << num; /* set the new direction */
759  dib8000_write_word(st, 1029, st->cfg.gpio_dir);
760 
761  st->cfg.gpio_val = dib8000_read_word(st, 1030);
762  st->cfg.gpio_val &= ~(1 << num); /* reset the direction bit */
763  st->cfg.gpio_val |= (val & 0x01) << num; /* set the new value */
764  dib8000_write_word(st, 1030, st->cfg.gpio_val);
765 
766  dprintk("gpio dir: %x: gpio val: %x", st->cfg.gpio_dir, st->cfg.gpio_val);
767 
768  return 0;
769 }
770 
771 int dib8000_set_gpio(struct dvb_frontend *fe, u8 num, u8 dir, u8 val)
772 {
773  struct dib8000_state *state = fe->demodulator_priv;
774  return dib8000_cfg_gpio(state, num, dir, val);
775 }
776 
778 static const u16 dib8000_defaults[] = {
779  /* auto search configuration - lock0 by default waiting
780  * for cpil_lock; lock1 cpil_lock; lock2 tmcc_sync_lock */
781  3, 7,
782  0x0004,
783  0x0400,
784  0x0814,
785 
786  12, 11,
787  0x001b,
788  0x7740,
789  0x005b,
790  0x8d80,
791  0x01c9,
792  0xc380,
793  0x0000,
794  0x0080,
795  0x0000,
796  0x0090,
797  0x0001,
798  0xd4c0,
799 
800  /*1, 32,
801  0x6680 // P_corm_thres Lock algorithms configuration */
802 
803  11, 80, /* set ADC level to -16 */
804  (1 << 13) - 825 - 117,
805  (1 << 13) - 837 - 117,
806  (1 << 13) - 811 - 117,
807  (1 << 13) - 766 - 117,
808  (1 << 13) - 737 - 117,
809  (1 << 13) - 693 - 117,
810  (1 << 13) - 648 - 117,
811  (1 << 13) - 619 - 117,
812  (1 << 13) - 575 - 117,
813  (1 << 13) - 531 - 117,
814  (1 << 13) - 501 - 117,
815 
816  4, 108,
817  0,
818  0,
819  0,
820  0,
821 
822  1, 175,
823  0x0410,
824  1, 179,
825  8192, // P_fft_nb_to_cut
826 
827  6, 181,
828  0x2800, // P_coff_corthres_ ( 2k 4k 8k ) 0x2800
829  0x2800,
830  0x2800,
831  0x2800, // P_coff_cpilthres_ ( 2k 4k 8k ) 0x2800
832  0x2800,
833  0x2800,
834 
835  2, 193,
836  0x0666, // P_pha3_thres
837  0x0000, // P_cti_use_cpe, P_cti_use_prog
838 
839  2, 205,
840  0x200f, // P_cspu_regul, P_cspu_win_cut
841  0x000f, // P_des_shift_work
842 
843  5, 215,
844  0x023d, // P_adp_regul_cnt
845  0x00a4, // P_adp_noise_cnt
846  0x00a4, // P_adp_regul_ext
847  0x7ff0, // P_adp_noise_ext
848  0x3ccc, // P_adp_fil
849 
850  1, 230,
851  0x0000, // P_2d_byp_ti_num
852 
853  1, 263,
854  0x800, //P_equal_thres_wgn
855 
856  1, 268,
857  (2 << 9) | 39, // P_equal_ctrl_synchro, P_equal_speedmode
858 
859  1, 270,
860  0x0001, // P_div_lock0_wait
861  1, 285,
862  0x0020, //p_fec_
863  1, 299,
864  0x0062, /* P_smo_mode, P_smo_rs_discard, P_smo_fifo_flush, P_smo_pid_parse, P_smo_error_discard */
865 
866  1, 338,
867  (1 << 12) | // P_ctrl_corm_thres4pre_freq_inh=1
868  (1 << 10) |
869  (0 << 9) | /* P_ctrl_pre_freq_inh=0 */
870  (3 << 5) | /* P_ctrl_pre_freq_step=3 */
871  (1 << 0), /* P_pre_freq_win_len=1 */
872 
873  0,
874 };
875 
876 static u16 dib8000_identify(struct i2c_device *client)
877 {
878  u16 value;
879 
880  //because of glitches sometimes
881  value = dib8000_i2c_read16(client, 896);
882 
883  if ((value = dib8000_i2c_read16(client, 896)) != 0x01b3) {
884  dprintk("wrong Vendor ID (read=0x%x)", value);
885  return 0;
886  }
887 
888  value = dib8000_i2c_read16(client, 897);
889  if (value != 0x8000 && value != 0x8001 &&
890  value != 0x8002 && value != 0x8090) {
891  dprintk("wrong Device ID (%x)", value);
892  return 0;
893  }
894 
895  switch (value) {
896  case 0x8000:
897  dprintk("found DiB8000A");
898  break;
899  case 0x8001:
900  dprintk("found DiB8000B");
901  break;
902  case 0x8002:
903  dprintk("found DiB8000C");
904  break;
905  case 0x8090:
906  dprintk("found DiB8096P");
907  break;
908  }
909  return value;
910 }
911 
912 static int dib8000_reset(struct dvb_frontend *fe)
913 {
914  struct dib8000_state *state = fe->demodulator_priv;
915 
916  if ((state->revision = dib8000_identify(&state->i2c)) == 0)
917  return -EINVAL;
918 
919  /* sram lead in, rdy */
920  if (state->revision != 0x8090)
921  dib8000_write_word(state, 1287, 0x0003);
922 
923  if (state->revision == 0x8000)
924  dprintk("error : dib8000 MA not supported");
925 
927 
928  dib8000_set_power_mode(state, DIB8000_POWER_ALL);
929 
930  /* always leave the VBG voltage on - it consumes almost nothing but takes a long time to start */
931  dib8000_set_adc_state(state, DIBX000_VBG_ENABLE);
932 
933  /* restart all parts */
934  dib8000_write_word(state, 770, 0xffff);
935  dib8000_write_word(state, 771, 0xffff);
936  dib8000_write_word(state, 772, 0xfffc);
937  if (state->revision == 0x8090)
938  dib8000_write_word(state, 1280, 0x0045);
939  else
940  dib8000_write_word(state, 1280, 0x004d);
941  dib8000_write_word(state, 1281, 0x000c);
942 
943  dib8000_write_word(state, 770, 0x0000);
944  dib8000_write_word(state, 771, 0x0000);
945  dib8000_write_word(state, 772, 0x0000);
946  dib8000_write_word(state, 898, 0x0004); // sad
947  dib8000_write_word(state, 1280, 0x0000);
948  dib8000_write_word(state, 1281, 0x0000);
949 
950  /* drives */
951  if (state->revision != 0x8090) {
952  if (state->cfg.drives)
953  dib8000_write_word(state, 906, state->cfg.drives);
954  else {
955  dprintk("using standard PAD-drive-settings, please adjust settings in config-struct to be optimal.");
956  /* min drive SDRAM - not optimal - adjust */
957  dib8000_write_word(state, 906, 0x2d98);
958  }
959  }
960 
961  dib8000_reset_pll(state);
962  if (state->revision != 0x8090)
963  dib8000_write_word(state, 898, 0x0004);
964 
965  if (dib8000_reset_gpio(state) != 0)
966  dprintk("GPIO reset was not successful.");
967 
968  if ((state->revision != 0x8090) &&
969  (dib8000_set_output_mode(fe, OUTMODE_HIGH_Z) != 0))
970  dprintk("OUTPUT_MODE could not be resetted.");
971 
972  state->current_agc = NULL;
973 
974  // P_iqc_alpha_pha, P_iqc_alpha_amp, P_iqc_dcc_alpha, ...
975  /* P_iqc_ca2 = 0; P_iqc_impnc_on = 0; P_iqc_mode = 0; */
976  if (state->cfg.pll->ifreq == 0)
977  dib8000_write_word(state, 40, 0x0755); /* P_iqc_corr_inh = 0 enable IQcorr block */
978  else
979  dib8000_write_word(state, 40, 0x1f55); /* P_iqc_corr_inh = 1 disable IQcorr block */
980 
981  {
982  u16 l = 0, r;
983  const u16 *n;
984  n = dib8000_defaults;
985  l = *n++;
986  while (l) {
987  r = *n++;
988  do {
989  dib8000_write_word(state, r, *n++);
990  r++;
991  } while (--l);
992  l = *n++;
993  }
994  }
995  if (state->revision != 0x8090)
996  dib8000_write_word(state, 903, (0 << 4) | 2);
997  state->isdbt_cfg_loaded = 0;
998 
999  //div_cfg override for special configs
1000  if (state->cfg.div_cfg != 0)
1001  dib8000_write_word(state, 903, state->cfg.div_cfg);
1002 
1003  /* unforce divstr regardless whether i2c enumeration was done or not */
1004  dib8000_write_word(state, 1285, dib8000_read_word(state, 1285) & ~(1 << 1));
1005 
1006  dib8000_set_bandwidth(fe, 6000);
1007 
1008  dib8000_set_adc_state(state, DIBX000_SLOW_ADC_ON);
1009  if (state->revision != 0x8090) {
1010  dib8000_sad_calib(state);
1011  dib8000_set_adc_state(state, DIBX000_SLOW_ADC_OFF);
1012  }
1013 
1014  dib8000_set_power_mode(state, DIB8000_POWER_INTERFACE_ONLY);
1015 
1016  return 0;
1017 }
1018 
1019 static void dib8000_restart_agc(struct dib8000_state *state)
1020 {
1021  // P_restart_iqc & P_restart_agc
1022  dib8000_write_word(state, 770, 0x0a00);
1023  dib8000_write_word(state, 770, 0x0000);
1024 }
1025 
1026 static int dib8000_update_lna(struct dib8000_state *state)
1027 {
1028  u16 dyn_gain;
1029 
1030  if (state->cfg.update_lna) {
1031  // read dyn_gain here (because it is demod-dependent and not tuner)
1032  dyn_gain = dib8000_read_word(state, 390);
1033 
1034  if (state->cfg.update_lna(state->fe[0], dyn_gain)) {
1035  dib8000_restart_agc(state);
1036  return 1;
1037  }
1038  }
1039  return 0;
1040 }
1041 
1042 static int dib8000_set_agc_config(struct dib8000_state *state, u8 band)
1043 {
1044  struct dibx000_agc_config *agc = NULL;
1045  int i;
1046  u16 reg;
1047 
1048  if (state->current_band == band && state->current_agc != NULL)
1049  return 0;
1050  state->current_band = band;
1051 
1052  for (i = 0; i < state->cfg.agc_config_count; i++)
1053  if (state->cfg.agc[i].band_caps & band) {
1054  agc = &state->cfg.agc[i];
1055  break;
1056  }
1057 
1058  if (agc == NULL) {
1059  dprintk("no valid AGC configuration found for band 0x%02x", band);
1060  return -EINVAL;
1061  }
1062 
1063  state->current_agc = agc;
1064 
1065  /* AGC */
1066  dib8000_write_word(state, 76, agc->setup);
1067  dib8000_write_word(state, 77, agc->inv_gain);
1068  dib8000_write_word(state, 78, agc->time_stabiliz);
1069  dib8000_write_word(state, 101, (agc->alpha_level << 12) | agc->thlock);
1070 
1071  // Demod AGC loop configuration
1072  dib8000_write_word(state, 102, (agc->alpha_mant << 5) | agc->alpha_exp);
1073  dib8000_write_word(state, 103, (agc->beta_mant << 6) | agc->beta_exp);
1074 
1075  dprintk("WBD: ref: %d, sel: %d, active: %d, alpha: %d",
1076  state->wbd_ref != 0 ? state->wbd_ref : agc->wbd_ref, agc->wbd_sel, !agc->perform_agc_softsplit, agc->wbd_sel);
1077 
1078  /* AGC continued */
1079  if (state->wbd_ref != 0)
1080  dib8000_write_word(state, 106, state->wbd_ref);
1081  else // use default
1082  dib8000_write_word(state, 106, agc->wbd_ref);
1083 
1084  if (state->revision == 0x8090) {
1085  reg = dib8000_read_word(state, 922) & (0x3 << 2);
1086  dib8000_write_word(state, 922, reg | (agc->wbd_sel << 2));
1087  }
1088 
1089  dib8000_write_word(state, 107, (agc->wbd_alpha << 9) | (agc->perform_agc_softsplit << 8));
1090  dib8000_write_word(state, 108, agc->agc1_max);
1091  dib8000_write_word(state, 109, agc->agc1_min);
1092  dib8000_write_word(state, 110, agc->agc2_max);
1093  dib8000_write_word(state, 111, agc->agc2_min);
1094  dib8000_write_word(state, 112, (agc->agc1_pt1 << 8) | agc->agc1_pt2);
1095  dib8000_write_word(state, 113, (agc->agc1_slope1 << 8) | agc->agc1_slope2);
1096  dib8000_write_word(state, 114, (agc->agc2_pt1 << 8) | agc->agc2_pt2);
1097  dib8000_write_word(state, 115, (agc->agc2_slope1 << 8) | agc->agc2_slope2);
1098 
1099  dib8000_write_word(state, 75, agc->agc1_pt3);
1100  if (state->revision != 0x8090)
1101  dib8000_write_word(state, 923,
1102  (dib8000_read_word(state, 923) & 0xffe3) |
1103  (agc->wbd_inv << 4) | (agc->wbd_sel << 2));
1104 
1105  return 0;
1106 }
1107 
1109 {
1110  struct dib8000_state *state = fe->demodulator_priv;
1111  dib8000_set_adc_state(state, DIBX000_ADC_ON);
1112  dib8000_set_agc_config(state, (unsigned char)(BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000)));
1113 }
1115 
1116 static int dib8000_agc_soft_split(struct dib8000_state *state)
1117 {
1118  u16 agc, split_offset;
1119 
1120  if (!state->current_agc || !state->current_agc->perform_agc_softsplit || state->current_agc->split.max == 0)
1121  return FE_CALLBACK_TIME_NEVER;
1122 
1123  // n_agc_global
1124  agc = dib8000_read_word(state, 390);
1125 
1126  if (agc > state->current_agc->split.min_thres)
1127  split_offset = state->current_agc->split.min;
1128  else if (agc < state->current_agc->split.max_thres)
1129  split_offset = state->current_agc->split.max;
1130  else
1131  split_offset = state->current_agc->split.max *
1132  (agc - state->current_agc->split.min_thres) /
1133  (state->current_agc->split.max_thres - state->current_agc->split.min_thres);
1134 
1135  dprintk("AGC split_offset: %d", split_offset);
1136 
1137  // P_agc_force_split and P_agc_split_offset
1138  dib8000_write_word(state, 107, (dib8000_read_word(state, 107) & 0xff00) | split_offset);
1139  return 5000;
1140 }
1141 
1142 static int dib8000_agc_startup(struct dvb_frontend *fe)
1143 {
1144  struct dib8000_state *state = fe->demodulator_priv;
1145  enum frontend_tune_state *tune_state = &state->tune_state;
1146  int ret = 0;
1147  u16 reg, upd_demod_gain_period = 0x8000;
1148 
1149  switch (*tune_state) {
1150  case CT_AGC_START:
1151  // set power-up level: interf+analog+AGC
1152 
1153  if (state->revision != 0x8090)
1154  dib8000_set_adc_state(state, DIBX000_ADC_ON);
1155  else {
1156  dib8000_set_power_mode(state, DIB8000_POWER_ALL);
1157 
1158  reg = dib8000_read_word(state, 1947)&0xff00;
1159  dib8000_write_word(state, 1946,
1160  upd_demod_gain_period & 0xFFFF);
1161  /* bit 14 = enDemodGain */
1162  dib8000_write_word(state, 1947, reg | (1<<14) |
1163  ((upd_demod_gain_period >> 16) & 0xFF));
1164 
1165  /* enable adc i & q */
1166  reg = dib8000_read_word(state, 1920);
1167  dib8000_write_word(state, 1920, (reg | 0x3) &
1168  (~(1 << 7)));
1169  }
1170 
1171  if (dib8000_set_agc_config(state, (unsigned char)(BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000))) != 0) {
1172  *tune_state = CT_AGC_STOP;
1173  state->status = FE_STATUS_TUNE_FAILED;
1174  break;
1175  }
1176 
1177  ret = 70;
1178  *tune_state = CT_AGC_STEP_0;
1179  break;
1180 
1181  case CT_AGC_STEP_0:
1182  //AGC initialization
1183  if (state->cfg.agc_control)
1184  state->cfg.agc_control(fe, 1);
1185 
1186  dib8000_restart_agc(state);
1187 
1188  // wait AGC rough lock time
1189  ret = 50;
1190  *tune_state = CT_AGC_STEP_1;
1191  break;
1192 
1193  case CT_AGC_STEP_1:
1194  // wait AGC accurate lock time
1195  ret = 70;
1196 
1197  if (dib8000_update_lna(state))
1198  // wait only AGC rough lock time
1199  ret = 50;
1200  else
1201  *tune_state = CT_AGC_STEP_2;
1202  break;
1203 
1204  case CT_AGC_STEP_2:
1205  dib8000_agc_soft_split(state);
1206 
1207  if (state->cfg.agc_control)
1208  state->cfg.agc_control(fe, 0);
1209 
1210  *tune_state = CT_AGC_STOP;
1211  break;
1212  default:
1213  ret = dib8000_agc_soft_split(state);
1214  break;
1215  }
1216  return ret;
1217 
1218 }
1219 
1220 static void dib8096p_host_bus_drive(struct dib8000_state *state, u8 drive)
1221 {
1222  u16 reg;
1223 
1224  drive &= 0x7;
1225 
1226  /* drive host bus 2, 3, 4 */
1227  reg = dib8000_read_word(state, 1798) &
1228  ~(0x7 | (0x7 << 6) | (0x7 << 12));
1229  reg |= (drive<<12) | (drive<<6) | drive;
1230  dib8000_write_word(state, 1798, reg);
1231 
1232  /* drive host bus 5,6 */
1233  reg = dib8000_read_word(state, 1799) & ~((0x7 << 2) | (0x7 << 8));
1234  reg |= (drive<<8) | (drive<<2);
1235  dib8000_write_word(state, 1799, reg);
1236 
1237  /* drive host bus 7, 8, 9 */
1238  reg = dib8000_read_word(state, 1800) &
1239  ~(0x7 | (0x7 << 6) | (0x7 << 12));
1240  reg |= (drive<<12) | (drive<<6) | drive;
1241  dib8000_write_word(state, 1800, reg);
1242 
1243  /* drive host bus 10, 11 */
1244  reg = dib8000_read_word(state, 1801) & ~((0x7 << 2) | (0x7 << 8));
1245  reg |= (drive<<8) | (drive<<2);
1246  dib8000_write_word(state, 1801, reg);
1247 
1248  /* drive host bus 12, 13, 14 */
1249  reg = dib8000_read_word(state, 1802) &
1250  ~(0x7 | (0x7 << 6) | (0x7 << 12));
1251  reg |= (drive<<12) | (drive<<6) | drive;
1252  dib8000_write_word(state, 1802, reg);
1253 }
1254 
1255 static u32 dib8096p_calcSyncFreq(u32 P_Kin, u32 P_Kout,
1256  u32 insertExtSynchro, u32 syncSize)
1257 {
1258  u32 quantif = 3;
1259  u32 nom = (insertExtSynchro * P_Kin+syncSize);
1260  u32 denom = P_Kout;
1261  u32 syncFreq = ((nom << quantif) / denom);
1262 
1263  if ((syncFreq & ((1 << quantif) - 1)) != 0)
1264  syncFreq = (syncFreq >> quantif) + 1;
1265  else
1266  syncFreq = (syncFreq >> quantif);
1267 
1268  if (syncFreq != 0)
1269  syncFreq = syncFreq - 1;
1270 
1271  return syncFreq;
1272 }
1273 
1274 static void dib8096p_cfg_DibTx(struct dib8000_state *state, u32 P_Kin,
1275  u32 P_Kout, u32 insertExtSynchro, u32 synchroMode,
1276  u32 syncWord, u32 syncSize)
1277 {
1278  dprintk("Configure DibStream Tx");
1279 
1280  dib8000_write_word(state, 1615, 1);
1281  dib8000_write_word(state, 1603, P_Kin);
1282  dib8000_write_word(state, 1605, P_Kout);
1283  dib8000_write_word(state, 1606, insertExtSynchro);
1284  dib8000_write_word(state, 1608, synchroMode);
1285  dib8000_write_word(state, 1609, (syncWord >> 16) & 0xffff);
1286  dib8000_write_word(state, 1610, syncWord & 0xffff);
1287  dib8000_write_word(state, 1612, syncSize);
1288  dib8000_write_word(state, 1615, 0);
1289 }
1290 
1291 static void dib8096p_cfg_DibRx(struct dib8000_state *state, u32 P_Kin,
1292  u32 P_Kout, u32 synchroMode, u32 insertExtSynchro,
1293  u32 syncWord, u32 syncSize, u32 dataOutRate)
1294 {
1295  u32 syncFreq;
1296 
1297  dprintk("Configure DibStream Rx synchroMode = %d", synchroMode);
1298 
1299  if ((P_Kin != 0) && (P_Kout != 0)) {
1300  syncFreq = dib8096p_calcSyncFreq(P_Kin, P_Kout,
1301  insertExtSynchro, syncSize);
1302  dib8000_write_word(state, 1542, syncFreq);
1303  }
1304 
1305  dib8000_write_word(state, 1554, 1);
1306  dib8000_write_word(state, 1536, P_Kin);
1307  dib8000_write_word(state, 1537, P_Kout);
1308  dib8000_write_word(state, 1539, synchroMode);
1309  dib8000_write_word(state, 1540, (syncWord >> 16) & 0xffff);
1310  dib8000_write_word(state, 1541, syncWord & 0xffff);
1311  dib8000_write_word(state, 1543, syncSize);
1312  dib8000_write_word(state, 1544, dataOutRate);
1313  dib8000_write_word(state, 1554, 0);
1314 }
1315 
1316 static void dib8096p_enMpegMux(struct dib8000_state *state, int onoff)
1317 {
1318  u16 reg_1287;
1319 
1320  reg_1287 = dib8000_read_word(state, 1287);
1321 
1322  switch (onoff) {
1323  case 1:
1324  reg_1287 &= ~(1 << 8);
1325  break;
1326  case 0:
1327  reg_1287 |= (1 << 8);
1328  break;
1329  }
1330 
1331  dib8000_write_word(state, 1287, reg_1287);
1332 }
1333 
1334 static void dib8096p_configMpegMux(struct dib8000_state *state,
1335  u16 pulseWidth, u16 enSerialMode, u16 enSerialClkDiv2)
1336 {
1337  u16 reg_1287;
1338 
1339  dprintk("Enable Mpeg mux");
1340 
1341  dib8096p_enMpegMux(state, 0);
1342 
1343  /* If the input mode is MPEG do not divide the serial clock */
1344  if ((enSerialMode == 1) && (state->input_mode_mpeg == 1))
1345  enSerialClkDiv2 = 0;
1346 
1347  reg_1287 = ((pulseWidth & 0x1f) << 3) |
1348  ((enSerialMode & 0x1) << 2) | (enSerialClkDiv2 & 0x1);
1349  dib8000_write_word(state, 1287, reg_1287);
1350 
1351  dib8096p_enMpegMux(state, 1);
1352 }
1353 
1354 static void dib8096p_setDibTxMux(struct dib8000_state *state, int mode)
1355 {
1356  u16 reg_1288 = dib8000_read_word(state, 1288) & ~(0x7 << 7);
1357 
1358  switch (mode) {
1359  case MPEG_ON_DIBTX:
1360  dprintk("SET MPEG ON DIBSTREAM TX");
1361  dib8096p_cfg_DibTx(state, 8, 5, 0, 0, 0, 0);
1362  reg_1288 |= (1 << 9); break;
1363  case DIV_ON_DIBTX:
1364  dprintk("SET DIV_OUT ON DIBSTREAM TX");
1365  dib8096p_cfg_DibTx(state, 5, 5, 0, 0, 0, 0);
1366  reg_1288 |= (1 << 8); break;
1367  case ADC_ON_DIBTX:
1368  dprintk("SET ADC_OUT ON DIBSTREAM TX");
1369  dib8096p_cfg_DibTx(state, 20, 5, 10, 0, 0, 0);
1370  reg_1288 |= (1 << 7); break;
1371  default:
1372  break;
1373  }
1374  dib8000_write_word(state, 1288, reg_1288);
1375 }
1376 
1377 static void dib8096p_setHostBusMux(struct dib8000_state *state, int mode)
1378 {
1379  u16 reg_1288 = dib8000_read_word(state, 1288) & ~(0x7 << 4);
1380 
1381  switch (mode) {
1382  case DEMOUT_ON_HOSTBUS:
1383  dprintk("SET DEM OUT OLD INTERF ON HOST BUS");
1384  dib8096p_enMpegMux(state, 0);
1385  reg_1288 |= (1 << 6);
1386  break;
1387  case DIBTX_ON_HOSTBUS:
1388  dprintk("SET DIBSTREAM TX ON HOST BUS");
1389  dib8096p_enMpegMux(state, 0);
1390  reg_1288 |= (1 << 5);
1391  break;
1392  case MPEG_ON_HOSTBUS:
1393  dprintk("SET MPEG MUX ON HOST BUS");
1394  reg_1288 |= (1 << 4);
1395  break;
1396  default:
1397  break;
1398  }
1399  dib8000_write_word(state, 1288, reg_1288);
1400 }
1401 
1402 static int dib8096p_set_diversity_in(struct dvb_frontend *fe, int onoff)
1403 {
1404  struct dib8000_state *state = fe->demodulator_priv;
1405  u16 reg_1287;
1406 
1407  switch (onoff) {
1408  case 0: /* only use the internal way - not the diversity input */
1409  dprintk("%s mode OFF : by default Enable Mpeg INPUT",
1410  __func__);
1411  /* outputRate = 8 */
1412  dib8096p_cfg_DibRx(state, 8, 5, 0, 0, 0, 8, 0);
1413 
1414  /* Do not divide the serial clock of MPEG MUX in
1415  SERIAL MODE in case input mode MPEG is used */
1416  reg_1287 = dib8000_read_word(state, 1287);
1417  /* enSerialClkDiv2 == 1 ? */
1418  if ((reg_1287 & 0x1) == 1) {
1419  /* force enSerialClkDiv2 = 0 */
1420  reg_1287 &= ~0x1;
1421  dib8000_write_word(state, 1287, reg_1287);
1422  }
1423  state->input_mode_mpeg = 1;
1424  break;
1425  case 1: /* both ways */
1426  case 2: /* only the diversity input */
1427  dprintk("%s ON : Enable diversity INPUT", __func__);
1428  dib8096p_cfg_DibRx(state, 5, 5, 0, 0, 0, 0, 0);
1429  state->input_mode_mpeg = 0;
1430  break;
1431  }
1432 
1433  dib8000_set_diversity_in(state->fe[0], onoff);
1434  return 0;
1435 }
1436 
1437 static int dib8096p_set_output_mode(struct dvb_frontend *fe, int mode)
1438 {
1439  struct dib8000_state *state = fe->demodulator_priv;
1440  u16 outreg, smo_mode, fifo_threshold;
1441  u8 prefer_mpeg_mux_use = 1;
1442  int ret = 0;
1443 
1444  dib8096p_host_bus_drive(state, 1);
1445 
1446  fifo_threshold = 1792;
1447  smo_mode = (dib8000_read_word(state, 299) & 0x0050) | (1 << 1);
1448  outreg = dib8000_read_word(state, 1286) &
1449  ~((1 << 10) | (0x7 << 6) | (1 << 1));
1450 
1451  switch (mode) {
1452  case OUTMODE_HIGH_Z:
1453  outreg = 0;
1454  break;
1455 
1456  case OUTMODE_MPEG2_SERIAL:
1457  if (prefer_mpeg_mux_use) {
1458  dprintk("dib8096P setting output mode TS_SERIAL using Mpeg Mux");
1459  dib8096p_configMpegMux(state, 3, 1, 1);
1460  dib8096p_setHostBusMux(state, MPEG_ON_HOSTBUS);
1461  } else {/* Use Smooth block */
1462  dprintk("dib8096P setting output mode TS_SERIAL using Smooth bloc");
1463  dib8096p_setHostBusMux(state,
1465  outreg |= (2 << 6) | (0 << 1);
1466  }
1467  break;
1468 
1470  if (prefer_mpeg_mux_use) {
1471  dprintk("dib8096P setting output mode TS_PARALLEL_GATED using Mpeg Mux");
1472  dib8096p_configMpegMux(state, 2, 0, 0);
1473  dib8096p_setHostBusMux(state, MPEG_ON_HOSTBUS);
1474  } else { /* Use Smooth block */
1475  dprintk("dib8096P setting output mode TS_PARALLEL_GATED using Smooth block");
1476  dib8096p_setHostBusMux(state,
1478  outreg |= (0 << 6);
1479  }
1480  break;
1481 
1482  case OUTMODE_MPEG2_PAR_CONT_CLK: /* Using Smooth block only */
1483  dprintk("dib8096P setting output mode TS_PARALLEL_CONT using Smooth block");
1484  dib8096p_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
1485  outreg |= (1 << 6);
1486  break;
1487 
1488  case OUTMODE_MPEG2_FIFO:
1489  /* Using Smooth block because not supported
1490  by new Mpeg Mux bloc */
1491  dprintk("dib8096P setting output mode TS_FIFO using Smooth block");
1492  dib8096p_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
1493  outreg |= (5 << 6);
1494  smo_mode |= (3 << 1);
1495  fifo_threshold = 512;
1496  break;
1497 
1498  case OUTMODE_DIVERSITY:
1499  dprintk("dib8096P setting output mode MODE_DIVERSITY");
1500  dib8096p_setDibTxMux(state, DIV_ON_DIBTX);
1501  dib8096p_setHostBusMux(state, DIBTX_ON_HOSTBUS);
1502  break;
1503 
1504  case OUTMODE_ANALOG_ADC:
1505  dprintk("dib8096P setting output mode MODE_ANALOG_ADC");
1506  dib8096p_setDibTxMux(state, ADC_ON_DIBTX);
1507  dib8096p_setHostBusMux(state, DIBTX_ON_HOSTBUS);
1508  break;
1509  }
1510 
1511  if (mode != OUTMODE_HIGH_Z)
1512  outreg |= (1<<10);
1513 
1514  dprintk("output_mpeg2_in_188_bytes = %d",
1515  state->cfg.output_mpeg2_in_188_bytes);
1516  if (state->cfg.output_mpeg2_in_188_bytes)
1517  smo_mode |= (1 << 5);
1518 
1519  ret |= dib8000_write_word(state, 299, smo_mode);
1520  /* synchronous fread */
1521  ret |= dib8000_write_word(state, 299 + 1, fifo_threshold);
1522  ret |= dib8000_write_word(state, 1286, outreg);
1523 
1524  return ret;
1525 }
1526 
1527 static int map_addr_to_serpar_number(struct i2c_msg *msg)
1528 {
1529  if (msg->buf[0] <= 15)
1530  msg->buf[0] -= 1;
1531  else if (msg->buf[0] == 17)
1532  msg->buf[0] = 15;
1533  else if (msg->buf[0] == 16)
1534  msg->buf[0] = 17;
1535  else if (msg->buf[0] == 19)
1536  msg->buf[0] = 16;
1537  else if (msg->buf[0] >= 21 && msg->buf[0] <= 25)
1538  msg->buf[0] -= 3;
1539  else if (msg->buf[0] == 28)
1540  msg->buf[0] = 23;
1541  else if (msg->buf[0] == 99)
1542  msg->buf[0] = 99;
1543  else
1544  return -EINVAL;
1545  return 0;
1546 }
1547 
1548 static int dib8096p_tuner_write_serpar(struct i2c_adapter *i2c_adap,
1549  struct i2c_msg msg[], int num)
1550 {
1551  struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1552  u8 n_overflow = 1;
1553  u16 i = 1000;
1554  u16 serpar_num = msg[0].buf[0];
1555 
1556  while (n_overflow == 1 && i) {
1557  n_overflow = (dib8000_read_word(state, 1984) >> 1) & 0x1;
1558  i--;
1559  if (i == 0)
1560  dprintk("Tuner ITF: write busy (overflow)");
1561  }
1562  dib8000_write_word(state, 1985, (1 << 6) | (serpar_num & 0x3f));
1563  dib8000_write_word(state, 1986, (msg[0].buf[1] << 8) | msg[0].buf[2]);
1564 
1565  return num;
1566 }
1567 
1568 static int dib8096p_tuner_read_serpar(struct i2c_adapter *i2c_adap,
1569  struct i2c_msg msg[], int num)
1570 {
1571  struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1572  u8 n_overflow = 1, n_empty = 1;
1573  u16 i = 1000;
1574  u16 serpar_num = msg[0].buf[0];
1575  u16 read_word;
1576 
1577  while (n_overflow == 1 && i) {
1578  n_overflow = (dib8000_read_word(state, 1984) >> 1) & 0x1;
1579  i--;
1580  if (i == 0)
1581  dprintk("TunerITF: read busy (overflow)");
1582  }
1583  dib8000_write_word(state, 1985, (0<<6) | (serpar_num&0x3f));
1584 
1585  i = 1000;
1586  while (n_empty == 1 && i) {
1587  n_empty = dib8000_read_word(state, 1984)&0x1;
1588  i--;
1589  if (i == 0)
1590  dprintk("TunerITF: read busy (empty)");
1591  }
1592 
1593  read_word = dib8000_read_word(state, 1987);
1594  msg[1].buf[0] = (read_word >> 8) & 0xff;
1595  msg[1].buf[1] = (read_word) & 0xff;
1596 
1597  return num;
1598 }
1599 
1600 static int dib8096p_tuner_rw_serpar(struct i2c_adapter *i2c_adap,
1601  struct i2c_msg msg[], int num)
1602 {
1603  if (map_addr_to_serpar_number(&msg[0]) == 0) {
1604  if (num == 1) /* write */
1605  return dib8096p_tuner_write_serpar(i2c_adap, msg, 1);
1606  else /* read */
1607  return dib8096p_tuner_read_serpar(i2c_adap, msg, 2);
1608  }
1609  return num;
1610 }
1611 
1612 static int dib8096p_rw_on_apb(struct i2c_adapter *i2c_adap,
1613  struct i2c_msg msg[], int num, u16 apb_address)
1614 {
1615  struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1616  u16 word;
1617 
1618  if (num == 1) { /* write */
1619  dib8000_write_word(state, apb_address,
1620  ((msg[0].buf[1] << 8) | (msg[0].buf[2])));
1621  } else {
1622  word = dib8000_read_word(state, apb_address);
1623  msg[1].buf[0] = (word >> 8) & 0xff;
1624  msg[1].buf[1] = (word) & 0xff;
1625  }
1626  return num;
1627 }
1628 
1629 static int dib8096p_tuner_xfer(struct i2c_adapter *i2c_adap,
1630  struct i2c_msg msg[], int num)
1631 {
1632  struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1633  u16 apb_address = 0, word;
1634  int i = 0;
1635 
1636  switch (msg[0].buf[0]) {
1637  case 0x12:
1638  apb_address = 1920;
1639  break;
1640  case 0x14:
1641  apb_address = 1921;
1642  break;
1643  case 0x24:
1644  apb_address = 1922;
1645  break;
1646  case 0x1a:
1647  apb_address = 1923;
1648  break;
1649  case 0x22:
1650  apb_address = 1924;
1651  break;
1652  case 0x33:
1653  apb_address = 1926;
1654  break;
1655  case 0x34:
1656  apb_address = 1927;
1657  break;
1658  case 0x35:
1659  apb_address = 1928;
1660  break;
1661  case 0x36:
1662  apb_address = 1929;
1663  break;
1664  case 0x37:
1665  apb_address = 1930;
1666  break;
1667  case 0x38:
1668  apb_address = 1931;
1669  break;
1670  case 0x39:
1671  apb_address = 1932;
1672  break;
1673  case 0x2a:
1674  apb_address = 1935;
1675  break;
1676  case 0x2b:
1677  apb_address = 1936;
1678  break;
1679  case 0x2c:
1680  apb_address = 1937;
1681  break;
1682  case 0x2d:
1683  apb_address = 1938;
1684  break;
1685  case 0x2e:
1686  apb_address = 1939;
1687  break;
1688  case 0x2f:
1689  apb_address = 1940;
1690  break;
1691  case 0x30:
1692  apb_address = 1941;
1693  break;
1694  case 0x31:
1695  apb_address = 1942;
1696  break;
1697  case 0x32:
1698  apb_address = 1943;
1699  break;
1700  case 0x3e:
1701  apb_address = 1944;
1702  break;
1703  case 0x3f:
1704  apb_address = 1945;
1705  break;
1706  case 0x40:
1707  apb_address = 1948;
1708  break;
1709  case 0x25:
1710  apb_address = 936;
1711  break;
1712  case 0x26:
1713  apb_address = 937;
1714  break;
1715  case 0x27:
1716  apb_address = 938;
1717  break;
1718  case 0x28:
1719  apb_address = 939;
1720  break;
1721  case 0x1d:
1722  /* get sad sel request */
1723  i = ((dib8000_read_word(state, 921) >> 12)&0x3);
1724  word = dib8000_read_word(state, 924+i);
1725  msg[1].buf[0] = (word >> 8) & 0xff;
1726  msg[1].buf[1] = (word) & 0xff;
1727  return num;
1728  case 0x1f:
1729  if (num == 1) { /* write */
1730  word = (u16) ((msg[0].buf[1] << 8) |
1731  msg[0].buf[2]);
1732  /* in the VGAMODE Sel are located on bit 0/1 */
1733  word &= 0x3;
1734  word = (dib8000_read_word(state, 921) &
1735  ~(3<<12)) | (word<<12);
1736  /* Set the proper input */
1737  dib8000_write_word(state, 921, word);
1738  return num;
1739  }
1740  }
1741 
1742  if (apb_address != 0) /* R/W acces via APB */
1743  return dib8096p_rw_on_apb(i2c_adap, msg, num, apb_address);
1744  else /* R/W access via SERPAR */
1745  return dib8096p_tuner_rw_serpar(i2c_adap, msg, num);
1746 
1747  return 0;
1748 }
1749 
1750 static u32 dib8096p_i2c_func(struct i2c_adapter *adapter)
1751 {
1752  return I2C_FUNC_I2C;
1753 }
1754 
1755 static struct i2c_algorithm dib8096p_tuner_xfer_algo = {
1756  .master_xfer = dib8096p_tuner_xfer,
1757  .functionality = dib8096p_i2c_func,
1758 };
1759 
1761 {
1762  struct dib8000_state *st = fe->demodulator_priv;
1763  return &st->dib8096p_tuner_adap;
1764 }
1766 
1767 int dib8096p_tuner_sleep(struct dvb_frontend *fe, int onoff)
1768 {
1769  struct dib8000_state *state = fe->demodulator_priv;
1770  u16 en_cur_state;
1771 
1772  dprintk("sleep dib8096p: %d", onoff);
1773 
1774  en_cur_state = dib8000_read_word(state, 1922);
1775 
1776  /* LNAs and MIX are ON and therefore it is a valid configuration */
1777  if (en_cur_state > 0xff)
1778  state->tuner_enable = en_cur_state ;
1779 
1780  if (onoff)
1781  en_cur_state &= 0x00ff;
1782  else {
1783  if (state->tuner_enable != 0)
1784  en_cur_state = state->tuner_enable;
1785  }
1786 
1787  dib8000_write_word(state, 1922, en_cur_state);
1788 
1789  return 0;
1790 }
1792 
1793 static const s32 lut_1000ln_mant[] =
1794 {
1795  908, 7003, 7090, 7170, 7244, 7313, 7377, 7438, 7495, 7549, 7600
1796 };
1797 
1799 {
1800  struct dib8000_state *state = fe->demodulator_priv;
1801  u32 ix = 0, tmp_val = 0, exp = 0, mant = 0;
1802  s32 val;
1803 
1804  val = dib8000_read32(state, 384);
1805  if (mode) {
1806  tmp_val = val;
1807  while (tmp_val >>= 1)
1808  exp++;
1809  mant = (val * 1000 / (1<<exp));
1810  ix = (u8)((mant-1000)/100); /* index of the LUT */
1811  val = (lut_1000ln_mant[ix] + 693*(exp-20) - 6908);
1812  val = (val*256)/1000;
1813  }
1814  return val;
1815 }
1817 
1819 {
1820  struct dib8000_state *state = fe->demodulator_priv;
1821  int val = 0;
1822 
1823  switch (IQ) {
1824  case 1:
1825  val = dib8000_read_word(state, 403);
1826  break;
1827  case 0:
1828  val = dib8000_read_word(state, 404);
1829  break;
1830  }
1831  if (val & 0x200)
1832  val -= 1024;
1833 
1834  return val;
1835 }
1837 
1838 static void dib8000_update_timf(struct dib8000_state *state)
1839 {
1840  u32 timf = state->timf = dib8000_read32(state, 435);
1841 
1842  dib8000_write_word(state, 29, (u16) (timf >> 16));
1843  dib8000_write_word(state, 30, (u16) (timf & 0xffff));
1844  dprintk("Updated timing frequency: %d (default: %d)", state->timf, state->timf_default);
1845 }
1846 
1848 {
1849  struct dib8000_state *state = fe->demodulator_priv;
1850 
1851  switch (op) {
1852  case DEMOD_TIMF_SET:
1853  state->timf = timf;
1854  break;
1855  case DEMOD_TIMF_UPDATE:
1856  dib8000_update_timf(state);
1857  break;
1858  case DEMOD_TIMF_GET:
1859  break;
1860  }
1861  dib8000_set_bandwidth(state->fe[0], 6000);
1862 
1863  return state->timf;
1864 }
1866 
1867 static const u16 adc_target_16dB[11] = {
1868  (1 << 13) - 825 - 117,
1869  (1 << 13) - 837 - 117,
1870  (1 << 13) - 811 - 117,
1871  (1 << 13) - 766 - 117,
1872  (1 << 13) - 737 - 117,
1873  (1 << 13) - 693 - 117,
1874  (1 << 13) - 648 - 117,
1875  (1 << 13) - 619 - 117,
1876  (1 << 13) - 575 - 117,
1877  (1 << 13) - 531 - 117,
1878  (1 << 13) - 501 - 117
1879 };
1880 static const u8 permu_seg[] = { 6, 5, 7, 4, 8, 3, 9, 2, 10, 1, 11, 0, 12 };
1881 
1882 static void dib8000_set_channel(struct dib8000_state *state, u8 seq, u8 autosearching)
1883 {
1884  u16 mode, max_constellation, seg_diff_mask = 0, nbseg_diff = 0;
1885  u8 guard, crate, constellation, timeI;
1886  u16 i, coeff[4], P_cfr_left_edge = 0, P_cfr_right_edge = 0, seg_mask13 = 0x1fff; // All 13 segments enabled
1887  const s16 *ncoeff = NULL, *ana_fe;
1888  u16 tmcc_pow = 0;
1889  u16 coff_pow = 0x2800;
1890  u16 init_prbs = 0xfff;
1891  u16 ana_gain = 0;
1892 
1893  if (state->revision == 0x8090)
1894  dib8000_init_sdram(state);
1895 
1896  if (state->ber_monitored_layer != LAYER_ALL)
1897  dib8000_write_word(state, 285, (dib8000_read_word(state, 285) & 0x60) | state->ber_monitored_layer);
1898  else
1899  dib8000_write_word(state, 285, dib8000_read_word(state, 285) & 0x60);
1900 
1901  i = dib8000_read_word(state, 26) & 1; // P_dds_invspec
1902  dib8000_write_word(state, 26, state->fe[0]->dtv_property_cache.inversion^i);
1903 
1904  if (state->fe[0]->dtv_property_cache.isdbt_sb_mode) {
1905  //compute new dds_freq for the seg and adjust prbs
1906  int seg_offset =
1907  state->fe[0]->dtv_property_cache.isdbt_sb_segment_idx -
1908  (state->fe[0]->dtv_property_cache.isdbt_sb_segment_count / 2) -
1909  (state->fe[0]->dtv_property_cache.isdbt_sb_segment_count % 2);
1910  int clk = state->cfg.pll->internal;
1911  u32 segtodds = ((u32) (430 << 23) / clk) << 3; // segtodds = SegBW / Fclk * pow(2,26)
1912  int dds_offset = seg_offset * segtodds;
1913  int new_dds, sub_channel;
1914  if ((state->fe[0]->dtv_property_cache.isdbt_sb_segment_count % 2) == 0)
1915  dds_offset -= (int)(segtodds / 2);
1916 
1917  if (state->cfg.pll->ifreq == 0) {
1918  if ((state->fe[0]->dtv_property_cache.inversion ^ i) == 0) {
1919  dib8000_write_word(state, 26, dib8000_read_word(state, 26) | 1);
1920  new_dds = dds_offset;
1921  } else
1922  new_dds = dds_offset;
1923 
1924  // We shift tuning frequency if the wanted segment is :
1925  // - the segment of center frequency with an odd total number of segments
1926  // - the segment to the left of center frequency with an even total number of segments
1927  // - the segment to the right of center frequency with an even total number of segments
1928  if ((state->fe[0]->dtv_property_cache.delivery_system == SYS_ISDBT)
1929  && (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1)
1930  && (((state->fe[0]->dtv_property_cache.isdbt_sb_segment_count % 2)
1931  && (state->fe[0]->dtv_property_cache.isdbt_sb_segment_idx ==
1932  ((state->fe[0]->dtv_property_cache.isdbt_sb_segment_count / 2) + 1)))
1933  || (((state->fe[0]->dtv_property_cache.isdbt_sb_segment_count % 2) == 0)
1934  && (state->fe[0]->dtv_property_cache.isdbt_sb_segment_idx == (state->fe[0]->dtv_property_cache.isdbt_sb_segment_count / 2)))
1935  || (((state->fe[0]->dtv_property_cache.isdbt_sb_segment_count % 2) == 0)
1936  && (state->fe[0]->dtv_property_cache.isdbt_sb_segment_idx ==
1937  ((state->fe[0]->dtv_property_cache.isdbt_sb_segment_count / 2) + 1)))
1938  )) {
1939  new_dds -= ((u32) (850 << 22) / clk) << 4; // new_dds = 850 (freq shift in KHz) / Fclk * pow(2,26)
1940  }
1941  } else {
1942  if ((state->fe[0]->dtv_property_cache.inversion ^ i) == 0)
1943  new_dds = state->cfg.pll->ifreq - dds_offset;
1944  else
1945  new_dds = state->cfg.pll->ifreq + dds_offset;
1946  }
1947  dib8000_write_word(state, 27, (u16) ((new_dds >> 16) & 0x01ff));
1948  dib8000_write_word(state, 28, (u16) (new_dds & 0xffff));
1949  if (state->fe[0]->dtv_property_cache.isdbt_sb_segment_count % 2)
1950  sub_channel = ((state->fe[0]->dtv_property_cache.isdbt_sb_subchannel + (3 * seg_offset) + 1) % 41) / 3;
1951  else
1952  sub_channel = ((state->fe[0]->dtv_property_cache.isdbt_sb_subchannel + (3 * seg_offset)) % 41) / 3;
1953  sub_channel -= 6;
1954 
1955  if (state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_2K
1956  || state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_4K) {
1957  dib8000_write_word(state, 219, dib8000_read_word(state, 219) | 0x1); //adp_pass =1
1958  dib8000_write_word(state, 190, dib8000_read_word(state, 190) | (0x1 << 14)); //pha3_force_pha_shift = 1
1959  } else {
1960  dib8000_write_word(state, 219, dib8000_read_word(state, 219) & 0xfffe); //adp_pass =0
1961  dib8000_write_word(state, 190, dib8000_read_word(state, 190) & 0xbfff); //pha3_force_pha_shift = 0
1962  }
1963 
1964  switch (state->fe[0]->dtv_property_cache.transmission_mode) {
1965  case TRANSMISSION_MODE_2K:
1966  switch (sub_channel) {
1967  case -6:
1968  init_prbs = 0x0;
1969  break; // 41, 0, 1
1970  case -5:
1971  init_prbs = 0x423;
1972  break; // 02~04
1973  case -4:
1974  init_prbs = 0x9;
1975  break; // 05~07
1976  case -3:
1977  init_prbs = 0x5C7;
1978  break; // 08~10
1979  case -2:
1980  init_prbs = 0x7A6;
1981  break; // 11~13
1982  case -1:
1983  init_prbs = 0x3D8;
1984  break; // 14~16
1985  case 0:
1986  init_prbs = 0x527;
1987  break; // 17~19
1988  case 1:
1989  init_prbs = 0x7FF;
1990  break; // 20~22
1991  case 2:
1992  init_prbs = 0x79B;
1993  break; // 23~25
1994  case 3:
1995  init_prbs = 0x3D6;
1996  break; // 26~28
1997  case 4:
1998  init_prbs = 0x3A2;
1999  break; // 29~31
2000  case 5:
2001  init_prbs = 0x53B;
2002  break; // 32~34
2003  case 6:
2004  init_prbs = 0x2F4;
2005  break; // 35~37
2006  default:
2007  case 7:
2008  init_prbs = 0x213;
2009  break; // 38~40
2010  }
2011  break;
2012 
2013  case TRANSMISSION_MODE_4K:
2014  switch (sub_channel) {
2015  case -6:
2016  init_prbs = 0x0;
2017  break; // 41, 0, 1
2018  case -5:
2019  init_prbs = 0x208;
2020  break; // 02~04
2021  case -4:
2022  init_prbs = 0xC3;
2023  break; // 05~07
2024  case -3:
2025  init_prbs = 0x7B9;
2026  break; // 08~10
2027  case -2:
2028  init_prbs = 0x423;
2029  break; // 11~13
2030  case -1:
2031  init_prbs = 0x5C7;
2032  break; // 14~16
2033  case 0:
2034  init_prbs = 0x3D8;
2035  break; // 17~19
2036  case 1:
2037  init_prbs = 0x7FF;
2038  break; // 20~22
2039  case 2:
2040  init_prbs = 0x3D6;
2041  break; // 23~25
2042  case 3:
2043  init_prbs = 0x53B;
2044  break; // 26~28
2045  case 4:
2046  init_prbs = 0x213;
2047  break; // 29~31
2048  case 5:
2049  init_prbs = 0x29;
2050  break; // 32~34
2051  case 6:
2052  init_prbs = 0xD0;
2053  break; // 35~37
2054  default:
2055  case 7:
2056  init_prbs = 0x48E;
2057  break; // 38~40
2058  }
2059  break;
2060 
2061  default:
2062  case TRANSMISSION_MODE_8K:
2063  switch (sub_channel) {
2064  case -6:
2065  init_prbs = 0x0;
2066  break; // 41, 0, 1
2067  case -5:
2068  init_prbs = 0x740;
2069  break; // 02~04
2070  case -4:
2071  init_prbs = 0x069;
2072  break; // 05~07
2073  case -3:
2074  init_prbs = 0x7DD;
2075  break; // 08~10
2076  case -2:
2077  init_prbs = 0x208;
2078  break; // 11~13
2079  case -1:
2080  init_prbs = 0x7B9;
2081  break; // 14~16
2082  case 0:
2083  init_prbs = 0x5C7;
2084  break; // 17~19
2085  case 1:
2086  init_prbs = 0x7FF;
2087  break; // 20~22
2088  case 2:
2089  init_prbs = 0x53B;
2090  break; // 23~25
2091  case 3:
2092  init_prbs = 0x29;
2093  break; // 26~28
2094  case 4:
2095  init_prbs = 0x48E;
2096  break; // 29~31
2097  case 5:
2098  init_prbs = 0x4C4;
2099  break; // 32~34
2100  case 6:
2101  init_prbs = 0x367;
2102  break; // 33~37
2103  default:
2104  case 7:
2105  init_prbs = 0x684;
2106  break; // 38~40
2107  }
2108  break;
2109  }
2110  } else {
2111  dib8000_write_word(state, 27, (u16) ((state->cfg.pll->ifreq >> 16) & 0x01ff));
2112  dib8000_write_word(state, 28, (u16) (state->cfg.pll->ifreq & 0xffff));
2113  dib8000_write_word(state, 26, (u16) ((state->cfg.pll->ifreq >> 25) & 0x0003));
2114  }
2115  /*P_mode == ?? */
2116  dib8000_write_word(state, 10, (seq << 4));
2117  // dib8000_write_word(state, 287, (dib8000_read_word(state, 287) & 0xe000) | 0x1000);
2118 
2119  switch (state->fe[0]->dtv_property_cache.guard_interval) {
2120  case GUARD_INTERVAL_1_32:
2121  guard = 0;
2122  break;
2123  case GUARD_INTERVAL_1_16:
2124  guard = 1;
2125  break;
2126  case GUARD_INTERVAL_1_8:
2127  guard = 2;
2128  break;
2129  case GUARD_INTERVAL_1_4:
2130  default:
2131  guard = 3;
2132  break;
2133  }
2134 
2135  dib8000_write_word(state, 1, (init_prbs << 2) | (guard & 0x3)); // ADDR 1
2136 
2137  max_constellation = DQPSK;
2138  for (i = 0; i < 3; i++) {
2139  switch (state->fe[0]->dtv_property_cache.layer[i].modulation) {
2140  case DQPSK:
2141  constellation = 0;
2142  break;
2143  case QPSK:
2144  constellation = 1;
2145  break;
2146  case QAM_16:
2147  constellation = 2;
2148  break;
2149  case QAM_64:
2150  default:
2151  constellation = 3;
2152  break;
2153  }
2154 
2155  switch (state->fe[0]->dtv_property_cache.layer[i].fec) {
2156  case FEC_1_2:
2157  crate = 1;
2158  break;
2159  case FEC_2_3:
2160  crate = 2;
2161  break;
2162  case FEC_3_4:
2163  crate = 3;
2164  break;
2165  case FEC_5_6:
2166  crate = 5;
2167  break;
2168  case FEC_7_8:
2169  default:
2170  crate = 7;
2171  break;
2172  }
2173 
2174  if ((state->fe[0]->dtv_property_cache.layer[i].interleaving > 0) &&
2175  ((state->fe[0]->dtv_property_cache.layer[i].interleaving <= 3) ||
2176  (state->fe[0]->dtv_property_cache.layer[i].interleaving == 4 && state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1))
2177  )
2178  timeI = state->fe[0]->dtv_property_cache.layer[i].interleaving;
2179  else
2180  timeI = 0;
2181  dib8000_write_word(state, 2 + i, (constellation << 10) | ((state->fe[0]->dtv_property_cache.layer[i].segment_count & 0xf) << 6) |
2182  (crate << 3) | timeI);
2183  if (state->fe[0]->dtv_property_cache.layer[i].segment_count > 0) {
2184  switch (max_constellation) {
2185  case DQPSK:
2186  case QPSK:
2187  if (state->fe[0]->dtv_property_cache.layer[i].modulation == QAM_16 ||
2188  state->fe[0]->dtv_property_cache.layer[i].modulation == QAM_64)
2189  max_constellation = state->fe[0]->dtv_property_cache.layer[i].modulation;
2190  break;
2191  case QAM_16:
2192  if (state->fe[0]->dtv_property_cache.layer[i].modulation == QAM_64)
2193  max_constellation = state->fe[0]->dtv_property_cache.layer[i].modulation;
2194  break;
2195  }
2196  }
2197  }
2198 
2199  mode = fft_to_mode(state);
2200 
2201  //dib8000_write_word(state, 5, 13); /*p_last_seg = 13*/
2202 
2203  dib8000_write_word(state, 274, (dib8000_read_word(state, 274) & 0xffcf) |
2204  ((state->fe[0]->dtv_property_cache.isdbt_partial_reception & 1) << 5) | ((state->fe[0]->dtv_property_cache.
2205  isdbt_sb_mode & 1) << 4));
2206 
2207  dprintk("mode = %d ; guard = %d", mode, state->fe[0]->dtv_property_cache.guard_interval);
2208 
2209  /* signal optimization parameter */
2210 
2211  if (state->fe[0]->dtv_property_cache.isdbt_partial_reception) {
2212  seg_diff_mask = (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK) << permu_seg[0];
2213  for (i = 1; i < 3; i++)
2214  nbseg_diff +=
2215  (state->fe[0]->dtv_property_cache.layer[i].modulation == DQPSK) * state->fe[0]->dtv_property_cache.layer[i].segment_count;
2216  for (i = 0; i < nbseg_diff; i++)
2217  seg_diff_mask |= 1 << permu_seg[i + 1];
2218  } else {
2219  for (i = 0; i < 3; i++)
2220  nbseg_diff +=
2221  (state->fe[0]->dtv_property_cache.layer[i].modulation == DQPSK) * state->fe[0]->dtv_property_cache.layer[i].segment_count;
2222  for (i = 0; i < nbseg_diff; i++)
2223  seg_diff_mask |= 1 << permu_seg[i];
2224  }
2225  dprintk("nbseg_diff = %X (%d)", seg_diff_mask, seg_diff_mask);
2226 
2227  state->differential_constellation = (seg_diff_mask != 0);
2228  if (state->revision != 0x8090)
2229  dib8000_set_diversity_in(state->fe[0], state->diversity_onoff);
2230  else
2231  dib8096p_set_diversity_in(state->fe[0], state->diversity_onoff);
2232 
2233  if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1) {
2234  if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 1)
2235  seg_mask13 = 0x00E0;
2236  else // 1-segment
2237  seg_mask13 = 0x0040;
2238  } else
2239  seg_mask13 = 0x1fff;
2240 
2241  // WRITE: Mode & Diff mask
2242  dib8000_write_word(state, 0, (mode << 13) | seg_diff_mask);
2243 
2244  if ((seg_diff_mask) || (state->fe[0]->dtv_property_cache.isdbt_sb_mode))
2245  dib8000_write_word(state, 268, (dib8000_read_word(state, 268) & 0xF9FF) | 0x0200);
2246  else
2247  dib8000_write_word(state, 268, (2 << 9) | 39); //init value
2248 
2249  // ---- SMALL ----
2250  // P_small_seg_diff
2251  dib8000_write_word(state, 352, seg_diff_mask); // ADDR 352
2252 
2253  dib8000_write_word(state, 353, seg_mask13); // ADDR 353
2254 
2255 /* // P_small_narrow_band=0, P_small_last_seg=13, P_small_offset_num_car=5 */
2256 
2257  // ---- SMALL ----
2258  if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1) {
2259  switch (state->fe[0]->dtv_property_cache.transmission_mode) {
2260  case TRANSMISSION_MODE_2K:
2261  if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0) {
2262  if (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK)
2263  ncoeff = coeff_2k_sb_1seg_dqpsk;
2264  else // QPSK or QAM
2265  ncoeff = coeff_2k_sb_1seg;
2266  } else { // 3-segments
2267  if (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK) {
2268  if (state->fe[0]->dtv_property_cache.layer[1].modulation == DQPSK)
2269  ncoeff = coeff_2k_sb_3seg_0dqpsk_1dqpsk;
2270  else // QPSK or QAM on external segments
2271  ncoeff = coeff_2k_sb_3seg_0dqpsk;
2272  } else { // QPSK or QAM on central segment
2273  if (state->fe[0]->dtv_property_cache.layer[1].modulation == DQPSK)
2274  ncoeff = coeff_2k_sb_3seg_1dqpsk;
2275  else // QPSK or QAM on external segments
2276  ncoeff = coeff_2k_sb_3seg;
2277  }
2278  }
2279  break;
2280 
2281  case TRANSMISSION_MODE_4K:
2282  if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0) {
2283  if (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK)
2284  ncoeff = coeff_4k_sb_1seg_dqpsk;
2285  else // QPSK or QAM
2286  ncoeff = coeff_4k_sb_1seg;
2287  } else { // 3-segments
2288  if (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK) {
2289  if (state->fe[0]->dtv_property_cache.layer[1].modulation == DQPSK) {
2290  ncoeff = coeff_4k_sb_3seg_0dqpsk_1dqpsk;
2291  } else { // QPSK or QAM on external segments
2292  ncoeff = coeff_4k_sb_3seg_0dqpsk;
2293  }
2294  } else { // QPSK or QAM on central segment
2295  if (state->fe[0]->dtv_property_cache.layer[1].modulation == DQPSK) {
2296  ncoeff = coeff_4k_sb_3seg_1dqpsk;
2297  } else // QPSK or QAM on external segments
2298  ncoeff = coeff_4k_sb_3seg;
2299  }
2300  }
2301  break;
2302 
2304  case TRANSMISSION_MODE_8K:
2305  default:
2306  if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0) {
2307  if (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK)
2308  ncoeff = coeff_8k_sb_1seg_dqpsk;
2309  else // QPSK or QAM
2310  ncoeff = coeff_8k_sb_1seg;
2311  } else { // 3-segments
2312  if (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK) {
2313  if (state->fe[0]->dtv_property_cache.layer[1].modulation == DQPSK) {
2314  ncoeff = coeff_8k_sb_3seg_0dqpsk_1dqpsk;
2315  } else { // QPSK or QAM on external segments
2316  ncoeff = coeff_8k_sb_3seg_0dqpsk;
2317  }
2318  } else { // QPSK or QAM on central segment
2319  if (state->fe[0]->dtv_property_cache.layer[1].modulation == DQPSK) {
2320  ncoeff = coeff_8k_sb_3seg_1dqpsk;
2321  } else // QPSK or QAM on external segments
2322  ncoeff = coeff_8k_sb_3seg;
2323  }
2324  }
2325  break;
2326  }
2327  for (i = 0; i < 8; i++)
2328  dib8000_write_word(state, 343 + i, ncoeff[i]);
2329  }
2330 
2331  // P_small_coef_ext_enable=ISDB-Tsb, P_small_narrow_band=ISDB-Tsb, P_small_last_seg=13, P_small_offset_num_car=5
2332  dib8000_write_word(state, 351,
2333  (state->fe[0]->dtv_property_cache.isdbt_sb_mode << 9) | (state->fe[0]->dtv_property_cache.isdbt_sb_mode << 8) | (13 << 4) | 5);
2334 
2335  // ---- COFF ----
2336  // Carloff, the most robust
2337  if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1) {
2338 
2339  // P_coff_cpil_alpha=4, P_coff_inh=0, P_coff_cpil_winlen=64
2340  // P_coff_narrow_band=1, P_coff_square_val=1, P_coff_one_seg=~partial_rcpt, P_coff_use_tmcc=1, P_coff_use_ac=1
2341  dib8000_write_word(state, 187,
2342  (4 << 12) | (0 << 11) | (63 << 5) | (0x3 << 3) | ((~state->fe[0]->dtv_property_cache.isdbt_partial_reception & 1) << 2)
2343  | 0x3);
2344 
2345 /* // P_small_coef_ext_enable = 1 */
2346 /* dib8000_write_word(state, 351, dib8000_read_word(state, 351) | 0x200); */
2347 
2348  if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0) {
2349 
2350  // P_coff_winlen=63, P_coff_thres_lock=15, P_coff_one_seg_width= (P_mode == 3) , P_coff_one_seg_sym= (P_mode-1)
2351  if (mode == 3)
2352  dib8000_write_word(state, 180, 0x1fcf | ((mode - 1) << 14));
2353  else
2354  dib8000_write_word(state, 180, 0x0fcf | ((mode - 1) << 14));
2355  // P_ctrl_corm_thres4pre_freq_inh=1,P_ctrl_pre_freq_mode_sat=1,
2356  // P_ctrl_pre_freq_inh=0, P_ctrl_pre_freq_step = 5, P_pre_freq_win_len=4
2357  dib8000_write_word(state, 338, (1 << 12) | (1 << 10) | (0 << 9) | (5 << 5) | 4);
2358  // P_ctrl_pre_freq_win_len=16, P_ctrl_pre_freq_thres_lockin=8
2359  dib8000_write_word(state, 340, (16 << 6) | (8 << 0));
2360  // P_ctrl_pre_freq_thres_lockout=6, P_small_use_tmcc/ac/cp=1
2361  dib8000_write_word(state, 341, (6 << 3) | (1 << 2) | (1 << 1) | (1 << 0));
2362 
2363  // P_coff_corthres_8k, 4k, 2k and P_coff_cpilthres_8k, 4k, 2k
2364  dib8000_write_word(state, 181, 300);
2365  dib8000_write_word(state, 182, 150);
2366  dib8000_write_word(state, 183, 80);
2367  dib8000_write_word(state, 184, 300);
2368  dib8000_write_word(state, 185, 150);
2369  dib8000_write_word(state, 186, 80);
2370  } else { // Sound Broadcasting mode 3 seg
2371  // P_coff_one_seg_sym= 1, P_coff_one_seg_width= 1, P_coff_winlen=63, P_coff_thres_lock=15
2372  /* if (mode == 3) */
2373  /* dib8000_write_word(state, 180, 0x2fca | ((0) << 14)); */
2374  /* else */
2375  /* dib8000_write_word(state, 180, 0x2fca | ((1) << 14)); */
2376  dib8000_write_word(state, 180, 0x1fcf | (1 << 14));
2377 
2378  // P_ctrl_corm_thres4pre_freq_inh = 1, P_ctrl_pre_freq_mode_sat=1,
2379  // P_ctrl_pre_freq_inh=0, P_ctrl_pre_freq_step = 4, P_pre_freq_win_len=4
2380  dib8000_write_word(state, 338, (1 << 12) | (1 << 10) | (0 << 9) | (4 << 5) | 4);
2381  // P_ctrl_pre_freq_win_len=16, P_ctrl_pre_freq_thres_lockin=8
2382  dib8000_write_word(state, 340, (16 << 6) | (8 << 0));
2383  //P_ctrl_pre_freq_thres_lockout=6, P_small_use_tmcc/ac/cp=1
2384  dib8000_write_word(state, 341, (6 << 3) | (1 << 2) | (1 << 1) | (1 << 0));
2385 
2386  // P_coff_corthres_8k, 4k, 2k and P_coff_cpilthres_8k, 4k, 2k
2387  dib8000_write_word(state, 181, 350);
2388  dib8000_write_word(state, 182, 300);
2389  dib8000_write_word(state, 183, 250);
2390  dib8000_write_word(state, 184, 350);
2391  dib8000_write_word(state, 185, 300);
2392  dib8000_write_word(state, 186, 250);
2393  }
2394 
2395  } else if (state->isdbt_cfg_loaded == 0) { // if not Sound Broadcasting mode : put default values for 13 segments
2396  dib8000_write_word(state, 180, (16 << 6) | 9);
2397  dib8000_write_word(state, 187, (4 << 12) | (8 << 5) | 0x2);
2398  coff_pow = 0x2800;
2399  for (i = 0; i < 6; i++)
2400  dib8000_write_word(state, 181 + i, coff_pow);
2401 
2402  // P_ctrl_corm_thres4pre_freq_inh=1, P_ctrl_pre_freq_mode_sat=1,
2403  // P_ctrl_pre_freq_mode_sat=1, P_ctrl_pre_freq_inh=0, P_ctrl_pre_freq_step = 3, P_pre_freq_win_len=1
2404  dib8000_write_word(state, 338, (1 << 12) | (1 << 10) | (0 << 9) | (3 << 5) | 1);
2405 
2406  // P_ctrl_pre_freq_win_len=8, P_ctrl_pre_freq_thres_lockin=6
2407  dib8000_write_word(state, 340, (8 << 6) | (6 << 0));
2408  // P_ctrl_pre_freq_thres_lockout=4, P_small_use_tmcc/ac/cp=1
2409  dib8000_write_word(state, 341, (4 << 3) | (1 << 2) | (1 << 1) | (1 << 0));
2410  }
2411  // ---- FFT ----
2412  if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1 && state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0)
2413  dib8000_write_word(state, 178, 64); // P_fft_powrange=64
2414  else
2415  dib8000_write_word(state, 178, 32); // P_fft_powrange=32
2416 
2417  /* make the cpil_coff_lock more robust but slower p_coff_winlen
2418  * 6bits; p_coff_thres_lock 6bits (for coff lock if needed)
2419  */
2420  /* if ( ( nbseg_diff>0)&&(nbseg_diff<13))
2421  dib8000_write_word(state, 187, (dib8000_read_word(state, 187) & 0xfffb) | (1 << 3)); */
2422 
2423  dib8000_write_word(state, 189, ~seg_mask13 | seg_diff_mask); /* P_lmod4_seg_inh */
2424  dib8000_write_word(state, 192, ~seg_mask13 | seg_diff_mask); /* P_pha3_seg_inh */
2425  dib8000_write_word(state, 225, ~seg_mask13 | seg_diff_mask); /* P_tac_seg_inh */
2426  if ((!state->fe[0]->dtv_property_cache.isdbt_sb_mode) && (state->cfg.pll->ifreq == 0))
2427  dib8000_write_word(state, 266, ~seg_mask13 | seg_diff_mask | 0x40); /* P_equal_noise_seg_inh */
2428  else
2429  dib8000_write_word(state, 266, ~seg_mask13 | seg_diff_mask); /* P_equal_noise_seg_inh */
2430  dib8000_write_word(state, 287, ~seg_mask13 | 0x1000); /* P_tmcc_seg_inh */
2431  //dib8000_write_word(state, 288, ~seg_mask13 | seg_diff_mask); /* P_tmcc_seg_eq_inh */
2432  if (!autosearching)
2433  dib8000_write_word(state, 288, (~seg_mask13 | seg_diff_mask) & 0x1fff); /* P_tmcc_seg_eq_inh */
2434  else
2435  dib8000_write_word(state, 288, 0x1fff); //disable equalisation of the tmcc when autosearch to be able to find the DQPSK channels.
2436  dprintk("287 = %X (%d)", ~seg_mask13 | 0x1000, ~seg_mask13 | 0x1000);
2437 
2438  dib8000_write_word(state, 211, seg_mask13 & (~seg_diff_mask)); /* P_des_seg_enabled */
2439 
2440  /* offset loop parameters */
2441  if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1) {
2442  if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0)
2443  /* P_timf_alpha = (11-P_mode), P_corm_alpha=6, P_corm_thres=0x80 */
2444  dib8000_write_word(state, 32, ((11 - mode) << 12) | (6 << 8) | 0x40);
2445 
2446  else // Sound Broadcasting mode 3 seg
2447  /* P_timf_alpha = (10-P_mode), P_corm_alpha=6, P_corm_thres=0x80 */
2448  dib8000_write_word(state, 32, ((10 - mode) << 12) | (6 << 8) | 0x60);
2449  } else
2450  // TODO in 13 seg, timf_alpha can always be the same or not ?
2451  /* P_timf_alpha = (9-P_mode, P_corm_alpha=6, P_corm_thres=0x80 */
2452  dib8000_write_word(state, 32, ((9 - mode) << 12) | (6 << 8) | 0x80);
2453 
2454  if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1) {
2455  if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0)
2456  /* P_ctrl_pha_off_max=3 P_ctrl_sfreq_inh =0 P_ctrl_sfreq_step = (11-P_mode) */
2457  dib8000_write_word(state, 37, (3 << 5) | (0 << 4) | (10 - mode));
2458 
2459  else // Sound Broadcasting mode 3 seg
2460  /* P_ctrl_pha_off_max=3 P_ctrl_sfreq_inh =0 P_ctrl_sfreq_step = (10-P_mode) */
2461  dib8000_write_word(state, 37, (3 << 5) | (0 << 4) | (9 - mode));
2462  } else
2463  /* P_ctrl_pha_off_max=3 P_ctrl_sfreq_inh =0 P_ctrl_sfreq_step = 9 */
2464  dib8000_write_word(state, 37, (3 << 5) | (0 << 4) | (8 - mode));
2465 
2466  /* P_dvsy_sync_wait - reuse mode */
2467  switch (state->fe[0]->dtv_property_cache.transmission_mode) {
2468  case TRANSMISSION_MODE_8K:
2469  mode = 256;
2470  break;
2471  case TRANSMISSION_MODE_4K:
2472  mode = 128;
2473  break;
2474  default:
2475  case TRANSMISSION_MODE_2K:
2476  mode = 64;
2477  break;
2478  }
2479  if (state->cfg.diversity_delay == 0)
2480  mode = (mode * (1 << (guard)) * 3) / 2 + 48; // add 50% SFN margin + compensate for one DVSY-fifo
2481  else
2482  mode = (mode * (1 << (guard)) * 3) / 2 + state->cfg.diversity_delay; // add 50% SFN margin + compensate for DVSY-fifo
2483  mode <<= 4;
2484  dib8000_write_word(state, 273, (dib8000_read_word(state, 273) & 0x000f) | mode);
2485 
2486  /* channel estimation fine configuration */
2487  switch (max_constellation) {
2488  case QAM_64:
2489  ana_gain = 0x7; // -1 : avoid def_est saturation when ADC target is -16dB
2490  coeff[0] = 0x0148; /* P_adp_regul_cnt 0.04 */
2491  coeff[1] = 0xfff0; /* P_adp_noise_cnt -0.002 */
2492  coeff[2] = 0x00a4; /* P_adp_regul_ext 0.02 */
2493  coeff[3] = 0xfff8; /* P_adp_noise_ext -0.001 */
2494  //if (!state->cfg.hostbus_diversity) //if diversity, we should prehaps use the configuration of the max_constallation -1
2495  break;
2496  case QAM_16:
2497  ana_gain = 0x7; // -1 : avoid def_est saturation when ADC target is -16dB
2498  coeff[0] = 0x023d; /* P_adp_regul_cnt 0.07 */
2499  coeff[1] = 0xffdf; /* P_adp_noise_cnt -0.004 */
2500  coeff[2] = 0x00a4; /* P_adp_regul_ext 0.02 */
2501  coeff[3] = 0xfff0; /* P_adp_noise_ext -0.002 */
2502  //if (!((state->cfg.hostbus_diversity) && (max_constellation == QAM_16)))
2503  break;
2504  default:
2505  ana_gain = 0; // 0 : goes along with ADC target at -22dB to keep good mobile performance and lock at sensitivity level
2506  coeff[0] = 0x099a; /* P_adp_regul_cnt 0.3 */
2507  coeff[1] = 0xffae; /* P_adp_noise_cnt -0.01 */
2508  coeff[2] = 0x0333; /* P_adp_regul_ext 0.1 */
2509  coeff[3] = 0xfff8; /* P_adp_noise_ext -0.002 */
2510  break;
2511  }
2512  for (mode = 0; mode < 4; mode++)
2513  dib8000_write_word(state, 215 + mode, coeff[mode]);
2514 
2515  // update ana_gain depending on max constellation
2516  dib8000_write_word(state, 116, ana_gain);
2517  // update ADC target depending on ana_gain
2518  if (ana_gain) { // set -16dB ADC target for ana_gain=-1
2519  for (i = 0; i < 10; i++)
2520  dib8000_write_word(state, 80 + i, adc_target_16dB[i]);
2521  } else { // set -22dB ADC target for ana_gain=0
2522  for (i = 0; i < 10; i++)
2523  dib8000_write_word(state, 80 + i, adc_target_16dB[i] - 355);
2524  }
2525 
2526  // ---- ANA_FE ----
2527  if (state->fe[0]->dtv_property_cache.isdbt_sb_mode) {
2528  if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 1)
2529  ana_fe = ana_fe_coeff_3seg;
2530  else // 1-segment
2531  ana_fe = ana_fe_coeff_1seg;
2532  } else
2533  ana_fe = ana_fe_coeff_13seg;
2534 
2535  if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1 || state->isdbt_cfg_loaded == 0)
2536  for (mode = 0; mode < 24; mode++)
2537  dib8000_write_word(state, 117 + mode, ana_fe[mode]);
2538 
2539  // ---- CHAN_BLK ----
2540  for (i = 0; i < 13; i++) {
2541  if ((((~seg_diff_mask) >> i) & 1) == 1) {
2542  P_cfr_left_edge += (1 << i) * ((i == 0) || ((((seg_mask13 & (~seg_diff_mask)) >> (i - 1)) & 1) == 0));
2543  P_cfr_right_edge += (1 << i) * ((i == 12) || ((((seg_mask13 & (~seg_diff_mask)) >> (i + 1)) & 1) == 0));
2544  }
2545  }
2546  dib8000_write_word(state, 222, P_cfr_left_edge); // P_cfr_left_edge
2547  dib8000_write_word(state, 223, P_cfr_right_edge); // P_cfr_right_edge
2548  // "P_cspu_left_edge" not used => do not care
2549  // "P_cspu_right_edge" not used => do not care
2550 
2551  if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1) {
2552  dib8000_write_word(state, 228, 1); // P_2d_mode_byp=1
2553  dib8000_write_word(state, 205, dib8000_read_word(state, 205) & 0xfff0); // P_cspu_win_cut = 0
2554  if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0
2555  && state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_2K) {
2556  //dib8000_write_word(state, 219, dib8000_read_word(state, 219) & 0xfffe); // P_adp_pass = 0
2557  dib8000_write_word(state, 265, 15); // P_equal_noise_sel = 15
2558  }
2559  } else if (state->isdbt_cfg_loaded == 0) {
2560  dib8000_write_word(state, 228, 0); // default value
2561  dib8000_write_word(state, 265, 31); // default value
2562  dib8000_write_word(state, 205, 0x200f); // init value
2563  }
2564  // ---- TMCC ----
2565  for (i = 0; i < 3; i++)
2566  tmcc_pow +=
2567  (((state->fe[0]->dtv_property_cache.layer[i].modulation == DQPSK) * 4 + 1) * state->fe[0]->dtv_property_cache.layer[i].segment_count);
2568  // Quantif of "P_tmcc_dec_thres_?k" is (0, 5+mode, 9);
2569  // Threshold is set at 1/4 of max power.
2570  tmcc_pow *= (1 << (9 - 2));
2571 
2572  dib8000_write_word(state, 290, tmcc_pow); // P_tmcc_dec_thres_2k
2573  dib8000_write_word(state, 291, tmcc_pow); // P_tmcc_dec_thres_4k
2574  dib8000_write_word(state, 292, tmcc_pow); // P_tmcc_dec_thres_8k
2575  //dib8000_write_word(state, 287, (1 << 13) | 0x1000 );
2576  // ---- PHA3 ----
2577 
2578  if (state->isdbt_cfg_loaded == 0)
2579  dib8000_write_word(state, 250, 3285); /*p_2d_hspeed_thr0 */
2580 
2581  if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1)
2582  state->isdbt_cfg_loaded = 0;
2583  else
2584  state->isdbt_cfg_loaded = 1;
2585 
2586 }
2587 
2588 static int dib8000_autosearch_start(struct dvb_frontend *fe)
2589 {
2590  u8 factor;
2591  u32 value;
2592  struct dib8000_state *state = fe->demodulator_priv;
2593 
2594  int slist = 0;
2595 
2596  state->fe[0]->dtv_property_cache.inversion = 0;
2597  if (!state->fe[0]->dtv_property_cache.isdbt_sb_mode)
2598  state->fe[0]->dtv_property_cache.layer[0].segment_count = 13;
2599  state->fe[0]->dtv_property_cache.layer[0].modulation = QAM_64;
2600  state->fe[0]->dtv_property_cache.layer[0].fec = FEC_2_3;
2601  state->fe[0]->dtv_property_cache.layer[0].interleaving = 0;
2602 
2603  //choose the right list, in sb, always do everything
2604  if (state->fe[0]->dtv_property_cache.isdbt_sb_mode) {
2605  state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_8K;
2606  state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_8;
2607  slist = 7;
2608  dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));
2609  } else {
2610  if (state->fe[0]->dtv_property_cache.guard_interval == GUARD_INTERVAL_AUTO) {
2611  if (state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_AUTO) {
2612  slist = 7;
2613  dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13)); // P_mode = 1 to have autosearch start ok with mode2
2614  } else
2615  slist = 3;
2616  } else {
2617  if (state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_AUTO) {
2618  slist = 2;
2619  dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13)); // P_mode = 1
2620  } else
2621  slist = 0;
2622  }
2623 
2624  if (state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_AUTO)
2625  state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_8K;
2626  if (state->fe[0]->dtv_property_cache.guard_interval == GUARD_INTERVAL_AUTO)
2627  state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_8;
2628 
2629  dprintk("using list for autosearch : %d", slist);
2630  dib8000_set_channel(state, (unsigned char)slist, 1);
2631  //dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13)); // P_mode = 1
2632 
2633  factor = 1;
2634 
2635  //set lock_mask values
2636  dib8000_write_word(state, 6, 0x4);
2637  dib8000_write_word(state, 7, 0x8);
2638  dib8000_write_word(state, 8, 0x1000);
2639 
2640  //set lock_mask wait time values
2641  value = 50 * state->cfg.pll->internal * factor;
2642  dib8000_write_word(state, 11, (u16) ((value >> 16) & 0xffff)); // lock0 wait time
2643  dib8000_write_word(state, 12, (u16) (value & 0xffff)); // lock0 wait time
2644  value = 100 * state->cfg.pll->internal * factor;
2645  dib8000_write_word(state, 13, (u16) ((value >> 16) & 0xffff)); // lock1 wait time
2646  dib8000_write_word(state, 14, (u16) (value & 0xffff)); // lock1 wait time
2647  value = 1000 * state->cfg.pll->internal * factor;
2648  dib8000_write_word(state, 15, (u16) ((value >> 16) & 0xffff)); // lock2 wait time
2649  dib8000_write_word(state, 16, (u16) (value & 0xffff)); // lock2 wait time
2650 
2651  value = dib8000_read_word(state, 0);
2652  dib8000_write_word(state, 0, (u16) ((1 << 15) | value));
2653  dib8000_read_word(state, 1284); // reset the INT. n_irq_pending
2654  dib8000_write_word(state, 0, (u16) value);
2655 
2656  }
2657 
2658  return 0;
2659 }
2660 
2661 static int dib8000_autosearch_irq(struct dvb_frontend *fe)
2662 {
2663  struct dib8000_state *state = fe->demodulator_priv;
2664  u16 irq_pending = dib8000_read_word(state, 1284);
2665 
2666  if (irq_pending & 0x1) { // failed
2667  dprintk("dib8000_autosearch_irq failed");
2668  return 1;
2669  }
2670 
2671  if (irq_pending & 0x2) { // succeeded
2672  dprintk("dib8000_autosearch_irq succeeded");
2673  return 2;
2674  }
2675 
2676  return 0; // still pending
2677 }
2678 
2679 static int dib8000_tune(struct dvb_frontend *fe)
2680 {
2681  struct dib8000_state *state = fe->demodulator_priv;
2682  int ret = 0;
2683  u16 lock, value, mode;
2684 
2685  // we are already tuned - just resuming from suspend
2686  if (state == NULL)
2687  return -EINVAL;
2688 
2689  mode = fft_to_mode(state);
2690 
2691  dib8000_set_bandwidth(fe, state->fe[0]->dtv_property_cache.bandwidth_hz / 1000);
2692  dib8000_set_channel(state, 0, 0);
2693 
2694  // restart demod
2695  ret |= dib8000_write_word(state, 770, 0x4000);
2696  ret |= dib8000_write_word(state, 770, 0x0000);
2697  msleep(45);
2698 
2699  /* P_ctrl_inh_cor=0, P_ctrl_alpha_cor=4, P_ctrl_inh_isi=0, P_ctrl_alpha_isi=3 */
2700  /* ret |= dib8000_write_word(state, 29, (0 << 9) | (4 << 5) | (0 << 4) | (3 << 0) ); workaround inh_isi stays at 1 */
2701 
2702  // never achieved a lock before - wait for timfreq to update
2703  if (state->timf == 0) {
2704  if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1) {
2705  if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0)
2706  msleep(300);
2707  else // Sound Broadcasting mode 3 seg
2708  msleep(500);
2709  } else // 13 seg
2710  msleep(200);
2711  }
2712  if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1) {
2713  if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0) {
2714 
2715  /* P_timf_alpha = (13-P_mode) , P_corm_alpha=6, P_corm_thres=0x40 alpha to check on board */
2716  dib8000_write_word(state, 32, ((13 - mode) << 12) | (6 << 8) | 0x40);
2717  //dib8000_write_word(state, 32, (8 << 12) | (6 << 8) | 0x80);
2718 
2719  /* P_ctrl_sfreq_step= (12-P_mode) P_ctrl_sfreq_inh =0 P_ctrl_pha_off_max */
2720  ret |= dib8000_write_word(state, 37, (12 - mode) | ((5 + mode) << 5));
2721 
2722  } else { // Sound Broadcasting mode 3 seg
2723 
2724  /* P_timf_alpha = (12-P_mode) , P_corm_alpha=6, P_corm_thres=0x60 alpha to check on board */
2725  dib8000_write_word(state, 32, ((12 - mode) << 12) | (6 << 8) | 0x60);
2726 
2727  ret |= dib8000_write_word(state, 37, (11 - mode) | ((5 + mode) << 5));
2728  }
2729 
2730  } else { // 13 seg
2731  /* P_timf_alpha = 8 , P_corm_alpha=6, P_corm_thres=0x80 alpha to check on board */
2732  dib8000_write_word(state, 32, ((11 - mode) << 12) | (6 << 8) | 0x80);
2733 
2734  ret |= dib8000_write_word(state, 37, (10 - mode) | ((5 + mode) << 5));
2735 
2736  }
2737 
2738  // we achieved a coff_cpil_lock - it's time to update the timf
2739  if (state->revision != 0x8090)
2740  lock = dib8000_read_word(state, 568);
2741  else
2742  lock = dib8000_read_word(state, 570);
2743  if ((lock >> 11) & 0x1)
2744  dib8000_update_timf(state);
2745 
2746  //now that tune is finished, lock0 should lock on fec_mpeg to output this lock on MP_LOCK. It's changed in autosearch start
2747  dib8000_write_word(state, 6, 0x200);
2748 
2749  if (state->revision == 0x8002) {
2750  value = dib8000_read_word(state, 903);
2751  dib8000_write_word(state, 903, value & ~(1 << 3));
2752  msleep(1);
2753  dib8000_write_word(state, 903, value | (1 << 3));
2754  }
2755 
2756  return ret;
2757 }
2758 
2759 static int dib8000_wakeup(struct dvb_frontend *fe)
2760 {
2761  struct dib8000_state *state = fe->demodulator_priv;
2762  u8 index_frontend;
2763  int ret;
2764 
2765  dib8000_set_power_mode(state, DIB8000_POWER_ALL);
2766  dib8000_set_adc_state(state, DIBX000_ADC_ON);
2767  if (dib8000_set_adc_state(state, DIBX000_SLOW_ADC_ON) != 0)
2768  dprintk("could not start Slow ADC");
2769 
2770  if (state->revision != 0x8090)
2771  dib8000_sad_calib(state);
2772 
2773  for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2774  ret = state->fe[index_frontend]->ops.init(state->fe[index_frontend]);
2775  if (ret < 0)
2776  return ret;
2777  }
2778 
2779  return 0;
2780 }
2781 
2782 static int dib8000_sleep(struct dvb_frontend *fe)
2783 {
2784  struct dib8000_state *state = fe->demodulator_priv;
2785  u8 index_frontend;
2786  int ret;
2787 
2788  for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2789  ret = state->fe[index_frontend]->ops.sleep(state->fe[index_frontend]);
2790  if (ret < 0)
2791  return ret;
2792  }
2793 
2794  if (state->revision != 0x8090)
2795  dib8000_set_output_mode(fe, OUTMODE_HIGH_Z);
2796  dib8000_set_power_mode(state, DIB8000_POWER_INTERFACE_ONLY);
2797  return dib8000_set_adc_state(state, DIBX000_SLOW_ADC_OFF) | dib8000_set_adc_state(state, DIBX000_ADC_OFF);
2798 }
2799 
2801 {
2802  struct dib8000_state *state = fe->demodulator_priv;
2803  return state->tune_state;
2804 }
2806 
2808 {
2809  struct dib8000_state *state = fe->demodulator_priv;
2810  state->tune_state = tune_state;
2811  return 0;
2812 }
2814 
2815 static int dib8000_get_frontend(struct dvb_frontend *fe)
2816 {
2817  struct dib8000_state *state = fe->demodulator_priv;
2818  u16 i, val = 0;
2819  fe_status_t stat;
2820  u8 index_frontend, sub_index_frontend;
2821 
2822  fe->dtv_property_cache.bandwidth_hz = 6000000;
2823 
2824  for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2825  state->fe[index_frontend]->ops.read_status(state->fe[index_frontend], &stat);
2826  if (stat&FE_HAS_SYNC) {
2827  dprintk("TMCC lock on the slave%i", index_frontend);
2828  /* synchronize the cache with the other frontends */
2829  state->fe[index_frontend]->ops.get_frontend(state->fe[index_frontend]);
2830  for (sub_index_frontend = 0; (sub_index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[sub_index_frontend] != NULL); sub_index_frontend++) {
2831  if (sub_index_frontend != index_frontend) {
2832  state->fe[sub_index_frontend]->dtv_property_cache.isdbt_sb_mode = state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode;
2833  state->fe[sub_index_frontend]->dtv_property_cache.inversion = state->fe[index_frontend]->dtv_property_cache.inversion;
2834  state->fe[sub_index_frontend]->dtv_property_cache.transmission_mode = state->fe[index_frontend]->dtv_property_cache.transmission_mode;
2835  state->fe[sub_index_frontend]->dtv_property_cache.guard_interval = state->fe[index_frontend]->dtv_property_cache.guard_interval;
2836  state->fe[sub_index_frontend]->dtv_property_cache.isdbt_partial_reception = state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception;
2837  for (i = 0; i < 3; i++) {
2838  state->fe[sub_index_frontend]->dtv_property_cache.layer[i].segment_count = state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count;
2839  state->fe[sub_index_frontend]->dtv_property_cache.layer[i].interleaving = state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving;
2840  state->fe[sub_index_frontend]->dtv_property_cache.layer[i].fec = state->fe[index_frontend]->dtv_property_cache.layer[i].fec;
2841  state->fe[sub_index_frontend]->dtv_property_cache.layer[i].modulation = state->fe[index_frontend]->dtv_property_cache.layer[i].modulation;
2842  }
2843  }
2844  }
2845  return 0;
2846  }
2847  }
2848 
2849  fe->dtv_property_cache.isdbt_sb_mode = dib8000_read_word(state, 508) & 0x1;
2850 
2851  if (state->revision == 0x8090)
2852  val = dib8000_read_word(state, 572);
2853  else
2854  val = dib8000_read_word(state, 570);
2855  fe->dtv_property_cache.inversion = (val & 0x40) >> 6;
2856  switch ((val & 0x30) >> 4) {
2857  case 1:
2858  fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_2K;
2859  break;
2860  case 3:
2861  default:
2862  fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_8K;
2863  break;
2864  }
2865 
2866  switch (val & 0x3) {
2867  case 0:
2868  fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_32;
2869  dprintk("dib8000_get_frontend GI = 1/32 ");
2870  break;
2871  case 1:
2872  fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_16;
2873  dprintk("dib8000_get_frontend GI = 1/16 ");
2874  break;
2875  case 2:
2876  dprintk("dib8000_get_frontend GI = 1/8 ");
2877  fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_8;
2878  break;
2879  case 3:
2880  dprintk("dib8000_get_frontend GI = 1/4 ");
2881  fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_4;
2882  break;
2883  }
2884 
2885  val = dib8000_read_word(state, 505);
2886  fe->dtv_property_cache.isdbt_partial_reception = val & 1;
2887  dprintk("dib8000_get_frontend : partial_reception = %d ", fe->dtv_property_cache.isdbt_partial_reception);
2888 
2889  for (i = 0; i < 3; i++) {
2890  val = dib8000_read_word(state, 493 + i);
2891  fe->dtv_property_cache.layer[i].segment_count = val & 0x0F;
2892  dprintk("dib8000_get_frontend : Layer %d segments = %d ", i, fe->dtv_property_cache.layer[i].segment_count);
2893 
2894  val = dib8000_read_word(state, 499 + i);
2895  fe->dtv_property_cache.layer[i].interleaving = val & 0x3;
2896  dprintk("dib8000_get_frontend : Layer %d time_intlv = %d ", i, fe->dtv_property_cache.layer[i].interleaving);
2897 
2898  val = dib8000_read_word(state, 481 + i);
2899  switch (val & 0x7) {
2900  case 1:
2901  fe->dtv_property_cache.layer[i].fec = FEC_1_2;
2902  dprintk("dib8000_get_frontend : Layer %d Code Rate = 1/2 ", i);
2903  break;
2904  case 2:
2905  fe->dtv_property_cache.layer[i].fec = FEC_2_3;
2906  dprintk("dib8000_get_frontend : Layer %d Code Rate = 2/3 ", i);
2907  break;
2908  case 3:
2909  fe->dtv_property_cache.layer[i].fec = FEC_3_4;
2910  dprintk("dib8000_get_frontend : Layer %d Code Rate = 3/4 ", i);
2911  break;
2912  case 5:
2913  fe->dtv_property_cache.layer[i].fec = FEC_5_6;
2914  dprintk("dib8000_get_frontend : Layer %d Code Rate = 5/6 ", i);
2915  break;
2916  default:
2917  fe->dtv_property_cache.layer[i].fec = FEC_7_8;
2918  dprintk("dib8000_get_frontend : Layer %d Code Rate = 7/8 ", i);
2919  break;
2920  }
2921 
2922  val = dib8000_read_word(state, 487 + i);
2923  switch (val & 0x3) {
2924  case 0:
2925  dprintk("dib8000_get_frontend : Layer %d DQPSK ", i);
2926  fe->dtv_property_cache.layer[i].modulation = DQPSK;
2927  break;
2928  case 1:
2929  fe->dtv_property_cache.layer[i].modulation = QPSK;
2930  dprintk("dib8000_get_frontend : Layer %d QPSK ", i);
2931  break;
2932  case 2:
2933  fe->dtv_property_cache.layer[i].modulation = QAM_16;
2934  dprintk("dib8000_get_frontend : Layer %d QAM16 ", i);
2935  break;
2936  case 3:
2937  default:
2938  dprintk("dib8000_get_frontend : Layer %d QAM64 ", i);
2939  fe->dtv_property_cache.layer[i].modulation = QAM_64;
2940  break;
2941  }
2942  }
2943 
2944  /* synchronize the cache with the other frontends */
2945  for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2946  state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode = fe->dtv_property_cache.isdbt_sb_mode;
2947  state->fe[index_frontend]->dtv_property_cache.inversion = fe->dtv_property_cache.inversion;
2948  state->fe[index_frontend]->dtv_property_cache.transmission_mode = fe->dtv_property_cache.transmission_mode;
2949  state->fe[index_frontend]->dtv_property_cache.guard_interval = fe->dtv_property_cache.guard_interval;
2950  state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception = fe->dtv_property_cache.isdbt_partial_reception;
2951  for (i = 0; i < 3; i++) {
2952  state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count = fe->dtv_property_cache.layer[i].segment_count;
2953  state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving = fe->dtv_property_cache.layer[i].interleaving;
2954  state->fe[index_frontend]->dtv_property_cache.layer[i].fec = fe->dtv_property_cache.layer[i].fec;
2955  state->fe[index_frontend]->dtv_property_cache.layer[i].modulation = fe->dtv_property_cache.layer[i].modulation;
2956  }
2957  }
2958  return 0;
2959 }
2960 
2961 static int dib8000_set_frontend(struct dvb_frontend *fe)
2962 {
2963  struct dib8000_state *state = fe->demodulator_priv;
2964  u8 nbr_pending, exit_condition, index_frontend;
2965  s8 index_frontend_success = -1;
2966  int time, ret;
2967  int time_slave = FE_CALLBACK_TIME_NEVER;
2968 
2969  if (state->fe[0]->dtv_property_cache.frequency == 0) {
2970  dprintk("dib8000: must at least specify frequency ");
2971  return 0;
2972  }
2973 
2974  if (state->fe[0]->dtv_property_cache.bandwidth_hz == 0) {
2975  dprintk("dib8000: no bandwidth specified, set to default ");
2976  state->fe[0]->dtv_property_cache.bandwidth_hz = 6000000;
2977  }
2978 
2979  for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2980  /* synchronization of the cache */
2981  state->fe[index_frontend]->dtv_property_cache.delivery_system = SYS_ISDBT;
2982  memcpy(&state->fe[index_frontend]->dtv_property_cache, &fe->dtv_property_cache, sizeof(struct dtv_frontend_properties));
2983 
2984  if (state->revision != 0x8090)
2985  dib8000_set_output_mode(state->fe[index_frontend],
2986  OUTMODE_HIGH_Z);
2987  else
2988  dib8096p_set_output_mode(state->fe[index_frontend],
2989  OUTMODE_HIGH_Z);
2990  if (state->fe[index_frontend]->ops.tuner_ops.set_params)
2991  state->fe[index_frontend]->ops.tuner_ops.set_params(state->fe[index_frontend]);
2992 
2993  dib8000_set_tune_state(state->fe[index_frontend], CT_AGC_START);
2994  }
2995 
2996  /* start up the AGC */
2997  do {
2998  time = dib8000_agc_startup(state->fe[0]);
2999  for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3000  time_slave = dib8000_agc_startup(state->fe[index_frontend]);
3001  if (time == FE_CALLBACK_TIME_NEVER)
3002  time = time_slave;
3003  else if ((time_slave != FE_CALLBACK_TIME_NEVER) && (time_slave > time))
3004  time = time_slave;
3005  }
3006  if (time != FE_CALLBACK_TIME_NEVER)
3007  msleep(time / 10);
3008  else
3009  break;
3010  exit_condition = 1;
3011  for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3012  if (dib8000_get_tune_state(state->fe[index_frontend]) != CT_AGC_STOP) {
3013  exit_condition = 0;
3014  break;
3015  }
3016  }
3017  } while (exit_condition == 0);
3018 
3019  for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3020  dib8000_set_tune_state(state->fe[index_frontend], CT_DEMOD_START);
3021 
3022  if ((state->fe[0]->dtv_property_cache.delivery_system != SYS_ISDBT) ||
3023  (state->fe[0]->dtv_property_cache.inversion == INVERSION_AUTO) ||
3024  (state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_AUTO) ||
3025  (state->fe[0]->dtv_property_cache.guard_interval == GUARD_INTERVAL_AUTO) ||
3026  (((state->fe[0]->dtv_property_cache.isdbt_layer_enabled & (1 << 0)) != 0) &&
3027  (state->fe[0]->dtv_property_cache.layer[0].segment_count != 0xff) &&
3028  (state->fe[0]->dtv_property_cache.layer[0].segment_count != 0) &&
3029  ((state->fe[0]->dtv_property_cache.layer[0].modulation == QAM_AUTO) ||
3030  (state->fe[0]->dtv_property_cache.layer[0].fec == FEC_AUTO))) ||
3031  (((state->fe[0]->dtv_property_cache.isdbt_layer_enabled & (1 << 1)) != 0) &&
3032  (state->fe[0]->dtv_property_cache.layer[1].segment_count != 0xff) &&
3033  (state->fe[0]->dtv_property_cache.layer[1].segment_count != 0) &&
3034  ((state->fe[0]->dtv_property_cache.layer[1].modulation == QAM_AUTO) ||
3035  (state->fe[0]->dtv_property_cache.layer[1].fec == FEC_AUTO))) ||
3036  (((state->fe[0]->dtv_property_cache.isdbt_layer_enabled & (1 << 2)) != 0) &&
3037  (state->fe[0]->dtv_property_cache.layer[2].segment_count != 0xff) &&
3038  (state->fe[0]->dtv_property_cache.layer[2].segment_count != 0) &&
3039  ((state->fe[0]->dtv_property_cache.layer[2].modulation == QAM_AUTO) ||
3040  (state->fe[0]->dtv_property_cache.layer[2].fec == FEC_AUTO))) ||
3041  (((state->fe[0]->dtv_property_cache.layer[0].segment_count == 0) ||
3042  ((state->fe[0]->dtv_property_cache.isdbt_layer_enabled & (1 << 0)) == 0)) &&
3043  ((state->fe[0]->dtv_property_cache.layer[1].segment_count == 0) ||
3044  ((state->fe[0]->dtv_property_cache.isdbt_layer_enabled & (2 << 0)) == 0)) &&
3045  ((state->fe[0]->dtv_property_cache.layer[2].segment_count == 0) || ((state->fe[0]->dtv_property_cache.isdbt_layer_enabled & (3 << 0)) == 0)))) {
3046  int i = 100;
3047  u8 found = 0;
3048  u8 tune_failed = 0;
3049 
3050  for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3051  dib8000_set_bandwidth(state->fe[index_frontend], fe->dtv_property_cache.bandwidth_hz / 1000);
3052  dib8000_autosearch_start(state->fe[index_frontend]);
3053  }
3054 
3055  do {
3056  msleep(20);
3057  nbr_pending = 0;
3058  exit_condition = 0; /* 0: tune pending; 1: tune failed; 2:tune success */
3059  for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3060  if (((tune_failed >> index_frontend) & 0x1) == 0) {
3061  found = dib8000_autosearch_irq(state->fe[index_frontend]);
3062  switch (found) {
3063  case 0: /* tune pending */
3064  nbr_pending++;
3065  break;
3066  case 2:
3067  dprintk("autosearch succeed on the frontend%i", index_frontend);
3068  exit_condition = 2;
3069  index_frontend_success = index_frontend;
3070  break;
3071  default:
3072  dprintk("unhandled autosearch result");
3073  case 1:
3074  tune_failed |= (1 << index_frontend);
3075  dprintk("autosearch failed for the frontend%i", index_frontend);
3076  break;
3077  }
3078  }
3079  }
3080 
3081  /* if all tune are done and no success, exit: tune failed */
3082  if ((nbr_pending == 0) && (exit_condition == 0))
3083  exit_condition = 1;
3084  } while ((exit_condition == 0) && i--);
3085 
3086  if (exit_condition == 1) { /* tune failed */
3087  dprintk("tune failed");
3088  return 0;
3089  }
3090 
3091  dprintk("tune success on frontend%i", index_frontend_success);
3092 
3093  dib8000_get_frontend(fe);
3094  }
3095 
3096  for (index_frontend = 0, ret = 0; (ret >= 0) && (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3097  ret = dib8000_tune(state->fe[index_frontend]);
3098 
3099  /* set output mode and diversity input */
3100  if (state->revision != 0x8090) {
3101  dib8000_set_output_mode(state->fe[0], state->cfg.output_mode);
3102  for (index_frontend = 1;
3103  (index_frontend < MAX_NUMBER_OF_FRONTENDS) &&
3104  (state->fe[index_frontend] != NULL);
3105  index_frontend++) {
3106  dib8000_set_output_mode(state->fe[index_frontend],
3108  dib8000_set_diversity_in(state->fe[index_frontend-1], 1);
3109  }
3110 
3111  /* turn off the diversity of the last chip */
3112  dib8000_set_diversity_in(state->fe[index_frontend-1], 0);
3113  } else {
3114  dib8096p_set_output_mode(state->fe[0], state->cfg.output_mode);
3115  if (state->cfg.enMpegOutput == 0) {
3116  dib8096p_setDibTxMux(state, MPEG_ON_DIBTX);
3117  dib8096p_setHostBusMux(state, DIBTX_ON_HOSTBUS);
3118  }
3119  for (index_frontend = 1;
3120  (index_frontend < MAX_NUMBER_OF_FRONTENDS) &&
3121  (state->fe[index_frontend] != NULL);
3122  index_frontend++) {
3123  dib8096p_set_output_mode(state->fe[index_frontend],
3125  dib8096p_set_diversity_in(state->fe[index_frontend-1], 1);
3126  }
3127 
3128  /* turn off the diversity of the last chip */
3129  dib8096p_set_diversity_in(state->fe[index_frontend-1], 0);
3130  }
3131 
3132  return ret;
3133 }
3134 
3135 static u16 dib8000_read_lock(struct dvb_frontend *fe)
3136 {
3137  struct dib8000_state *state = fe->demodulator_priv;
3138 
3139  if (state->revision == 0x8090)
3140  return dib8000_read_word(state, 570);
3141  return dib8000_read_word(state, 568);
3142 }
3143 
3144 static int dib8000_read_status(struct dvb_frontend *fe, fe_status_t * stat)
3145 {
3146  struct dib8000_state *state = fe->demodulator_priv;
3147  u16 lock_slave = 0, lock;
3148  u8 index_frontend;
3149 
3150  if (state->revision == 0x8090)
3151  lock = dib8000_read_word(state, 570);
3152  else
3153  lock = dib8000_read_word(state, 568);
3154 
3155  for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3156  lock_slave |= dib8000_read_lock(state->fe[index_frontend]);
3157 
3158  *stat = 0;
3159 
3160  if (((lock >> 13) & 1) || ((lock_slave >> 13) & 1))
3161  *stat |= FE_HAS_SIGNAL;
3162 
3163  if (((lock >> 8) & 1) || ((lock_slave >> 8) & 1)) /* Equal */
3164  *stat |= FE_HAS_CARRIER;
3165 
3166  if ((((lock >> 1) & 0xf) == 0xf) || (((lock_slave >> 1) & 0xf) == 0xf)) /* TMCC_SYNC */
3167  *stat |= FE_HAS_SYNC;
3168 
3169  if ((((lock >> 12) & 1) || ((lock_slave >> 12) & 1)) && ((lock >> 5) & 7)) /* FEC MPEG */
3170  *stat |= FE_HAS_LOCK;
3171 
3172  if (((lock >> 12) & 1) || ((lock_slave >> 12) & 1)) {
3173  lock = dib8000_read_word(state, 554); /* Viterbi Layer A */
3174  if (lock & 0x01)
3175  *stat |= FE_HAS_VITERBI;
3176 
3177  lock = dib8000_read_word(state, 555); /* Viterbi Layer B */
3178  if (lock & 0x01)
3179  *stat |= FE_HAS_VITERBI;
3180 
3181  lock = dib8000_read_word(state, 556); /* Viterbi Layer C */
3182  if (lock & 0x01)
3183  *stat |= FE_HAS_VITERBI;
3184  }
3185 
3186  return 0;
3187 }
3188 
3189 static int dib8000_read_ber(struct dvb_frontend *fe, u32 * ber)
3190 {
3191  struct dib8000_state *state = fe->demodulator_priv;
3192 
3193  /* 13 segments */
3194  if (state->revision == 0x8090)
3195  *ber = (dib8000_read_word(state, 562) << 16) |
3196  dib8000_read_word(state, 563);
3197  else
3198  *ber = (dib8000_read_word(state, 560) << 16) |
3199  dib8000_read_word(state, 561);
3200  return 0;
3201 }
3202 
3203 static int dib8000_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
3204 {
3205  struct dib8000_state *state = fe->demodulator_priv;
3206 
3207  /* packet error on 13 seg */
3208  if (state->revision == 0x8090)
3209  *unc = dib8000_read_word(state, 567);
3210  else
3211  *unc = dib8000_read_word(state, 565);
3212  return 0;
3213 }
3214 
3215 static int dib8000_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
3216 {
3217  struct dib8000_state *state = fe->demodulator_priv;
3218  u8 index_frontend;
3219  u16 val;
3220 
3221  *strength = 0;
3222  for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3223  state->fe[index_frontend]->ops.read_signal_strength(state->fe[index_frontend], &val);
3224  if (val > 65535 - *strength)
3225  *strength = 65535;
3226  else
3227  *strength += val;
3228  }
3229 
3230  val = 65535 - dib8000_read_word(state, 390);
3231  if (val > 65535 - *strength)
3232  *strength = 65535;
3233  else
3234  *strength += val;
3235  return 0;
3236 }
3237 
3238 static u32 dib8000_get_snr(struct dvb_frontend *fe)
3239 {
3240  struct dib8000_state *state = fe->demodulator_priv;
3241  u32 n, s, exp;
3242  u16 val;
3243 
3244  if (state->revision != 0x8090)
3245  val = dib8000_read_word(state, 542);
3246  else
3247  val = dib8000_read_word(state, 544);
3248  n = (val >> 6) & 0xff;
3249  exp = (val & 0x3f);
3250  if ((exp & 0x20) != 0)
3251  exp -= 0x40;
3252  n <<= exp+16;
3253 
3254  if (state->revision != 0x8090)
3255  val = dib8000_read_word(state, 543);
3256  else
3257  val = dib8000_read_word(state, 545);
3258  s = (val >> 6) & 0xff;
3259  exp = (val & 0x3f);
3260  if ((exp & 0x20) != 0)
3261  exp -= 0x40;
3262  s <<= exp+16;
3263 
3264  if (n > 0) {
3265  u32 t = (s/n) << 16;
3266  return t + ((s << 16) - n*t) / n;
3267  }
3268  return 0xffffffff;
3269 }
3270 
3271 static int dib8000_read_snr(struct dvb_frontend *fe, u16 * snr)
3272 {
3273  struct dib8000_state *state = fe->demodulator_priv;
3274  u8 index_frontend;
3275  u32 snr_master;
3276 
3277  snr_master = dib8000_get_snr(fe);
3278  for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3279  snr_master += dib8000_get_snr(state->fe[index_frontend]);
3280 
3281  if ((snr_master >> 16) != 0) {
3282  snr_master = 10*intlog10(snr_master>>16);
3283  *snr = snr_master / ((1 << 24) / 10);
3284  }
3285  else
3286  *snr = 0;
3287 
3288  return 0;
3289 }
3290 
3291 int dib8000_set_slave_frontend(struct dvb_frontend *fe, struct dvb_frontend *fe_slave)
3292 {
3293  struct dib8000_state *state = fe->demodulator_priv;
3294  u8 index_frontend = 1;
3295 
3296  while ((index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL))
3297  index_frontend++;
3298  if (index_frontend < MAX_NUMBER_OF_FRONTENDS) {
3299  dprintk("set slave fe %p to index %i", fe_slave, index_frontend);
3300  state->fe[index_frontend] = fe_slave;
3301  return 0;
3302  }
3303 
3304  dprintk("too many slave frontend");
3305  return -ENOMEM;
3306 }
3308 
3310 {
3311  struct dib8000_state *state = fe->demodulator_priv;
3312  u8 index_frontend = 1;
3313 
3314  while ((index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL))
3315  index_frontend++;
3316  if (index_frontend != 1) {
3317  dprintk("remove slave fe %p (index %i)", state->fe[index_frontend-1], index_frontend-1);
3318  state->fe[index_frontend] = NULL;
3319  return 0;
3320  }
3321 
3322  dprintk("no frontend to be removed");
3323  return -ENODEV;
3324 }
3326 
3327 struct dvb_frontend *dib8000_get_slave_frontend(struct dvb_frontend *fe, int slave_index)
3328 {
3329  struct dib8000_state *state = fe->demodulator_priv;
3330 
3331  if (slave_index >= MAX_NUMBER_OF_FRONTENDS)
3332  return NULL;
3333  return state->fe[slave_index];
3334 }
3336 
3337 
3338 int dib8000_i2c_enumeration(struct i2c_adapter *host, int no_of_demods,
3339  u8 default_addr, u8 first_addr, u8 is_dib8096p)
3340 {
3341  int k = 0, ret = 0;
3342  u8 new_addr = 0;
3343  struct i2c_device client = {.adap = host };
3344 
3345  client.i2c_write_buffer = kzalloc(4 * sizeof(u8), GFP_KERNEL);
3346  if (!client.i2c_write_buffer) {
3347  dprintk("%s: not enough memory", __func__);
3348  return -ENOMEM;
3349  }
3350  client.i2c_read_buffer = kzalloc(4 * sizeof(u8), GFP_KERNEL);
3351  if (!client.i2c_read_buffer) {
3352  dprintk("%s: not enough memory", __func__);
3353  ret = -ENOMEM;
3354  goto error_memory_read;
3355  }
3356  client.i2c_buffer_lock = kzalloc(sizeof(struct mutex), GFP_KERNEL);
3357  if (!client.i2c_buffer_lock) {
3358  dprintk("%s: not enough memory", __func__);
3359  ret = -ENOMEM;
3360  goto error_memory_lock;
3361  }
3362  mutex_init(client.i2c_buffer_lock);
3363 
3364  for (k = no_of_demods - 1; k >= 0; k--) {
3365  /* designated i2c address */
3366  new_addr = first_addr + (k << 1);
3367 
3368  client.addr = new_addr;
3369  if (!is_dib8096p)
3370  dib8000_i2c_write16(&client, 1287, 0x0003); /* sram lead in, rdy */
3371  if (dib8000_identify(&client) == 0) {
3372  /* sram lead in, rdy */
3373  if (!is_dib8096p)
3374  dib8000_i2c_write16(&client, 1287, 0x0003);
3375  client.addr = default_addr;
3376  if (dib8000_identify(&client) == 0) {
3377  dprintk("#%d: not identified", k);
3378  ret = -EINVAL;
3379  goto error;
3380  }
3381  }
3382 
3383  /* start diversity to pull_down div_str - just for i2c-enumeration */
3384  dib8000_i2c_write16(&client, 1286, (1 << 10) | (4 << 6));
3385 
3386  /* set new i2c address and force divstart */
3387  dib8000_i2c_write16(&client, 1285, (new_addr << 2) | 0x2);
3388  client.addr = new_addr;
3389  dib8000_identify(&client);
3390 
3391  dprintk("IC %d initialized (to i2c_address 0x%x)", k, new_addr);
3392  }
3393 
3394  for (k = 0; k < no_of_demods; k++) {
3395  new_addr = first_addr | (k << 1);
3396  client.addr = new_addr;
3397 
3398  // unforce divstr
3399  dib8000_i2c_write16(&client, 1285, new_addr << 2);
3400 
3401  /* deactivate div - it was just for i2c-enumeration */
3402  dib8000_i2c_write16(&client, 1286, 0);
3403  }
3404 
3405 error:
3406  kfree(client.i2c_buffer_lock);
3407 error_memory_lock:
3408  kfree(client.i2c_read_buffer);
3409 error_memory_read:
3410  kfree(client.i2c_write_buffer);
3411 
3412  return ret;
3413 }
3414 
3416 static int dib8000_fe_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings *tune)
3417 {
3418  tune->min_delay_ms = 1000;
3419  tune->step_size = 0;
3420  tune->max_drift = 0;
3421  return 0;
3422 }
3423 
3424 static void dib8000_release(struct dvb_frontend *fe)
3425 {
3426  struct dib8000_state *st = fe->demodulator_priv;
3427  u8 index_frontend;
3428 
3429  for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (st->fe[index_frontend] != NULL); index_frontend++)
3430  dvb_frontend_detach(st->fe[index_frontend]);
3431 
3434  kfree(st->fe[0]);
3435  kfree(st);
3436 }
3437 
3439 {
3440  struct dib8000_state *st = fe->demodulator_priv;
3441  return dibx000_get_i2c_adapter(&st->i2c_master, intf, gating);
3442 }
3443 
3445 
3447 {
3448  struct dib8000_state *st = fe->demodulator_priv;
3449  u16 val = dib8000_read_word(st, 299) & 0xffef;
3450  val |= (onoff & 0x1) << 4;
3451 
3452  dprintk("pid filter enabled %d", onoff);
3453  return dib8000_write_word(st, 299, val);
3454 }
3456 
3457 int dib8000_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
3458 {
3459  struct dib8000_state *st = fe->demodulator_priv;
3460  dprintk("Index %x, PID %d, OnOff %d", id, pid, onoff);
3461  return dib8000_write_word(st, 305 + id, onoff ? (1 << 13) | pid : 0);
3462 }
3464 
3465 static const struct dvb_frontend_ops dib8000_ops = {
3466  .delsys = { SYS_ISDBT },
3467  .info = {
3468  .name = "DiBcom 8000 ISDB-T",
3469  .frequency_min = 44250000,
3470  .frequency_max = 867250000,
3471  .frequency_stepsize = 62500,
3472  .caps = FE_CAN_INVERSION_AUTO |
3477  },
3478 
3479  .release = dib8000_release,
3480 
3481  .init = dib8000_wakeup,
3482  .sleep = dib8000_sleep,
3483 
3484  .set_frontend = dib8000_set_frontend,
3485  .get_tune_settings = dib8000_fe_get_tune_settings,
3486  .get_frontend = dib8000_get_frontend,
3487 
3488  .read_status = dib8000_read_status,
3489  .read_ber = dib8000_read_ber,
3490  .read_signal_strength = dib8000_read_signal_strength,
3491  .read_snr = dib8000_read_snr,
3492  .read_ucblocks = dib8000_read_unc_blocks,
3493 };
3494 
3495 struct dvb_frontend *dib8000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib8000_config *cfg)
3496 {
3497  struct dvb_frontend *fe;
3498  struct dib8000_state *state;
3499 
3500  dprintk("dib8000_attach");
3501 
3502  state = kzalloc(sizeof(struct dib8000_state), GFP_KERNEL);
3503  if (state == NULL)
3504  return NULL;
3505  fe = kzalloc(sizeof(struct dvb_frontend), GFP_KERNEL);
3506  if (fe == NULL)
3507  goto error;
3508 
3509  memcpy(&state->cfg, cfg, sizeof(struct dib8000_config));
3510  state->i2c.adap = i2c_adap;
3511  state->i2c.addr = i2c_addr;
3512  state->i2c.i2c_write_buffer = state->i2c_write_buffer;
3513  state->i2c.i2c_read_buffer = state->i2c_read_buffer;
3514  mutex_init(&state->i2c_buffer_lock);
3515  state->i2c.i2c_buffer_lock = &state->i2c_buffer_lock;
3516  state->gpio_val = cfg->gpio_val;
3517  state->gpio_dir = cfg->gpio_dir;
3518 
3519  /* Ensure the output mode remains at the previous default if it's
3520  * not specifically set by the caller.
3521  */
3522  if ((state->cfg.output_mode != OUTMODE_MPEG2_SERIAL) && (state->cfg.output_mode != OUTMODE_MPEG2_PAR_GATED_CLK))
3523  state->cfg.output_mode = OUTMODE_MPEG2_FIFO;
3524 
3525  state->fe[0] = fe;
3526  fe->demodulator_priv = state;
3527  memcpy(&state->fe[0]->ops, &dib8000_ops, sizeof(struct dvb_frontend_ops));
3528 
3529  state->timf_default = cfg->pll->timf;
3530 
3531  if (dib8000_identify(&state->i2c) == 0)
3532  goto error;
3533 
3534  dibx000_init_i2c_master(&state->i2c_master, DIB8000, state->i2c.adap, state->i2c.addr);
3535 
3536  /* init 8096p tuner adapter */
3537  strncpy(state->dib8096p_tuner_adap.name, "DiB8096P tuner interface",
3538  sizeof(state->dib8096p_tuner_adap.name));
3539  state->dib8096p_tuner_adap.algo = &dib8096p_tuner_xfer_algo;
3540  state->dib8096p_tuner_adap.algo_data = NULL;
3541  state->dib8096p_tuner_adap.dev.parent = state->i2c.adap->dev.parent;
3542  i2c_set_adapdata(&state->dib8096p_tuner_adap, state);
3544 
3545  dib8000_reset(fe);
3546 
3547  dib8000_write_word(state, 285, (dib8000_read_word(state, 285) & ~0x60) | (3 << 5)); /* ber_rs_len = 3 */
3548 
3549  return fe;
3550 
3551  error:
3552  kfree(state);
3553  return NULL;
3554 }
3555 
3557 
3558 MODULE_AUTHOR("Olivier Grenie <[email protected], " "Patrick Boettcher <[email protected]>");
3559 MODULE_DESCRIPTION("Driver for the DiBcom 8000 ISDB-T demodulator");
3560 MODULE_LICENSE("GPL");