lgdt330x.c (26108B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Support for LGDT3302 and LGDT3303 - VSB/QAM 4 * 5 * Copyright (C) 2005 Wilson Michaels <wilsonmichaels@earthlink.net> 6 */ 7 8/* 9 * NOTES ABOUT THIS DRIVER 10 * 11 * This Linux driver supports: 12 * DViCO FusionHDTV 3 Gold-Q 13 * DViCO FusionHDTV 3 Gold-T 14 * DViCO FusionHDTV 5 Gold 15 * DViCO FusionHDTV 5 Lite 16 * DViCO FusionHDTV 5 USB Gold 17 * Air2PC/AirStar 2 ATSC 3rd generation (HD5000) 18 * pcHDTV HD5500 19 * 20 */ 21 22#include <linux/kernel.h> 23#include <linux/module.h> 24#include <linux/init.h> 25#include <linux/delay.h> 26#include <linux/string.h> 27#include <linux/slab.h> 28#include <asm/byteorder.h> 29 30#include <media/dvb_frontend.h> 31#include <media/dvb_math.h> 32#include "lgdt330x_priv.h" 33#include "lgdt330x.h" 34 35/* Use Equalizer Mean Squared Error instead of Phaser Tracker MSE */ 36/* #define USE_EQMSE */ 37 38static int debug; 39module_param(debug, int, 0644); 40MODULE_PARM_DESC(debug, "Turn on/off lgdt330x frontend debugging (default:off)."); 41 42#define dprintk(state, fmt, arg...) do { \ 43 if (debug) \ 44 dev_printk(KERN_DEBUG, &state->client->dev, fmt, ##arg);\ 45} while (0) 46 47struct lgdt330x_state { 48 struct i2c_client *client; 49 50 /* Configuration settings */ 51 struct lgdt330x_config config; 52 53 struct dvb_frontend frontend; 54 55 /* Demodulator private data */ 56 enum fe_modulation current_modulation; 57 u32 snr; /* Result of last SNR calculation */ 58 u16 ucblocks; 59 unsigned long last_stats_time; 60 61 /* Tuner private data */ 62 u32 current_frequency; 63}; 64 65static int i2c_write_demod_bytes(struct lgdt330x_state *state, 66 const u8 *buf, /* data bytes to send */ 67 int len /* number of bytes to send */) 68{ 69 int i; 70 int err; 71 72 for (i = 0; i < len - 1; i += 2) { 73 err = i2c_master_send(state->client, buf, 2); 74 if (err != 2) { 75 dev_warn(&state->client->dev, 76 "%s: error (addr %02x <- %02x, err = %i)\n", 77 __func__, buf[0], buf[1], err); 78 if (err < 0) 79 return err; 80 else 81 return -EREMOTEIO; 82 } 83 buf += 2; 84 } 85 return 0; 86} 87 88/* 89 * This routine writes the register (reg) to the demod bus 90 * then reads the data returned for (len) bytes. 91 */ 92static int i2c_read_demod_bytes(struct lgdt330x_state *state, 93 enum I2C_REG reg, u8 *buf, int len) 94{ 95 u8 wr[] = { reg }; 96 struct i2c_msg msg[] = { 97 { 98 .addr = state->client->addr, 99 .flags = 0, 100 .buf = wr, 101 .len = 1 102 }, { 103 .addr = state->client->addr, 104 .flags = I2C_M_RD, 105 .buf = buf, 106 .len = len 107 }, 108 }; 109 int ret; 110 111 ret = i2c_transfer(state->client->adapter, msg, 2); 112 if (ret != 2) { 113 dev_warn(&state->client->dev, 114 "%s: addr 0x%02x select 0x%02x error (ret == %i)\n", 115 __func__, state->client->addr, reg, ret); 116 if (ret >= 0) 117 ret = -EIO; 118 } else { 119 ret = 0; 120 } 121 return ret; 122} 123 124/* Software reset */ 125static int lgdt3302_sw_reset(struct lgdt330x_state *state) 126{ 127 u8 ret; 128 u8 reset[] = { 129 IRQ_MASK, 130 /* 131 * bit 6 is active low software reset 132 * bits 5-0 are 1 to mask interrupts 133 */ 134 0x00 135 }; 136 137 ret = i2c_write_demod_bytes(state, 138 reset, sizeof(reset)); 139 if (ret == 0) { 140 /* force reset high (inactive) and unmask interrupts */ 141 reset[1] = 0x7f; 142 ret = i2c_write_demod_bytes(state, 143 reset, sizeof(reset)); 144 } 145 return ret; 146} 147 148static int lgdt3303_sw_reset(struct lgdt330x_state *state) 149{ 150 u8 ret; 151 u8 reset[] = { 152 0x02, 153 0x00 /* bit 0 is active low software reset */ 154 }; 155 156 ret = i2c_write_demod_bytes(state, 157 reset, sizeof(reset)); 158 if (ret == 0) { 159 /* force reset high (inactive) */ 160 reset[1] = 0x01; 161 ret = i2c_write_demod_bytes(state, 162 reset, sizeof(reset)); 163 } 164 return ret; 165} 166 167static int lgdt330x_sw_reset(struct lgdt330x_state *state) 168{ 169 switch (state->config.demod_chip) { 170 case LGDT3302: 171 return lgdt3302_sw_reset(state); 172 case LGDT3303: 173 return lgdt3303_sw_reset(state); 174 default: 175 return -ENODEV; 176 } 177} 178 179static int lgdt330x_init(struct dvb_frontend *fe) 180{ 181 struct lgdt330x_state *state = fe->demodulator_priv; 182 struct dtv_frontend_properties *p = &fe->dtv_property_cache; 183 char *chip_name; 184 int err; 185 /* 186 * Array of byte pairs <address, value> 187 * to initialize each different chip 188 */ 189 static const u8 lgdt3302_init_data[] = { 190 /* Use 50MHz param values from spec sheet since xtal is 50 */ 191 /* 192 * Change the value of NCOCTFV[25:0] of carrier 193 * recovery center frequency register 194 */ 195 VSB_CARRIER_FREQ0, 0x00, 196 VSB_CARRIER_FREQ1, 0x87, 197 VSB_CARRIER_FREQ2, 0x8e, 198 VSB_CARRIER_FREQ3, 0x01, 199 /* 200 * Change the TPCLK pin polarity 201 * data is valid on falling clock 202 */ 203 DEMUX_CONTROL, 0xfb, 204 /* 205 * Change the value of IFBW[11:0] of 206 * AGC IF/RF loop filter bandwidth register 207 */ 208 AGC_RF_BANDWIDTH0, 0x40, 209 AGC_RF_BANDWIDTH1, 0x93, 210 AGC_RF_BANDWIDTH2, 0x00, 211 /* 212 * Change the value of bit 6, 'nINAGCBY' and 213 * 'NSSEL[1:0] of ACG function control register 2 214 */ 215 AGC_FUNC_CTRL2, 0xc6, 216 /* 217 * Change the value of bit 6 'RFFIX' 218 * of AGC function control register 3 219 */ 220 AGC_FUNC_CTRL3, 0x40, 221 /* 222 * Set the value of 'INLVTHD' register 0x2a/0x2c 223 * to 0x7fe 224 */ 225 AGC_DELAY0, 0x07, 226 AGC_DELAY2, 0xfe, 227 /* 228 * Change the value of IAGCBW[15:8] 229 * of inner AGC loop filter bandwidth 230 */ 231 AGC_LOOP_BANDWIDTH0, 0x08, 232 AGC_LOOP_BANDWIDTH1, 0x9a 233 }; 234 static const u8 lgdt3303_init_data[] = { 235 0x4c, 0x14 236 }; 237 static const u8 flip_1_lgdt3303_init_data[] = { 238 0x4c, 0x14, 239 0x87, 0xf3 240 }; 241 static const u8 flip_2_lgdt3303_init_data[] = { 242 0x4c, 0x14, 243 0x87, 0xda 244 }; 245 246 /* 247 * Hardware reset is done using gpio[0] of cx23880x chip. 248 * I'd like to do it here, but don't know how to find chip address. 249 * cx88-cards.c arranges for the reset bit to be inactive (high). 250 * Maybe there needs to be a callable function in cx88-core or 251 * the caller of this function needs to do it. 252 */ 253 254 switch (state->config.demod_chip) { 255 case LGDT3302: 256 chip_name = "LGDT3302"; 257 err = i2c_write_demod_bytes(state, lgdt3302_init_data, 258 sizeof(lgdt3302_init_data)); 259 break; 260 case LGDT3303: 261 chip_name = "LGDT3303"; 262 switch (state->config.clock_polarity_flip) { 263 case 2: 264 err = i2c_write_demod_bytes(state, 265 flip_2_lgdt3303_init_data, 266 sizeof(flip_2_lgdt3303_init_data)); 267 break; 268 case 1: 269 err = i2c_write_demod_bytes(state, 270 flip_1_lgdt3303_init_data, 271 sizeof(flip_1_lgdt3303_init_data)); 272 break; 273 case 0: 274 default: 275 err = i2c_write_demod_bytes(state, lgdt3303_init_data, 276 sizeof(lgdt3303_init_data)); 277 } 278 break; 279 default: 280 chip_name = "undefined"; 281 dev_warn(&state->client->dev, 282 "Only LGDT3302 and LGDT3303 are supported chips.\n"); 283 err = -ENODEV; 284 } 285 dprintk(state, "Initialized the %s chip\n", chip_name); 286 if (err < 0) 287 return err; 288 289 p->cnr.len = 1; 290 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 291 p->block_error.len = 1; 292 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 293 p->block_count.len = 1; 294 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 295 state->last_stats_time = 0; 296 297 return lgdt330x_sw_reset(state); 298} 299 300static int lgdt330x_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) 301{ 302 struct lgdt330x_state *state = fe->demodulator_priv; 303 304 *ucblocks = state->ucblocks; 305 306 return 0; 307} 308 309static int lgdt330x_set_parameters(struct dvb_frontend *fe) 310{ 311 struct dtv_frontend_properties *p = &fe->dtv_property_cache; 312 struct lgdt330x_state *state = fe->demodulator_priv; 313 /* 314 * Array of byte pairs <address, value> 315 * to initialize 8VSB for lgdt3303 chip 50 MHz IF 316 */ 317 static const u8 lgdt3303_8vsb_44_data[] = { 318 0x04, 0x00, 319 0x0d, 0x40, 320 0x0e, 0x87, 321 0x0f, 0x8e, 322 0x10, 0x01, 323 0x47, 0x8b 324 }; 325 /* 326 * Array of byte pairs <address, value> 327 * to initialize QAM for lgdt3303 chip 328 */ 329 static const u8 lgdt3303_qam_data[] = { 330 0x04, 0x00, 331 0x0d, 0x00, 332 0x0e, 0x00, 333 0x0f, 0x00, 334 0x10, 0x00, 335 0x51, 0x63, 336 0x47, 0x66, 337 0x48, 0x66, 338 0x4d, 0x1a, 339 0x49, 0x08, 340 0x4a, 0x9b 341 }; 342 u8 top_ctrl_cfg[] = { TOP_CONTROL, 0x03 }; 343 344 int err = 0; 345 /* Change only if we are actually changing the modulation */ 346 if (state->current_modulation != p->modulation) { 347 switch (p->modulation) { 348 case VSB_8: 349 dprintk(state, "VSB_8 MODE\n"); 350 351 /* Select VSB mode */ 352 top_ctrl_cfg[1] = 0x03; 353 354 /* Select ANT connector if supported by card */ 355 if (state->config.pll_rf_set) 356 state->config.pll_rf_set(fe, 1); 357 358 if (state->config.demod_chip == LGDT3303) { 359 err = i2c_write_demod_bytes(state, 360 lgdt3303_8vsb_44_data, 361 sizeof(lgdt3303_8vsb_44_data)); 362 } 363 break; 364 365 case QAM_64: 366 dprintk(state, "QAM_64 MODE\n"); 367 368 /* Select QAM_64 mode */ 369 top_ctrl_cfg[1] = 0x00; 370 371 /* Select CABLE connector if supported by card */ 372 if (state->config.pll_rf_set) 373 state->config.pll_rf_set(fe, 0); 374 375 if (state->config.demod_chip == LGDT3303) { 376 err = i2c_write_demod_bytes(state, 377 lgdt3303_qam_data, 378 sizeof(lgdt3303_qam_data)); 379 } 380 break; 381 382 case QAM_256: 383 dprintk(state, "QAM_256 MODE\n"); 384 385 /* Select QAM_256 mode */ 386 top_ctrl_cfg[1] = 0x01; 387 388 /* Select CABLE connector if supported by card */ 389 if (state->config.pll_rf_set) 390 state->config.pll_rf_set(fe, 0); 391 392 if (state->config.demod_chip == LGDT3303) { 393 err = i2c_write_demod_bytes(state, 394 lgdt3303_qam_data, 395 sizeof(lgdt3303_qam_data)); 396 } 397 break; 398 default: 399 dev_warn(&state->client->dev, 400 "%s: Modulation type(%d) UNSUPPORTED\n", 401 __func__, p->modulation); 402 return -1; 403 } 404 if (err < 0) 405 dev_warn(&state->client->dev, 406 "%s: error blasting bytes to lgdt3303 for modulation type(%d)\n", 407 __func__, p->modulation); 408 409 /* 410 * select serial or parallel MPEG hardware interface 411 * Serial: 0x04 for LGDT3302 or 0x40 for LGDT3303 412 * Parallel: 0x00 413 */ 414 top_ctrl_cfg[1] |= state->config.serial_mpeg; 415 416 /* Select the requested mode */ 417 i2c_write_demod_bytes(state, top_ctrl_cfg, 418 sizeof(top_ctrl_cfg)); 419 if (state->config.set_ts_params) 420 state->config.set_ts_params(fe, 0); 421 state->current_modulation = p->modulation; 422 } 423 424 /* Tune to the specified frequency */ 425 if (fe->ops.tuner_ops.set_params) { 426 fe->ops.tuner_ops.set_params(fe); 427 if (fe->ops.i2c_gate_ctrl) 428 fe->ops.i2c_gate_ctrl(fe, 0); 429 } 430 431 /* Keep track of the new frequency */ 432 /* 433 * FIXME this is the wrong way to do this... 434 * The tuner is shared with the video4linux analog API 435 */ 436 state->current_frequency = p->frequency; 437 438 lgdt330x_sw_reset(state); 439 return 0; 440} 441 442static int lgdt330x_get_frontend(struct dvb_frontend *fe, 443 struct dtv_frontend_properties *p) 444{ 445 struct lgdt330x_state *state = fe->demodulator_priv; 446 447 p->frequency = state->current_frequency; 448 return 0; 449} 450 451/* 452 * Calculate SNR estimation (scaled by 2^24) 453 * 454 * 8-VSB SNR equations from LGDT3302 and LGDT3303 datasheets, QAM 455 * equations from LGDT3303 datasheet. VSB is the same between the '02 456 * and '03, so maybe QAM is too? Perhaps someone with a newer datasheet 457 * that has QAM information could verify? 458 * 459 * For 8-VSB: (two ways, take your pick) 460 * LGDT3302: 461 * SNR_EQ = 10 * log10(25 * 24^2 / EQ_MSE) 462 * LGDT3303: 463 * SNR_EQ = 10 * log10(25 * 32^2 / EQ_MSE) 464 * LGDT3302 & LGDT3303: 465 * SNR_PT = 10 * log10(25 * 32^2 / PT_MSE) (we use this one) 466 * For 64-QAM: 467 * SNR = 10 * log10( 688128 / MSEQAM) 468 * For 256-QAM: 469 * SNR = 10 * log10( 696320 / MSEQAM) 470 * 471 * We re-write the snr equation as: 472 * SNR * 2^24 = 10*(c - intlog10(MSE)) 473 * Where for 256-QAM, c = log10(696320) * 2^24, and so on. 474 */ 475static u32 calculate_snr(u32 mse, u32 c) 476{ 477 if (mse == 0) /* No signal */ 478 return 0; 479 480 mse = intlog10(mse); 481 if (mse > c) { 482 /* 483 * Negative SNR, which is possible, but realisticly the 484 * demod will lose lock before the signal gets this bad. 485 * The API only allows for unsigned values, so just return 0 486 */ 487 return 0; 488 } 489 return 10 * (c - mse); 490} 491 492static int lgdt3302_read_snr(struct dvb_frontend *fe) 493{ 494 struct lgdt330x_state *state = fe->demodulator_priv; 495 u8 buf[5]; /* read data buffer */ 496 u32 noise; /* noise value */ 497 u32 c; /* per-modulation SNR calculation constant */ 498 499 switch (state->current_modulation) { 500 case VSB_8: 501 i2c_read_demod_bytes(state, LGDT3302_EQPH_ERR0, buf, 5); 502#ifdef USE_EQMSE 503 /* Use Equalizer Mean-Square Error Register */ 504 /* SNR for ranges from -15.61 to +41.58 */ 505 noise = ((buf[0] & 7) << 16) | (buf[1] << 8) | buf[2]; 506 c = 69765745; /* log10(25*24^2)*2^24 */ 507#else 508 /* Use Phase Tracker Mean-Square Error Register */ 509 /* SNR for ranges from -13.11 to +44.08 */ 510 noise = ((buf[0] & 7 << 3) << 13) | (buf[3] << 8) | buf[4]; 511 c = 73957994; /* log10(25*32^2)*2^24 */ 512#endif 513 break; 514 case QAM_64: 515 case QAM_256: 516 i2c_read_demod_bytes(state, CARRIER_MSEQAM1, buf, 2); 517 noise = ((buf[0] & 3) << 8) | buf[1]; 518 c = state->current_modulation == QAM_64 ? 97939837 : 98026066; 519 /* log10(688128)*2^24 and log10(696320)*2^24 */ 520 break; 521 default: 522 dev_err(&state->client->dev, 523 "%s: Modulation set to unsupported value\n", 524 __func__); 525 526 state->snr = 0; 527 528 return -EREMOTEIO; /* return -EDRIVER_IS_GIBBERED; */ 529 } 530 531 state->snr = calculate_snr(noise, c); 532 533 dprintk(state, "noise = 0x%08x, snr = %d.%02d dB\n", noise, 534 state->snr >> 24, (((state->snr >> 8) & 0xffff) * 100) >> 16); 535 536 return 0; 537} 538 539static int lgdt3303_read_snr(struct dvb_frontend *fe) 540{ 541 struct lgdt330x_state *state = fe->demodulator_priv; 542 u8 buf[5]; /* read data buffer */ 543 u32 noise; /* noise value */ 544 u32 c; /* per-modulation SNR calculation constant */ 545 546 switch (state->current_modulation) { 547 case VSB_8: 548 i2c_read_demod_bytes(state, LGDT3303_EQPH_ERR0, buf, 5); 549#ifdef USE_EQMSE 550 /* Use Equalizer Mean-Square Error Register */ 551 /* SNR for ranges from -16.12 to +44.08 */ 552 noise = ((buf[0] & 0x78) << 13) | (buf[1] << 8) | buf[2]; 553 c = 73957994; /* log10(25*32^2)*2^24 */ 554#else 555 /* Use Phase Tracker Mean-Square Error Register */ 556 /* SNR for ranges from -13.11 to +44.08 */ 557 noise = ((buf[0] & 7) << 16) | (buf[3] << 8) | buf[4]; 558 c = 73957994; /* log10(25*32^2)*2^24 */ 559#endif 560 break; 561 case QAM_64: 562 case QAM_256: 563 i2c_read_demod_bytes(state, CARRIER_MSEQAM1, buf, 2); 564 noise = (buf[0] << 8) | buf[1]; 565 c = state->current_modulation == QAM_64 ? 97939837 : 98026066; 566 /* log10(688128)*2^24 and log10(696320)*2^24 */ 567 break; 568 default: 569 dev_err(&state->client->dev, 570 "%s: Modulation set to unsupported value\n", 571 __func__); 572 state->snr = 0; 573 return -EREMOTEIO; /* return -EDRIVER_IS_GIBBERED; */ 574 } 575 576 state->snr = calculate_snr(noise, c); 577 578 dprintk(state, "noise = 0x%08x, snr = %d.%02d dB\n", noise, 579 state->snr >> 24, (((state->snr >> 8) & 0xffff) * 100) >> 16); 580 581 return 0; 582} 583 584static int lgdt330x_read_snr(struct dvb_frontend *fe, u16 *snr) 585{ 586 struct lgdt330x_state *state = fe->demodulator_priv; 587 588 *snr = (state->snr) >> 16; /* Convert from 8.24 fixed-point to 8.8 */ 589 590 return 0; 591} 592 593static int lgdt330x_read_signal_strength(struct dvb_frontend *fe, u16 *strength) 594{ 595 /* Calculate Strength from SNR up to 35dB */ 596 /* 597 * Even though the SNR can go higher than 35dB, there is some comfort 598 * factor in having a range of strong signals that can show at 100% 599 */ 600 struct lgdt330x_state *state = fe->demodulator_priv; 601 u16 snr; 602 int ret; 603 604 ret = fe->ops.read_snr(fe, &snr); 605 if (ret != 0) 606 return ret; 607 /* Rather than use the 8.8 value snr, use state->snr which is 8.24 */ 608 /* scale the range 0 - 35*2^24 into 0 - 65535 */ 609 if (state->snr >= 8960 * 0x10000) 610 *strength = 0xffff; 611 else 612 *strength = state->snr / 8960; 613 614 return 0; 615} 616 617 618static int lgdt3302_read_status(struct dvb_frontend *fe, 619 enum fe_status *status) 620{ 621 struct lgdt330x_state *state = fe->demodulator_priv; 622 struct dtv_frontend_properties *p = &fe->dtv_property_cache; 623 u8 buf[3]; 624 int err; 625 626 *status = 0; /* Reset status result */ 627 628 /* AGC status register */ 629 i2c_read_demod_bytes(state, AGC_STATUS, buf, 1); 630 dprintk(state, "AGC_STATUS = 0x%02x\n", buf[0]); 631 if ((buf[0] & 0x0c) == 0x8) { 632 /* 633 * Test signal does not exist flag 634 * as well as the AGC lock flag. 635 */ 636 *status |= FE_HAS_SIGNAL; 637 } 638 639 /* 640 * You must set the Mask bits to 1 in the IRQ_MASK in order 641 * to see that status bit in the IRQ_STATUS register. 642 * This is done in SwReset(); 643 */ 644 645 /* signal status */ 646 i2c_read_demod_bytes(state, TOP_CONTROL, buf, sizeof(buf)); 647 dprintk(state, 648 "TOP_CONTROL = 0x%02x, IRO_MASK = 0x%02x, IRQ_STATUS = 0x%02x\n", 649 buf[0], buf[1], buf[2]); 650 651 /* sync status */ 652 if ((buf[2] & 0x03) == 0x01) 653 *status |= FE_HAS_SYNC; 654 655 /* FEC error status */ 656 if ((buf[2] & 0x0c) == 0x08) 657 *status |= FE_HAS_LOCK | FE_HAS_VITERBI; 658 659 /* Carrier Recovery Lock Status Register */ 660 i2c_read_demod_bytes(state, CARRIER_LOCK, buf, 1); 661 dprintk(state, "CARRIER_LOCK = 0x%02x\n", buf[0]); 662 switch (state->current_modulation) { 663 case QAM_256: 664 case QAM_64: 665 /* Need to understand why there are 3 lock levels here */ 666 if ((buf[0] & 0x07) == 0x07) 667 *status |= FE_HAS_CARRIER; 668 break; 669 case VSB_8: 670 if ((buf[0] & 0x80) == 0x80) 671 *status |= FE_HAS_CARRIER; 672 break; 673 default: 674 dev_warn(&state->client->dev, 675 "%s: Modulation set to unsupported value\n", 676 __func__); 677 } 678 679 if (!(*status & FE_HAS_LOCK)) { 680 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 681 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 682 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 683 return 0; 684 } 685 686 if (state->last_stats_time && 687 time_is_after_jiffies(state->last_stats_time)) 688 return 0; 689 690 state->last_stats_time = jiffies + msecs_to_jiffies(1000); 691 692 err = lgdt3302_read_snr(fe); 693 if (!err) { 694 p->cnr.stat[0].scale = FE_SCALE_DECIBEL; 695 p->cnr.stat[0].svalue = (((u64)state->snr) * 1000) >> 24; 696 } else { 697 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 698 } 699 700 err = i2c_read_demod_bytes(state, LGDT3302_PACKET_ERR_COUNTER1, 701 buf, sizeof(buf)); 702 if (!err) { 703 state->ucblocks = (buf[0] << 8) | buf[1]; 704 705 dprintk(state, "UCB = 0x%02x\n", state->ucblocks); 706 707 p->block_error.stat[0].uvalue += state->ucblocks; 708 /* FIXME: what's the basis for block count */ 709 p->block_count.stat[0].uvalue += 10000; 710 711 p->block_error.stat[0].scale = FE_SCALE_COUNTER; 712 p->block_count.stat[0].scale = FE_SCALE_COUNTER; 713 } else { 714 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 715 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 716 } 717 718 return 0; 719} 720 721static int lgdt3303_read_status(struct dvb_frontend *fe, 722 enum fe_status *status) 723{ 724 struct lgdt330x_state *state = fe->demodulator_priv; 725 struct dtv_frontend_properties *p = &fe->dtv_property_cache; 726 u8 buf[3]; 727 int err; 728 729 *status = 0; /* Reset status result */ 730 731 /* lgdt3303 AGC status register */ 732 err = i2c_read_demod_bytes(state, 0x58, buf, 1); 733 if (err < 0) 734 return err; 735 736 dprintk(state, "AGC_STATUS = 0x%02x\n", buf[0]); 737 if ((buf[0] & 0x21) == 0x01) { 738 /* 739 * Test input signal does not exist flag 740 * as well as the AGC lock flag. 741 */ 742 *status |= FE_HAS_SIGNAL; 743 } 744 745 /* Carrier Recovery Lock Status Register */ 746 i2c_read_demod_bytes(state, CARRIER_LOCK, buf, 1); 747 dprintk(state, "CARRIER_LOCK = 0x%02x\n", buf[0]); 748 switch (state->current_modulation) { 749 case QAM_256: 750 case QAM_64: 751 /* Need to understand why there are 3 lock levels here */ 752 if ((buf[0] & 0x07) == 0x07) 753 *status |= FE_HAS_CARRIER; 754 else 755 break; 756 i2c_read_demod_bytes(state, 0x8a, buf, 1); 757 dprintk(state, "QAM LOCK = 0x%02x\n", buf[0]); 758 759 if ((buf[0] & 0x04) == 0x04) 760 *status |= FE_HAS_SYNC; 761 if ((buf[0] & 0x01) == 0x01) 762 *status |= FE_HAS_LOCK; 763 if ((buf[0] & 0x08) == 0x08) 764 *status |= FE_HAS_VITERBI; 765 break; 766 case VSB_8: 767 if ((buf[0] & 0x80) == 0x80) 768 *status |= FE_HAS_CARRIER; 769 else 770 break; 771 i2c_read_demod_bytes(state, 0x38, buf, 1); 772 dprintk(state, "8-VSB LOCK = 0x%02x\n", buf[0]); 773 774 if ((buf[0] & 0x02) == 0x00) 775 *status |= FE_HAS_SYNC; 776 if ((buf[0] & 0x01) == 0x01) 777 *status |= FE_HAS_VITERBI | FE_HAS_LOCK; 778 break; 779 default: 780 dev_warn(&state->client->dev, 781 "%s: Modulation set to unsupported value\n", 782 __func__); 783 } 784 785 if (!(*status & FE_HAS_LOCK)) { 786 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 787 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 788 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 789 return 0; 790 } 791 792 if (state->last_stats_time && 793 time_is_after_jiffies(state->last_stats_time)) 794 return 0; 795 796 state->last_stats_time = jiffies + msecs_to_jiffies(1000); 797 798 err = lgdt3303_read_snr(fe); 799 if (!err) { 800 p->cnr.stat[0].scale = FE_SCALE_DECIBEL; 801 p->cnr.stat[0].svalue = (((u64)state->snr) * 1000) >> 24; 802 } else { 803 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 804 } 805 806 err = i2c_read_demod_bytes(state, LGDT3303_PACKET_ERR_COUNTER1, 807 buf, sizeof(buf)); 808 if (!err) { 809 state->ucblocks = (buf[0] << 8) | buf[1]; 810 811 dprintk(state, "UCB = 0x%02x\n", state->ucblocks); 812 813 p->block_error.stat[0].uvalue += state->ucblocks; 814 /* FIXME: what's the basis for block count */ 815 p->block_count.stat[0].uvalue += 10000; 816 817 p->block_error.stat[0].scale = FE_SCALE_COUNTER; 818 p->block_count.stat[0].scale = FE_SCALE_COUNTER; 819 } else { 820 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 821 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 822 } 823 824 return 0; 825} 826 827static int 828lgdt330x_get_tune_settings(struct dvb_frontend *fe, 829 struct dvb_frontend_tune_settings *fe_tune_settings) 830{ 831 /* I have no idea about this - it may not be needed */ 832 fe_tune_settings->min_delay_ms = 500; 833 fe_tune_settings->step_size = 0; 834 fe_tune_settings->max_drift = 0; 835 return 0; 836} 837 838static void lgdt330x_release(struct dvb_frontend *fe) 839{ 840 struct lgdt330x_state *state = fe->demodulator_priv; 841 struct i2c_client *client = state->client; 842 843 dev_dbg(&client->dev, "\n"); 844 845 i2c_unregister_device(client); 846} 847 848static struct dvb_frontend *lgdt330x_get_dvb_frontend(struct i2c_client *client) 849{ 850 struct lgdt330x_state *state = i2c_get_clientdata(client); 851 852 dev_dbg(&client->dev, "\n"); 853 854 return &state->frontend; 855} 856 857static const struct dvb_frontend_ops lgdt3302_ops; 858static const struct dvb_frontend_ops lgdt3303_ops; 859 860static int lgdt330x_probe(struct i2c_client *client, 861 const struct i2c_device_id *id) 862{ 863 struct lgdt330x_state *state = NULL; 864 u8 buf[1]; 865 866 /* Allocate memory for the internal state */ 867 state = kzalloc(sizeof(*state), GFP_KERNEL); 868 if (!state) 869 goto error; 870 871 /* Setup the state */ 872 memcpy(&state->config, client->dev.platform_data, 873 sizeof(state->config)); 874 i2c_set_clientdata(client, state); 875 state->client = client; 876 877 /* Create dvb_frontend */ 878 switch (state->config.demod_chip) { 879 case LGDT3302: 880 memcpy(&state->frontend.ops, &lgdt3302_ops, 881 sizeof(struct dvb_frontend_ops)); 882 break; 883 case LGDT3303: 884 memcpy(&state->frontend.ops, &lgdt3303_ops, 885 sizeof(struct dvb_frontend_ops)); 886 break; 887 default: 888 goto error; 889 } 890 state->frontend.demodulator_priv = state; 891 892 /* Setup get frontend callback */ 893 state->config.get_dvb_frontend = lgdt330x_get_dvb_frontend; 894 895 /* Verify communication with demod chip */ 896 if (i2c_read_demod_bytes(state, 2, buf, 1)) 897 goto error; 898 899 state->current_frequency = -1; 900 state->current_modulation = -1; 901 902 dev_info(&state->client->dev, 903 "Demod loaded for LGDT330%s chip\n", 904 state->config.demod_chip == LGDT3302 ? "2" : "3"); 905 906 return 0; 907 908error: 909 kfree(state); 910 if (debug) 911 dev_printk(KERN_DEBUG, &client->dev, "Error loading lgdt330x driver\n"); 912 return -ENODEV; 913} 914struct dvb_frontend *lgdt330x_attach(const struct lgdt330x_config *_config, 915 u8 demod_address, 916 struct i2c_adapter *i2c) 917{ 918 struct i2c_client *client; 919 struct i2c_board_info board_info = {}; 920 struct lgdt330x_config config = *_config; 921 922 strscpy(board_info.type, "lgdt330x", sizeof(board_info.type)); 923 board_info.addr = demod_address; 924 board_info.platform_data = &config; 925 client = i2c_new_client_device(i2c, &board_info); 926 if (!i2c_client_has_driver(client)) 927 return NULL; 928 929 return lgdt330x_get_dvb_frontend(client); 930} 931EXPORT_SYMBOL(lgdt330x_attach); 932 933static const struct dvb_frontend_ops lgdt3302_ops = { 934 .delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B }, 935 .info = { 936 .name = "LG Electronics LGDT3302 VSB/QAM Frontend", 937 .frequency_min_hz = 54 * MHz, 938 .frequency_max_hz = 858 * MHz, 939 .frequency_stepsize_hz = 62500, 940 .symbol_rate_min = 5056941, /* QAM 64 */ 941 .symbol_rate_max = 10762000, /* VSB 8 */ 942 .caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB 943 }, 944 .init = lgdt330x_init, 945 .set_frontend = lgdt330x_set_parameters, 946 .get_frontend = lgdt330x_get_frontend, 947 .get_tune_settings = lgdt330x_get_tune_settings, 948 .read_status = lgdt3302_read_status, 949 .read_signal_strength = lgdt330x_read_signal_strength, 950 .read_snr = lgdt330x_read_snr, 951 .read_ucblocks = lgdt330x_read_ucblocks, 952 .release = lgdt330x_release, 953}; 954 955static const struct dvb_frontend_ops lgdt3303_ops = { 956 .delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B }, 957 .info = { 958 .name = "LG Electronics LGDT3303 VSB/QAM Frontend", 959 .frequency_min_hz = 54 * MHz, 960 .frequency_max_hz = 858 * MHz, 961 .frequency_stepsize_hz = 62500, 962 .symbol_rate_min = 5056941, /* QAM 64 */ 963 .symbol_rate_max = 10762000, /* VSB 8 */ 964 .caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB 965 }, 966 .init = lgdt330x_init, 967 .set_frontend = lgdt330x_set_parameters, 968 .get_frontend = lgdt330x_get_frontend, 969 .get_tune_settings = lgdt330x_get_tune_settings, 970 .read_status = lgdt3303_read_status, 971 .read_signal_strength = lgdt330x_read_signal_strength, 972 .read_snr = lgdt330x_read_snr, 973 .read_ucblocks = lgdt330x_read_ucblocks, 974 .release = lgdt330x_release, 975}; 976 977static int lgdt330x_remove(struct i2c_client *client) 978{ 979 struct lgdt330x_state *state = i2c_get_clientdata(client); 980 981 dev_dbg(&client->dev, "\n"); 982 983 kfree(state); 984 985 return 0; 986} 987 988static const struct i2c_device_id lgdt330x_id_table[] = { 989 {"lgdt330x", 0}, 990 {} 991}; 992MODULE_DEVICE_TABLE(i2c, lgdt330x_id_table); 993 994static struct i2c_driver lgdt330x_driver = { 995 .driver = { 996 .name = "lgdt330x", 997 .suppress_bind_attrs = true, 998 }, 999 .probe = lgdt330x_probe, 1000 .remove = lgdt330x_remove, 1001 .id_table = lgdt330x_id_table, 1002}; 1003 1004module_i2c_driver(lgdt330x_driver); 1005 1006 1007MODULE_DESCRIPTION("LGDT330X (ATSC 8VSB & ITU-T J.83 AnnexB 64/256 QAM) Demodulator Driver"); 1008MODULE_AUTHOR("Wilson Michaels"); 1009MODULE_LICENSE("GPL");