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