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