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.12 1242 lines 34 kB view raw
1 /* 2 Driver for Philips tda1004xh OFDM Demodulator 3 4 (c) 2003, 2004 Andrew de Quincey & Robert Schlabbach 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 21 */ 22/* 23 * This driver needs external firmware. Please use the commands 24 * "<kerneldir>/Documentation/dvb/get_dvb_firmware tda10045", 25 * "<kerneldir>/Documentation/dvb/get_dvb_firmware tda10046" to 26 * download/extract them, and then copy them to /usr/lib/hotplug/firmware. 27 */ 28#define TDA10045_DEFAULT_FIRMWARE "dvb-fe-tda10045.fw" 29#define TDA10046_DEFAULT_FIRMWARE "dvb-fe-tda10046.fw" 30 31#include <linux/init.h> 32#include <linux/module.h> 33#include <linux/moduleparam.h> 34#include <linux/device.h> 35#include "dvb_frontend.h" 36#include "tda1004x.h" 37 38enum tda1004x_demod { 39 TDA1004X_DEMOD_TDA10045, 40 TDA1004X_DEMOD_TDA10046, 41}; 42 43struct tda1004x_state { 44 struct i2c_adapter* i2c; 45 struct dvb_frontend_ops ops; 46 const struct tda1004x_config* config; 47 struct dvb_frontend frontend; 48 49 /* private demod data */ 50 u8 initialised; 51 enum tda1004x_demod demod_type; 52 u8 fw_version; 53}; 54 55 56static int debug; 57#define dprintk(args...) \ 58 do { \ 59 if (debug) printk(KERN_DEBUG "tda1004x: " args); \ 60 } while (0) 61 62#define TDA1004X_CHIPID 0x00 63#define TDA1004X_AUTO 0x01 64#define TDA1004X_IN_CONF1 0x02 65#define TDA1004X_IN_CONF2 0x03 66#define TDA1004X_OUT_CONF1 0x04 67#define TDA1004X_OUT_CONF2 0x05 68#define TDA1004X_STATUS_CD 0x06 69#define TDA1004X_CONFC4 0x07 70#define TDA1004X_DSSPARE2 0x0C 71#define TDA10045H_CODE_IN 0x0D 72#define TDA10045H_FWPAGE 0x0E 73#define TDA1004X_SCAN_CPT 0x10 74#define TDA1004X_DSP_CMD 0x11 75#define TDA1004X_DSP_ARG 0x12 76#define TDA1004X_DSP_DATA1 0x13 77#define TDA1004X_DSP_DATA2 0x14 78#define TDA1004X_CONFADC1 0x15 79#define TDA1004X_CONFC1 0x16 80#define TDA10045H_S_AGC 0x1a 81#define TDA10046H_AGC_TUN_LEVEL 0x1a 82#define TDA1004X_SNR 0x1c 83#define TDA1004X_CONF_TS1 0x1e 84#define TDA1004X_CONF_TS2 0x1f 85#define TDA1004X_CBER_RESET 0x20 86#define TDA1004X_CBER_MSB 0x21 87#define TDA1004X_CBER_LSB 0x22 88#define TDA1004X_CVBER_LUT 0x23 89#define TDA1004X_VBER_MSB 0x24 90#define TDA1004X_VBER_MID 0x25 91#define TDA1004X_VBER_LSB 0x26 92#define TDA1004X_UNCOR 0x27 93 94#define TDA10045H_CONFPLL_P 0x2D 95#define TDA10045H_CONFPLL_M_MSB 0x2E 96#define TDA10045H_CONFPLL_M_LSB 0x2F 97#define TDA10045H_CONFPLL_N 0x30 98 99#define TDA10046H_CONFPLL1 0x2D 100#define TDA10046H_CONFPLL2 0x2F 101#define TDA10046H_CONFPLL3 0x30 102#define TDA10046H_TIME_WREF1 0x31 103#define TDA10046H_TIME_WREF2 0x32 104#define TDA10046H_TIME_WREF3 0x33 105#define TDA10046H_TIME_WREF4 0x34 106#define TDA10046H_TIME_WREF5 0x35 107 108#define TDA10045H_UNSURW_MSB 0x31 109#define TDA10045H_UNSURW_LSB 0x32 110#define TDA10045H_WREF_MSB 0x33 111#define TDA10045H_WREF_MID 0x34 112#define TDA10045H_WREF_LSB 0x35 113#define TDA10045H_MUXOUT 0x36 114#define TDA1004X_CONFADC2 0x37 115 116#define TDA10045H_IOFFSET 0x38 117 118#define TDA10046H_CONF_TRISTATE1 0x3B 119#define TDA10046H_CONF_TRISTATE2 0x3C 120#define TDA10046H_CONF_POLARITY 0x3D 121#define TDA10046H_FREQ_OFFSET 0x3E 122#define TDA10046H_GPIO_OUT_SEL 0x41 123#define TDA10046H_GPIO_SELECT 0x42 124#define TDA10046H_AGC_CONF 0x43 125#define TDA10046H_AGC_GAINS 0x46 126#define TDA10046H_AGC_TUN_MIN 0x47 127#define TDA10046H_AGC_TUN_MAX 0x48 128#define TDA10046H_AGC_IF_MIN 0x49 129#define TDA10046H_AGC_IF_MAX 0x4A 130 131#define TDA10046H_FREQ_PHY2_MSB 0x4D 132#define TDA10046H_FREQ_PHY2_LSB 0x4E 133 134#define TDA10046H_CVBER_CTRL 0x4F 135#define TDA10046H_AGC_IF_LEVEL 0x52 136#define TDA10046H_CODE_CPT 0x57 137#define TDA10046H_CODE_IN 0x58 138 139 140static int tda1004x_write_byteI(struct tda1004x_state *state, int reg, int data) 141{ 142 int ret; 143 u8 buf[] = { reg, data }; 144 struct i2c_msg msg = { .flags = 0, .buf = buf, .len = 2 }; 145 146 dprintk("%s: reg=0x%x, data=0x%x\n", __FUNCTION__, reg, data); 147 148 msg.addr = state->config->demod_address; 149 ret = i2c_transfer(state->i2c, &msg, 1); 150 151 if (ret != 1) 152 dprintk("%s: error reg=0x%x, data=0x%x, ret=%i\n", 153 __FUNCTION__, reg, data, ret); 154 155 dprintk("%s: success reg=0x%x, data=0x%x, ret=%i\n", __FUNCTION__, 156 reg, data, ret); 157 return (ret != 1) ? -1 : 0; 158} 159 160static int tda1004x_read_byte(struct tda1004x_state *state, int reg) 161{ 162 int ret; 163 u8 b0[] = { reg }; 164 u8 b1[] = { 0 }; 165 struct i2c_msg msg[] = {{ .flags = 0, .buf = b0, .len = 1 }, 166 { .flags = I2C_M_RD, .buf = b1, .len = 1 }}; 167 168 dprintk("%s: reg=0x%x\n", __FUNCTION__, reg); 169 170 msg[0].addr = state->config->demod_address; 171 msg[1].addr = state->config->demod_address; 172 ret = i2c_transfer(state->i2c, msg, 2); 173 174 if (ret != 2) { 175 dprintk("%s: error reg=0x%x, ret=%i\n", __FUNCTION__, reg, 176 ret); 177 return -1; 178 } 179 180 dprintk("%s: success reg=0x%x, data=0x%x, ret=%i\n", __FUNCTION__, 181 reg, b1[0], ret); 182 return b1[0]; 183} 184 185static int tda1004x_write_mask(struct tda1004x_state *state, int reg, int mask, int data) 186{ 187 int val; 188 dprintk("%s: reg=0x%x, mask=0x%x, data=0x%x\n", __FUNCTION__, reg, 189 mask, data); 190 191 // read a byte and check 192 val = tda1004x_read_byte(state, reg); 193 if (val < 0) 194 return val; 195 196 // mask if off 197 val = val & ~mask; 198 val |= data & 0xff; 199 200 // write it out again 201 return tda1004x_write_byteI(state, reg, val); 202} 203 204static int tda1004x_write_buf(struct tda1004x_state *state, int reg, unsigned char *buf, int len) 205{ 206 int i; 207 int result; 208 209 dprintk("%s: reg=0x%x, len=0x%x\n", __FUNCTION__, reg, len); 210 211 result = 0; 212 for (i = 0; i < len; i++) { 213 result = tda1004x_write_byteI(state, reg + i, buf[i]); 214 if (result != 0) 215 break; 216 } 217 218 return result; 219} 220 221static int tda1004x_enable_tuner_i2c(struct tda1004x_state *state) 222{ 223 int result; 224 dprintk("%s\n", __FUNCTION__); 225 226 result = tda1004x_write_mask(state, TDA1004X_CONFC4, 2, 2); 227 msleep(1); 228 return result; 229} 230 231static int tda1004x_disable_tuner_i2c(struct tda1004x_state *state) 232{ 233 dprintk("%s\n", __FUNCTION__); 234 235 return tda1004x_write_mask(state, TDA1004X_CONFC4, 2, 0); 236} 237 238static int tda10045h_set_bandwidth(struct tda1004x_state *state, 239 fe_bandwidth_t bandwidth) 240{ 241 static u8 bandwidth_6mhz[] = { 0x02, 0x00, 0x3d, 0x00, 0x60, 0x1e, 0xa7, 0x45, 0x4f }; 242 static u8 bandwidth_7mhz[] = { 0x02, 0x00, 0x37, 0x00, 0x4a, 0x2f, 0x6d, 0x76, 0xdb }; 243 static u8 bandwidth_8mhz[] = { 0x02, 0x00, 0x3d, 0x00, 0x48, 0x17, 0x89, 0xc7, 0x14 }; 244 245 switch (bandwidth) { 246 case BANDWIDTH_6_MHZ: 247 tda1004x_write_buf(state, TDA10045H_CONFPLL_P, bandwidth_6mhz, sizeof(bandwidth_6mhz)); 248 break; 249 250 case BANDWIDTH_7_MHZ: 251 tda1004x_write_buf(state, TDA10045H_CONFPLL_P, bandwidth_7mhz, sizeof(bandwidth_7mhz)); 252 break; 253 254 case BANDWIDTH_8_MHZ: 255 tda1004x_write_buf(state, TDA10045H_CONFPLL_P, bandwidth_8mhz, sizeof(bandwidth_8mhz)); 256 break; 257 258 default: 259 return -EINVAL; 260 } 261 262 tda1004x_write_byteI(state, TDA10045H_IOFFSET, 0); 263 264 return 0; 265} 266 267static int tda10046h_set_bandwidth(struct tda1004x_state *state, 268 fe_bandwidth_t bandwidth) 269{ 270 static u8 bandwidth_6mhz[] = { 0x80, 0x15, 0xfe, 0xab, 0x8e }; 271 static u8 bandwidth_7mhz[] = { 0x6e, 0x02, 0x53, 0xc8, 0x25 }; 272 static u8 bandwidth_8mhz[] = { 0x60, 0x12, 0xa8, 0xe4, 0xbd }; 273 274 switch (bandwidth) { 275 case BANDWIDTH_6_MHZ: 276 tda1004x_write_buf(state, TDA10046H_TIME_WREF1, bandwidth_6mhz, sizeof(bandwidth_6mhz)); 277 break; 278 279 case BANDWIDTH_7_MHZ: 280 tda1004x_write_buf(state, TDA10046H_TIME_WREF1, bandwidth_7mhz, sizeof(bandwidth_7mhz)); 281 break; 282 283 case BANDWIDTH_8_MHZ: 284 tda1004x_write_buf(state, TDA10046H_TIME_WREF1, bandwidth_8mhz, sizeof(bandwidth_8mhz)); 285 break; 286 287 default: 288 return -EINVAL; 289 } 290 291 return 0; 292} 293 294static int tda1004x_do_upload(struct tda1004x_state *state, 295 unsigned char *mem, unsigned int len, 296 u8 dspCodeCounterReg, u8 dspCodeInReg) 297{ 298 u8 buf[65]; 299 struct i2c_msg fw_msg = { .flags = 0, .buf = buf, .len = 0 }; 300 int tx_size; 301 int pos = 0; 302 303 /* clear code counter */ 304 tda1004x_write_byteI(state, dspCodeCounterReg, 0); 305 fw_msg.addr = state->config->demod_address; 306 307 buf[0] = dspCodeInReg; 308 while (pos != len) { 309 // work out how much to send this time 310 tx_size = len - pos; 311 if (tx_size > 0x10) 312 tx_size = 0x10; 313 314 // send the chunk 315 memcpy(buf + 1, mem + pos, tx_size); 316 fw_msg.len = tx_size + 1; 317 if (i2c_transfer(state->i2c, &fw_msg, 1) != 1) { 318 printk("tda1004x: Error during firmware upload\n"); 319 return -EIO; 320 } 321 pos += tx_size; 322 323 dprintk("%s: fw_pos=0x%x\n", __FUNCTION__, pos); 324 } 325 326 return 0; 327} 328 329static int tda1004x_check_upload_ok(struct tda1004x_state *state, u8 dspVersion) 330{ 331 u8 data1, data2; 332 333 // check upload was OK 334 tda1004x_write_mask(state, TDA1004X_CONFC4, 0x10, 0); // we want to read from the DSP 335 tda1004x_write_byteI(state, TDA1004X_DSP_CMD, 0x67); 336 337 data1 = tda1004x_read_byte(state, TDA1004X_DSP_DATA1); 338 data2 = tda1004x_read_byte(state, TDA1004X_DSP_DATA2); 339 if ((data1 != 0x67) || (data2 != dspVersion)) 340 return -EIO; 341 342 return 0; 343} 344 345static int tda10045_fwupload(struct dvb_frontend* fe) 346{ 347 struct tda1004x_state* state = fe->demodulator_priv; 348 int ret; 349 const struct firmware *fw; 350 351 /* don't re-upload unless necessary */ 352 if (tda1004x_check_upload_ok(state, 0x2c) == 0) 353 return 0; 354 355 /* request the firmware, this will block until someone uploads it */ 356 printk("tda1004x: waiting for firmware upload (%s)...\n", TDA10045_DEFAULT_FIRMWARE); 357 ret = state->config->request_firmware(fe, &fw, TDA10045_DEFAULT_FIRMWARE); 358 if (ret) { 359 printk("tda1004x: no firmware upload (timeout or file not found?)\n"); 360 return ret; 361 } 362 363 /* reset chip */ 364 tda1004x_write_mask(state, TDA1004X_CONFC4, 0x10, 0); 365 tda1004x_write_mask(state, TDA1004X_CONFC4, 8, 8); 366 tda1004x_write_mask(state, TDA1004X_CONFC4, 8, 0); 367 msleep(10); 368 369 /* set parameters */ 370 tda10045h_set_bandwidth(state, BANDWIDTH_8_MHZ); 371 372 ret = tda1004x_do_upload(state, fw->data, fw->size, TDA10045H_FWPAGE, TDA10045H_CODE_IN); 373 if (ret) 374 return ret; 375 printk("tda1004x: firmware upload complete\n"); 376 377 /* wait for DSP to initialise */ 378 /* DSPREADY doesn't seem to work on the TDA10045H */ 379 msleep(100); 380 381 return tda1004x_check_upload_ok(state, 0x2c); 382} 383 384static int tda10046_get_fw_version(struct tda1004x_state *state, 385 const struct firmware *fw) 386{ 387 const unsigned char pattern[] = { 0x67, 0x00, 0x50, 0x62, 0x5e, 0x18, 0x67 }; 388 unsigned int i; 389 390 /* area guessed from firmware v20, v21 and v25 */ 391 for (i = 0x660; i < 0x700; i++) { 392 if (!memcmp(&fw->data[i], pattern, sizeof(pattern))) { 393 state->fw_version = fw->data[i + sizeof(pattern)]; 394 printk(KERN_INFO "tda1004x: using firmware v%02x\n", 395 state->fw_version); 396 return 0; 397 } 398 } 399 400 return -EINVAL; 401} 402 403static int tda10046_fwupload(struct dvb_frontend* fe) 404{ 405 struct tda1004x_state* state = fe->demodulator_priv; 406 unsigned long timeout; 407 int ret; 408 const struct firmware *fw; 409 410 /* reset + wake up chip */ 411 tda1004x_write_mask(state, TDA1004X_CONFC4, 1, 0); 412 tda1004x_write_mask(state, TDA10046H_CONF_TRISTATE1, 1, 0); 413 msleep(100); 414 415 /* don't re-upload unless necessary */ 416 if (tda1004x_check_upload_ok(state, state->fw_version) == 0) 417 return 0; 418 419 /* request the firmware, this will block until someone uploads it */ 420 printk("tda1004x: waiting for firmware upload (%s)...\n", TDA10046_DEFAULT_FIRMWARE); 421 ret = state->config->request_firmware(fe, &fw, TDA10046_DEFAULT_FIRMWARE); 422 if (ret) { 423 printk("tda1004x: no firmware upload (timeout or file not found?)\n"); 424 return ret; 425 } 426 427 if (fw->size < 24478) { /* size of firmware v20, which is the smallest of v20, v21 and v25 */ 428 printk("tda1004x: firmware file seems to be too small (%d bytes)\n", fw->size); 429 return -EINVAL; 430 } 431 432 ret = tda10046_get_fw_version(state, fw); 433 if (ret < 0) { 434 printk("tda1004x: unable to find firmware version\n"); 435 return ret; 436 } 437 438 /* set parameters */ 439 tda1004x_write_byteI(state, TDA10046H_CONFPLL2, 10); 440 tda1004x_write_byteI(state, TDA10046H_CONFPLL3, state->config->n_i2c); 441 tda1004x_write_byteI(state, TDA10046H_FREQ_OFFSET, 99); 442 tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_MSB, 0xd4); 443 tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_LSB, 0x2c); 444 tda1004x_write_mask(state, TDA1004X_CONFC4, 8, 8); // going to boot from HOST 445 446 ret = tda1004x_do_upload(state, fw->data, fw->size, TDA10046H_CODE_CPT, TDA10046H_CODE_IN); 447 if (ret) 448 return ret; 449 printk("tda1004x: firmware upload complete\n"); 450 451 /* wait for DSP to initialise */ 452 timeout = jiffies + HZ; 453 while (!(tda1004x_read_byte(state, TDA1004X_STATUS_CD) & 0x20)) { 454 if (time_after(jiffies, timeout)) { 455 printk("tda1004x: DSP failed to initialised.\n"); 456 return -EIO; 457 } 458 msleep(1); 459 } 460 461 return tda1004x_check_upload_ok(state, state->fw_version); 462} 463 464static int tda1004x_encode_fec(int fec) 465{ 466 // convert known FEC values 467 switch (fec) { 468 case FEC_1_2: 469 return 0; 470 case FEC_2_3: 471 return 1; 472 case FEC_3_4: 473 return 2; 474 case FEC_5_6: 475 return 3; 476 case FEC_7_8: 477 return 4; 478 } 479 480 // unsupported 481 return -EINVAL; 482} 483 484static int tda1004x_decode_fec(int tdafec) 485{ 486 // convert known FEC values 487 switch (tdafec) { 488 case 0: 489 return FEC_1_2; 490 case 1: 491 return FEC_2_3; 492 case 2: 493 return FEC_3_4; 494 case 3: 495 return FEC_5_6; 496 case 4: 497 return FEC_7_8; 498 } 499 500 // unsupported 501 return -1; 502} 503 504int tda1004x_write_byte(struct dvb_frontend* fe, int reg, int data) 505{ 506 struct tda1004x_state* state = fe->demodulator_priv; 507 508 return tda1004x_write_byteI(state, reg, data); 509} 510 511static int tda10045_init(struct dvb_frontend* fe) 512{ 513 struct tda1004x_state* state = fe->demodulator_priv; 514 515 dprintk("%s\n", __FUNCTION__); 516 517 if (state->initialised) 518 return 0; 519 520 if (tda10045_fwupload(fe)) { 521 printk("tda1004x: firmware upload failed\n"); 522 return -EIO; 523 } 524 525 tda1004x_write_mask(state, TDA1004X_CONFADC1, 0x10, 0); // wake up the ADC 526 527 // Init the PLL 528 if (state->config->pll_init) { 529 tda1004x_enable_tuner_i2c(state); 530 state->config->pll_init(fe); 531 tda1004x_disable_tuner_i2c(state); 532 } 533 534 // tda setup 535 tda1004x_write_mask(state, TDA1004X_CONFC4, 0x20, 0); // disable DSP watchdog timer 536 tda1004x_write_mask(state, TDA1004X_AUTO, 8, 0); // select HP stream 537 tda1004x_write_mask(state, TDA1004X_CONFC1, 0x40, 0); // set polarity of VAGC signal 538 tda1004x_write_mask(state, TDA1004X_CONFC1, 0x80, 0x80); // enable pulse killer 539 tda1004x_write_mask(state, TDA1004X_AUTO, 0x10, 0x10); // enable auto offset 540 tda1004x_write_mask(state, TDA1004X_IN_CONF2, 0xC0, 0x0); // no frequency offset 541 tda1004x_write_byteI(state, TDA1004X_CONF_TS1, 0); // setup MPEG2 TS interface 542 tda1004x_write_byteI(state, TDA1004X_CONF_TS2, 0); // setup MPEG2 TS interface 543 tda1004x_write_mask(state, TDA1004X_VBER_MSB, 0xe0, 0xa0); // 10^6 VBER measurement bits 544 tda1004x_write_mask(state, TDA1004X_CONFC1, 0x10, 0); // VAGC polarity 545 tda1004x_write_byteI(state, TDA1004X_CONFADC1, 0x2e); 546 547 tda1004x_write_mask(state, 0x1f, 0x01, state->config->invert_oclk); 548 549 state->initialised = 1; 550 return 0; 551} 552 553static int tda10046_init(struct dvb_frontend* fe) 554{ 555 struct tda1004x_state* state = fe->demodulator_priv; 556 dprintk("%s\n", __FUNCTION__); 557 558 if (state->initialised) 559 return 0; 560 561 if (tda10046_fwupload(fe)) { 562 printk("tda1004x: firmware upload failed\n"); 563 return -EIO; 564 } 565 566 tda1004x_write_mask(state, TDA1004X_CONFC4, 1, 0); // wake up the chip 567 568 // Init the PLL 569 if (state->config->pll_init) { 570 tda1004x_enable_tuner_i2c(state); 571 state->config->pll_init(fe); 572 tda1004x_disable_tuner_i2c(state); 573 } 574 575 // tda setup 576 tda1004x_write_mask(state, TDA1004X_CONFC4, 0x20, 0); // disable DSP watchdog timer 577 tda1004x_write_mask(state, TDA1004X_CONFC1, 0x40, 0x40); 578 tda1004x_write_mask(state, TDA1004X_AUTO, 8, 0); // select HP stream 579 tda1004x_write_mask(state, TDA1004X_CONFC1, 0x80, 0); // disable pulse killer 580 tda1004x_write_byteI(state, TDA10046H_CONFPLL2, 10); // PLL M = 10 581 tda1004x_write_byteI(state, TDA10046H_CONFPLL3, state->config->n_i2c); // PLL P = N = 0 582 tda1004x_write_byteI(state, TDA10046H_FREQ_OFFSET, 99); // FREQOFFS = 99 583 tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_MSB, 0xd4); // } PHY2 = -11221 584 tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_LSB, 0x2c); // } 585 tda1004x_write_byteI(state, TDA10046H_AGC_CONF, 0); // AGC setup 586 tda1004x_write_mask(state, TDA10046H_CONF_POLARITY, 0x60, 0x60); // set AGC polarities 587 tda1004x_write_byteI(state, TDA10046H_AGC_TUN_MIN, 0); // } 588 tda1004x_write_byteI(state, TDA10046H_AGC_TUN_MAX, 0xff); // } AGC min/max values 589 tda1004x_write_byteI(state, TDA10046H_AGC_IF_MIN, 0); // } 590 tda1004x_write_byteI(state, TDA10046H_AGC_IF_MAX, 0xff); // } 591 tda1004x_write_mask(state, TDA10046H_CVBER_CTRL, 0x30, 0x10); // 10^6 VBER measurement bits 592 tda1004x_write_byteI(state, TDA10046H_AGC_GAINS, 1); // IF gain 2, TUN gain 1 593 tda1004x_write_mask(state, TDA1004X_AUTO, 0x80, 0); // crystal is 50ppm 594 tda1004x_write_byteI(state, TDA1004X_CONF_TS1, 7); // MPEG2 interface config 595 tda1004x_write_mask(state, TDA1004X_CONF_TS2, 0x31, 0); // MPEG2 interface config 596 tda1004x_write_mask(state, TDA10046H_CONF_TRISTATE1, 0x9e, 0); // disable AGC_TUN 597 tda1004x_write_byteI(state, TDA10046H_CONF_TRISTATE2, 0xe1); // tristate setup 598 tda1004x_write_byteI(state, TDA10046H_GPIO_OUT_SEL, 0xcc); // GPIO output config 599 tda1004x_write_mask(state, TDA10046H_GPIO_SELECT, 8, 8); // GPIO select 600 tda10046h_set_bandwidth(state, BANDWIDTH_8_MHZ); // default bandwidth 8 MHz 601 602 tda1004x_write_mask(state, 0x3a, 0x80, state->config->invert_oclk << 7); 603 604 state->initialised = 1; 605 return 0; 606} 607 608static int tda1004x_set_fe(struct dvb_frontend* fe, 609 struct dvb_frontend_parameters *fe_params) 610{ 611 struct tda1004x_state* state = fe->demodulator_priv; 612 int tmp; 613 int inversion; 614 615 dprintk("%s\n", __FUNCTION__); 616 617 if (state->demod_type == TDA1004X_DEMOD_TDA10046) { 618 // setup auto offset 619 tda1004x_write_mask(state, TDA1004X_AUTO, 0x10, 0x10); 620 tda1004x_write_mask(state, TDA1004X_IN_CONF1, 0x80, 0); 621 tda1004x_write_mask(state, TDA1004X_IN_CONF2, 0xC0, 0); 622 623 // disable agc_conf[2] 624 tda1004x_write_mask(state, TDA10046H_AGC_CONF, 4, 0); 625 } 626 627 // set frequency 628 tda1004x_enable_tuner_i2c(state); 629 state->config->pll_set(fe, fe_params); 630 tda1004x_disable_tuner_i2c(state); 631 632 if (state->demod_type == TDA1004X_DEMOD_TDA10046) 633 tda1004x_write_mask(state, TDA10046H_AGC_CONF, 4, 4); 634 635 // Hardcoded to use auto as much as possible on the TDA10045 as it 636 // is very unreliable if AUTO mode is _not_ used. 637 if (state->demod_type == TDA1004X_DEMOD_TDA10045) { 638 fe_params->u.ofdm.code_rate_HP = FEC_AUTO; 639 fe_params->u.ofdm.guard_interval = GUARD_INTERVAL_AUTO; 640 fe_params->u.ofdm.transmission_mode = TRANSMISSION_MODE_AUTO; 641 } 642 643 // Set standard params.. or put them to auto 644 if ((fe_params->u.ofdm.code_rate_HP == FEC_AUTO) || 645 (fe_params->u.ofdm.code_rate_LP == FEC_AUTO) || 646 (fe_params->u.ofdm.constellation == QAM_AUTO) || 647 (fe_params->u.ofdm.hierarchy_information == HIERARCHY_AUTO)) { 648 tda1004x_write_mask(state, TDA1004X_AUTO, 1, 1); // enable auto 649 tda1004x_write_mask(state, TDA1004X_IN_CONF1, 0x03, 0); // turn off constellation bits 650 tda1004x_write_mask(state, TDA1004X_IN_CONF1, 0x60, 0); // turn off hierarchy bits 651 tda1004x_write_mask(state, TDA1004X_IN_CONF2, 0x3f, 0); // turn off FEC bits 652 } else { 653 tda1004x_write_mask(state, TDA1004X_AUTO, 1, 0); // disable auto 654 655 // set HP FEC 656 tmp = tda1004x_encode_fec(fe_params->u.ofdm.code_rate_HP); 657 if (tmp < 0) 658 return tmp; 659 tda1004x_write_mask(state, TDA1004X_IN_CONF2, 7, tmp); 660 661 // set LP FEC 662 tmp = tda1004x_encode_fec(fe_params->u.ofdm.code_rate_LP); 663 if (tmp < 0) 664 return tmp; 665 tda1004x_write_mask(state, TDA1004X_IN_CONF2, 0x38, tmp << 3); 666 667 // set constellation 668 switch (fe_params->u.ofdm.constellation) { 669 case QPSK: 670 tda1004x_write_mask(state, TDA1004X_IN_CONF1, 3, 0); 671 break; 672 673 case QAM_16: 674 tda1004x_write_mask(state, TDA1004X_IN_CONF1, 3, 1); 675 break; 676 677 case QAM_64: 678 tda1004x_write_mask(state, TDA1004X_IN_CONF1, 3, 2); 679 break; 680 681 default: 682 return -EINVAL; 683 } 684 685 // set hierarchy 686 switch (fe_params->u.ofdm.hierarchy_information) { 687 case HIERARCHY_NONE: 688 tda1004x_write_mask(state, TDA1004X_IN_CONF1, 0x60, 0 << 5); 689 break; 690 691 case HIERARCHY_1: 692 tda1004x_write_mask(state, TDA1004X_IN_CONF1, 0x60, 1 << 5); 693 break; 694 695 case HIERARCHY_2: 696 tda1004x_write_mask(state, TDA1004X_IN_CONF1, 0x60, 2 << 5); 697 break; 698 699 case HIERARCHY_4: 700 tda1004x_write_mask(state, TDA1004X_IN_CONF1, 0x60, 3 << 5); 701 break; 702 703 default: 704 return -EINVAL; 705 } 706 } 707 708 // set bandwidth 709 switch (state->demod_type) { 710 case TDA1004X_DEMOD_TDA10045: 711 tda10045h_set_bandwidth(state, fe_params->u.ofdm.bandwidth); 712 break; 713 714 case TDA1004X_DEMOD_TDA10046: 715 tda10046h_set_bandwidth(state, fe_params->u.ofdm.bandwidth); 716 break; 717 } 718 719 // set inversion 720 inversion = fe_params->inversion; 721 if (state->config->invert) 722 inversion = inversion ? INVERSION_OFF : INVERSION_ON; 723 switch (inversion) { 724 case INVERSION_OFF: 725 tda1004x_write_mask(state, TDA1004X_CONFC1, 0x20, 0); 726 break; 727 728 case INVERSION_ON: 729 tda1004x_write_mask(state, TDA1004X_CONFC1, 0x20, 0x20); 730 break; 731 732 default: 733 return -EINVAL; 734 } 735 736 // set guard interval 737 switch (fe_params->u.ofdm.guard_interval) { 738 case GUARD_INTERVAL_1_32: 739 tda1004x_write_mask(state, TDA1004X_AUTO, 2, 0); 740 tda1004x_write_mask(state, TDA1004X_IN_CONF1, 0x0c, 0 << 2); 741 break; 742 743 case GUARD_INTERVAL_1_16: 744 tda1004x_write_mask(state, TDA1004X_AUTO, 2, 0); 745 tda1004x_write_mask(state, TDA1004X_IN_CONF1, 0x0c, 1 << 2); 746 break; 747 748 case GUARD_INTERVAL_1_8: 749 tda1004x_write_mask(state, TDA1004X_AUTO, 2, 0); 750 tda1004x_write_mask(state, TDA1004X_IN_CONF1, 0x0c, 2 << 2); 751 break; 752 753 case GUARD_INTERVAL_1_4: 754 tda1004x_write_mask(state, TDA1004X_AUTO, 2, 0); 755 tda1004x_write_mask(state, TDA1004X_IN_CONF1, 0x0c, 3 << 2); 756 break; 757 758 case GUARD_INTERVAL_AUTO: 759 tda1004x_write_mask(state, TDA1004X_AUTO, 2, 2); 760 tda1004x_write_mask(state, TDA1004X_IN_CONF1, 0x0c, 0 << 2); 761 break; 762 763 default: 764 return -EINVAL; 765 } 766 767 // set transmission mode 768 switch (fe_params->u.ofdm.transmission_mode) { 769 case TRANSMISSION_MODE_2K: 770 tda1004x_write_mask(state, TDA1004X_AUTO, 4, 0); 771 tda1004x_write_mask(state, TDA1004X_IN_CONF1, 0x10, 0 << 4); 772 break; 773 774 case TRANSMISSION_MODE_8K: 775 tda1004x_write_mask(state, TDA1004X_AUTO, 4, 0); 776 tda1004x_write_mask(state, TDA1004X_IN_CONF1, 0x10, 1 << 4); 777 break; 778 779 case TRANSMISSION_MODE_AUTO: 780 tda1004x_write_mask(state, TDA1004X_AUTO, 4, 4); 781 tda1004x_write_mask(state, TDA1004X_IN_CONF1, 0x10, 0); 782 break; 783 784 default: 785 return -EINVAL; 786 } 787 788 // start the lock 789 switch (state->demod_type) { 790 case TDA1004X_DEMOD_TDA10045: 791 tda1004x_write_mask(state, TDA1004X_CONFC4, 8, 8); 792 tda1004x_write_mask(state, TDA1004X_CONFC4, 8, 0); 793 break; 794 795 case TDA1004X_DEMOD_TDA10046: 796 tda1004x_write_mask(state, TDA1004X_AUTO, 0x40, 0x40); 797 break; 798 } 799 800 msleep(10); 801 802 return 0; 803} 804 805static int tda1004x_get_fe(struct dvb_frontend* fe, struct dvb_frontend_parameters *fe_params) 806{ 807 struct tda1004x_state* state = fe->demodulator_priv; 808 dprintk("%s\n", __FUNCTION__); 809 810 // inversion status 811 fe_params->inversion = INVERSION_OFF; 812 if (tda1004x_read_byte(state, TDA1004X_CONFC1) & 0x20) 813 fe_params->inversion = INVERSION_ON; 814 if (state->config->invert) 815 fe_params->inversion = fe_params->inversion ? INVERSION_OFF : INVERSION_ON; 816 817 // bandwidth 818 switch (state->demod_type) { 819 case TDA1004X_DEMOD_TDA10045: 820 switch (tda1004x_read_byte(state, TDA10045H_WREF_LSB)) { 821 case 0x14: 822 fe_params->u.ofdm.bandwidth = BANDWIDTH_8_MHZ; 823 break; 824 case 0xdb: 825 fe_params->u.ofdm.bandwidth = BANDWIDTH_7_MHZ; 826 break; 827 case 0x4f: 828 fe_params->u.ofdm.bandwidth = BANDWIDTH_6_MHZ; 829 break; 830 } 831 break; 832 833 case TDA1004X_DEMOD_TDA10046: 834 switch (tda1004x_read_byte(state, TDA10046H_TIME_WREF1)) { 835 case 0x60: 836 fe_params->u.ofdm.bandwidth = BANDWIDTH_8_MHZ; 837 break; 838 case 0x6e: 839 fe_params->u.ofdm.bandwidth = BANDWIDTH_7_MHZ; 840 break; 841 case 0x80: 842 fe_params->u.ofdm.bandwidth = BANDWIDTH_6_MHZ; 843 break; 844 } 845 break; 846 } 847 848 // FEC 849 fe_params->u.ofdm.code_rate_HP = 850 tda1004x_decode_fec(tda1004x_read_byte(state, TDA1004X_OUT_CONF2) & 7); 851 fe_params->u.ofdm.code_rate_LP = 852 tda1004x_decode_fec((tda1004x_read_byte(state, TDA1004X_OUT_CONF2) >> 3) & 7); 853 854 // constellation 855 switch (tda1004x_read_byte(state, TDA1004X_OUT_CONF1) & 3) { 856 case 0: 857 fe_params->u.ofdm.constellation = QPSK; 858 break; 859 case 1: 860 fe_params->u.ofdm.constellation = QAM_16; 861 break; 862 case 2: 863 fe_params->u.ofdm.constellation = QAM_64; 864 break; 865 } 866 867 // transmission mode 868 fe_params->u.ofdm.transmission_mode = TRANSMISSION_MODE_2K; 869 if (tda1004x_read_byte(state, TDA1004X_OUT_CONF1) & 0x10) 870 fe_params->u.ofdm.transmission_mode = TRANSMISSION_MODE_8K; 871 872 // guard interval 873 switch ((tda1004x_read_byte(state, TDA1004X_OUT_CONF1) & 0x0c) >> 2) { 874 case 0: 875 fe_params->u.ofdm.guard_interval = GUARD_INTERVAL_1_32; 876 break; 877 case 1: 878 fe_params->u.ofdm.guard_interval = GUARD_INTERVAL_1_16; 879 break; 880 case 2: 881 fe_params->u.ofdm.guard_interval = GUARD_INTERVAL_1_8; 882 break; 883 case 3: 884 fe_params->u.ofdm.guard_interval = GUARD_INTERVAL_1_4; 885 break; 886 } 887 888 // hierarchy 889 switch ((tda1004x_read_byte(state, TDA1004X_OUT_CONF1) & 0x60) >> 5) { 890 case 0: 891 fe_params->u.ofdm.hierarchy_information = HIERARCHY_NONE; 892 break; 893 case 1: 894 fe_params->u.ofdm.hierarchy_information = HIERARCHY_1; 895 break; 896 case 2: 897 fe_params->u.ofdm.hierarchy_information = HIERARCHY_2; 898 break; 899 case 3: 900 fe_params->u.ofdm.hierarchy_information = HIERARCHY_4; 901 break; 902 } 903 904 return 0; 905} 906 907static int tda1004x_read_status(struct dvb_frontend* fe, fe_status_t * fe_status) 908{ 909 struct tda1004x_state* state = fe->demodulator_priv; 910 int status; 911 int cber; 912 int vber; 913 914 dprintk("%s\n", __FUNCTION__); 915 916 // read status 917 status = tda1004x_read_byte(state, TDA1004X_STATUS_CD); 918 if (status == -1) 919 return -EIO; 920 921 // decode 922 *fe_status = 0; 923 if (status & 4) 924 *fe_status |= FE_HAS_SIGNAL; 925 if (status & 2) 926 *fe_status |= FE_HAS_CARRIER; 927 if (status & 8) 928 *fe_status |= FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK; 929 930 // if we don't already have VITERBI (i.e. not LOCKED), see if the viterbi 931 // is getting anything valid 932 if (!(*fe_status & FE_HAS_VITERBI)) { 933 // read the CBER 934 cber = tda1004x_read_byte(state, TDA1004X_CBER_LSB); 935 if (cber == -1) 936 return -EIO; 937 status = tda1004x_read_byte(state, TDA1004X_CBER_MSB); 938 if (status == -1) 939 return -EIO; 940 cber |= (status << 8); 941 tda1004x_read_byte(state, TDA1004X_CBER_RESET); 942 943 if (cber != 65535) 944 *fe_status |= FE_HAS_VITERBI; 945 } 946 947 // if we DO have some valid VITERBI output, but don't already have SYNC 948 // bytes (i.e. not LOCKED), see if the RS decoder is getting anything valid. 949 if ((*fe_status & FE_HAS_VITERBI) && (!(*fe_status & FE_HAS_SYNC))) { 950 // read the VBER 951 vber = tda1004x_read_byte(state, TDA1004X_VBER_LSB); 952 if (vber == -1) 953 return -EIO; 954 status = tda1004x_read_byte(state, TDA1004X_VBER_MID); 955 if (status == -1) 956 return -EIO; 957 vber |= (status << 8); 958 status = tda1004x_read_byte(state, TDA1004X_VBER_MSB); 959 if (status == -1) 960 return -EIO; 961 vber |= ((status << 16) & 0x0f); 962 tda1004x_read_byte(state, TDA1004X_CVBER_LUT); 963 964 // if RS has passed some valid TS packets, then we must be 965 // getting some SYNC bytes 966 if (vber < 16632) 967 *fe_status |= FE_HAS_SYNC; 968 } 969 970 // success 971 dprintk("%s: fe_status=0x%x\n", __FUNCTION__, *fe_status); 972 return 0; 973} 974 975static int tda1004x_read_signal_strength(struct dvb_frontend* fe, u16 * signal) 976{ 977 struct tda1004x_state* state = fe->demodulator_priv; 978 int tmp; 979 int reg = 0; 980 981 dprintk("%s\n", __FUNCTION__); 982 983 // determine the register to use 984 switch (state->demod_type) { 985 case TDA1004X_DEMOD_TDA10045: 986 reg = TDA10045H_S_AGC; 987 break; 988 989 case TDA1004X_DEMOD_TDA10046: 990 reg = TDA10046H_AGC_IF_LEVEL; 991 break; 992 } 993 994 // read it 995 tmp = tda1004x_read_byte(state, reg); 996 if (tmp < 0) 997 return -EIO; 998 999 *signal = (tmp << 8) | tmp; 1000 dprintk("%s: signal=0x%x\n", __FUNCTION__, *signal); 1001 return 0; 1002} 1003 1004static int tda1004x_read_snr(struct dvb_frontend* fe, u16 * snr) 1005{ 1006 struct tda1004x_state* state = fe->demodulator_priv; 1007 int tmp; 1008 1009 dprintk("%s\n", __FUNCTION__); 1010 1011 // read it 1012 tmp = tda1004x_read_byte(state, TDA1004X_SNR); 1013 if (tmp < 0) 1014 return -EIO; 1015 if (tmp) 1016 tmp = 255 - tmp; 1017 1018 *snr = ((tmp << 8) | tmp); 1019 dprintk("%s: snr=0x%x\n", __FUNCTION__, *snr); 1020 return 0; 1021} 1022 1023static int tda1004x_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks) 1024{ 1025 struct tda1004x_state* state = fe->demodulator_priv; 1026 int tmp; 1027 int tmp2; 1028 int counter; 1029 1030 dprintk("%s\n", __FUNCTION__); 1031 1032 // read the UCBLOCKS and reset 1033 counter = 0; 1034 tmp = tda1004x_read_byte(state, TDA1004X_UNCOR); 1035 if (tmp < 0) 1036 return -EIO; 1037 tmp &= 0x7f; 1038 while (counter++ < 5) { 1039 tda1004x_write_mask(state, TDA1004X_UNCOR, 0x80, 0); 1040 tda1004x_write_mask(state, TDA1004X_UNCOR, 0x80, 0); 1041 tda1004x_write_mask(state, TDA1004X_UNCOR, 0x80, 0); 1042 1043 tmp2 = tda1004x_read_byte(state, TDA1004X_UNCOR); 1044 if (tmp2 < 0) 1045 return -EIO; 1046 tmp2 &= 0x7f; 1047 if ((tmp2 < tmp) || (tmp2 == 0)) 1048 break; 1049 } 1050 1051 if (tmp != 0x7f) 1052 *ucblocks = tmp; 1053 else 1054 *ucblocks = 0xffffffff; 1055 1056 dprintk("%s: ucblocks=0x%x\n", __FUNCTION__, *ucblocks); 1057 return 0; 1058} 1059 1060static int tda1004x_read_ber(struct dvb_frontend* fe, u32* ber) 1061{ 1062 struct tda1004x_state* state = fe->demodulator_priv; 1063 int tmp; 1064 1065 dprintk("%s\n", __FUNCTION__); 1066 1067 // read it in 1068 tmp = tda1004x_read_byte(state, TDA1004X_CBER_LSB); 1069 if (tmp < 0) 1070 return -EIO; 1071 *ber = tmp << 1; 1072 tmp = tda1004x_read_byte(state, TDA1004X_CBER_MSB); 1073 if (tmp < 0) 1074 return -EIO; 1075 *ber |= (tmp << 9); 1076 tda1004x_read_byte(state, TDA1004X_CBER_RESET); 1077 1078 dprintk("%s: ber=0x%x\n", __FUNCTION__, *ber); 1079 return 0; 1080} 1081 1082static int tda1004x_sleep(struct dvb_frontend* fe) 1083{ 1084 struct tda1004x_state* state = fe->demodulator_priv; 1085 1086 switch (state->demod_type) { 1087 case TDA1004X_DEMOD_TDA10045: 1088 tda1004x_write_mask(state, TDA1004X_CONFADC1, 0x10, 0x10); 1089 break; 1090 1091 case TDA1004X_DEMOD_TDA10046: 1092 tda1004x_write_mask(state, TDA1004X_CONFC4, 1, 1); 1093 break; 1094 } 1095 state->initialised = 0; 1096 1097 return 0; 1098} 1099 1100static int tda1004x_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fesettings) 1101{ 1102 fesettings->min_delay_ms = 800; 1103 fesettings->step_size = 166667; 1104 fesettings->max_drift = 166667*2; 1105 return 0; 1106} 1107 1108static void tda1004x_release(struct dvb_frontend* fe) 1109{ 1110 struct tda1004x_state *state = fe->demodulator_priv; 1111 kfree(state); 1112} 1113 1114static struct dvb_frontend_ops tda10045_ops = { 1115 .info = { 1116 .name = "Philips TDA10045H DVB-T", 1117 .type = FE_OFDM, 1118 .frequency_min = 51000000, 1119 .frequency_max = 858000000, 1120 .frequency_stepsize = 166667, 1121 .caps = 1122 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | 1123 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | 1124 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO | 1125 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO 1126 }, 1127 1128 .release = tda1004x_release, 1129 1130 .init = tda10045_init, 1131 .sleep = tda1004x_sleep, 1132 1133 .set_frontend = tda1004x_set_fe, 1134 .get_frontend = tda1004x_get_fe, 1135 .get_tune_settings = tda1004x_get_tune_settings, 1136 1137 .read_status = tda1004x_read_status, 1138 .read_ber = tda1004x_read_ber, 1139 .read_signal_strength = tda1004x_read_signal_strength, 1140 .read_snr = tda1004x_read_snr, 1141 .read_ucblocks = tda1004x_read_ucblocks, 1142}; 1143 1144struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config, 1145 struct i2c_adapter* i2c) 1146{ 1147 struct tda1004x_state *state; 1148 1149 /* allocate memory for the internal state */ 1150 state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL); 1151 if (!state) 1152 return NULL; 1153 1154 /* setup the state */ 1155 state->config = config; 1156 state->i2c = i2c; 1157 memcpy(&state->ops, &tda10045_ops, sizeof(struct dvb_frontend_ops)); 1158 state->initialised = 0; 1159 state->demod_type = TDA1004X_DEMOD_TDA10045; 1160 1161 /* check if the demod is there */ 1162 if (tda1004x_read_byte(state, TDA1004X_CHIPID) != 0x25) { 1163 kfree(state); 1164 return NULL; 1165 } 1166 1167 /* create dvb_frontend */ 1168 state->frontend.ops = &state->ops; 1169 state->frontend.demodulator_priv = state; 1170 return &state->frontend; 1171} 1172 1173static struct dvb_frontend_ops tda10046_ops = { 1174 .info = { 1175 .name = "Philips TDA10046H DVB-T", 1176 .type = FE_OFDM, 1177 .frequency_min = 51000000, 1178 .frequency_max = 858000000, 1179 .frequency_stepsize = 166667, 1180 .caps = 1181 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | 1182 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO | 1183 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO | 1184 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO 1185 }, 1186 1187 .release = tda1004x_release, 1188 1189 .init = tda10046_init, 1190 .sleep = tda1004x_sleep, 1191 1192 .set_frontend = tda1004x_set_fe, 1193 .get_frontend = tda1004x_get_fe, 1194 .get_tune_settings = tda1004x_get_tune_settings, 1195 1196 .read_status = tda1004x_read_status, 1197 .read_ber = tda1004x_read_ber, 1198 .read_signal_strength = tda1004x_read_signal_strength, 1199 .read_snr = tda1004x_read_snr, 1200 .read_ucblocks = tda1004x_read_ucblocks, 1201}; 1202 1203struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config, 1204 struct i2c_adapter* i2c) 1205{ 1206 struct tda1004x_state *state; 1207 1208 /* allocate memory for the internal state */ 1209 state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL); 1210 if (!state) 1211 return NULL; 1212 1213 /* setup the state */ 1214 state->config = config; 1215 state->i2c = i2c; 1216 memcpy(&state->ops, &tda10046_ops, sizeof(struct dvb_frontend_ops)); 1217 state->initialised = 0; 1218 state->demod_type = TDA1004X_DEMOD_TDA10046; 1219 state->fw_version = 0x20; /* dummy default value */ 1220 1221 /* check if the demod is there */ 1222 if (tda1004x_read_byte(state, TDA1004X_CHIPID) != 0x46) { 1223 kfree(state); 1224 return NULL; 1225 } 1226 1227 /* create dvb_frontend */ 1228 state->frontend.ops = &state->ops; 1229 state->frontend.demodulator_priv = state; 1230 return &state->frontend; 1231} 1232 1233module_param(debug, int, 0644); 1234MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off)."); 1235 1236MODULE_DESCRIPTION("Philips TDA10045H & TDA10046H DVB-T Demodulator"); 1237MODULE_AUTHOR("Andrew de Quincey & Robert Schlabbach"); 1238MODULE_LICENSE("GPL"); 1239 1240EXPORT_SYMBOL(tda10045_attach); 1241EXPORT_SYMBOL(tda10046_attach); 1242EXPORT_SYMBOL(tda1004x_write_byte);