1 /* 2 * Driver for DiBcom DiB3000MC/P-demodulator. 3 * 4 * Copyright (C) 2004-7 DiBcom (http://www.dibcom.fr/) 5 * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@posteo.de) 6 * 7 * This code is partially based on the previous dib3000mc.c . 8 * 9 * This program is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU General Public License as 11 * published by the Free Software Foundation, version 2. 12 */ 13 14 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 15 16 #include <linux/kernel.h> 17 #include <linux/slab.h> 18 #include <linux/i2c.h> 19 20 #include <media/dvb_frontend.h> 21 22 #include "dib3000mc.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 dib3000mc_state { 39 struct dvb_frontend demod; 40 struct dib3000mc_config *cfg; 41 42 u8 i2c_addr; 43 struct i2c_adapter *i2c_adap; 44 45 struct dibx000_i2c_master i2c_master; 46 47 u32 timf; 48 49 u32 current_bandwidth; 50 51 u16 dev_id; 52 53 u8 sfn_workaround_active :1; 54 }; 55 56 static u16 dib3000mc_read_word(struct dib3000mc_state *state, u16 reg) 57 { 58 struct i2c_msg msg[2] = { 59 { .addr = state->i2c_addr >> 1, .flags = 0, .len = 2 }, 60 { .addr = state->i2c_addr >> 1, .flags = I2C_M_RD, .len = 2 }, 61 }; 62 u16 word; 63 u8 *b; 64 65 b = kmalloc(4, GFP_KERNEL); 66 if (!b) 67 return 0; 68 69 b[0] = (reg >> 8) | 0x80; 70 b[1] = reg; 71 b[2] = 0; 72 b[3] = 0; 73 74 msg[0].buf = b; 75 msg[1].buf = b + 2; 76 77 if (i2c_transfer(state->i2c_adap, msg, 2) != 2) 78 dprintk("i2c read error on %d\n",reg); 79 80 word = (b[2] << 8) | b[3]; 81 kfree(b); 82 83 return word; 84 } 85 86 static int dib3000mc_write_word(struct dib3000mc_state *state, u16 reg, u16 val) 87 { 88 struct i2c_msg msg = { 89 .addr = state->i2c_addr >> 1, .flags = 0, .len = 4 90 }; 91 int rc; 92 u8 *b; 93 94 b = kmalloc(4, GFP_KERNEL); 95 if (!b) 96 return -ENOMEM; 97 98 b[0] = reg >> 8; 99 b[1] = reg; 100 b[2] = val >> 8; 101 b[3] = val; 102 103 msg.buf = b; 104 105 rc = i2c_transfer(state->i2c_adap, &msg, 1) != 1 ? -EREMOTEIO : 0; 106 kfree(b); 107 108 return rc; 109 } 110 111 static int dib3000mc_identify(struct dib3000mc_state *state) 112 { 113 u16 value; 114 if ((value = dib3000mc_read_word(state, 1025)) != 0x01b3) { 115 dprintk("-E- DiB3000MC/P: wrong Vendor ID (read=0x%x)\n",value); 116 return -EREMOTEIO; 117 } 118 119 value = dib3000mc_read_word(state, 1026); 120 if (value != 0x3001 && value != 0x3002) { 121 dprintk("-E- DiB3000MC/P: wrong Device ID (%x)\n",value); 122 return -EREMOTEIO; 123 } 124 state->dev_id = value; 125 126 dprintk("-I- found DiB3000MC/P: %x\n",state->dev_id); 127 128 return 0; 129 } 130 131 static int dib3000mc_set_timing(struct dib3000mc_state *state, s16 nfft, u32 bw, u8 update_offset) 132 { 133 u32 timf; 134 135 if (state->timf == 0) { 136 timf = 1384402; // default value for 8MHz 137 if (update_offset) 138 msleep(200); // first time we do an update 139 } else 140 timf = state->timf; 141 142 timf *= (bw / 1000); 143 144 if (update_offset) { 145 s16 tim_offs = dib3000mc_read_word(state, 416); 146 147 if (tim_offs & 0x2000) 148 tim_offs -= 0x4000; 149 150 if (nfft == TRANSMISSION_MODE_2K) 151 tim_offs *= 4; 152 153 timf += tim_offs; 154 state->timf = timf / (bw / 1000); 155 } 156 157 dprintk("timf: %d\n", timf); 158 159 dib3000mc_write_word(state, 23, (u16) (timf >> 16)); 160 dib3000mc_write_word(state, 24, (u16) (timf ) & 0xffff); 161 162 return 0; 163 } 164 165 static int dib3000mc_setup_pwm_state(struct dib3000mc_state *state) 166 { 167 u16 reg_51, reg_52 = state->cfg->agc->setup & 0xfefb; 168 if (state->cfg->pwm3_inversion) { 169 reg_51 = (2 << 14) | (0 << 10) | (7 << 6) | (2 << 2) | (2 << 0); 170 reg_52 |= (1 << 2); 171 } else { 172 reg_51 = (2 << 14) | (4 << 10) | (7 << 6) | (2 << 2) | (2 << 0); 173 reg_52 |= (1 << 8); 174 } 175 dib3000mc_write_word(state, 51, reg_51); 176 dib3000mc_write_word(state, 52, reg_52); 177 178 if (state->cfg->use_pwm3) 179 dib3000mc_write_word(state, 245, (1 << 3) | (1 << 0)); 180 else 181 dib3000mc_write_word(state, 245, 0); 182 183 dib3000mc_write_word(state, 1040, 0x3); 184 return 0; 185 } 186 187 static int dib3000mc_set_output_mode(struct dib3000mc_state *state, int mode) 188 { 189 int ret = 0; 190 u16 fifo_threshold = 1792; 191 u16 outreg = 0; 192 u16 outmode = 0; 193 u16 elecout = 1; 194 u16 smo_reg = dib3000mc_read_word(state, 206) & 0x0010; /* keep the pid_parse bit */ 195 196 dprintk("-I- Setting output mode for demod %p to %d\n", 197 &state->demod, mode); 198 199 switch (mode) { 200 case OUTMODE_HIGH_Z: // disable 201 elecout = 0; 202 break; 203 case OUTMODE_MPEG2_PAR_GATED_CLK: // STBs with parallel gated clock 204 outmode = 0; 205 break; 206 case OUTMODE_MPEG2_PAR_CONT_CLK: // STBs with parallel continues clock 207 outmode = 1; 208 break; 209 case OUTMODE_MPEG2_SERIAL: // STBs with serial input 210 outmode = 2; 211 break; 212 case OUTMODE_MPEG2_FIFO: // e.g. USB feeding 213 elecout = 3; 214 /*ADDR @ 206 : 215 P_smo_error_discard [1;6:6] = 0 216 P_smo_rs_discard [1;5:5] = 0 217 P_smo_pid_parse [1;4:4] = 0 218 P_smo_fifo_flush [1;3:3] = 0 219 P_smo_mode [2;2:1] = 11 220 P_smo_ovf_prot [1;0:0] = 0 221 */ 222 smo_reg |= 3 << 1; 223 fifo_threshold = 512; 224 outmode = 5; 225 break; 226 case OUTMODE_DIVERSITY: 227 outmode = 4; 228 elecout = 1; 229 break; 230 default: 231 dprintk("Unhandled output_mode passed to be set for demod %p\n",&state->demod); 232 outmode = 0; 233 break; 234 } 235 236 if ((state->cfg->output_mpeg2_in_188_bytes)) 237 smo_reg |= (1 << 5); // P_smo_rs_discard [1;5:5] = 1 238 239 outreg = dib3000mc_read_word(state, 244) & 0x07FF; 240 outreg |= (outmode << 11); 241 ret |= dib3000mc_write_word(state, 244, outreg); 242 ret |= dib3000mc_write_word(state, 206, smo_reg); /*smo_ mode*/ 243 ret |= dib3000mc_write_word(state, 207, fifo_threshold); /* synchronous fread */ 244 ret |= dib3000mc_write_word(state, 1040, elecout); /* P_out_cfg */ 245 return ret; 246 } 247 248 static int dib3000mc_set_bandwidth(struct dib3000mc_state *state, u32 bw) 249 { 250 u16 bw_cfg[6] = { 0 }; 251 u16 imp_bw_cfg[3] = { 0 }; 252 u16 reg; 253 254 /* settings here are for 27.7MHz */ 255 switch (bw) { 256 case 8000: 257 bw_cfg[0] = 0x0019; bw_cfg[1] = 0x5c30; bw_cfg[2] = 0x0054; bw_cfg[3] = 0x88a0; bw_cfg[4] = 0x01a6; bw_cfg[5] = 0xab20; 258 imp_bw_cfg[0] = 0x04db; imp_bw_cfg[1] = 0x00db; imp_bw_cfg[2] = 0x00b7; 259 break; 260 261 case 7000: 262 bw_cfg[0] = 0x001c; bw_cfg[1] = 0xfba5; bw_cfg[2] = 0x0060; bw_cfg[3] = 0x9c25; bw_cfg[4] = 0x01e3; bw_cfg[5] = 0x0cb7; 263 imp_bw_cfg[0] = 0x04c0; imp_bw_cfg[1] = 0x00c0; imp_bw_cfg[2] = 0x00a0; 264 break; 265 266 case 6000: 267 bw_cfg[0] = 0x0021; bw_cfg[1] = 0xd040; bw_cfg[2] = 0x0070; bw_cfg[3] = 0xb62b; bw_cfg[4] = 0x0233; bw_cfg[5] = 0x8ed5; 268 imp_bw_cfg[0] = 0x04a5; imp_bw_cfg[1] = 0x00a5; imp_bw_cfg[2] = 0x0089; 269 break; 270 271 case 5000: 272 bw_cfg[0] = 0x0028; bw_cfg[1] = 0x9380; bw_cfg[2] = 0x0087; bw_cfg[3] = 0x4100; bw_cfg[4] = 0x02a4; bw_cfg[5] = 0x4500; 273 imp_bw_cfg[0] = 0x0489; imp_bw_cfg[1] = 0x0089; imp_bw_cfg[2] = 0x0072; 274 break; 275 276 default: return -EINVAL; 277 } 278 279 for (reg = 6; reg < 12; reg++) 280 dib3000mc_write_word(state, reg, bw_cfg[reg - 6]); 281 dib3000mc_write_word(state, 12, 0x0000); 282 dib3000mc_write_word(state, 13, 0x03e8); 283 dib3000mc_write_word(state, 14, 0x0000); 284 dib3000mc_write_word(state, 15, 0x03f2); 285 dib3000mc_write_word(state, 16, 0x0001); 286 dib3000mc_write_word(state, 17, 0xb0d0); 287 // P_sec_len 288 dib3000mc_write_word(state, 18, 0x0393); 289 dib3000mc_write_word(state, 19, 0x8700); 290 291 for (reg = 55; reg < 58; reg++) 292 dib3000mc_write_word(state, reg, imp_bw_cfg[reg - 55]); 293 294 // Timing configuration 295 dib3000mc_set_timing(state, TRANSMISSION_MODE_2K, bw, 0); 296 297 return 0; 298 } 299 300 static u16 impulse_noise_val[29] = 301 302 { 303 0x38, 0x6d9, 0x3f28, 0x7a7, 0x3a74, 0x196, 0x32a, 0x48c, 0x3ffe, 0x7f3, 304 0x2d94, 0x76, 0x53d, 0x3ff8, 0x7e3, 0x3320, 0x76, 0x5b3, 0x3feb, 0x7d2, 305 0x365e, 0x76, 0x48c, 0x3ffe, 0x5b3, 0x3feb, 0x76, 0x0000, 0xd 306 }; 307 308 static void dib3000mc_set_impulse_noise(struct dib3000mc_state *state, u8 mode, s16 nfft) 309 { 310 u16 i; 311 for (i = 58; i < 87; i++) 312 dib3000mc_write_word(state, i, impulse_noise_val[i-58]); 313 314 if (nfft == TRANSMISSION_MODE_8K) { 315 dib3000mc_write_word(state, 58, 0x3b); 316 dib3000mc_write_word(state, 84, 0x00); 317 dib3000mc_write_word(state, 85, 0x8200); 318 } 319 320 dib3000mc_write_word(state, 34, 0x1294); 321 dib3000mc_write_word(state, 35, 0x1ff8); 322 if (mode == 1) 323 dib3000mc_write_word(state, 55, dib3000mc_read_word(state, 55) | (1 << 10)); 324 } 325 326 static int dib3000mc_init(struct dvb_frontend *demod) 327 { 328 struct dib3000mc_state *state = demod->demodulator_priv; 329 struct dibx000_agc_config *agc = state->cfg->agc; 330 331 // Restart Configuration 332 dib3000mc_write_word(state, 1027, 0x8000); 333 dib3000mc_write_word(state, 1027, 0x0000); 334 335 // power up the demod + mobility configuration 336 dib3000mc_write_word(state, 140, 0x0000); 337 dib3000mc_write_word(state, 1031, 0); 338 339 if (state->cfg->mobile_mode) { 340 dib3000mc_write_word(state, 139, 0x0000); 341 dib3000mc_write_word(state, 141, 0x0000); 342 dib3000mc_write_word(state, 175, 0x0002); 343 dib3000mc_write_word(state, 1032, 0x0000); 344 } else { 345 dib3000mc_write_word(state, 139, 0x0001); 346 dib3000mc_write_word(state, 141, 0x0000); 347 dib3000mc_write_word(state, 175, 0x0000); 348 dib3000mc_write_word(state, 1032, 0x012C); 349 } 350 dib3000mc_write_word(state, 1033, 0x0000); 351 352 // P_clk_cfg 353 dib3000mc_write_word(state, 1037, 0x3130); 354 355 // other configurations 356 357 // P_ctrl_sfreq 358 dib3000mc_write_word(state, 33, (5 << 0)); 359 dib3000mc_write_word(state, 88, (1 << 10) | (0x10 << 0)); 360 361 // Phase noise control 362 // P_fft_phacor_inh, P_fft_phacor_cpe, P_fft_powrange 363 dib3000mc_write_word(state, 99, (1 << 9) | (0x20 << 0)); 364 365 if (state->cfg->phase_noise_mode == 0) 366 dib3000mc_write_word(state, 111, 0x00); 367 else 368 dib3000mc_write_word(state, 111, 0x02); 369 370 // P_agc_global 371 dib3000mc_write_word(state, 50, 0x8000); 372 373 // agc setup misc 374 dib3000mc_setup_pwm_state(state); 375 376 // P_agc_counter_lock 377 dib3000mc_write_word(state, 53, 0x87); 378 // P_agc_counter_unlock 379 dib3000mc_write_word(state, 54, 0x87); 380 381 /* agc */ 382 dib3000mc_write_word(state, 36, state->cfg->max_time); 383 dib3000mc_write_word(state, 37, (state->cfg->agc_command1 << 13) | (state->cfg->agc_command2 << 12) | (0x1d << 0)); 384 dib3000mc_write_word(state, 38, state->cfg->pwm3_value); 385 dib3000mc_write_word(state, 39, state->cfg->ln_adc_level); 386 387 // set_agc_loop_Bw 388 dib3000mc_write_word(state, 40, 0x0179); 389 dib3000mc_write_word(state, 41, 0x03f0); 390 391 dib3000mc_write_word(state, 42, agc->agc1_max); 392 dib3000mc_write_word(state, 43, agc->agc1_min); 393 dib3000mc_write_word(state, 44, agc->agc2_max); 394 dib3000mc_write_word(state, 45, agc->agc2_min); 395 dib3000mc_write_word(state, 46, (agc->agc1_pt1 << 8) | agc->agc1_pt2); 396 dib3000mc_write_word(state, 47, (agc->agc1_slope1 << 8) | agc->agc1_slope2); 397 dib3000mc_write_word(state, 48, (agc->agc2_pt1 << 8) | agc->agc2_pt2); 398 dib3000mc_write_word(state, 49, (agc->agc2_slope1 << 8) | agc->agc2_slope2); 399 400 // Begin: TimeOut registers 401 // P_pha3_thres 402 dib3000mc_write_word(state, 110, 3277); 403 // P_timf_alpha = 6, P_corm_alpha = 6, P_corm_thres = 0x80 404 dib3000mc_write_word(state, 26, 0x6680); 405 // lock_mask0 406 dib3000mc_write_word(state, 1, 4); 407 // lock_mask1 408 dib3000mc_write_word(state, 2, 4); 409 // lock_mask2 410 dib3000mc_write_word(state, 3, 0x1000); 411 // P_search_maxtrial=1 412 dib3000mc_write_word(state, 5, 1); 413 414 dib3000mc_set_bandwidth(state, 8000); 415 416 // div_lock_mask 417 dib3000mc_write_word(state, 4, 0x814); 418 419 dib3000mc_write_word(state, 21, (1 << 9) | 0x164); 420 dib3000mc_write_word(state, 22, 0x463d); 421 422 // Spurious rm cfg 423 // P_cspu_regul, P_cspu_win_cut 424 dib3000mc_write_word(state, 120, 0x200f); 425 // P_adp_selec_monit 426 dib3000mc_write_word(state, 134, 0); 427 428 // Fec cfg 429 dib3000mc_write_word(state, 195, 0x10); 430 431 // diversity register: P_dvsy_sync_wait.. 432 dib3000mc_write_word(state, 180, 0x2FF0); 433 434 // Impulse noise configuration 435 dib3000mc_set_impulse_noise(state, 0, TRANSMISSION_MODE_8K); 436 437 // output mode set-up 438 dib3000mc_set_output_mode(state, OUTMODE_HIGH_Z); 439 440 /* close the i2c-gate */ 441 dib3000mc_write_word(state, 769, (1 << 7) ); 442 443 return 0; 444 } 445 446 static int dib3000mc_sleep(struct dvb_frontend *demod) 447 { 448 struct dib3000mc_state *state = demod->demodulator_priv; 449 450 dib3000mc_write_word(state, 1031, 0xFFFF); 451 dib3000mc_write_word(state, 1032, 0xFFFF); 452 dib3000mc_write_word(state, 1033, 0xFFF0); 453 454 return 0; 455 } 456 457 static void dib3000mc_set_adp_cfg(struct dib3000mc_state *state, s16 qam) 458 { 459 u16 cfg[4] = { 0 },reg; 460 switch (qam) { 461 case QPSK: 462 cfg[0] = 0x099a; cfg[1] = 0x7fae; cfg[2] = 0x0333; cfg[3] = 0x7ff0; 463 break; 464 case QAM_16: 465 cfg[0] = 0x023d; cfg[1] = 0x7fdf; cfg[2] = 0x00a4; cfg[3] = 0x7ff0; 466 break; 467 case QAM_64: 468 cfg[0] = 0x0148; cfg[1] = 0x7ff0; cfg[2] = 0x00a4; cfg[3] = 0x7ff8; 469 break; 470 } 471 for (reg = 129; reg < 133; reg++) 472 dib3000mc_write_word(state, reg, cfg[reg - 129]); 473 } 474 475 static void dib3000mc_set_channel_cfg(struct dib3000mc_state *state, 476 struct dtv_frontend_properties *ch, u16 seq) 477 { 478 u16 value; 479 u32 bw = BANDWIDTH_TO_KHZ(ch->bandwidth_hz); 480 481 dib3000mc_set_bandwidth(state, bw); 482 dib3000mc_set_timing(state, ch->transmission_mode, bw, 0); 483 484 #if 1 485 dib3000mc_write_word(state, 100, (16 << 6) + 9); 486 #else 487 if (boost) 488 dib3000mc_write_word(state, 100, (11 << 6) + 6); 489 else 490 dib3000mc_write_word(state, 100, (16 << 6) + 9); 491 #endif 492 493 dib3000mc_write_word(state, 1027, 0x0800); 494 dib3000mc_write_word(state, 1027, 0x0000); 495 496 //Default cfg isi offset adp 497 dib3000mc_write_word(state, 26, 0x6680); 498 dib3000mc_write_word(state, 29, 0x1273); 499 dib3000mc_write_word(state, 33, 5); 500 dib3000mc_set_adp_cfg(state, QAM_16); 501 dib3000mc_write_word(state, 133, 15564); 502 503 dib3000mc_write_word(state, 12 , 0x0); 504 dib3000mc_write_word(state, 13 , 0x3e8); 505 dib3000mc_write_word(state, 14 , 0x0); 506 dib3000mc_write_word(state, 15 , 0x3f2); 507 508 dib3000mc_write_word(state, 93,0); 509 dib3000mc_write_word(state, 94,0); 510 dib3000mc_write_word(state, 95,0); 511 dib3000mc_write_word(state, 96,0); 512 dib3000mc_write_word(state, 97,0); 513 dib3000mc_write_word(state, 98,0); 514 515 dib3000mc_set_impulse_noise(state, 0, ch->transmission_mode); 516 517 value = 0; 518 switch (ch->transmission_mode) { 519 case TRANSMISSION_MODE_2K: value |= (0 << 7); break; 520 default: 521 case TRANSMISSION_MODE_8K: value |= (1 << 7); break; 522 } 523 switch (ch->guard_interval) { 524 case GUARD_INTERVAL_1_32: value |= (0 << 5); break; 525 case GUARD_INTERVAL_1_16: value |= (1 << 5); break; 526 case GUARD_INTERVAL_1_4: value |= (3 << 5); break; 527 default: 528 case GUARD_INTERVAL_1_8: value |= (2 << 5); break; 529 } 530 switch (ch->modulation) { 531 case QPSK: value |= (0 << 3); break; 532 case QAM_16: value |= (1 << 3); break; 533 default: 534 case QAM_64: value |= (2 << 3); break; 535 } 536 switch (HIERARCHY_1) { 537 case HIERARCHY_2: value |= 2; break; 538 case HIERARCHY_4: value |= 4; break; 539 default: 540 case HIERARCHY_1: value |= 1; break; 541 } 542 dib3000mc_write_word(state, 0, value); 543 dib3000mc_write_word(state, 5, (1 << 8) | ((seq & 0xf) << 4)); 544 545 value = 0; 546 if (ch->hierarchy == 1) 547 value |= (1 << 4); 548 if (1 == 1) 549 value |= 1; 550 switch ((ch->hierarchy == 0 || 1 == 1) ? ch->code_rate_HP : ch->code_rate_LP) { 551 case FEC_2_3: value |= (2 << 1); break; 552 case FEC_3_4: value |= (3 << 1); break; 553 case FEC_5_6: value |= (5 << 1); break; 554 case FEC_7_8: value |= (7 << 1); break; 555 default: 556 case FEC_1_2: value |= (1 << 1); break; 557 } 558 dib3000mc_write_word(state, 181, value); 559 560 // diversity synchro delay add 50% SFN margin 561 switch (ch->transmission_mode) { 562 case TRANSMISSION_MODE_8K: value = 256; break; 563 case TRANSMISSION_MODE_2K: 564 default: value = 64; break; 565 } 566 switch (ch->guard_interval) { 567 case GUARD_INTERVAL_1_16: value *= 2; break; 568 case GUARD_INTERVAL_1_8: value *= 4; break; 569 case GUARD_INTERVAL_1_4: value *= 8; break; 570 default: 571 case GUARD_INTERVAL_1_32: value *= 1; break; 572 } 573 value <<= 4; 574 value |= dib3000mc_read_word(state, 180) & 0x000f; 575 dib3000mc_write_word(state, 180, value); 576 577 // restart demod 578 value = dib3000mc_read_word(state, 0); 579 dib3000mc_write_word(state, 0, value | (1 << 9)); 580 dib3000mc_write_word(state, 0, value); 581 582 msleep(30); 583 584 dib3000mc_set_impulse_noise(state, state->cfg->impulse_noise_mode, ch->transmission_mode); 585 } 586 587 static int dib3000mc_autosearch_start(struct dvb_frontend *demod) 588 { 589 struct dtv_frontend_properties *chan = &demod->dtv_property_cache; 590 struct dib3000mc_state *state = demod->demodulator_priv; 591 u16 reg; 592 // u32 val; 593 struct dtv_frontend_properties schan; 594 595 schan = *chan; 596 597 /* TODO what is that ? */ 598 599 /* a channel for autosearch */ 600 schan.transmission_mode = TRANSMISSION_MODE_8K; 601 schan.guard_interval = GUARD_INTERVAL_1_32; 602 schan.modulation = QAM_64; 603 schan.code_rate_HP = FEC_2_3; 604 schan.code_rate_LP = FEC_2_3; 605 schan.hierarchy = 0; 606 607 dib3000mc_set_channel_cfg(state, &schan, 11); 608 609 reg = dib3000mc_read_word(state, 0); 610 dib3000mc_write_word(state, 0, reg | (1 << 8)); 611 dib3000mc_read_word(state, 511); 612 dib3000mc_write_word(state, 0, reg); 613 614 return 0; 615 } 616 617 static int dib3000mc_autosearch_is_irq(struct dvb_frontend *demod) 618 { 619 struct dib3000mc_state *state = demod->demodulator_priv; 620 u16 irq_pending = dib3000mc_read_word(state, 511); 621 622 if (irq_pending & 0x1) // failed 623 return 1; 624 625 if (irq_pending & 0x2) // succeeded 626 return 2; 627 628 return 0; // still pending 629 } 630 631 static int dib3000mc_tune(struct dvb_frontend *demod) 632 { 633 struct dtv_frontend_properties *ch = &demod->dtv_property_cache; 634 struct dib3000mc_state *state = demod->demodulator_priv; 635 636 // ** configure demod ** 637 dib3000mc_set_channel_cfg(state, ch, 0); 638 639 // activates isi 640 if (state->sfn_workaround_active) { 641 dprintk("SFN workaround is active\n"); 642 dib3000mc_write_word(state, 29, 0x1273); 643 dib3000mc_write_word(state, 108, 0x4000); // P_pha3_force_pha_shift 644 } else { 645 dib3000mc_write_word(state, 29, 0x1073); 646 dib3000mc_write_word(state, 108, 0x0000); // P_pha3_force_pha_shift 647 } 648 649 dib3000mc_set_adp_cfg(state, (u8)ch->modulation); 650 if (ch->transmission_mode == TRANSMISSION_MODE_8K) { 651 dib3000mc_write_word(state, 26, 38528); 652 dib3000mc_write_word(state, 33, 8); 653 } else { 654 dib3000mc_write_word(state, 26, 30336); 655 dib3000mc_write_word(state, 33, 6); 656 } 657 658 if (dib3000mc_read_word(state, 509) & 0x80) 659 dib3000mc_set_timing(state, ch->transmission_mode, 660 BANDWIDTH_TO_KHZ(ch->bandwidth_hz), 1); 661 662 return 0; 663 } 664 665 struct i2c_adapter * dib3000mc_get_tuner_i2c_master(struct dvb_frontend *demod, int gating) 666 { 667 struct dib3000mc_state *st = demod->demodulator_priv; 668 return dibx000_get_i2c_adapter(&st->i2c_master, DIBX000_I2C_INTERFACE_TUNER, gating); 669 } 670 671 EXPORT_SYMBOL(dib3000mc_get_tuner_i2c_master); 672 673 static int dib3000mc_get_frontend(struct dvb_frontend* fe, 674 struct dtv_frontend_properties *fep) 675 { 676 struct dib3000mc_state *state = fe->demodulator_priv; 677 u16 tps = dib3000mc_read_word(state,458); 678 679 fep->inversion = INVERSION_AUTO; 680 681 fep->bandwidth_hz = state->current_bandwidth; 682 683 switch ((tps >> 8) & 0x1) { 684 case 0: fep->transmission_mode = TRANSMISSION_MODE_2K; break; 685 case 1: fep->transmission_mode = TRANSMISSION_MODE_8K; break; 686 } 687 688 switch (tps & 0x3) { 689 case 0: fep->guard_interval = GUARD_INTERVAL_1_32; break; 690 case 1: fep->guard_interval = GUARD_INTERVAL_1_16; break; 691 case 2: fep->guard_interval = GUARD_INTERVAL_1_8; break; 692 case 3: fep->guard_interval = GUARD_INTERVAL_1_4; break; 693 } 694 695 switch ((tps >> 13) & 0x3) { 696 case 0: fep->modulation = QPSK; break; 697 case 1: fep->modulation = QAM_16; break; 698 case 2: 699 default: fep->modulation = QAM_64; break; 700 } 701 702 /* as long as the frontend_param structure is fixed for hierarchical transmission I refuse to use it */ 703 /* (tps >> 12) & 0x1 == hrch is used, (tps >> 9) & 0x7 == alpha */ 704 705 fep->hierarchy = HIERARCHY_NONE; 706 switch ((tps >> 5) & 0x7) { 707 case 1: fep->code_rate_HP = FEC_1_2; break; 708 case 2: fep->code_rate_HP = FEC_2_3; break; 709 case 3: fep->code_rate_HP = FEC_3_4; break; 710 case 5: fep->code_rate_HP = FEC_5_6; break; 711 case 7: 712 default: fep->code_rate_HP = FEC_7_8; break; 713 714 } 715 716 switch ((tps >> 2) & 0x7) { 717 case 1: fep->code_rate_LP = FEC_1_2; break; 718 case 2: fep->code_rate_LP = FEC_2_3; break; 719 case 3: fep->code_rate_LP = FEC_3_4; break; 720 case 5: fep->code_rate_LP = FEC_5_6; break; 721 case 7: 722 default: fep->code_rate_LP = FEC_7_8; break; 723 } 724 725 return 0; 726 } 727 728 static int dib3000mc_set_frontend(struct dvb_frontend *fe) 729 { 730 struct dtv_frontend_properties *fep = &fe->dtv_property_cache; 731 struct dib3000mc_state *state = fe->demodulator_priv; 732 int ret; 733 734 dib3000mc_set_output_mode(state, OUTMODE_HIGH_Z); 735 736 state->current_bandwidth = fep->bandwidth_hz; 737 dib3000mc_set_bandwidth(state, BANDWIDTH_TO_KHZ(fep->bandwidth_hz)); 738 739 /* maybe the parameter has been changed */ 740 state->sfn_workaround_active = buggy_sfn_workaround; 741 742 if (fe->ops.tuner_ops.set_params) { 743 fe->ops.tuner_ops.set_params(fe); 744 msleep(100); 745 } 746 747 if (fep->transmission_mode == TRANSMISSION_MODE_AUTO || 748 fep->guard_interval == GUARD_INTERVAL_AUTO || 749 fep->modulation == QAM_AUTO || 750 fep->code_rate_HP == FEC_AUTO) { 751 int i = 1000, found; 752 753 dib3000mc_autosearch_start(fe); 754 do { 755 msleep(1); 756 found = dib3000mc_autosearch_is_irq(fe); 757 } while (found == 0 && i--); 758 759 dprintk("autosearch returns: %d\n",found); 760 if (found == 0 || found == 1) 761 return 0; // no channel found 762 763 dib3000mc_get_frontend(fe, fep); 764 } 765 766 ret = dib3000mc_tune(fe); 767 768 /* make this a config parameter */ 769 dib3000mc_set_output_mode(state, OUTMODE_MPEG2_FIFO); 770 return ret; 771 } 772 773 static int dib3000mc_read_status(struct dvb_frontend *fe, enum fe_status *stat) 774 { 775 struct dib3000mc_state *state = fe->demodulator_priv; 776 u16 lock = dib3000mc_read_word(state, 509); 777 778 *stat = 0; 779 780 if (lock & 0x8000) 781 *stat |= FE_HAS_SIGNAL; 782 if (lock & 0x3000) 783 *stat |= FE_HAS_CARRIER; 784 if (lock & 0x0100) 785 *stat |= FE_HAS_VITERBI; 786 if (lock & 0x0010) 787 *stat |= FE_HAS_SYNC; 788 if (lock & 0x0008) 789 *stat |= FE_HAS_LOCK; 790 791 return 0; 792 } 793 794 static int dib3000mc_read_ber(struct dvb_frontend *fe, u32 *ber) 795 { 796 struct dib3000mc_state *state = fe->demodulator_priv; 797 *ber = (dib3000mc_read_word(state, 500) << 16) | dib3000mc_read_word(state, 501); 798 return 0; 799 } 800 801 static int dib3000mc_read_unc_blocks(struct dvb_frontend *fe, u32 *unc) 802 { 803 struct dib3000mc_state *state = fe->demodulator_priv; 804 *unc = dib3000mc_read_word(state, 508); 805 return 0; 806 } 807 808 static int dib3000mc_read_signal_strength(struct dvb_frontend *fe, u16 *strength) 809 { 810 struct dib3000mc_state *state = fe->demodulator_priv; 811 u16 val = dib3000mc_read_word(state, 392); 812 *strength = 65535 - val; 813 return 0; 814 } 815 816 static int dib3000mc_read_snr(struct dvb_frontend* fe, u16 *snr) 817 { 818 *snr = 0x0000; 819 return 0; 820 } 821 822 static int dib3000mc_fe_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings *tune) 823 { 824 tune->min_delay_ms = 1000; 825 return 0; 826 } 827 828 static void dib3000mc_release(struct dvb_frontend *fe) 829 { 830 struct dib3000mc_state *state = fe->demodulator_priv; 831 dibx000_exit_i2c_master(&state->i2c_master); 832 kfree(state); 833 } 834 835 int dib3000mc_pid_control(struct dvb_frontend *fe, int index, int pid,int onoff) 836 { 837 struct dib3000mc_state *state = fe->demodulator_priv; 838 dib3000mc_write_word(state, 212 + index, onoff ? (1 << 13) | pid : 0); 839 return 0; 840 } 841 EXPORT_SYMBOL(dib3000mc_pid_control); 842 843 int dib3000mc_pid_parse(struct dvb_frontend *fe, int onoff) 844 { 845 struct dib3000mc_state *state = fe->demodulator_priv; 846 u16 tmp = dib3000mc_read_word(state, 206) & ~(1 << 4); 847 tmp |= (onoff << 4); 848 return dib3000mc_write_word(state, 206, tmp); 849 } 850 EXPORT_SYMBOL(dib3000mc_pid_parse); 851 852 void dib3000mc_set_config(struct dvb_frontend *fe, struct dib3000mc_config *cfg) 853 { 854 struct dib3000mc_state *state = fe->demodulator_priv; 855 state->cfg = cfg; 856 } 857 EXPORT_SYMBOL(dib3000mc_set_config); 858 859 int dib3000mc_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib3000mc_config cfg[]) 860 { 861 struct dib3000mc_state *dmcst; 862 int k; 863 u8 new_addr; 864 865 static u8 DIB3000MC_I2C_ADDRESS[] = {20,22,24,26}; 866 867 dmcst = kzalloc(sizeof(struct dib3000mc_state), GFP_KERNEL); 868 if (dmcst == NULL) 869 return -ENOMEM; 870 871 dmcst->i2c_adap = i2c; 872 873 for (k = no_of_demods-1; k >= 0; k--) { 874 dmcst->cfg = &cfg[k]; 875 876 /* designated i2c address */ 877 new_addr = DIB3000MC_I2C_ADDRESS[k]; 878 dmcst->i2c_addr = new_addr; 879 if (dib3000mc_identify(dmcst) != 0) { 880 dmcst->i2c_addr = default_addr; 881 if (dib3000mc_identify(dmcst) != 0) { 882 dprintk("-E- DiB3000P/MC #%d: not identified\n", k); 883 kfree(dmcst); 884 return -ENODEV; 885 } 886 } 887 888 dib3000mc_set_output_mode(dmcst, OUTMODE_MPEG2_PAR_CONT_CLK); 889 890 // set new i2c address and force divstr (Bit 1) to value 0 (Bit 0) 891 dib3000mc_write_word(dmcst, 1024, (new_addr << 3) | 0x1); 892 dmcst->i2c_addr = new_addr; 893 } 894 895 for (k = 0; k < no_of_demods; k++) { 896 dmcst->cfg = &cfg[k]; 897 dmcst->i2c_addr = DIB3000MC_I2C_ADDRESS[k]; 898 899 dib3000mc_write_word(dmcst, 1024, dmcst->i2c_addr << 3); 900 901 /* turn off data output */ 902 dib3000mc_set_output_mode(dmcst, OUTMODE_HIGH_Z); 903 } 904 905 kfree(dmcst); 906 return 0; 907 } 908 EXPORT_SYMBOL(dib3000mc_i2c_enumeration); 909 910 static const struct dvb_frontend_ops dib3000mc_ops; 911 912 struct dvb_frontend * dib3000mc_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib3000mc_config *cfg) 913 { 914 struct dvb_frontend *demod; 915 struct dib3000mc_state *st; 916 st = kzalloc(sizeof(struct dib3000mc_state), GFP_KERNEL); 917 if (st == NULL) 918 return NULL; 919 920 st->cfg = cfg; 921 st->i2c_adap = i2c_adap; 922 st->i2c_addr = i2c_addr; 923 924 demod = &st->demod; 925 demod->demodulator_priv = st; 926 memcpy(&st->demod.ops, &dib3000mc_ops, sizeof(struct dvb_frontend_ops)); 927 928 if (dib3000mc_identify(st) != 0) 929 goto error; 930 931 dibx000_init_i2c_master(&st->i2c_master, DIB3000MC, st->i2c_adap, st->i2c_addr); 932 933 dib3000mc_write_word(st, 1037, 0x3130); 934 935 return demod; 936 937 error: 938 kfree(st); 939 return NULL; 940 } 941 EXPORT_SYMBOL(dib3000mc_attach); 942 943 static const struct dvb_frontend_ops dib3000mc_ops = { 944 .delsys = { SYS_DVBT }, 945 .info = { 946 .name = "DiBcom 3000MC/P", 947 .frequency_min_hz = 44250 * kHz, 948 .frequency_max_hz = 867250 * kHz, 949 .frequency_stepsize_hz = 62500, 950 .caps = FE_CAN_INVERSION_AUTO | 951 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | 952 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | 953 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO | 954 FE_CAN_TRANSMISSION_MODE_AUTO | 955 FE_CAN_GUARD_INTERVAL_AUTO | 956 FE_CAN_RECOVER | 957 FE_CAN_HIERARCHY_AUTO, 958 }, 959 960 .release = dib3000mc_release, 961 962 .init = dib3000mc_init, 963 .sleep = dib3000mc_sleep, 964 965 .set_frontend = dib3000mc_set_frontend, 966 .get_tune_settings = dib3000mc_fe_get_tune_settings, 967 .get_frontend = dib3000mc_get_frontend, 968 969 .read_status = dib3000mc_read_status, 970 .read_ber = dib3000mc_read_ber, 971 .read_signal_strength = dib3000mc_read_signal_strength, 972 .read_snr = dib3000mc_read_snr, 973 .read_ucblocks = dib3000mc_read_unc_blocks, 974 }; 975 976 MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>"); 977 MODULE_DESCRIPTION("Driver for the DiBcom 3000MC/P COFDM demodulator"); 978 MODULE_LICENSE("GPL"); 979