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