diff options
Diffstat (limited to 'drivers/media/dvb/frontends/it913x-fe.c')
-rw-r--r-- | drivers/media/dvb/frontends/it913x-fe.c | 289 |
1 files changed, 213 insertions, 76 deletions
diff --git a/drivers/media/dvb/frontends/it913x-fe.c b/drivers/media/dvb/frontends/it913x-fe.c index d4bd24eb4700..ccc36bf2deb4 100644 --- a/drivers/media/dvb/frontends/it913x-fe.c +++ b/drivers/media/dvb/frontends/it913x-fe.c | |||
@@ -46,13 +46,17 @@ MODULE_PARM_DESC(debug, "set debugging level (1=info (or-able))."); | |||
46 | dprintk(level, name" (%02x%02x%02x%02x%02x%02x%02x%02x)", \ | 46 | dprintk(level, name" (%02x%02x%02x%02x%02x%02x%02x%02x)", \ |
47 | *p, *(p+1), *(p+2), *(p+3), *(p+4), \ | 47 | *p, *(p+1), *(p+2), *(p+3), *(p+4), \ |
48 | *(p+5), *(p+6), *(p+7)); | 48 | *(p+5), *(p+6), *(p+7)); |
49 | #define info(format, arg...) \ | ||
50 | printk(KERN_INFO "it913x-fe: " format "\n" , ## arg) | ||
49 | 51 | ||
50 | struct it913x_fe_state { | 52 | struct it913x_fe_state { |
51 | struct dvb_frontend frontend; | 53 | struct dvb_frontend frontend; |
52 | struct i2c_adapter *i2c_adap; | 54 | struct i2c_adapter *i2c_adap; |
55 | struct ite_config *config; | ||
53 | u8 i2c_addr; | 56 | u8 i2c_addr; |
54 | u32 frequency; | 57 | u32 frequency; |
55 | u8 adf; | 58 | fe_modulation_t constellation; |
59 | fe_transmit_mode_t transmission_mode; | ||
56 | u32 crystalFrequency; | 60 | u32 crystalFrequency; |
57 | u32 adcFrequency; | 61 | u32 adcFrequency; |
58 | u8 tuner_type; | 62 | u8 tuner_type; |
@@ -62,6 +66,7 @@ struct it913x_fe_state { | |||
62 | u8 tun_fdiv; | 66 | u8 tun_fdiv; |
63 | u8 tun_clk_mode; | 67 | u8 tun_clk_mode; |
64 | u32 tun_fn_min; | 68 | u32 tun_fn_min; |
69 | u32 ucblocks; | ||
65 | }; | 70 | }; |
66 | 71 | ||
67 | static int it913x_read_reg(struct it913x_fe_state *state, | 72 | static int it913x_read_reg(struct it913x_fe_state *state, |
@@ -211,20 +216,24 @@ static int it913x_init_tuner(struct it913x_fe_state *state) | |||
211 | state->tun_fn_min /= (state->tun_fdiv * nv_val); | 216 | state->tun_fn_min /= (state->tun_fdiv * nv_val); |
212 | deb_info("Tuner fn_min %d", state->tun_fn_min); | 217 | deb_info("Tuner fn_min %d", state->tun_fn_min); |
213 | 218 | ||
214 | for (i = 0; i < 50; i++) { | 219 | if (state->config->chip_ver > 1) |
215 | reg = it913x_read_reg_u8(state, 0xec82); | 220 | msleep(50); |
216 | if (reg > 0) | 221 | else { |
217 | break; | 222 | for (i = 0; i < 50; i++) { |
218 | if (reg < 0) | 223 | reg = it913x_read_reg_u8(state, 0xec82); |
219 | return -ENODEV; | 224 | if (reg > 0) |
220 | udelay(2000); | 225 | break; |
226 | if (reg < 0) | ||
227 | return -ENODEV; | ||
228 | udelay(2000); | ||
229 | } | ||
221 | } | 230 | } |
222 | 231 | ||
223 | return it913x_write_reg(state, PRO_DMOD, 0xed81, val); | 232 | return it913x_write_reg(state, PRO_DMOD, 0xed81, val); |
224 | } | 233 | } |
225 | 234 | ||
226 | static int it9137_set_tuner(struct it913x_fe_state *state, | 235 | static int it9137_set_tuner(struct it913x_fe_state *state, |
227 | enum fe_bandwidth bandwidth, u32 frequency_m) | 236 | u32 bandwidth, u32 frequency_m) |
228 | { | 237 | { |
229 | struct it913xset *set_tuner = set_it9137_template; | 238 | struct it913xset *set_tuner = set_it9137_template; |
230 | int ret, reg; | 239 | int ret, reg; |
@@ -237,6 +246,11 @@ static int it9137_set_tuner(struct it913x_fe_state *state, | |||
237 | u8 lna_band; | 246 | u8 lna_band; |
238 | u8 bw; | 247 | u8 bw; |
239 | 248 | ||
249 | if (state->config->firmware_ver == 1) | ||
250 | set_tuner = set_it9135_template; | ||
251 | else | ||
252 | set_tuner = set_it9137_template; | ||
253 | |||
240 | deb_info("Tuner Frequency %d Bandwidth %d", frequency, bandwidth); | 254 | deb_info("Tuner Frequency %d Bandwidth %d", frequency, bandwidth); |
241 | 255 | ||
242 | if (frequency >= 51000 && frequency <= 440000) { | 256 | if (frequency >= 51000 && frequency <= 440000) { |
@@ -273,16 +287,21 @@ static int it9137_set_tuner(struct it913x_fe_state *state, | |||
273 | return -EINVAL; | 287 | return -EINVAL; |
274 | set_tuner[0].reg[0] = lna_band; | 288 | set_tuner[0].reg[0] = lna_band; |
275 | 289 | ||
276 | if (bandwidth == BANDWIDTH_5_MHZ) | 290 | switch (bandwidth) { |
291 | case 5000000: | ||
277 | bw = 0; | 292 | bw = 0; |
278 | else if (bandwidth == BANDWIDTH_6_MHZ) | 293 | break; |
294 | case 6000000: | ||
279 | bw = 2; | 295 | bw = 2; |
280 | else if (bandwidth == BANDWIDTH_7_MHZ) | 296 | break; |
297 | case 7000000: | ||
281 | bw = 4; | 298 | bw = 4; |
282 | else if (bandwidth == BANDWIDTH_8_MHZ) | 299 | break; |
283 | bw = 6; | 300 | default: |
284 | else | 301 | case 8000000: |
285 | bw = 6; | 302 | bw = 6; |
303 | break; | ||
304 | } | ||
286 | 305 | ||
287 | set_tuner[1].reg[0] = bw; | 306 | set_tuner[1].reg[0] = bw; |
288 | set_tuner[2].reg[0] = 0xa0 | (l_band << 3); | 307 | set_tuner[2].reg[0] = 0xa0 | (l_band << 3); |
@@ -361,7 +380,7 @@ static int it9137_set_tuner(struct it913x_fe_state *state, | |||
361 | } | 380 | } |
362 | 381 | ||
363 | static int it913x_fe_select_bw(struct it913x_fe_state *state, | 382 | static int it913x_fe_select_bw(struct it913x_fe_state *state, |
364 | enum fe_bandwidth bandwidth, u32 adcFrequency) | 383 | u32 bandwidth, u32 adcFrequency) |
365 | { | 384 | { |
366 | int ret, i; | 385 | int ret, i; |
367 | u8 buffer[256]; | 386 | u8 buffer[256]; |
@@ -374,17 +393,21 @@ static int it913x_fe_select_bw(struct it913x_fe_state *state, | |||
374 | 393 | ||
375 | deb_info("Bandwidth %d Adc %d", bandwidth, adcFrequency); | 394 | deb_info("Bandwidth %d Adc %d", bandwidth, adcFrequency); |
376 | 395 | ||
377 | if (bandwidth == BANDWIDTH_5_MHZ) | 396 | switch (bandwidth) { |
397 | case 5000000: | ||
378 | bw = 3; | 398 | bw = 3; |
379 | else if (bandwidth == BANDWIDTH_6_MHZ) | 399 | break; |
400 | case 6000000: | ||
380 | bw = 0; | 401 | bw = 0; |
381 | else if (bandwidth == BANDWIDTH_7_MHZ) | 402 | break; |
403 | case 7000000: | ||
382 | bw = 1; | 404 | bw = 1; |
383 | else if (bandwidth == BANDWIDTH_8_MHZ) | 405 | break; |
384 | bw = 2; | 406 | default: |
385 | else | 407 | case 8000000: |
386 | bw = 2; | 408 | bw = 2; |
387 | 409 | break; | |
410 | } | ||
388 | ret = it913x_write_reg(state, PRO_DMOD, REG_BW, bw); | 411 | ret = it913x_write_reg(state, PRO_DMOD, REG_BW, bw); |
389 | 412 | ||
390 | if (state->table == NULL) | 413 | if (state->table == NULL) |
@@ -492,31 +515,79 @@ static int it913x_fe_read_signal_strength(struct dvb_frontend *fe, | |||
492 | return 0; | 515 | return 0; |
493 | } | 516 | } |
494 | 517 | ||
495 | static int it913x_fe_read_snr(struct dvb_frontend *fe, u16* snr) | 518 | static int it913x_fe_read_snr(struct dvb_frontend *fe, u16 *snr) |
496 | { | 519 | { |
497 | struct it913x_fe_state *state = fe->demodulator_priv; | 520 | struct it913x_fe_state *state = fe->demodulator_priv; |
498 | int ret = it913x_read_reg_u8(state, SIGNAL_QUALITY); | 521 | int ret; |
499 | ret = (ret * 0xff) / 0x64; | 522 | u8 reg[3]; |
500 | ret |= (ret << 0x8); | 523 | u32 snr_val, snr_min, snr_max; |
501 | *snr = ~ret; | 524 | u32 temp; |
502 | return 0; | 525 | |
526 | ret = it913x_read_reg(state, 0x2c, reg, sizeof(reg)); | ||
527 | |||
528 | snr_val = (u32)(reg[2] << 16) | (reg[1] << 8) | reg[0]; | ||
529 | |||
530 | ret |= it913x_read_reg(state, 0xf78b, reg, 1); | ||
531 | if (reg[0]) | ||
532 | snr_val /= reg[0]; | ||
533 | |||
534 | if (state->transmission_mode == TRANSMISSION_MODE_2K) | ||
535 | snr_val *= 4; | ||
536 | else if (state->transmission_mode == TRANSMISSION_MODE_4K) | ||
537 | snr_val *= 2; | ||
538 | |||
539 | if (state->constellation == QPSK) { | ||
540 | snr_min = 0xb4711; | ||
541 | snr_max = 0x191451; | ||
542 | } else if (state->constellation == QAM_16) { | ||
543 | snr_min = 0x4f0d5; | ||
544 | snr_max = 0xc7925; | ||
545 | } else if (state->constellation == QAM_64) { | ||
546 | snr_min = 0x256d0; | ||
547 | snr_max = 0x626be; | ||
548 | } else | ||
549 | return -EINVAL; | ||
550 | |||
551 | if (snr_val < snr_min) | ||
552 | *snr = 0; | ||
553 | else if (snr_val < snr_max) { | ||
554 | temp = (snr_val - snr_min) >> 5; | ||
555 | temp *= 0xffff; | ||
556 | temp /= (snr_max - snr_min) >> 5; | ||
557 | *snr = (u16)temp; | ||
558 | } else | ||
559 | *snr = 0xffff; | ||
560 | |||
561 | return (ret < 0) ? -ENODEV : 0; | ||
503 | } | 562 | } |
504 | 563 | ||
505 | static int it913x_fe_read_ber(struct dvb_frontend *fe, u32 *ber) | 564 | static int it913x_fe_read_ber(struct dvb_frontend *fe, u32 *ber) |
506 | { | 565 | { |
507 | *ber = 0; | 566 | struct it913x_fe_state *state = fe->demodulator_priv; |
567 | int ret; | ||
568 | u8 reg[5]; | ||
569 | /* Read Aborted Packets and Pre-Viterbi error rate 5 bytes */ | ||
570 | ret = it913x_read_reg(state, RSD_ABORT_PKT_LSB, reg, sizeof(reg)); | ||
571 | state->ucblocks += (u32)(reg[1] << 8) | reg[0]; | ||
572 | *ber = (u32)(reg[4] << 16) | (reg[3] << 8) | reg[2]; | ||
508 | return 0; | 573 | return 0; |
509 | } | 574 | } |
510 | 575 | ||
511 | static int it913x_fe_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) | 576 | static int it913x_fe_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) |
512 | { | 577 | { |
513 | *ucblocks = 0; | 578 | struct it913x_fe_state *state = fe->demodulator_priv; |
514 | return 0; | 579 | int ret; |
580 | u8 reg[2]; | ||
581 | /* Aborted Packets */ | ||
582 | ret = it913x_read_reg(state, RSD_ABORT_PKT_LSB, reg, sizeof(reg)); | ||
583 | state->ucblocks += (u32)(reg[1] << 8) | reg[0]; | ||
584 | *ucblocks = state->ucblocks; | ||
585 | return ret; | ||
515 | } | 586 | } |
516 | 587 | ||
517 | static int it913x_fe_get_frontend(struct dvb_frontend *fe, | 588 | static int it913x_fe_get_frontend(struct dvb_frontend *fe) |
518 | struct dvb_frontend_parameters *p) | ||
519 | { | 589 | { |
590 | struct dtv_frontend_properties *p = &fe->dtv_property_cache; | ||
520 | struct it913x_fe_state *state = fe->demodulator_priv; | 591 | struct it913x_fe_state *state = fe->demodulator_priv; |
521 | int ret; | 592 | int ret; |
522 | u8 reg[8]; | 593 | u8 reg[8]; |
@@ -524,26 +595,30 @@ static int it913x_fe_get_frontend(struct dvb_frontend *fe, | |||
524 | ret = it913x_read_reg(state, REG_TPSD_TX_MODE, reg, sizeof(reg)); | 595 | ret = it913x_read_reg(state, REG_TPSD_TX_MODE, reg, sizeof(reg)); |
525 | 596 | ||
526 | if (reg[3] < 3) | 597 | if (reg[3] < 3) |
527 | p->u.ofdm.constellation = fe_con[reg[3]]; | 598 | p->modulation = fe_con[reg[3]]; |
528 | 599 | ||
529 | if (reg[0] < 3) | 600 | if (reg[0] < 3) |
530 | p->u.ofdm.transmission_mode = fe_mode[reg[0]]; | 601 | p->transmission_mode = fe_mode[reg[0]]; |
531 | 602 | ||
532 | if (reg[1] < 4) | 603 | if (reg[1] < 4) |
533 | p->u.ofdm.guard_interval = fe_gi[reg[1]]; | 604 | p->guard_interval = fe_gi[reg[1]]; |
534 | 605 | ||
535 | if (reg[2] < 4) | 606 | if (reg[2] < 4) |
536 | p->u.ofdm.hierarchy_information = fe_hi[reg[2]]; | 607 | p->hierarchy = fe_hi[reg[2]]; |
608 | |||
609 | p->code_rate_HP = (reg[6] < 6) ? fe_code[reg[6]] : FEC_NONE; | ||
610 | p->code_rate_LP = (reg[7] < 6) ? fe_code[reg[7]] : FEC_NONE; | ||
537 | 611 | ||
538 | p->u.ofdm.code_rate_HP = (reg[6] < 6) ? fe_code[reg[6]] : FEC_NONE; | 612 | /* Update internal state to reflect the autodetected props */ |
539 | p->u.ofdm.code_rate_LP = (reg[7] < 6) ? fe_code[reg[7]] : FEC_NONE; | 613 | state->constellation = p->modulation; |
614 | state->transmission_mode = p->transmission_mode; | ||
540 | 615 | ||
541 | return 0; | 616 | return 0; |
542 | } | 617 | } |
543 | 618 | ||
544 | static int it913x_fe_set_frontend(struct dvb_frontend *fe, | 619 | static int it913x_fe_set_frontend(struct dvb_frontend *fe) |
545 | struct dvb_frontend_parameters *p) | ||
546 | { | 620 | { |
621 | struct dtv_frontend_properties *p = &fe->dtv_property_cache; | ||
547 | struct it913x_fe_state *state = fe->demodulator_priv; | 622 | struct it913x_fe_state *state = fe->demodulator_priv; |
548 | int ret, i; | 623 | int ret, i; |
549 | u8 empty_ch, last_ch; | 624 | u8 empty_ch, last_ch; |
@@ -551,7 +626,7 @@ static int it913x_fe_set_frontend(struct dvb_frontend *fe, | |||
551 | state->it913x_status = 0; | 626 | state->it913x_status = 0; |
552 | 627 | ||
553 | /* Set bw*/ | 628 | /* Set bw*/ |
554 | ret = it913x_fe_select_bw(state, p->u.ofdm.bandwidth, | 629 | ret = it913x_fe_select_bw(state, p->bandwidth_hz, |
555 | state->adcFrequency); | 630 | state->adcFrequency); |
556 | 631 | ||
557 | /* Training Mode Off */ | 632 | /* Training Mode Off */ |
@@ -571,20 +646,25 @@ static int it913x_fe_set_frontend(struct dvb_frontend *fe, | |||
571 | i = 1; | 646 | i = 1; |
572 | else if ((p->frequency >= 1450000000) && (p->frequency <= 1680000000)) | 647 | else if ((p->frequency >= 1450000000) && (p->frequency <= 1680000000)) |
573 | i = 2; | 648 | i = 2; |
574 | else | 649 | else |
575 | return -EOPNOTSUPP; | 650 | return -EOPNOTSUPP; |
576 | 651 | ||
577 | ret = it913x_write_reg(state, PRO_DMOD, FREE_BAND, i); | 652 | ret = it913x_write_reg(state, PRO_DMOD, FREE_BAND, i); |
578 | 653 | ||
579 | deb_info("Frontend Set Tuner Type %02x", state->tuner_type); | 654 | deb_info("Frontend Set Tuner Type %02x", state->tuner_type); |
580 | switch (state->tuner_type) { | 655 | switch (state->tuner_type) { |
581 | case IT9137: /* Tuner type 0x38 */ | 656 | case IT9135_38: |
657 | case IT9135_51: | ||
658 | case IT9135_52: | ||
659 | case IT9135_60: | ||
660 | case IT9135_61: | ||
661 | case IT9135_62: | ||
582 | ret = it9137_set_tuner(state, | 662 | ret = it9137_set_tuner(state, |
583 | p->u.ofdm.bandwidth, p->frequency); | 663 | p->bandwidth_hz, p->frequency); |
584 | break; | 664 | break; |
585 | default: | 665 | default: |
586 | if (fe->ops.tuner_ops.set_params) { | 666 | if (fe->ops.tuner_ops.set_params) { |
587 | fe->ops.tuner_ops.set_params(fe, p); | 667 | fe->ops.tuner_ops.set_params(fe); |
588 | if (fe->ops.i2c_gate_ctrl) | 668 | if (fe->ops.i2c_gate_ctrl) |
589 | fe->ops.i2c_gate_ctrl(fe, 0); | 669 | fe->ops.i2c_gate_ctrl(fe, 0); |
590 | } | 670 | } |
@@ -678,16 +758,19 @@ static u32 compute_div(u32 a, u32 b, u32 x) | |||
678 | 758 | ||
679 | static int it913x_fe_start(struct it913x_fe_state *state) | 759 | static int it913x_fe_start(struct it913x_fe_state *state) |
680 | { | 760 | { |
681 | struct it913xset *set_fe; | 761 | struct it913xset *set_lna; |
682 | struct it913xset *set_mode; | 762 | struct it913xset *set_mode; |
683 | int ret; | 763 | int ret; |
684 | u8 adf = (state->adf & 0xf); | 764 | u8 adf = (state->config->adf & 0xf); |
685 | u32 adc, xtal; | 765 | u32 adc, xtal; |
686 | u8 b[4]; | 766 | u8 b[4]; |
687 | 767 | ||
688 | ret = it913x_init_tuner(state); | 768 | if (state->config->chip_ver == 1) |
769 | ret = it913x_init_tuner(state); | ||
770 | |||
771 | info("ADF table value :%02x", adf); | ||
689 | 772 | ||
690 | if (adf < 12) { | 773 | if (adf < 10) { |
691 | state->crystalFrequency = fe_clockTable[adf].xtal ; | 774 | state->crystalFrequency = fe_clockTable[adf].xtal ; |
692 | state->table = fe_clockTable[adf].table; | 775 | state->table = fe_clockTable[adf].table; |
693 | state->adcFrequency = state->table->adcFrequency; | 776 | state->adcFrequency = state->table->adcFrequency; |
@@ -698,9 +781,6 @@ static int it913x_fe_start(struct it913x_fe_state *state) | |||
698 | } else | 781 | } else |
699 | return -EINVAL; | 782 | return -EINVAL; |
700 | 783 | ||
701 | deb_info("Xtal Freq :%d Adc Freq :%d Adc %08x Xtal %08x", | ||
702 | state->crystalFrequency, state->adcFrequency, adc, xtal); | ||
703 | |||
704 | /* Set LED indicator on GPIOH3 */ | 784 | /* Set LED indicator on GPIOH3 */ |
705 | ret = it913x_write_reg(state, PRO_LINK, GPIOH3_EN, 0x1); | 785 | ret = it913x_write_reg(state, PRO_LINK, GPIOH3_EN, 0x1); |
706 | ret |= it913x_write_reg(state, PRO_LINK, GPIOH3_ON, 0x1); | 786 | ret |= it913x_write_reg(state, PRO_LINK, GPIOH3_ON, 0x1); |
@@ -721,22 +801,71 @@ static int it913x_fe_start(struct it913x_fe_state *state) | |||
721 | b[2] = (adc >> 16) & 0xff; | 801 | b[2] = (adc >> 16) & 0xff; |
722 | ret |= it913x_write(state, PRO_DMOD, ADC_FREQ, b, 3); | 802 | ret |= it913x_write(state, PRO_DMOD, ADC_FREQ, b, 3); |
723 | 803 | ||
804 | if (state->config->adc_x2) | ||
805 | ret |= it913x_write_reg(state, PRO_DMOD, ADC_X_2, 0x01); | ||
806 | b[0] = 0; | ||
807 | b[1] = 0; | ||
808 | b[2] = 0; | ||
809 | ret |= it913x_write(state, PRO_DMOD, 0x0029, b, 3); | ||
810 | |||
811 | info("Crystal Frequency :%d Adc Frequency :%d ADC X2: %02x", | ||
812 | state->crystalFrequency, state->adcFrequency, | ||
813 | state->config->adc_x2); | ||
814 | deb_info("Xtal value :%04x Adc value :%04x", xtal, adc); | ||
815 | |||
816 | if (ret < 0) | ||
817 | return -ENODEV; | ||
818 | |||
819 | /* v1 or v2 tuner script */ | ||
820 | if (state->config->chip_ver > 1) | ||
821 | ret = it913x_fe_script_loader(state, it9135_v2); | ||
822 | else | ||
823 | ret = it913x_fe_script_loader(state, it9135_v1); | ||
824 | if (ret < 0) | ||
825 | return ret; | ||
826 | |||
827 | /* LNA Scripts */ | ||
724 | switch (state->tuner_type) { | 828 | switch (state->tuner_type) { |
725 | case IT9137: /* Tuner type 0x38 */ | 829 | case IT9135_51: |
726 | set_fe = it9137_set; | 830 | set_lna = it9135_51; |
831 | break; | ||
832 | case IT9135_52: | ||
833 | set_lna = it9135_52; | ||
834 | break; | ||
835 | case IT9135_60: | ||
836 | set_lna = it9135_60; | ||
837 | break; | ||
838 | case IT9135_61: | ||
839 | set_lna = it9135_61; | ||
727 | break; | 840 | break; |
841 | case IT9135_62: | ||
842 | set_lna = it9135_62; | ||
843 | break; | ||
844 | case IT9135_38: | ||
728 | default: | 845 | default: |
729 | return -EINVAL; | 846 | set_lna = it9135_38; |
730 | } | 847 | } |
848 | info("Tuner LNA type :%02x", state->tuner_type); | ||
849 | |||
850 | ret = it913x_fe_script_loader(state, set_lna); | ||
851 | if (ret < 0) | ||
852 | return ret; | ||
853 | |||
854 | if (state->config->chip_ver == 2) { | ||
855 | ret = it913x_write_reg(state, PRO_DMOD, TRIGGER_OFSM, 0x1); | ||
856 | ret |= it913x_write_reg(state, PRO_LINK, PADODPU, 0x0); | ||
857 | ret |= it913x_write_reg(state, PRO_LINK, AGC_O_D, 0x0); | ||
858 | ret |= it913x_init_tuner(state); | ||
859 | } | ||
860 | if (ret < 0) | ||
861 | return -ENODEV; | ||
731 | 862 | ||
732 | /* set the demod */ | ||
733 | ret = it913x_fe_script_loader(state, set_fe); | ||
734 | /* Always solo frontend */ | 863 | /* Always solo frontend */ |
735 | set_mode = set_solo_fe; | 864 | set_mode = set_solo_fe; |
736 | ret |= it913x_fe_script_loader(state, set_mode); | 865 | ret |= it913x_fe_script_loader(state, set_mode); |
737 | 866 | ||
738 | ret |= it913x_fe_suspend(state); | 867 | ret |= it913x_fe_suspend(state); |
739 | return 0; | 868 | return (ret < 0) ? -ENODEV : 0; |
740 | } | 869 | } |
741 | 870 | ||
742 | static int it913x_fe_init(struct dvb_frontend *fe) | 871 | static int it913x_fe_init(struct dvb_frontend *fe) |
@@ -746,17 +875,11 @@ static int it913x_fe_init(struct dvb_frontend *fe) | |||
746 | /* Power Up Tuner - common all versions */ | 875 | /* Power Up Tuner - common all versions */ |
747 | ret = it913x_write_reg(state, PRO_DMOD, 0xec40, 0x1); | 876 | ret = it913x_write_reg(state, PRO_DMOD, 0xec40, 0x1); |
748 | 877 | ||
749 | ret |= it913x_write_reg(state, PRO_DMOD, AFE_MEM0, 0x0); | ||
750 | |||
751 | ret |= it913x_fe_script_loader(state, init_1); | 878 | ret |= it913x_fe_script_loader(state, init_1); |
752 | 879 | ||
753 | switch (state->tuner_type) { | 880 | ret |= it913x_write_reg(state, PRO_DMOD, AFE_MEM0, 0x0); |
754 | case IT9137: | 881 | |
755 | ret |= it913x_write_reg(state, PRO_DMOD, 0xfba8, 0x0); | 882 | ret |= it913x_write_reg(state, PRO_DMOD, 0xfba8, 0x0); |
756 | break; | ||
757 | default: | ||
758 | return -EINVAL; | ||
759 | } | ||
760 | 883 | ||
761 | return (ret < 0) ? -ENODEV : 0; | 884 | return (ret < 0) ? -ENODEV : 0; |
762 | } | 885 | } |
@@ -770,19 +893,34 @@ static void it913x_fe_release(struct dvb_frontend *fe) | |||
770 | static struct dvb_frontend_ops it913x_fe_ofdm_ops; | 893 | static struct dvb_frontend_ops it913x_fe_ofdm_ops; |
771 | 894 | ||
772 | struct dvb_frontend *it913x_fe_attach(struct i2c_adapter *i2c_adap, | 895 | struct dvb_frontend *it913x_fe_attach(struct i2c_adapter *i2c_adap, |
773 | u8 i2c_addr, u8 adf, u8 type) | 896 | u8 i2c_addr, struct ite_config *config) |
774 | { | 897 | { |
775 | struct it913x_fe_state *state = NULL; | 898 | struct it913x_fe_state *state = NULL; |
776 | int ret; | 899 | int ret; |
900 | |||
777 | /* allocate memory for the internal state */ | 901 | /* allocate memory for the internal state */ |
778 | state = kzalloc(sizeof(struct it913x_fe_state), GFP_KERNEL); | 902 | state = kzalloc(sizeof(struct it913x_fe_state), GFP_KERNEL); |
779 | if (state == NULL) | 903 | if (state == NULL) |
904 | return NULL; | ||
905 | if (config == NULL) | ||
780 | goto error; | 906 | goto error; |
781 | 907 | ||
782 | state->i2c_adap = i2c_adap; | 908 | state->i2c_adap = i2c_adap; |
783 | state->i2c_addr = i2c_addr; | 909 | state->i2c_addr = i2c_addr; |
784 | state->adf = adf; | 910 | state->config = config; |
785 | state->tuner_type = type; | 911 | |
912 | switch (state->config->tuner_id_0) { | ||
913 | case IT9135_51: | ||
914 | case IT9135_52: | ||
915 | case IT9135_60: | ||
916 | case IT9135_61: | ||
917 | case IT9135_62: | ||
918 | state->tuner_type = state->config->tuner_id_0; | ||
919 | break; | ||
920 | default: | ||
921 | case IT9135_38: | ||
922 | state->tuner_type = IT9135_38; | ||
923 | } | ||
786 | 924 | ||
787 | ret = it913x_fe_start(state); | 925 | ret = it913x_fe_start(state); |
788 | if (ret < 0) | 926 | if (ret < 0) |
@@ -802,10 +940,9 @@ error: | |||
802 | EXPORT_SYMBOL(it913x_fe_attach); | 940 | EXPORT_SYMBOL(it913x_fe_attach); |
803 | 941 | ||
804 | static struct dvb_frontend_ops it913x_fe_ofdm_ops = { | 942 | static struct dvb_frontend_ops it913x_fe_ofdm_ops = { |
805 | 943 | .delsys = { SYS_DVBT }, | |
806 | .info = { | 944 | .info = { |
807 | .name = "it913x-fe DVB-T", | 945 | .name = "it913x-fe DVB-T", |
808 | .type = FE_OFDM, | ||
809 | .frequency_min = 51000000, | 946 | .frequency_min = 51000000, |
810 | .frequency_max = 1680000000, | 947 | .frequency_max = 1680000000, |
811 | .frequency_stepsize = 62500, | 948 | .frequency_stepsize = 62500, |
@@ -835,5 +972,5 @@ static struct dvb_frontend_ops it913x_fe_ofdm_ops = { | |||
835 | 972 | ||
836 | MODULE_DESCRIPTION("it913x Frontend and it9137 tuner"); | 973 | MODULE_DESCRIPTION("it913x Frontend and it9137 tuner"); |
837 | MODULE_AUTHOR("Malcolm Priestley tvboxspy@gmail.com"); | 974 | MODULE_AUTHOR("Malcolm Priestley tvboxspy@gmail.com"); |
838 | MODULE_VERSION("1.07"); | 975 | MODULE_VERSION("1.13"); |
839 | MODULE_LICENSE("GPL"); | 976 | MODULE_LICENSE("GPL"); |