Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.19 731 lines 18 kB view raw
1/* 2 Driver for ST STV0299 demodulator 3 4 Copyright (C) 2001-2002 Convergence Integrated Media GmbH 5 <ralph@convergence.de>, 6 <holger@convergence.de>, 7 <js@convergence.de> 8 9 10 Philips SU1278/SH 11 12 Copyright (C) 2002 by Peter Schildmann <peter.schildmann@web.de> 13 14 15 LG TDQF-S001F 16 17 Copyright (C) 2002 Felix Domke <tmbinc@elitedvb.net> 18 & Andreas Oberritter <obi@linuxtv.org> 19 20 21 Support for Samsung TBMU24112IMB used on Technisat SkyStar2 rev. 2.6B 22 23 Copyright (C) 2003 Vadim Catana <skystar@moldova.cc>: 24 25 Support for Philips SU1278 on Technotrend hardware 26 27 Copyright (C) 2004 Andrew de Quincey <adq_dvb@lidskialf.net> 28 29 This program is free software; you can redistribute it and/or modify 30 it under the terms of the GNU General Public License as published by 31 the Free Software Foundation; either version 2 of the License, or 32 (at your option) any later version. 33 34 This program is distributed in the hope that it will be useful, 35 but WITHOUT ANY WARRANTY; without even the implied warranty of 36 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 37 GNU General Public License for more details. 38 39 You should have received a copy of the GNU General Public License 40 along with this program; if not, write to the Free Software 41 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 42 43*/ 44 45#include <linux/init.h> 46#include <linux/kernel.h> 47#include <linux/module.h> 48#include <linux/moduleparam.h> 49#include <linux/string.h> 50#include <linux/slab.h> 51#include <linux/jiffies.h> 52#include <asm/div64.h> 53 54#include "dvb_frontend.h" 55#include "stv0299.h" 56 57struct stv0299_state { 58 struct i2c_adapter* i2c; 59 const struct stv0299_config* config; 60 struct dvb_frontend frontend; 61 62 u8 initialised:1; 63 u32 tuner_frequency; 64 u32 symbol_rate; 65 fe_code_rate_t fec_inner; 66 int errmode; 67}; 68 69#define STATUS_BER 0 70#define STATUS_UCBLOCKS 1 71 72static int debug; 73static int debug_legacy_dish_switch; 74#define dprintk(args...) \ 75 do { \ 76 if (debug) printk(KERN_DEBUG "stv0299: " args); \ 77 } while (0) 78 79 80static int stv0299_writeregI (struct stv0299_state* state, u8 reg, u8 data) 81{ 82 int ret; 83 u8 buf [] = { reg, data }; 84 struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf, .len = 2 }; 85 86 ret = i2c_transfer (state->i2c, &msg, 1); 87 88 if (ret != 1) 89 dprintk("%s: writereg error (reg == 0x%02x, val == 0x%02x, " 90 "ret == %i)\n", __FUNCTION__, reg, data, ret); 91 92 return (ret != 1) ? -EREMOTEIO : 0; 93} 94 95int stv0299_write(struct dvb_frontend* fe, u8 *buf, int len) 96{ 97 struct stv0299_state* state = fe->demodulator_priv; 98 99 if (len != 2) 100 return -EINVAL; 101 102 return stv0299_writeregI(state, buf[0], buf[1]); 103} 104 105static u8 stv0299_readreg (struct stv0299_state* state, u8 reg) 106{ 107 int ret; 108 u8 b0 [] = { reg }; 109 u8 b1 [] = { 0 }; 110 struct i2c_msg msg [] = { { .addr = state->config->demod_address, .flags = 0, .buf = b0, .len = 1 }, 111 { .addr = state->config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 1 } }; 112 113 ret = i2c_transfer (state->i2c, msg, 2); 114 115 if (ret != 2) 116 dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", 117 __FUNCTION__, reg, ret); 118 119 return b1[0]; 120} 121 122static int stv0299_readregs (struct stv0299_state* state, u8 reg1, u8 *b, u8 len) 123{ 124 int ret; 125 struct i2c_msg msg [] = { { .addr = state->config->demod_address, .flags = 0, .buf = &reg1, .len = 1 }, 126 { .addr = state->config->demod_address, .flags = I2C_M_RD, .buf = b, .len = len } }; 127 128 ret = i2c_transfer (state->i2c, msg, 2); 129 130 if (ret != 2) 131 dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret); 132 133 return ret == 2 ? 0 : ret; 134} 135 136static int stv0299_set_FEC (struct stv0299_state* state, fe_code_rate_t fec) 137{ 138 dprintk ("%s\n", __FUNCTION__); 139 140 switch (fec) { 141 case FEC_AUTO: 142 { 143 return stv0299_writeregI (state, 0x31, 0x1f); 144 } 145 case FEC_1_2: 146 { 147 return stv0299_writeregI (state, 0x31, 0x01); 148 } 149 case FEC_2_3: 150 { 151 return stv0299_writeregI (state, 0x31, 0x02); 152 } 153 case FEC_3_4: 154 { 155 return stv0299_writeregI (state, 0x31, 0x04); 156 } 157 case FEC_5_6: 158 { 159 return stv0299_writeregI (state, 0x31, 0x08); 160 } 161 case FEC_7_8: 162 { 163 return stv0299_writeregI (state, 0x31, 0x10); 164 } 165 default: 166 { 167 return -EINVAL; 168 } 169 } 170} 171 172static fe_code_rate_t stv0299_get_fec (struct stv0299_state* state) 173{ 174 static fe_code_rate_t fec_tab [] = { FEC_2_3, FEC_3_4, FEC_5_6, 175 FEC_7_8, FEC_1_2 }; 176 u8 index; 177 178 dprintk ("%s\n", __FUNCTION__); 179 180 index = stv0299_readreg (state, 0x1b); 181 index &= 0x7; 182 183 if (index > 4) 184 return FEC_AUTO; 185 186 return fec_tab [index]; 187} 188 189static int stv0299_wait_diseqc_fifo (struct stv0299_state* state, int timeout) 190{ 191 unsigned long start = jiffies; 192 193 dprintk ("%s\n", __FUNCTION__); 194 195 while (stv0299_readreg(state, 0x0a) & 1) { 196 if (jiffies - start > timeout) { 197 dprintk ("%s: timeout!!\n", __FUNCTION__); 198 return -ETIMEDOUT; 199 } 200 msleep(10); 201 }; 202 203 return 0; 204} 205 206static int stv0299_wait_diseqc_idle (struct stv0299_state* state, int timeout) 207{ 208 unsigned long start = jiffies; 209 210 dprintk ("%s\n", __FUNCTION__); 211 212 while ((stv0299_readreg(state, 0x0a) & 3) != 2 ) { 213 if (jiffies - start > timeout) { 214 dprintk ("%s: timeout!!\n", __FUNCTION__); 215 return -ETIMEDOUT; 216 } 217 msleep(10); 218 }; 219 220 return 0; 221} 222 223static int stv0299_set_symbolrate (struct dvb_frontend* fe, u32 srate) 224{ 225 struct stv0299_state* state = fe->demodulator_priv; 226 u64 big = srate; 227 u32 ratio; 228 229 // check rate is within limits 230 if ((srate < 1000000) || (srate > 45000000)) return -EINVAL; 231 232 // calculate value to program 233 big = big << 20; 234 big += (state->config->mclk-1); // round correctly 235 do_div(big, state->config->mclk); 236 ratio = big << 4; 237 238 return state->config->set_symbol_rate(fe, srate, ratio); 239} 240 241static int stv0299_get_symbolrate (struct stv0299_state* state) 242{ 243 u32 Mclk = state->config->mclk / 4096L; 244 u32 srate; 245 s32 offset; 246 u8 sfr[3]; 247 s8 rtf; 248 249 dprintk ("%s\n", __FUNCTION__); 250 251 stv0299_readregs (state, 0x1f, sfr, 3); 252 stv0299_readregs (state, 0x1a, &rtf, 1); 253 254 srate = (sfr[0] << 8) | sfr[1]; 255 srate *= Mclk; 256 srate /= 16; 257 srate += (sfr[2] >> 4) * Mclk / 256; 258 offset = (s32) rtf * (srate / 4096L); 259 offset /= 128; 260 261 dprintk ("%s : srate = %i\n", __FUNCTION__, srate); 262 dprintk ("%s : ofset = %i\n", __FUNCTION__, offset); 263 264 srate += offset; 265 266 srate += 1000; 267 srate /= 2000; 268 srate *= 2000; 269 270 return srate; 271} 272 273static int stv0299_send_diseqc_msg (struct dvb_frontend* fe, 274 struct dvb_diseqc_master_cmd *m) 275{ 276 struct stv0299_state* state = fe->demodulator_priv; 277 u8 val; 278 int i; 279 280 dprintk ("%s\n", __FUNCTION__); 281 282 if (stv0299_wait_diseqc_idle (state, 100) < 0) 283 return -ETIMEDOUT; 284 285 val = stv0299_readreg (state, 0x08); 286 287 if (stv0299_writeregI (state, 0x08, (val & ~0x7) | 0x6)) /* DiSEqC mode */ 288 return -EREMOTEIO; 289 290 for (i=0; i<m->msg_len; i++) { 291 if (stv0299_wait_diseqc_fifo (state, 100) < 0) 292 return -ETIMEDOUT; 293 294 if (stv0299_writeregI (state, 0x09, m->msg[i])) 295 return -EREMOTEIO; 296 } 297 298 if (stv0299_wait_diseqc_idle (state, 100) < 0) 299 return -ETIMEDOUT; 300 301 return 0; 302} 303 304static int stv0299_send_diseqc_burst (struct dvb_frontend* fe, fe_sec_mini_cmd_t burst) 305{ 306 struct stv0299_state* state = fe->demodulator_priv; 307 u8 val; 308 309 dprintk ("%s\n", __FUNCTION__); 310 311 if (stv0299_wait_diseqc_idle (state, 100) < 0) 312 return -ETIMEDOUT; 313 314 val = stv0299_readreg (state, 0x08); 315 316 if (stv0299_writeregI (state, 0x08, (val & ~0x7) | 0x2)) /* burst mode */ 317 return -EREMOTEIO; 318 319 if (stv0299_writeregI (state, 0x09, burst == SEC_MINI_A ? 0x00 : 0xff)) 320 return -EREMOTEIO; 321 322 if (stv0299_wait_diseqc_idle (state, 100) < 0) 323 return -ETIMEDOUT; 324 325 if (stv0299_writeregI (state, 0x08, val)) 326 return -EREMOTEIO; 327 328 return 0; 329} 330 331static int stv0299_set_tone (struct dvb_frontend* fe, fe_sec_tone_mode_t tone) 332{ 333 struct stv0299_state* state = fe->demodulator_priv; 334 u8 val; 335 336 if (stv0299_wait_diseqc_idle (state, 100) < 0) 337 return -ETIMEDOUT; 338 339 val = stv0299_readreg (state, 0x08); 340 341 switch (tone) { 342 case SEC_TONE_ON: 343 return stv0299_writeregI (state, 0x08, val | 0x3); 344 345 case SEC_TONE_OFF: 346 return stv0299_writeregI (state, 0x08, (val & ~0x3) | 0x02); 347 348 default: 349 return -EINVAL; 350 } 351} 352 353static int stv0299_set_voltage (struct dvb_frontend* fe, fe_sec_voltage_t voltage) 354{ 355 struct stv0299_state* state = fe->demodulator_priv; 356 u8 reg0x08; 357 u8 reg0x0c; 358 359 dprintk("%s: %s\n", __FUNCTION__, 360 voltage == SEC_VOLTAGE_13 ? "SEC_VOLTAGE_13" : 361 voltage == SEC_VOLTAGE_18 ? "SEC_VOLTAGE_18" : "??"); 362 363 reg0x08 = stv0299_readreg (state, 0x08); 364 reg0x0c = stv0299_readreg (state, 0x0c); 365 366 /** 367 * H/V switching over OP0, OP1 and OP2 are LNB power enable bits 368 */ 369 reg0x0c &= 0x0f; 370 371 if (voltage == SEC_VOLTAGE_OFF) { 372 stv0299_writeregI (state, 0x0c, 0x00); /* LNB power off! */ 373 return stv0299_writeregI (state, 0x08, 0x00); /* LNB power off! */ 374 } 375 376 stv0299_writeregI (state, 0x08, (reg0x08 & 0x3f) | (state->config->lock_output << 6)); 377 378 switch (voltage) { 379 case SEC_VOLTAGE_13: 380 if (state->config->volt13_op0_op1 == STV0299_VOLT13_OP0) reg0x0c |= 0x10; 381 else reg0x0c |= 0x40; 382 383 return stv0299_writeregI(state, 0x0c, reg0x0c); 384 385 case SEC_VOLTAGE_18: 386 return stv0299_writeregI(state, 0x0c, reg0x0c | 0x50); 387 default: 388 return -EINVAL; 389 }; 390} 391 392static int stv0299_send_legacy_dish_cmd (struct dvb_frontend* fe, unsigned long cmd) 393{ 394 struct stv0299_state* state = fe->demodulator_priv; 395 u8 reg0x08; 396 u8 reg0x0c; 397 u8 lv_mask = 0x40; 398 u8 last = 1; 399 int i; 400 struct timeval nexttime; 401 struct timeval tv[10]; 402 403 reg0x08 = stv0299_readreg (state, 0x08); 404 reg0x0c = stv0299_readreg (state, 0x0c); 405 reg0x0c &= 0x0f; 406 stv0299_writeregI (state, 0x08, (reg0x08 & 0x3f) | (state->config->lock_output << 6)); 407 if (state->config->volt13_op0_op1 == STV0299_VOLT13_OP0) 408 lv_mask = 0x10; 409 410 cmd = cmd << 1; 411 if (debug_legacy_dish_switch) 412 printk ("%s switch command: 0x%04lx\n",__FUNCTION__, cmd); 413 414 do_gettimeofday (&nexttime); 415 if (debug_legacy_dish_switch) 416 memcpy (&tv[0], &nexttime, sizeof (struct timeval)); 417 stv0299_writeregI (state, 0x0c, reg0x0c | 0x50); /* set LNB to 18V */ 418 419 dvb_frontend_sleep_until(&nexttime, 32000); 420 421 for (i=0; i<9; i++) { 422 if (debug_legacy_dish_switch) 423 do_gettimeofday (&tv[i+1]); 424 if((cmd & 0x01) != last) { 425 /* set voltage to (last ? 13V : 18V) */ 426 stv0299_writeregI (state, 0x0c, reg0x0c | (last ? lv_mask : 0x50)); 427 last = (last) ? 0 : 1; 428 } 429 430 cmd = cmd >> 1; 431 432 if (i != 8) 433 dvb_frontend_sleep_until(&nexttime, 8000); 434 } 435 if (debug_legacy_dish_switch) { 436 printk ("%s(%d): switch delay (should be 32k followed by all 8k\n", 437 __FUNCTION__, fe->dvb->num); 438 for (i = 1; i < 10; i++) 439 printk ("%d: %d\n", i, timeval_usec_diff(tv[i-1] , tv[i])); 440 } 441 442 return 0; 443} 444 445static int stv0299_init (struct dvb_frontend* fe) 446{ 447 struct stv0299_state* state = fe->demodulator_priv; 448 int i; 449 450 dprintk("stv0299: init chip\n"); 451 452 for (i=0; !(state->config->inittab[i] == 0xff && state->config->inittab[i+1] == 0xff); i+=2) 453 stv0299_writeregI(state, state->config->inittab[i], state->config->inittab[i+1]); 454 455 return 0; 456} 457 458static int stv0299_read_status(struct dvb_frontend* fe, fe_status_t* status) 459{ 460 struct stv0299_state* state = fe->demodulator_priv; 461 462 u8 signal = 0xff - stv0299_readreg (state, 0x18); 463 u8 sync = stv0299_readreg (state, 0x1b); 464 465 dprintk ("%s : FE_READ_STATUS : VSTATUS: 0x%02x\n", __FUNCTION__, sync); 466 *status = 0; 467 468 if (signal > 10) 469 *status |= FE_HAS_SIGNAL; 470 471 if (sync & 0x80) 472 *status |= FE_HAS_CARRIER; 473 474 if (sync & 0x10) 475 *status |= FE_HAS_VITERBI; 476 477 if (sync & 0x08) 478 *status |= FE_HAS_SYNC; 479 480 if ((sync & 0x98) == 0x98) 481 *status |= FE_HAS_LOCK; 482 483 return 0; 484} 485 486static int stv0299_read_ber(struct dvb_frontend* fe, u32* ber) 487{ 488 struct stv0299_state* state = fe->demodulator_priv; 489 490 if (state->errmode != STATUS_BER) return 0; 491 *ber = (stv0299_readreg (state, 0x1d) << 8) | stv0299_readreg (state, 0x1e); 492 493 return 0; 494} 495 496static int stv0299_read_signal_strength(struct dvb_frontend* fe, u16* strength) 497{ 498 struct stv0299_state* state = fe->demodulator_priv; 499 500 s32 signal = 0xffff - ((stv0299_readreg (state, 0x18) << 8) 501 | stv0299_readreg (state, 0x19)); 502 503 dprintk ("%s : FE_READ_SIGNAL_STRENGTH : AGC2I: 0x%02x%02x, signal=0x%04x\n", __FUNCTION__, 504 stv0299_readreg (state, 0x18), 505 stv0299_readreg (state, 0x19), (int) signal); 506 507 signal = signal * 5 / 4; 508 *strength = (signal > 0xffff) ? 0xffff : (signal < 0) ? 0 : signal; 509 510 return 0; 511} 512 513static int stv0299_read_snr(struct dvb_frontend* fe, u16* snr) 514{ 515 struct stv0299_state* state = fe->demodulator_priv; 516 517 s32 xsnr = 0xffff - ((stv0299_readreg (state, 0x24) << 8) 518 | stv0299_readreg (state, 0x25)); 519 xsnr = 3 * (xsnr - 0xa100); 520 *snr = (xsnr > 0xffff) ? 0xffff : (xsnr < 0) ? 0 : xsnr; 521 522 return 0; 523} 524 525static int stv0299_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks) 526{ 527 struct stv0299_state* state = fe->demodulator_priv; 528 529 if (state->errmode != STATUS_UCBLOCKS) *ucblocks = 0; 530 else *ucblocks = (stv0299_readreg (state, 0x1d) << 8) | stv0299_readreg (state, 0x1e); 531 532 return 0; 533} 534 535static int stv0299_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters * p) 536{ 537 struct stv0299_state* state = fe->demodulator_priv; 538 int invval = 0; 539 540 dprintk ("%s : FE_SET_FRONTEND\n", __FUNCTION__); 541 542 // set the inversion 543 if (p->inversion == INVERSION_OFF) invval = 0; 544 else if (p->inversion == INVERSION_ON) invval = 1; 545 else { 546 printk("stv0299 does not support auto-inversion\n"); 547 return -EINVAL; 548 } 549 if (state->config->invert) invval = (~invval) & 1; 550 stv0299_writeregI(state, 0x0c, (stv0299_readreg(state, 0x0c) & 0xfe) | invval); 551 552 if (fe->ops.tuner_ops.set_params) { 553 fe->ops.tuner_ops.set_params(fe, p); 554 if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); 555 } 556 557 stv0299_set_FEC (state, p->u.qpsk.fec_inner); 558 stv0299_set_symbolrate (fe, p->u.qpsk.symbol_rate); 559 stv0299_writeregI(state, 0x22, 0x00); 560 stv0299_writeregI(state, 0x23, 0x00); 561 562 state->tuner_frequency = p->frequency; 563 state->fec_inner = p->u.qpsk.fec_inner; 564 state->symbol_rate = p->u.qpsk.symbol_rate; 565 566 return 0; 567} 568 569static int stv0299_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters * p) 570{ 571 struct stv0299_state* state = fe->demodulator_priv; 572 s32 derot_freq; 573 int invval; 574 575 derot_freq = (s32)(s16) ((stv0299_readreg (state, 0x22) << 8) 576 | stv0299_readreg (state, 0x23)); 577 578 derot_freq *= (state->config->mclk >> 16); 579 derot_freq += 500; 580 derot_freq /= 1000; 581 582 p->frequency += derot_freq; 583 584 invval = stv0299_readreg (state, 0x0c) & 1; 585 if (state->config->invert) invval = (~invval) & 1; 586 p->inversion = invval ? INVERSION_ON : INVERSION_OFF; 587 588 p->u.qpsk.fec_inner = stv0299_get_fec (state); 589 p->u.qpsk.symbol_rate = stv0299_get_symbolrate (state); 590 591 return 0; 592} 593 594static int stv0299_sleep(struct dvb_frontend* fe) 595{ 596 struct stv0299_state* state = fe->demodulator_priv; 597 598 stv0299_writeregI(state, 0x02, 0x80); 599 state->initialised = 0; 600 601 return 0; 602} 603 604static int stv0299_i2c_gate_ctrl(struct dvb_frontend* fe, int enable) 605{ 606 struct stv0299_state* state = fe->demodulator_priv; 607 608 if (enable) { 609 stv0299_writeregI(state, 0x05, 0xb5); 610 } else { 611 stv0299_writeregI(state, 0x05, 0x35); 612 } 613 udelay(1); 614 return 0; 615} 616 617static int stv0299_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fesettings) 618{ 619 struct stv0299_state* state = fe->demodulator_priv; 620 621 fesettings->min_delay_ms = state->config->min_delay_ms; 622 if (fesettings->parameters.u.qpsk.symbol_rate < 10000000) { 623 fesettings->step_size = fesettings->parameters.u.qpsk.symbol_rate / 32000; 624 fesettings->max_drift = 5000; 625 } else { 626 fesettings->step_size = fesettings->parameters.u.qpsk.symbol_rate / 16000; 627 fesettings->max_drift = fesettings->parameters.u.qpsk.symbol_rate / 2000; 628 } 629 return 0; 630} 631 632static void stv0299_release(struct dvb_frontend* fe) 633{ 634 struct stv0299_state* state = fe->demodulator_priv; 635 kfree(state); 636} 637 638static struct dvb_frontend_ops stv0299_ops; 639 640struct dvb_frontend* stv0299_attach(const struct stv0299_config* config, 641 struct i2c_adapter* i2c) 642{ 643 struct stv0299_state* state = NULL; 644 int id; 645 646 /* allocate memory for the internal state */ 647 state = kmalloc(sizeof(struct stv0299_state), GFP_KERNEL); 648 if (state == NULL) goto error; 649 650 /* setup the state */ 651 state->config = config; 652 state->i2c = i2c; 653 state->initialised = 0; 654 state->tuner_frequency = 0; 655 state->symbol_rate = 0; 656 state->fec_inner = 0; 657 state->errmode = STATUS_BER; 658 659 /* check if the demod is there */ 660 stv0299_writeregI(state, 0x02, 0x34); /* standby off */ 661 msleep(200); 662 id = stv0299_readreg(state, 0x00); 663 664 /* register 0x00 contains 0xa1 for STV0299 and STV0299B */ 665 /* register 0x00 might contain 0x80 when returning from standby */ 666 if (id != 0xa1 && id != 0x80) goto error; 667 668 /* create dvb_frontend */ 669 memcpy(&state->frontend.ops, &stv0299_ops, sizeof(struct dvb_frontend_ops)); 670 state->frontend.demodulator_priv = state; 671 return &state->frontend; 672 673error: 674 kfree(state); 675 return NULL; 676} 677 678static struct dvb_frontend_ops stv0299_ops = { 679 680 .info = { 681 .name = "ST STV0299 DVB-S", 682 .type = FE_QPSK, 683 .frequency_min = 950000, 684 .frequency_max = 2150000, 685 .frequency_stepsize = 125, /* kHz for QPSK frontends */ 686 .frequency_tolerance = 0, 687 .symbol_rate_min = 1000000, 688 .symbol_rate_max = 45000000, 689 .symbol_rate_tolerance = 500, /* ppm */ 690 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | 691 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | 692 FE_CAN_QPSK | 693 FE_CAN_FEC_AUTO 694 }, 695 696 .release = stv0299_release, 697 698 .init = stv0299_init, 699 .sleep = stv0299_sleep, 700 .write = stv0299_write, 701 .i2c_gate_ctrl = stv0299_i2c_gate_ctrl, 702 703 .set_frontend = stv0299_set_frontend, 704 .get_frontend = stv0299_get_frontend, 705 .get_tune_settings = stv0299_get_tune_settings, 706 707 .read_status = stv0299_read_status, 708 .read_ber = stv0299_read_ber, 709 .read_signal_strength = stv0299_read_signal_strength, 710 .read_snr = stv0299_read_snr, 711 .read_ucblocks = stv0299_read_ucblocks, 712 713 .diseqc_send_master_cmd = stv0299_send_diseqc_msg, 714 .diseqc_send_burst = stv0299_send_diseqc_burst, 715 .set_tone = stv0299_set_tone, 716 .set_voltage = stv0299_set_voltage, 717 .dishnetwork_send_legacy_command = stv0299_send_legacy_dish_cmd, 718}; 719 720module_param(debug_legacy_dish_switch, int, 0444); 721MODULE_PARM_DESC(debug_legacy_dish_switch, "Enable timing analysis for Dish Network legacy switches"); 722 723module_param(debug, int, 0644); 724MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off)."); 725 726MODULE_DESCRIPTION("ST STV0299 DVB Demodulator driver"); 727MODULE_AUTHOR("Ralph Metzler, Holger Waechtler, Peter Schildmann, Felix Domke, " 728 "Andreas Oberritter, Andrew de Quincey, Kenneth Aafly"); 729MODULE_LICENSE("GPL"); 730 731EXPORT_SYMBOL(stv0299_attach);