1 /* 2 Conexant cx24116/cx24118 - DVBS/S2 Satellite demod/tuner driver 3 4 Copyright (C) 2006-2008 Steven Toth <stoth@hauppauge.com> 5 Copyright (C) 2006-2007 Georg Acher 6 Copyright (C) 2007-2008 Darron Broad 7 March 2007 8 Fixed some bugs. 9 Added diseqc support. 10 Added corrected signal strength support. 11 August 2007 12 Sync with legacy version. 13 Some clean ups. 14 Copyright (C) 2008 Igor Liplianin 15 September, 9th 2008 16 Fixed locking on high symbol rates (>30000). 17 Implement MPEG initialization parameter. 18 January, 17th 2009 19 Fill set_voltage with actually control voltage code. 20 Correct set tone to not affect voltage. 21 22 This program is free software; you can redistribute it and/or modify 23 it under the terms of the GNU General Public License as published by 24 the Free Software Foundation; either version 2 of the License, or 25 (at your option) any later version. 26 27 This program is distributed in the hope that it will be useful, 28 but WITHOUT ANY WARRANTY; without even the implied warranty of 29 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 30 GNU General Public License for more details. 31 32 You should have received a copy of the GNU General Public License 33 along with this program; if not, write to the Free Software 34 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 35 */ 36 37 #include <linux/slab.h> 38 #include <linux/kernel.h> 39 #include <linux/module.h> 40 #include <linux/moduleparam.h> 41 #include <linux/init.h> 42 #include <linux/firmware.h> 43 44 #include "dvb_frontend.h" 45 #include "cx24116.h" 46 47 static int debug; 48 module_param(debug, int, 0644); 49 MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)"); 50 51 #define dprintk(args...) \ 52 do { \ 53 if (debug) \ 54 printk(KERN_INFO "cx24116: " args); \ 55 } while (0) 56 57 #define CX24116_DEFAULT_FIRMWARE "dvb-fe-cx24116.fw" 58 #define CX24116_SEARCH_RANGE_KHZ 5000 59 60 /* known registers */ 61 #define CX24116_REG_COMMAND (0x00) /* command args 0x00..0x1e */ 62 #define CX24116_REG_EXECUTE (0x1f) /* execute command */ 63 #define CX24116_REG_MAILBOX (0x96) /* FW or multipurpose mailbox? */ 64 #define CX24116_REG_RESET (0x20) /* reset status > 0 */ 65 #define CX24116_REG_SIGNAL (0x9e) /* signal low */ 66 #define CX24116_REG_SSTATUS (0x9d) /* signal high / status */ 67 #define CX24116_REG_QUALITY8 (0xa3) 68 #define CX24116_REG_QSTATUS (0xbc) 69 #define CX24116_REG_QUALITY0 (0xd5) 70 #define CX24116_REG_BER0 (0xc9) 71 #define CX24116_REG_BER8 (0xc8) 72 #define CX24116_REG_BER16 (0xc7) 73 #define CX24116_REG_BER24 (0xc6) 74 #define CX24116_REG_UCB0 (0xcb) 75 #define CX24116_REG_UCB8 (0xca) 76 #define CX24116_REG_CLKDIV (0xf3) 77 #define CX24116_REG_RATEDIV (0xf9) 78 79 /* configured fec (not tuned) or actual FEC (tuned) 1=1/2 2=2/3 etc */ 80 #define CX24116_REG_FECSTATUS (0x9c) 81 82 /* FECSTATUS bits */ 83 /* mask to determine configured fec (not tuned) or actual fec (tuned) */ 84 #define CX24116_FEC_FECMASK (0x1f) 85 86 /* Select DVB-S demodulator, else DVB-S2 */ 87 #define CX24116_FEC_DVBS (0x20) 88 #define CX24116_FEC_UNKNOWN (0x40) /* Unknown/unused */ 89 90 /* Pilot mode requested when tuning else always reset when tuned */ 91 #define CX24116_FEC_PILOT (0x80) 92 93 /* arg buffer size */ 94 #define CX24116_ARGLEN (0x1e) 95 96 /* rolloff */ 97 #define CX24116_ROLLOFF_020 (0x00) 98 #define CX24116_ROLLOFF_025 (0x01) 99 #define CX24116_ROLLOFF_035 (0x02) 100 101 /* pilot bit */ 102 #define CX24116_PILOT_OFF (0x00) 103 #define CX24116_PILOT_ON (0x40) 104 105 /* signal status */ 106 #define CX24116_HAS_SIGNAL (0x01) 107 #define CX24116_HAS_CARRIER (0x02) 108 #define CX24116_HAS_VITERBI (0x04) 109 #define CX24116_HAS_SYNCLOCK (0x08) 110 #define CX24116_HAS_UNKNOWN1 (0x10) 111 #define CX24116_HAS_UNKNOWN2 (0x20) 112 #define CX24116_STATUS_MASK (0x0f) 113 #define CX24116_SIGNAL_MASK (0xc0) 114 115 #define CX24116_DISEQC_TONEOFF (0) /* toneburst never sent */ 116 #define CX24116_DISEQC_TONECACHE (1) /* toneburst cached */ 117 #define CX24116_DISEQC_MESGCACHE (2) /* message cached */ 118 119 /* arg offset for DiSEqC */ 120 #define CX24116_DISEQC_BURST (1) 121 #define CX24116_DISEQC_ARG2_2 (2) /* unknown value=2 */ 122 #define CX24116_DISEQC_ARG3_0 (3) /* unknown value=0 */ 123 #define CX24116_DISEQC_ARG4_0 (4) /* unknown value=0 */ 124 #define CX24116_DISEQC_MSGLEN (5) 125 #define CX24116_DISEQC_MSGOFS (6) 126 127 /* DiSEqC burst */ 128 #define CX24116_DISEQC_MINI_A (0) 129 #define CX24116_DISEQC_MINI_B (1) 130 131 /* DiSEqC tone burst */ 132 static int toneburst = 1; 133 module_param(toneburst, int, 0644); 134 MODULE_PARM_DESC(toneburst, "DiSEqC toneburst 0=OFF, 1=TONE CACHE, "\ 135 "2=MESSAGE CACHE (default:1)"); 136 137 /* SNR measurements */ 138 static int esno_snr; 139 module_param(esno_snr, int, 0644); 140 MODULE_PARM_DESC(esno_snr, "SNR return units, 0=PERCENTAGE 0-100, "\ 141 "1=ESNO(db * 10) (default:0)"); 142 143 enum cmds { 144 CMD_SET_VCO = 0x10, 145 CMD_TUNEREQUEST = 0x11, 146 CMD_MPEGCONFIG = 0x13, 147 CMD_TUNERINIT = 0x14, 148 CMD_BANDWIDTH = 0x15, 149 CMD_GETAGC = 0x19, 150 CMD_LNBCONFIG = 0x20, 151 CMD_LNBSEND = 0x21, /* Formerly CMD_SEND_DISEQC */ 152 CMD_LNBDCLEVEL = 0x22, 153 CMD_SET_TONE = 0x23, 154 CMD_UPDFWVERS = 0x35, 155 CMD_TUNERSLEEP = 0x36, 156 CMD_AGCCONTROL = 0x3b, /* Unknown */ 157 }; 158 159 /* The Demod/Tuner can't easily provide these, we cache them */ 160 struct cx24116_tuning { 161 u32 frequency; 162 u32 symbol_rate; 163 enum fe_spectral_inversion inversion; 164 enum fe_code_rate fec; 165 166 enum fe_delivery_system delsys; 167 enum fe_modulation modulation; 168 enum fe_pilot pilot; 169 enum fe_rolloff rolloff; 170 171 /* Demod values */ 172 u8 fec_val; 173 u8 fec_mask; 174 u8 inversion_val; 175 u8 pilot_val; 176 u8 rolloff_val; 177 }; 178 179 /* Basic commands that are sent to the firmware */ 180 struct cx24116_cmd { 181 u8 len; 182 u8 args[CX24116_ARGLEN]; 183 }; 184 185 struct cx24116_state { 186 struct i2c_adapter *i2c; 187 const struct cx24116_config *config; 188 189 struct dvb_frontend frontend; 190 191 struct cx24116_tuning dcur; 192 struct cx24116_tuning dnxt; 193 194 u8 skip_fw_load; 195 u8 burst; 196 struct cx24116_cmd dsec_cmd; 197 }; 198 199 static int cx24116_writereg(struct cx24116_state *state, int reg, int data) 200 { 201 u8 buf[] = { reg, data }; 202 struct i2c_msg msg = { .addr = state->config->demod_address, 203 .flags = 0, .buf = buf, .len = 2 }; 204 int err; 205 206 if (debug > 1) 207 printk("cx24116: %s: write reg 0x%02x, value 0x%02x\n", 208 __func__, reg, data); 209 210 err = i2c_transfer(state->i2c, &msg, 1); 211 if (err != 1) { 212 printk(KERN_ERR "%s: writereg error(err == %i, reg == 0x%02x, value == 0x%02x)\n", 213 __func__, err, reg, data); 214 return -EREMOTEIO; 215 } 216 217 return 0; 218 } 219 220 /* Bulk byte writes to a single I2C address, for 32k firmware load */ 221 static int cx24116_writeregN(struct cx24116_state *state, int reg, 222 const u8 *data, u16 len) 223 { 224 int ret = -EREMOTEIO; 225 struct i2c_msg msg; 226 u8 *buf; 227 228 buf = kmalloc(len + 1, GFP_KERNEL); 229 if (buf == NULL) { 230 printk("Unable to kmalloc\n"); 231 ret = -ENOMEM; 232 goto error; 233 } 234 235 *(buf) = reg; 236 memcpy(buf + 1, data, len); 237 238 msg.addr = state->config->demod_address; 239 msg.flags = 0; 240 msg.buf = buf; 241 msg.len = len + 1; 242 243 if (debug > 1) 244 printk(KERN_INFO "cx24116: %s: write regN 0x%02x, len = %d\n", 245 __func__, reg, len); 246 247 ret = i2c_transfer(state->i2c, &msg, 1); 248 if (ret != 1) { 249 printk(KERN_ERR "%s: writereg error(err == %i, reg == 0x%02x\n", 250 __func__, ret, reg); 251 ret = -EREMOTEIO; 252 } 253 254 error: 255 kfree(buf); 256 257 return ret; 258 } 259 260 static int cx24116_readreg(struct cx24116_state *state, u8 reg) 261 { 262 int ret; 263 u8 b0[] = { reg }; 264 u8 b1[] = { 0 }; 265 struct i2c_msg msg[] = { 266 { .addr = state->config->demod_address, .flags = 0, 267 .buf = b0, .len = 1 }, 268 { .addr = state->config->demod_address, .flags = I2C_M_RD, 269 .buf = b1, .len = 1 } 270 }; 271 272 ret = i2c_transfer(state->i2c, msg, 2); 273 274 if (ret != 2) { 275 printk(KERN_ERR "%s: reg=0x%x (error=%d)\n", 276 __func__, reg, ret); 277 return ret; 278 } 279 280 if (debug > 1) 281 printk(KERN_INFO "cx24116: read reg 0x%02x, value 0x%02x\n", 282 reg, b1[0]); 283 284 return b1[0]; 285 } 286 287 static int cx24116_set_inversion(struct cx24116_state *state, 288 enum fe_spectral_inversion inversion) 289 { 290 dprintk("%s(%d)\n", __func__, inversion); 291 292 switch (inversion) { 293 case INVERSION_OFF: 294 state->dnxt.inversion_val = 0x00; 295 break; 296 case INVERSION_ON: 297 state->dnxt.inversion_val = 0x04; 298 break; 299 case INVERSION_AUTO: 300 state->dnxt.inversion_val = 0x0C; 301 break; 302 default: 303 return -EINVAL; 304 } 305 306 state->dnxt.inversion = inversion; 307 308 return 0; 309 } 310 311 /* 312 * modfec (modulation and FEC) 313 * =========================== 314 * 315 * MOD FEC mask/val standard 316 * ---- -------- ----------- -------- 317 * QPSK FEC_1_2 0x02 0x02+X DVB-S 318 * QPSK FEC_2_3 0x04 0x02+X DVB-S 319 * QPSK FEC_3_4 0x08 0x02+X DVB-S 320 * QPSK FEC_4_5 0x10 0x02+X DVB-S (?) 321 * QPSK FEC_5_6 0x20 0x02+X DVB-S 322 * QPSK FEC_6_7 0x40 0x02+X DVB-S 323 * QPSK FEC_7_8 0x80 0x02+X DVB-S 324 * QPSK FEC_8_9 0x01 0x02+X DVB-S (?) (NOT SUPPORTED?) 325 * QPSK AUTO 0xff 0x02+X DVB-S 326 * 327 * For DVB-S high byte probably represents FEC 328 * and low byte selects the modulator. The high 329 * byte is search range mask. Bit 5 may turn 330 * on DVB-S and remaining bits represent some 331 * kind of calibration (how/what i do not know). 332 * 333 * Eg.(2/3) szap "Zone Horror" 334 * 335 * mask/val = 0x04, 0x20 336 * status 1f | signal c3c0 | snr a333 | ber 00000098 | unc 0 | FE_HAS_LOCK 337 * 338 * mask/val = 0x04, 0x30 339 * status 1f | signal c3c0 | snr a333 | ber 00000000 | unc 0 | FE_HAS_LOCK 340 * 341 * After tuning FECSTATUS contains actual FEC 342 * in use numbered 1 through to 8 for 1/2 .. 2/3 etc 343 * 344 * NBC=NOT/NON BACKWARD COMPATIBLE WITH DVB-S (DVB-S2 only) 345 * 346 * NBC-QPSK FEC_1_2 0x00, 0x04 DVB-S2 347 * NBC-QPSK FEC_3_5 0x00, 0x05 DVB-S2 348 * NBC-QPSK FEC_2_3 0x00, 0x06 DVB-S2 349 * NBC-QPSK FEC_3_4 0x00, 0x07 DVB-S2 350 * NBC-QPSK FEC_4_5 0x00, 0x08 DVB-S2 351 * NBC-QPSK FEC_5_6 0x00, 0x09 DVB-S2 352 * NBC-QPSK FEC_8_9 0x00, 0x0a DVB-S2 353 * NBC-QPSK FEC_9_10 0x00, 0x0b DVB-S2 354 * 355 * NBC-8PSK FEC_3_5 0x00, 0x0c DVB-S2 356 * NBC-8PSK FEC_2_3 0x00, 0x0d DVB-S2 357 * NBC-8PSK FEC_3_4 0x00, 0x0e DVB-S2 358 * NBC-8PSK FEC_5_6 0x00, 0x0f DVB-S2 359 * NBC-8PSK FEC_8_9 0x00, 0x10 DVB-S2 360 * NBC-8PSK FEC_9_10 0x00, 0x11 DVB-S2 361 * 362 * For DVB-S2 low bytes selects both modulator 363 * and FEC. High byte is meaningless here. To 364 * set pilot, bit 6 (0x40) is set. When inspecting 365 * FECSTATUS bit 7 (0x80) represents the pilot 366 * selection whilst not tuned. When tuned, actual FEC 367 * in use is found in FECSTATUS as per above. Pilot 368 * value is reset. 369 */ 370 371 /* A table of modulation, fec and configuration bytes for the demod. 372 * Not all S2 mmodulation schemes are support and not all rates with 373 * a scheme are support. Especially, no auto detect when in S2 mode. 374 */ 375 static struct cx24116_modfec { 376 enum fe_delivery_system delivery_system; 377 enum fe_modulation modulation; 378 enum fe_code_rate fec; 379 u8 mask; /* In DVBS mode this is used to autodetect */ 380 u8 val; /* Passed to the firmware to indicate mode selection */ 381 } CX24116_MODFEC_MODES[] = { 382 /* QPSK. For unknown rates we set hardware to auto detect 0xfe 0x30 */ 383 384 /*mod fec mask val */ 385 { SYS_DVBS, QPSK, FEC_NONE, 0xfe, 0x30 }, 386 { SYS_DVBS, QPSK, FEC_1_2, 0x02, 0x2e }, /* 00000010 00101110 */ 387 { SYS_DVBS, QPSK, FEC_2_3, 0x04, 0x2f }, /* 00000100 00101111 */ 388 { SYS_DVBS, QPSK, FEC_3_4, 0x08, 0x30 }, /* 00001000 00110000 */ 389 { SYS_DVBS, QPSK, FEC_4_5, 0xfe, 0x30 }, /* 000?0000 ? */ 390 { SYS_DVBS, QPSK, FEC_5_6, 0x20, 0x31 }, /* 00100000 00110001 */ 391 { SYS_DVBS, QPSK, FEC_6_7, 0xfe, 0x30 }, /* 0?000000 ? */ 392 { SYS_DVBS, QPSK, FEC_7_8, 0x80, 0x32 }, /* 10000000 00110010 */ 393 { SYS_DVBS, QPSK, FEC_8_9, 0xfe, 0x30 }, /* 0000000? ? */ 394 { SYS_DVBS, QPSK, FEC_AUTO, 0xfe, 0x30 }, 395 /* NBC-QPSK */ 396 { SYS_DVBS2, QPSK, FEC_1_2, 0x00, 0x04 }, 397 { SYS_DVBS2, QPSK, FEC_3_5, 0x00, 0x05 }, 398 { SYS_DVBS2, QPSK, FEC_2_3, 0x00, 0x06 }, 399 { SYS_DVBS2, QPSK, FEC_3_4, 0x00, 0x07 }, 400 { SYS_DVBS2, QPSK, FEC_4_5, 0x00, 0x08 }, 401 { SYS_DVBS2, QPSK, FEC_5_6, 0x00, 0x09 }, 402 { SYS_DVBS2, QPSK, FEC_8_9, 0x00, 0x0a }, 403 { SYS_DVBS2, QPSK, FEC_9_10, 0x00, 0x0b }, 404 /* 8PSK */ 405 { SYS_DVBS2, PSK_8, FEC_3_5, 0x00, 0x0c }, 406 { SYS_DVBS2, PSK_8, FEC_2_3, 0x00, 0x0d }, 407 { SYS_DVBS2, PSK_8, FEC_3_4, 0x00, 0x0e }, 408 { SYS_DVBS2, PSK_8, FEC_5_6, 0x00, 0x0f }, 409 { SYS_DVBS2, PSK_8, FEC_8_9, 0x00, 0x10 }, 410 { SYS_DVBS2, PSK_8, FEC_9_10, 0x00, 0x11 }, 411 /* 412 * `val' can be found in the FECSTATUS register when tuning. 413 * FECSTATUS will give the actual FEC in use if tuning was successful. 414 */ 415 }; 416 417 static int cx24116_lookup_fecmod(struct cx24116_state *state, 418 enum fe_delivery_system d, enum fe_modulation m, enum fe_code_rate f) 419 { 420 int i, ret = -EOPNOTSUPP; 421 422 dprintk("%s(0x%02x,0x%02x)\n", __func__, m, f); 423 424 for (i = 0; i < ARRAY_SIZE(CX24116_MODFEC_MODES); i++) { 425 if ((d == CX24116_MODFEC_MODES[i].delivery_system) && 426 (m == CX24116_MODFEC_MODES[i].modulation) && 427 (f == CX24116_MODFEC_MODES[i].fec)) { 428 ret = i; 429 break; 430 } 431 } 432 433 return ret; 434 } 435 436 static int cx24116_set_fec(struct cx24116_state *state, 437 enum fe_delivery_system delsys, 438 enum fe_modulation mod, 439 enum fe_code_rate fec) 440 { 441 int ret = 0; 442 443 dprintk("%s(0x%02x,0x%02x)\n", __func__, mod, fec); 444 445 ret = cx24116_lookup_fecmod(state, delsys, mod, fec); 446 447 if (ret < 0) 448 return ret; 449 450 state->dnxt.fec = fec; 451 state->dnxt.fec_val = CX24116_MODFEC_MODES[ret].val; 452 state->dnxt.fec_mask = CX24116_MODFEC_MODES[ret].mask; 453 dprintk("%s() mask/val = 0x%02x/0x%02x\n", __func__, 454 state->dnxt.fec_mask, state->dnxt.fec_val); 455 456 return 0; 457 } 458 459 static int cx24116_set_symbolrate(struct cx24116_state *state, u32 rate) 460 { 461 dprintk("%s(%d)\n", __func__, rate); 462 463 /* check if symbol rate is within limits */ 464 if ((rate > state->frontend.ops.info.symbol_rate_max) || 465 (rate < state->frontend.ops.info.symbol_rate_min)) { 466 dprintk("%s() unsupported symbol_rate = %d\n", __func__, rate); 467 return -EOPNOTSUPP; 468 } 469 470 state->dnxt.symbol_rate = rate; 471 dprintk("%s() symbol_rate = %d\n", __func__, rate); 472 473 return 0; 474 } 475 476 static int cx24116_load_firmware(struct dvb_frontend *fe, 477 const struct firmware *fw); 478 479 static int cx24116_firmware_ondemand(struct dvb_frontend *fe) 480 { 481 struct cx24116_state *state = fe->demodulator_priv; 482 const struct firmware *fw; 483 int ret = 0; 484 485 dprintk("%s()\n", __func__); 486 487 if (cx24116_readreg(state, 0x20) > 0) { 488 489 if (state->skip_fw_load) 490 return 0; 491 492 /* Load firmware */ 493 /* request the firmware, this will block until loaded */ 494 printk(KERN_INFO "%s: Waiting for firmware upload (%s)...\n", 495 __func__, CX24116_DEFAULT_FIRMWARE); 496 ret = request_firmware(&fw, CX24116_DEFAULT_FIRMWARE, 497 state->i2c->dev.parent); 498 printk(KERN_INFO "%s: Waiting for firmware upload(2)...\n", 499 __func__); 500 if (ret) { 501 printk(KERN_ERR "%s: No firmware uploaded (timeout or file not found?)\n", 502 __func__); 503 return ret; 504 } 505 506 /* Make sure we don't recurse back through here 507 * during loading */ 508 state->skip_fw_load = 1; 509 510 ret = cx24116_load_firmware(fe, fw); 511 if (ret) 512 printk(KERN_ERR "%s: Writing firmware to device failed\n", 513 __func__); 514 515 release_firmware(fw); 516 517 printk(KERN_INFO "%s: Firmware upload %s\n", __func__, 518 ret == 0 ? "complete" : "failed"); 519 520 /* Ensure firmware is always loaded if required */ 521 state->skip_fw_load = 0; 522 } 523 524 return ret; 525 } 526 527 /* Take a basic firmware command structure, format it 528 * and forward it for processing 529 */ 530 static int cx24116_cmd_execute(struct dvb_frontend *fe, struct cx24116_cmd *cmd) 531 { 532 struct cx24116_state *state = fe->demodulator_priv; 533 int i, ret; 534 535 dprintk("%s()\n", __func__); 536 537 /* Load the firmware if required */ 538 ret = cx24116_firmware_ondemand(fe); 539 if (ret != 0) { 540 printk(KERN_ERR "%s(): Unable initialise the firmware\n", 541 __func__); 542 return ret; 543 } 544 545 /* Write the command */ 546 for (i = 0; i < cmd->len ; i++) { 547 dprintk("%s: 0x%02x == 0x%02x\n", __func__, i, cmd->args[i]); 548 cx24116_writereg(state, i, cmd->args[i]); 549 } 550 551 /* Start execution and wait for cmd to terminate */ 552 cx24116_writereg(state, CX24116_REG_EXECUTE, 0x01); 553 while (cx24116_readreg(state, CX24116_REG_EXECUTE)) { 554 msleep(10); 555 if (i++ > 64) { 556 /* Avoid looping forever if the firmware does 557 not respond */ 558 printk(KERN_WARNING "%s() Firmware not responding\n", 559 __func__); 560 return -EREMOTEIO; 561 } 562 } 563 return 0; 564 } 565 566 static int cx24116_load_firmware(struct dvb_frontend *fe, 567 const struct firmware *fw) 568 { 569 struct cx24116_state *state = fe->demodulator_priv; 570 struct cx24116_cmd cmd; 571 int i, ret, len, max, remaining; 572 unsigned char vers[4]; 573 574 dprintk("%s\n", __func__); 575 dprintk("Firmware is %zu bytes (%02x %02x .. %02x %02x)\n", 576 fw->size, 577 fw->data[0], 578 fw->data[1], 579 fw->data[fw->size-2], 580 fw->data[fw->size-1]); 581 582 /* Toggle 88x SRST pin to reset demod */ 583 if (state->config->reset_device) 584 state->config->reset_device(fe); 585 586 /* Begin the firmware load process */ 587 /* Prepare the demod, load the firmware, cleanup after load */ 588 589 /* Init PLL */ 590 cx24116_writereg(state, 0xE5, 0x00); 591 cx24116_writereg(state, 0xF1, 0x08); 592 cx24116_writereg(state, 0xF2, 0x13); 593 594 /* Start PLL */ 595 cx24116_writereg(state, 0xe0, 0x03); 596 cx24116_writereg(state, 0xe0, 0x00); 597 598 /* Unknown */ 599 cx24116_writereg(state, CX24116_REG_CLKDIV, 0x46); 600 cx24116_writereg(state, CX24116_REG_RATEDIV, 0x00); 601 602 /* Unknown */ 603 cx24116_writereg(state, 0xF0, 0x03); 604 cx24116_writereg(state, 0xF4, 0x81); 605 cx24116_writereg(state, 0xF5, 0x00); 606 cx24116_writereg(state, 0xF6, 0x00); 607 608 /* Split firmware to the max I2C write len and write. 609 * Writes whole firmware as one write when i2c_wr_max is set to 0. */ 610 if (state->config->i2c_wr_max) 611 max = state->config->i2c_wr_max; 612 else 613 max = INT_MAX; /* enough for 32k firmware */ 614 615 for (remaining = fw->size; remaining > 0; remaining -= max - 1) { 616 len = remaining; 617 if (len > max - 1) 618 len = max - 1; 619 620 cx24116_writeregN(state, 0xF7, &fw->data[fw->size - remaining], 621 len); 622 } 623 624 cx24116_writereg(state, 0xF4, 0x10); 625 cx24116_writereg(state, 0xF0, 0x00); 626 cx24116_writereg(state, 0xF8, 0x06); 627 628 /* Firmware CMD 10: VCO config */ 629 cmd.args[0x00] = CMD_SET_VCO; 630 cmd.args[0x01] = 0x05; 631 cmd.args[0x02] = 0xdc; 632 cmd.args[0x03] = 0xda; 633 cmd.args[0x04] = 0xae; 634 cmd.args[0x05] = 0xaa; 635 cmd.args[0x06] = 0x04; 636 cmd.args[0x07] = 0x9d; 637 cmd.args[0x08] = 0xfc; 638 cmd.args[0x09] = 0x06; 639 cmd.len = 0x0a; 640 ret = cx24116_cmd_execute(fe, &cmd); 641 if (ret != 0) 642 return ret; 643 644 cx24116_writereg(state, CX24116_REG_SSTATUS, 0x00); 645 646 /* Firmware CMD 14: Tuner config */ 647 cmd.args[0x00] = CMD_TUNERINIT; 648 cmd.args[0x01] = 0x00; 649 cmd.args[0x02] = 0x00; 650 cmd.len = 0x03; 651 ret = cx24116_cmd_execute(fe, &cmd); 652 if (ret != 0) 653 return ret; 654 655 cx24116_writereg(state, 0xe5, 0x00); 656 657 /* Firmware CMD 13: MPEG config */ 658 cmd.args[0x00] = CMD_MPEGCONFIG; 659 cmd.args[0x01] = 0x01; 660 cmd.args[0x02] = 0x75; 661 cmd.args[0x03] = 0x00; 662 if (state->config->mpg_clk_pos_pol) 663 cmd.args[0x04] = state->config->mpg_clk_pos_pol; 664 else 665 cmd.args[0x04] = 0x02; 666 cmd.args[0x05] = 0x00; 667 cmd.len = 0x06; 668 ret = cx24116_cmd_execute(fe, &cmd); 669 if (ret != 0) 670 return ret; 671 672 /* Firmware CMD 35: Get firmware version */ 673 cmd.args[0x00] = CMD_UPDFWVERS; 674 cmd.len = 0x02; 675 for (i = 0; i < 4; i++) { 676 cmd.args[0x01] = i; 677 ret = cx24116_cmd_execute(fe, &cmd); 678 if (ret != 0) 679 return ret; 680 vers[i] = cx24116_readreg(state, CX24116_REG_MAILBOX); 681 } 682 printk(KERN_INFO "%s: FW version %i.%i.%i.%i\n", __func__, 683 vers[0], vers[1], vers[2], vers[3]); 684 685 return 0; 686 } 687 688 static int cx24116_read_status(struct dvb_frontend *fe, enum fe_status *status) 689 { 690 struct cx24116_state *state = fe->demodulator_priv; 691 692 int lock = cx24116_readreg(state, CX24116_REG_SSTATUS) & 693 CX24116_STATUS_MASK; 694 695 dprintk("%s: status = 0x%02x\n", __func__, lock); 696 697 *status = 0; 698 699 if (lock & CX24116_HAS_SIGNAL) 700 *status |= FE_HAS_SIGNAL; 701 if (lock & CX24116_HAS_CARRIER) 702 *status |= FE_HAS_CARRIER; 703 if (lock & CX24116_HAS_VITERBI) 704 *status |= FE_HAS_VITERBI; 705 if (lock & CX24116_HAS_SYNCLOCK) 706 *status |= FE_HAS_SYNC | FE_HAS_LOCK; 707 708 return 0; 709 } 710 711 static int cx24116_read_ber(struct dvb_frontend *fe, u32 *ber) 712 { 713 struct cx24116_state *state = fe->demodulator_priv; 714 715 dprintk("%s()\n", __func__); 716 717 *ber = (cx24116_readreg(state, CX24116_REG_BER24) << 24) | 718 (cx24116_readreg(state, CX24116_REG_BER16) << 16) | 719 (cx24116_readreg(state, CX24116_REG_BER8) << 8) | 720 cx24116_readreg(state, CX24116_REG_BER0); 721 722 return 0; 723 } 724 725 /* TODO Determine function and scale appropriately */ 726 static int cx24116_read_signal_strength(struct dvb_frontend *fe, 727 u16 *signal_strength) 728 { 729 struct cx24116_state *state = fe->demodulator_priv; 730 struct cx24116_cmd cmd; 731 int ret; 732 u16 sig_reading; 733 734 dprintk("%s()\n", __func__); 735 736 /* Firmware CMD 19: Get AGC */ 737 cmd.args[0x00] = CMD_GETAGC; 738 cmd.len = 0x01; 739 ret = cx24116_cmd_execute(fe, &cmd); 740 if (ret != 0) 741 return ret; 742 743 sig_reading = 744 (cx24116_readreg(state, 745 CX24116_REG_SSTATUS) & CX24116_SIGNAL_MASK) | 746 (cx24116_readreg(state, CX24116_REG_SIGNAL) << 6); 747 *signal_strength = 0 - sig_reading; 748 749 dprintk("%s: raw / cooked = 0x%04x / 0x%04x\n", 750 __func__, sig_reading, *signal_strength); 751 752 return 0; 753 } 754 755 /* SNR (0..100)% = (sig & 0xf0) * 10 + (sig & 0x0f) * 10 / 16 */ 756 static int cx24116_read_snr_pct(struct dvb_frontend *fe, u16 *snr) 757 { 758 struct cx24116_state *state = fe->demodulator_priv; 759 u8 snr_reading; 760 static const u32 snr_tab[] = { /* 10 x Table (rounded up) */ 761 0x00000, 0x0199A, 0x03333, 0x04ccD, 0x06667, 762 0x08000, 0x0999A, 0x0b333, 0x0cccD, 0x0e667, 763 0x10000, 0x1199A, 0x13333, 0x14ccD, 0x16667, 764 0x18000 }; 765 766 dprintk("%s()\n", __func__); 767 768 snr_reading = cx24116_readreg(state, CX24116_REG_QUALITY0); 769 770 if (snr_reading >= 0xa0 /* 100% */) 771 *snr = 0xffff; 772 else 773 *snr = snr_tab[(snr_reading & 0xf0) >> 4] + 774 (snr_tab[(snr_reading & 0x0f)] >> 4); 775 776 dprintk("%s: raw / cooked = 0x%02x / 0x%04x\n", __func__, 777 snr_reading, *snr); 778 779 return 0; 780 } 781 782 /* The reelbox patches show the value in the registers represents 783 * ESNO, from 0->30db (values 0->300). We provide this value by 784 * default. 785 */ 786 static int cx24116_read_snr_esno(struct dvb_frontend *fe, u16 *snr) 787 { 788 struct cx24116_state *state = fe->demodulator_priv; 789 790 dprintk("%s()\n", __func__); 791 792 *snr = cx24116_readreg(state, CX24116_REG_QUALITY8) << 8 | 793 cx24116_readreg(state, CX24116_REG_QUALITY0); 794 795 dprintk("%s: raw 0x%04x\n", __func__, *snr); 796 797 return 0; 798 } 799 800 static int cx24116_read_snr(struct dvb_frontend *fe, u16 *snr) 801 { 802 if (esno_snr == 1) 803 return cx24116_read_snr_esno(fe, snr); 804 else 805 return cx24116_read_snr_pct(fe, snr); 806 } 807 808 static int cx24116_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) 809 { 810 struct cx24116_state *state = fe->demodulator_priv; 811 812 dprintk("%s()\n", __func__); 813 814 *ucblocks = (cx24116_readreg(state, CX24116_REG_UCB8) << 8) | 815 cx24116_readreg(state, CX24116_REG_UCB0); 816 817 return 0; 818 } 819 820 /* Overwrite the current tuning params, we are about to tune */ 821 static void cx24116_clone_params(struct dvb_frontend *fe) 822 { 823 struct cx24116_state *state = fe->demodulator_priv; 824 state->dcur = state->dnxt; 825 } 826 827 /* Wait for LNB */ 828 static int cx24116_wait_for_lnb(struct dvb_frontend *fe) 829 { 830 struct cx24116_state *state = fe->demodulator_priv; 831 int i; 832 833 dprintk("%s() qstatus = 0x%02x\n", __func__, 834 cx24116_readreg(state, CX24116_REG_QSTATUS)); 835 836 /* Wait for up to 300 ms */ 837 for (i = 0; i < 30 ; i++) { 838 if (cx24116_readreg(state, CX24116_REG_QSTATUS) & 0x20) 839 return 0; 840 msleep(10); 841 } 842 843 dprintk("%s(): LNB not ready\n", __func__); 844 845 return -ETIMEDOUT; /* -EBUSY ? */ 846 } 847 848 static int cx24116_set_voltage(struct dvb_frontend *fe, 849 enum fe_sec_voltage voltage) 850 { 851 struct cx24116_cmd cmd; 852 int ret; 853 854 dprintk("%s: %s\n", __func__, 855 voltage == SEC_VOLTAGE_13 ? "SEC_VOLTAGE_13" : 856 voltage == SEC_VOLTAGE_18 ? "SEC_VOLTAGE_18" : "??"); 857 858 /* Wait for LNB ready */ 859 ret = cx24116_wait_for_lnb(fe); 860 if (ret != 0) 861 return ret; 862 863 /* Wait for voltage/min repeat delay */ 864 msleep(100); 865 866 cmd.args[0x00] = CMD_LNBDCLEVEL; 867 cmd.args[0x01] = (voltage == SEC_VOLTAGE_18 ? 0x01 : 0x00); 868 cmd.len = 0x02; 869 870 /* Min delay time before DiSEqC send */ 871 msleep(15); 872 873 return cx24116_cmd_execute(fe, &cmd); 874 } 875 876 static int cx24116_set_tone(struct dvb_frontend *fe, 877 enum fe_sec_tone_mode tone) 878 { 879 struct cx24116_cmd cmd; 880 int ret; 881 882 dprintk("%s(%d)\n", __func__, tone); 883 if ((tone != SEC_TONE_ON) && (tone != SEC_TONE_OFF)) { 884 printk(KERN_ERR "%s: Invalid, tone=%d\n", __func__, tone); 885 return -EINVAL; 886 } 887 888 /* Wait for LNB ready */ 889 ret = cx24116_wait_for_lnb(fe); 890 if (ret != 0) 891 return ret; 892 893 /* Min delay time after DiSEqC send */ 894 msleep(15); /* XXX determine is FW does this, see send_diseqc/burst */ 895 896 /* Now we set the tone */ 897 cmd.args[0x00] = CMD_SET_TONE; 898 cmd.args[0x01] = 0x00; 899 cmd.args[0x02] = 0x00; 900 901 switch (tone) { 902 case SEC_TONE_ON: 903 dprintk("%s: setting tone on\n", __func__); 904 cmd.args[0x03] = 0x01; 905 break; 906 case SEC_TONE_OFF: 907 dprintk("%s: setting tone off\n", __func__); 908 cmd.args[0x03] = 0x00; 909 break; 910 } 911 cmd.len = 0x04; 912 913 /* Min delay time before DiSEqC send */ 914 msleep(15); /* XXX determine is FW does this, see send_diseqc/burst */ 915 916 return cx24116_cmd_execute(fe, &cmd); 917 } 918 919 /* Initialise DiSEqC */ 920 static int cx24116_diseqc_init(struct dvb_frontend *fe) 921 { 922 struct cx24116_state *state = fe->demodulator_priv; 923 struct cx24116_cmd cmd; 924 int ret; 925 926 /* Firmware CMD 20: LNB/DiSEqC config */ 927 cmd.args[0x00] = CMD_LNBCONFIG; 928 cmd.args[0x01] = 0x00; 929 cmd.args[0x02] = 0x10; 930 cmd.args[0x03] = 0x00; 931 cmd.args[0x04] = 0x8f; 932 cmd.args[0x05] = 0x28; 933 cmd.args[0x06] = (toneburst == CX24116_DISEQC_TONEOFF) ? 0x00 : 0x01; 934 cmd.args[0x07] = 0x01; 935 cmd.len = 0x08; 936 ret = cx24116_cmd_execute(fe, &cmd); 937 if (ret != 0) 938 return ret; 939 940 /* Prepare a DiSEqC command */ 941 state->dsec_cmd.args[0x00] = CMD_LNBSEND; 942 943 /* DiSEqC burst */ 944 state->dsec_cmd.args[CX24116_DISEQC_BURST] = CX24116_DISEQC_MINI_A; 945 946 /* Unknown */ 947 state->dsec_cmd.args[CX24116_DISEQC_ARG2_2] = 0x02; 948 state->dsec_cmd.args[CX24116_DISEQC_ARG3_0] = 0x00; 949 /* Continuation flag? */ 950 state->dsec_cmd.args[CX24116_DISEQC_ARG4_0] = 0x00; 951 952 /* DiSEqC message length */ 953 state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] = 0x00; 954 955 /* Command length */ 956 state->dsec_cmd.len = CX24116_DISEQC_MSGOFS; 957 958 return 0; 959 } 960 961 /* Send DiSEqC message with derived burst (hack) || previous burst */ 962 static int cx24116_send_diseqc_msg(struct dvb_frontend *fe, 963 struct dvb_diseqc_master_cmd *d) 964 { 965 struct cx24116_state *state = fe->demodulator_priv; 966 int i, ret; 967 968 /* Validate length */ 969 if (d->msg_len > sizeof(d->msg)) 970 return -EINVAL; 971 972 /* Dump DiSEqC message */ 973 if (debug) { 974 printk(KERN_INFO "cx24116: %s(", __func__); 975 for (i = 0 ; i < d->msg_len ;) { 976 printk(KERN_INFO "0x%02x", d->msg[i]); 977 if (++i < d->msg_len) 978 printk(KERN_INFO ", "); 979 } 980 printk(") toneburst=%d\n", toneburst); 981 } 982 983 /* DiSEqC message */ 984 for (i = 0; i < d->msg_len; i++) 985 state->dsec_cmd.args[CX24116_DISEQC_MSGOFS + i] = d->msg[i]; 986 987 /* DiSEqC message length */ 988 state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] = d->msg_len; 989 990 /* Command length */ 991 state->dsec_cmd.len = CX24116_DISEQC_MSGOFS + 992 state->dsec_cmd.args[CX24116_DISEQC_MSGLEN]; 993 994 /* DiSEqC toneburst */ 995 if (toneburst == CX24116_DISEQC_MESGCACHE) 996 /* Message is cached */ 997 return 0; 998 999 else if (toneburst == CX24116_DISEQC_TONEOFF) 1000 /* Message is sent without burst */ 1001 state->dsec_cmd.args[CX24116_DISEQC_BURST] = 0; 1002 1003 else if (toneburst == CX24116_DISEQC_TONECACHE) { 1004 /* 1005 * Message is sent with derived else cached burst 1006 * 1007 * WRITE PORT GROUP COMMAND 38 1008 * 1009 * 0/A/A: E0 10 38 F0..F3 1010 * 1/B/B: E0 10 38 F4..F7 1011 * 2/C/A: E0 10 38 F8..FB 1012 * 3/D/B: E0 10 38 FC..FF 1013 * 1014 * databyte[3]= 8421:8421 1015 * ABCD:WXYZ 1016 * CLR :SET 1017 * 1018 * WX= PORT SELECT 0..3 (X=TONEBURST) 1019 * Y = VOLTAGE (0=13V, 1=18V) 1020 * Z = BAND (0=LOW, 1=HIGH(22K)) 1021 */ 1022 if (d->msg_len >= 4 && d->msg[2] == 0x38) 1023 state->dsec_cmd.args[CX24116_DISEQC_BURST] = 1024 ((d->msg[3] & 4) >> 2); 1025 if (debug) 1026 dprintk("%s burst=%d\n", __func__, 1027 state->dsec_cmd.args[CX24116_DISEQC_BURST]); 1028 } 1029 1030 /* Wait for LNB ready */ 1031 ret = cx24116_wait_for_lnb(fe); 1032 if (ret != 0) 1033 return ret; 1034 1035 /* Wait for voltage/min repeat delay */ 1036 msleep(100); 1037 1038 /* Command */ 1039 ret = cx24116_cmd_execute(fe, &state->dsec_cmd); 1040 if (ret != 0) 1041 return ret; 1042 /* 1043 * Wait for send 1044 * 1045 * Eutelsat spec: 1046 * >15ms delay + (XXX determine if FW does this, see set_tone) 1047 * 13.5ms per byte + 1048 * >15ms delay + 1049 * 12.5ms burst + 1050 * >15ms delay (XXX determine if FW does this, see set_tone) 1051 */ 1052 msleep((state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] << 4) + 1053 ((toneburst == CX24116_DISEQC_TONEOFF) ? 30 : 60)); 1054 1055 return 0; 1056 } 1057 1058 /* Send DiSEqC burst */ 1059 static int cx24116_diseqc_send_burst(struct dvb_frontend *fe, 1060 enum fe_sec_mini_cmd burst) 1061 { 1062 struct cx24116_state *state = fe->demodulator_priv; 1063 int ret; 1064 1065 dprintk("%s(%d) toneburst=%d\n", __func__, burst, toneburst); 1066 1067 /* DiSEqC burst */ 1068 if (burst == SEC_MINI_A) 1069 state->dsec_cmd.args[CX24116_DISEQC_BURST] = 1070 CX24116_DISEQC_MINI_A; 1071 else if (burst == SEC_MINI_B) 1072 state->dsec_cmd.args[CX24116_DISEQC_BURST] = 1073 CX24116_DISEQC_MINI_B; 1074 else 1075 return -EINVAL; 1076 1077 /* DiSEqC toneburst */ 1078 if (toneburst != CX24116_DISEQC_MESGCACHE) 1079 /* Burst is cached */ 1080 return 0; 1081 1082 /* Burst is to be sent with cached message */ 1083 1084 /* Wait for LNB ready */ 1085 ret = cx24116_wait_for_lnb(fe); 1086 if (ret != 0) 1087 return ret; 1088 1089 /* Wait for voltage/min repeat delay */ 1090 msleep(100); 1091 1092 /* Command */ 1093 ret = cx24116_cmd_execute(fe, &state->dsec_cmd); 1094 if (ret != 0) 1095 return ret; 1096 1097 /* 1098 * Wait for send 1099 * 1100 * Eutelsat spec: 1101 * >15ms delay + (XXX determine if FW does this, see set_tone) 1102 * 13.5ms per byte + 1103 * >15ms delay + 1104 * 12.5ms burst + 1105 * >15ms delay (XXX determine if FW does this, see set_tone) 1106 */ 1107 msleep((state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] << 4) + 60); 1108 1109 return 0; 1110 } 1111 1112 static void cx24116_release(struct dvb_frontend *fe) 1113 { 1114 struct cx24116_state *state = fe->demodulator_priv; 1115 dprintk("%s\n", __func__); 1116 kfree(state); 1117 } 1118 1119 static const struct dvb_frontend_ops cx24116_ops; 1120 1121 struct dvb_frontend *cx24116_attach(const struct cx24116_config *config, 1122 struct i2c_adapter *i2c) 1123 { 1124 struct cx24116_state *state = NULL; 1125 int ret; 1126 1127 dprintk("%s\n", __func__); 1128 1129 /* allocate memory for the internal state */ 1130 state = kzalloc(sizeof(struct cx24116_state), GFP_KERNEL); 1131 if (state == NULL) 1132 goto error1; 1133 1134 state->config = config; 1135 state->i2c = i2c; 1136 1137 /* check if the demod is present */ 1138 ret = (cx24116_readreg(state, 0xFF) << 8) | 1139 cx24116_readreg(state, 0xFE); 1140 if (ret != 0x0501) { 1141 printk(KERN_INFO "Invalid probe, probably not a CX24116 device\n"); 1142 goto error2; 1143 } 1144 1145 /* create dvb_frontend */ 1146 memcpy(&state->frontend.ops, &cx24116_ops, 1147 sizeof(struct dvb_frontend_ops)); 1148 state->frontend.demodulator_priv = state; 1149 return &state->frontend; 1150 1151 error2: kfree(state); 1152 error1: return NULL; 1153 } 1154 EXPORT_SYMBOL(cx24116_attach); 1155 1156 /* 1157 * Initialise or wake up device 1158 * 1159 * Power config will reset and load initial firmware if required 1160 */ 1161 static int cx24116_initfe(struct dvb_frontend *fe) 1162 { 1163 struct cx24116_state *state = fe->demodulator_priv; 1164 struct cx24116_cmd cmd; 1165 int ret; 1166 1167 dprintk("%s()\n", __func__); 1168 1169 /* Power on */ 1170 cx24116_writereg(state, 0xe0, 0); 1171 cx24116_writereg(state, 0xe1, 0); 1172 cx24116_writereg(state, 0xea, 0); 1173 1174 /* Firmware CMD 36: Power config */ 1175 cmd.args[0x00] = CMD_TUNERSLEEP; 1176 cmd.args[0x01] = 0; 1177 cmd.len = 0x02; 1178 ret = cx24116_cmd_execute(fe, &cmd); 1179 if (ret != 0) 1180 return ret; 1181 1182 ret = cx24116_diseqc_init(fe); 1183 if (ret != 0) 1184 return ret; 1185 1186 /* HVR-4000 needs this */ 1187 return cx24116_set_voltage(fe, SEC_VOLTAGE_13); 1188 } 1189 1190 /* 1191 * Put device to sleep 1192 */ 1193 static int cx24116_sleep(struct dvb_frontend *fe) 1194 { 1195 struct cx24116_state *state = fe->demodulator_priv; 1196 struct cx24116_cmd cmd; 1197 int ret; 1198 1199 dprintk("%s()\n", __func__); 1200 1201 /* Firmware CMD 36: Power config */ 1202 cmd.args[0x00] = CMD_TUNERSLEEP; 1203 cmd.args[0x01] = 1; 1204 cmd.len = 0x02; 1205 ret = cx24116_cmd_execute(fe, &cmd); 1206 if (ret != 0) 1207 return ret; 1208 1209 /* Power off (Shutdown clocks) */ 1210 cx24116_writereg(state, 0xea, 0xff); 1211 cx24116_writereg(state, 0xe1, 1); 1212 cx24116_writereg(state, 0xe0, 1); 1213 1214 return 0; 1215 } 1216 1217 /* dvb-core told us to tune, the tv property cache will be complete, 1218 * it's safe for is to pull values and use them for tuning purposes. 1219 */ 1220 static int cx24116_set_frontend(struct dvb_frontend *fe) 1221 { 1222 struct cx24116_state *state = fe->demodulator_priv; 1223 struct dtv_frontend_properties *c = &fe->dtv_property_cache; 1224 struct cx24116_cmd cmd; 1225 enum fe_status tunerstat; 1226 int i, status, ret, retune = 1; 1227 1228 dprintk("%s()\n", __func__); 1229 1230 switch (c->delivery_system) { 1231 case SYS_DVBS: 1232 dprintk("%s: DVB-S delivery system selected\n", __func__); 1233 1234 /* Only QPSK is supported for DVB-S */ 1235 if (c->modulation != QPSK) { 1236 dprintk("%s: unsupported modulation selected (%d)\n", 1237 __func__, c->modulation); 1238 return -EOPNOTSUPP; 1239 } 1240 1241 /* Pilot doesn't exist in DVB-S, turn bit off */ 1242 state->dnxt.pilot_val = CX24116_PILOT_OFF; 1243 1244 /* DVB-S only supports 0.35 */ 1245 if (c->rolloff != ROLLOFF_35) { 1246 dprintk("%s: unsupported rolloff selected (%d)\n", 1247 __func__, c->rolloff); 1248 return -EOPNOTSUPP; 1249 } 1250 state->dnxt.rolloff_val = CX24116_ROLLOFF_035; 1251 break; 1252 1253 case SYS_DVBS2: 1254 dprintk("%s: DVB-S2 delivery system selected\n", __func__); 1255 1256 /* 1257 * NBC 8PSK/QPSK with DVB-S is supported for DVB-S2, 1258 * but not hardware auto detection 1259 */ 1260 if (c->modulation != PSK_8 && c->modulation != QPSK) { 1261 dprintk("%s: unsupported modulation selected (%d)\n", 1262 __func__, c->modulation); 1263 return -EOPNOTSUPP; 1264 } 1265 1266 switch (c->pilot) { 1267 case PILOT_AUTO: /* Not supported but emulated */ 1268 state->dnxt.pilot_val = (c->modulation == QPSK) 1269 ? CX24116_PILOT_OFF : CX24116_PILOT_ON; 1270 retune++; 1271 break; 1272 case PILOT_OFF: 1273 state->dnxt.pilot_val = CX24116_PILOT_OFF; 1274 break; 1275 case PILOT_ON: 1276 state->dnxt.pilot_val = CX24116_PILOT_ON; 1277 break; 1278 default: 1279 dprintk("%s: unsupported pilot mode selected (%d)\n", 1280 __func__, c->pilot); 1281 return -EOPNOTSUPP; 1282 } 1283 1284 switch (c->rolloff) { 1285 case ROLLOFF_20: 1286 state->dnxt.rolloff_val = CX24116_ROLLOFF_020; 1287 break; 1288 case ROLLOFF_25: 1289 state->dnxt.rolloff_val = CX24116_ROLLOFF_025; 1290 break; 1291 case ROLLOFF_35: 1292 state->dnxt.rolloff_val = CX24116_ROLLOFF_035; 1293 break; 1294 case ROLLOFF_AUTO: /* Rolloff must be explicit */ 1295 default: 1296 dprintk("%s: unsupported rolloff selected (%d)\n", 1297 __func__, c->rolloff); 1298 return -EOPNOTSUPP; 1299 } 1300 break; 1301 1302 default: 1303 dprintk("%s: unsupported delivery system selected (%d)\n", 1304 __func__, c->delivery_system); 1305 return -EOPNOTSUPP; 1306 } 1307 state->dnxt.delsys = c->delivery_system; 1308 state->dnxt.modulation = c->modulation; 1309 state->dnxt.frequency = c->frequency; 1310 state->dnxt.pilot = c->pilot; 1311 state->dnxt.rolloff = c->rolloff; 1312 1313 ret = cx24116_set_inversion(state, c->inversion); 1314 if (ret != 0) 1315 return ret; 1316 1317 /* FEC_NONE/AUTO for DVB-S2 is not supported and detected here */ 1318 ret = cx24116_set_fec(state, c->delivery_system, c->modulation, c->fec_inner); 1319 if (ret != 0) 1320 return ret; 1321 1322 ret = cx24116_set_symbolrate(state, c->symbol_rate); 1323 if (ret != 0) 1324 return ret; 1325 1326 /* discard the 'current' tuning parameters and prepare to tune */ 1327 cx24116_clone_params(fe); 1328 1329 dprintk("%s: delsys = %d\n", __func__, state->dcur.delsys); 1330 dprintk("%s: modulation = %d\n", __func__, state->dcur.modulation); 1331 dprintk("%s: frequency = %d\n", __func__, state->dcur.frequency); 1332 dprintk("%s: pilot = %d (val = 0x%02x)\n", __func__, 1333 state->dcur.pilot, state->dcur.pilot_val); 1334 dprintk("%s: retune = %d\n", __func__, retune); 1335 dprintk("%s: rolloff = %d (val = 0x%02x)\n", __func__, 1336 state->dcur.rolloff, state->dcur.rolloff_val); 1337 dprintk("%s: symbol_rate = %d\n", __func__, state->dcur.symbol_rate); 1338 dprintk("%s: FEC = %d (mask/val = 0x%02x/0x%02x)\n", __func__, 1339 state->dcur.fec, state->dcur.fec_mask, state->dcur.fec_val); 1340 dprintk("%s: Inversion = %d (val = 0x%02x)\n", __func__, 1341 state->dcur.inversion, state->dcur.inversion_val); 1342 1343 /* This is also done in advise/acquire on HVR4000 but not on LITE */ 1344 if (state->config->set_ts_params) 1345 state->config->set_ts_params(fe, 0); 1346 1347 /* Set/Reset B/W */ 1348 cmd.args[0x00] = CMD_BANDWIDTH; 1349 cmd.args[0x01] = 0x01; 1350 cmd.len = 0x02; 1351 ret = cx24116_cmd_execute(fe, &cmd); 1352 if (ret != 0) 1353 return ret; 1354 1355 /* Prepare a tune request */ 1356 cmd.args[0x00] = CMD_TUNEREQUEST; 1357 1358 /* Frequency */ 1359 cmd.args[0x01] = (state->dcur.frequency & 0xff0000) >> 16; 1360 cmd.args[0x02] = (state->dcur.frequency & 0x00ff00) >> 8; 1361 cmd.args[0x03] = (state->dcur.frequency & 0x0000ff); 1362 1363 /* Symbol Rate */ 1364 cmd.args[0x04] = ((state->dcur.symbol_rate / 1000) & 0xff00) >> 8; 1365 cmd.args[0x05] = ((state->dcur.symbol_rate / 1000) & 0x00ff); 1366 1367 /* Automatic Inversion */ 1368 cmd.args[0x06] = state->dcur.inversion_val; 1369 1370 /* Modulation / FEC / Pilot */ 1371 cmd.args[0x07] = state->dcur.fec_val | state->dcur.pilot_val; 1372 1373 cmd.args[0x08] = CX24116_SEARCH_RANGE_KHZ >> 8; 1374 cmd.args[0x09] = CX24116_SEARCH_RANGE_KHZ & 0xff; 1375 cmd.args[0x0a] = 0x00; 1376 cmd.args[0x0b] = 0x00; 1377 cmd.args[0x0c] = state->dcur.rolloff_val; 1378 cmd.args[0x0d] = state->dcur.fec_mask; 1379 1380 if (state->dcur.symbol_rate > 30000000) { 1381 cmd.args[0x0e] = 0x04; 1382 cmd.args[0x0f] = 0x00; 1383 cmd.args[0x10] = 0x01; 1384 cmd.args[0x11] = 0x77; 1385 cmd.args[0x12] = 0x36; 1386 cx24116_writereg(state, CX24116_REG_CLKDIV, 0x44); 1387 cx24116_writereg(state, CX24116_REG_RATEDIV, 0x01); 1388 } else { 1389 cmd.args[0x0e] = 0x06; 1390 cmd.args[0x0f] = 0x00; 1391 cmd.args[0x10] = 0x00; 1392 cmd.args[0x11] = 0xFA; 1393 cmd.args[0x12] = 0x24; 1394 cx24116_writereg(state, CX24116_REG_CLKDIV, 0x46); 1395 cx24116_writereg(state, CX24116_REG_RATEDIV, 0x00); 1396 } 1397 1398 cmd.len = 0x13; 1399 1400 /* We need to support pilot and non-pilot tuning in the 1401 * driver automatically. This is a workaround for because 1402 * the demod does not support autodetect. 1403 */ 1404 do { 1405 /* Reset status register */ 1406 status = cx24116_readreg(state, CX24116_REG_SSTATUS) 1407 & CX24116_SIGNAL_MASK; 1408 cx24116_writereg(state, CX24116_REG_SSTATUS, status); 1409 1410 /* Tune */ 1411 ret = cx24116_cmd_execute(fe, &cmd); 1412 if (ret != 0) 1413 break; 1414 1415 /* 1416 * Wait for up to 500 ms before retrying 1417 * 1418 * If we are able to tune then generally it occurs within 100ms. 1419 * If it takes longer, try a different toneburst setting. 1420 */ 1421 for (i = 0; i < 50 ; i++) { 1422 cx24116_read_status(fe, &tunerstat); 1423 status = tunerstat & (FE_HAS_SIGNAL | FE_HAS_SYNC); 1424 if (status == (FE_HAS_SIGNAL | FE_HAS_SYNC)) { 1425 dprintk("%s: Tuned\n", __func__); 1426 goto tuned; 1427 } 1428 msleep(10); 1429 } 1430 1431 dprintk("%s: Not tuned\n", __func__); 1432 1433 /* Toggle pilot bit when in auto-pilot */ 1434 if (state->dcur.pilot == PILOT_AUTO) 1435 cmd.args[0x07] ^= CX24116_PILOT_ON; 1436 } while (--retune); 1437 1438 tuned: /* Set/Reset B/W */ 1439 cmd.args[0x00] = CMD_BANDWIDTH; 1440 cmd.args[0x01] = 0x00; 1441 cmd.len = 0x02; 1442 return cx24116_cmd_execute(fe, &cmd); 1443 } 1444 1445 static int cx24116_tune(struct dvb_frontend *fe, bool re_tune, 1446 unsigned int mode_flags, unsigned int *delay, enum fe_status *status) 1447 { 1448 /* 1449 * It is safe to discard "params" here, as the DVB core will sync 1450 * fe->dtv_property_cache with fepriv->parameters_in, where the 1451 * DVBv3 params are stored. The only practical usage for it indicate 1452 * that re-tuning is needed, e. g. (fepriv->state & FESTATE_RETUNE) is 1453 * true. 1454 */ 1455 1456 *delay = HZ / 5; 1457 if (re_tune) { 1458 int ret = cx24116_set_frontend(fe); 1459 if (ret) 1460 return ret; 1461 } 1462 return cx24116_read_status(fe, status); 1463 } 1464 1465 static int cx24116_get_algo(struct dvb_frontend *fe) 1466 { 1467 return DVBFE_ALGO_HW; 1468 } 1469 1470 static const struct dvb_frontend_ops cx24116_ops = { 1471 .delsys = { SYS_DVBS, SYS_DVBS2 }, 1472 .info = { 1473 .name = "Conexant CX24116/CX24118", 1474 .frequency_min = 950000, 1475 .frequency_max = 2150000, 1476 .frequency_stepsize = 1011, /* kHz for QPSK frontends */ 1477 .frequency_tolerance = 5000, 1478 .symbol_rate_min = 1000000, 1479 .symbol_rate_max = 45000000, 1480 .caps = FE_CAN_INVERSION_AUTO | 1481 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | 1482 FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 | 1483 FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | 1484 FE_CAN_2G_MODULATION | 1485 FE_CAN_QPSK | FE_CAN_RECOVER 1486 }, 1487 1488 .release = cx24116_release, 1489 1490 .init = cx24116_initfe, 1491 .sleep = cx24116_sleep, 1492 .read_status = cx24116_read_status, 1493 .read_ber = cx24116_read_ber, 1494 .read_signal_strength = cx24116_read_signal_strength, 1495 .read_snr = cx24116_read_snr, 1496 .read_ucblocks = cx24116_read_ucblocks, 1497 .set_tone = cx24116_set_tone, 1498 .set_voltage = cx24116_set_voltage, 1499 .diseqc_send_master_cmd = cx24116_send_diseqc_msg, 1500 .diseqc_send_burst = cx24116_diseqc_send_burst, 1501 .get_frontend_algo = cx24116_get_algo, 1502 .tune = cx24116_tune, 1503 1504 .set_frontend = cx24116_set_frontend, 1505 }; 1506 1507 MODULE_DESCRIPTION("DVB Frontend module for Conexant cx24116/cx24118 hardware"); 1508 MODULE_AUTHOR("Steven Toth"); 1509 MODULE_LICENSE("GPL"); 1510 1511