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