diff options
Diffstat (limited to 'drivers/media/video/saa7134/saa7134-dvb.c')
-rw-r--r-- | drivers/media/video/saa7134/saa7134-dvb.c | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/drivers/media/video/saa7134/saa7134-dvb.c b/drivers/media/video/saa7134/saa7134-dvb.c index aaac12e8adbf..d1d1abc55718 100644 --- a/drivers/media/video/saa7134/saa7134-dvb.c +++ b/drivers/media/video/saa7134/saa7134-dvb.c | |||
@@ -626,8 +626,196 @@ static struct tda1004x_config tda827x_lifeview_config = { | |||
626 | .pll_sleep = philips_tda827x_pll_sleep, | 626 | .pll_sleep = philips_tda827x_pll_sleep, |
627 | .request_firmware = NULL, | 627 | .request_firmware = NULL, |
628 | }; | 628 | }; |
629 | |||
630 | /* ------------------------------------------------------------------ */ | ||
631 | |||
632 | struct tda827xa_data { | ||
633 | u32 lomax; | ||
634 | u8 svco; | ||
635 | u8 spd; | ||
636 | u8 scr; | ||
637 | u8 sbs; | ||
638 | u8 gc3; | ||
639 | }; | ||
640 | |||
641 | static struct tda827xa_data tda827xa_dvbt[] = { | ||
642 | { .lomax = 56875000, .svco = 3, .spd = 4, .scr = 0, .sbs = 0, .gc3 = 1}, | ||
643 | { .lomax = 67250000, .svco = 0, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 1}, | ||
644 | { .lomax = 81250000, .svco = 1, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 1}, | ||
645 | { .lomax = 97500000, .svco = 2, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 1}, | ||
646 | { .lomax = 113750000, .svco = 3, .spd = 3, .scr = 0, .sbs = 1, .gc3 = 1}, | ||
647 | { .lomax = 134500000, .svco = 0, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1}, | ||
648 | { .lomax = 154000000, .svco = 1, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1}, | ||
649 | { .lomax = 162500000, .svco = 1, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1}, | ||
650 | { .lomax = 183000000, .svco = 2, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1}, | ||
651 | { .lomax = 195000000, .svco = 2, .spd = 2, .scr = 0, .sbs = 2, .gc3 = 1}, | ||
652 | { .lomax = 227500000, .svco = 3, .spd = 2, .scr = 0, .sbs = 2, .gc3 = 1}, | ||
653 | { .lomax = 269000000, .svco = 0, .spd = 1, .scr = 0, .sbs = 2, .gc3 = 1}, | ||
654 | { .lomax = 290000000, .svco = 1, .spd = 1, .scr = 0, .sbs = 2, .gc3 = 1}, | ||
655 | { .lomax = 325000000, .svco = 1, .spd = 1, .scr = 0, .sbs = 3, .gc3 = 1}, | ||
656 | { .lomax = 390000000, .svco = 2, .spd = 1, .scr = 0, .sbs = 3, .gc3 = 1}, | ||
657 | { .lomax = 455000000, .svco = 3, .spd = 1, .scr = 0, .sbs = 3, .gc3 = 1}, | ||
658 | { .lomax = 520000000, .svco = 0, .spd = 0, .scr = 0, .sbs = 3, .gc3 = 1}, | ||
659 | { .lomax = 538000000, .svco = 0, .spd = 0, .scr = 1, .sbs = 3, .gc3 = 1}, | ||
660 | { .lomax = 550000000, .svco = 1, .spd = 0, .scr = 0, .sbs = 3, .gc3 = 1}, | ||
661 | { .lomax = 620000000, .svco = 1, .spd = 0, .scr = 0, .sbs = 4, .gc3 = 0}, | ||
662 | { .lomax = 650000000, .svco = 1, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 0}, | ||
663 | { .lomax = 700000000, .svco = 2, .spd = 0, .scr = 0, .sbs = 4, .gc3 = 0}, | ||
664 | { .lomax = 780000000, .svco = 2, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 0}, | ||
665 | { .lomax = 820000000, .svco = 3, .spd = 0, .scr = 0, .sbs = 4, .gc3 = 0}, | ||
666 | { .lomax = 870000000, .svco = 3, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 0}, | ||
667 | { .lomax = 911000000, .svco = 3, .spd = 0, .scr = 2, .sbs = 4, .gc3 = 0}, | ||
668 | { .lomax = 0, .svco = 0, .spd = 0, .scr = 0, .sbs = 0, .gc3 = 0}}; | ||
669 | |||
670 | |||
671 | static int philips_tda827xa_pll_set(u8 addr, struct dvb_frontend *fe, struct dvb_frontend_parameters *params) | ||
672 | { | ||
673 | struct saa7134_dev *dev = fe->dvb->priv; | ||
674 | u8 tuner_buf[14]; | ||
675 | unsigned char reg2[2]; | ||
676 | |||
677 | struct i2c_msg msg = {.addr = addr,.flags = 0,.buf = tuner_buf}; | ||
678 | int i, tuner_freq, if_freq; | ||
679 | u32 N; | ||
680 | |||
681 | switch (params->u.ofdm.bandwidth) { | ||
682 | case BANDWIDTH_6_MHZ: | ||
683 | if_freq = 4000000; | ||
684 | break; | ||
685 | case BANDWIDTH_7_MHZ: | ||
686 | if_freq = 4500000; | ||
687 | break; | ||
688 | default: /* 8 MHz or Auto */ | ||
689 | if_freq = 5000000; | ||
690 | break; | ||
691 | } | ||
692 | tuner_freq = params->frequency + if_freq; | ||
693 | |||
694 | i = 0; | ||
695 | while (tda827xa_dvbt[i].lomax < tuner_freq) { | ||
696 | if(tda827xa_dvbt[i + 1].lomax == 0) | ||
697 | break; | ||
698 | i++; | ||
699 | } | ||
700 | |||
701 | N = ((tuner_freq + 31250) / 62500) << tda827xa_dvbt[i].spd; | ||
702 | tuner_buf[0] = 0; // subaddress | ||
703 | tuner_buf[1] = N >> 8; | ||
704 | tuner_buf[2] = N & 0xff; | ||
705 | tuner_buf[3] = 0; | ||
706 | tuner_buf[4] = 0x16; | ||
707 | tuner_buf[5] = (tda827xa_dvbt[i].spd << 5) + (tda827xa_dvbt[i].svco << 3) + | ||
708 | tda827xa_dvbt[i].sbs; | ||
709 | tuner_buf[6] = 0x4b + (tda827xa_dvbt[i].gc3 << 4); | ||
710 | tuner_buf[7] = 0x0c; | ||
711 | tuner_buf[8] = 0x06; | ||
712 | tuner_buf[9] = 0x24; | ||
713 | tuner_buf[10] = 0xff; | ||
714 | tuner_buf[11] = 0x60; | ||
715 | tuner_buf[12] = 0x00; | ||
716 | tuner_buf[13] = 0x39; // lpsel | ||
717 | msg.len = 14; | ||
718 | if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1) | ||
719 | return -EIO; | ||
720 | |||
721 | msg.buf= reg2; | ||
722 | msg.len = 2; | ||
723 | reg2[0] = 0x60; | ||
724 | reg2[1] = 0x3c; | ||
725 | i2c_transfer(&dev->i2c_adap, &msg, 1); | ||
726 | |||
727 | reg2[0] = 0xa0; | ||
728 | reg2[1] = 0x40; | ||
729 | i2c_transfer(&dev->i2c_adap, &msg, 1); | ||
730 | |||
731 | msleep(2); | ||
732 | /* correct CP value */ | ||
733 | reg2[0] = 0x30; | ||
734 | reg2[1] = 0x10 + tda827xa_dvbt[i].scr; | ||
735 | msg.len = 2; | ||
736 | i2c_transfer(&dev->i2c_adap, &msg, 1); | ||
737 | |||
738 | msleep(550); | ||
739 | reg2[0] = 0x50; | ||
740 | reg2[1] = 0x4f + (tda827xa_dvbt[i].gc3 << 4); | ||
741 | i2c_transfer(&dev->i2c_adap, &msg, 1); | ||
742 | |||
743 | return 0; | ||
744 | |||
745 | } | ||
746 | |||
747 | static void philips_tda827xa_pll_sleep(u8 addr, struct dvb_frontend *fe) | ||
748 | { | ||
749 | struct saa7134_dev *dev = fe->dvb->priv; | ||
750 | static u8 tda827xa_sleep[] = { 0x30, 0x90}; | ||
751 | struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tda827xa_sleep, | ||
752 | .len = sizeof(tda827xa_sleep) }; | ||
753 | i2c_transfer(&dev->i2c_adap, &tuner_msg, 1); | ||
754 | |||
755 | } | ||
756 | |||
757 | /* ------------------------------------------------------------------ */ | ||
758 | |||
759 | static int philips_tiger_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) | ||
760 | { | ||
761 | int ret; | ||
762 | struct saa7134_dev *dev = fe->dvb->priv; | ||
763 | static u8 tda8290_close[] = { 0x21, 0xc0}; | ||
764 | static u8 tda8290_open[] = { 0x21, 0x80}; | ||
765 | struct i2c_msg tda8290_msg = {.addr = 0x4b,.flags = 0, .len = 2}; | ||
766 | /* close tda8290 i2c bridge */ | ||
767 | tda8290_msg.buf = tda8290_close; | ||
768 | ret = i2c_transfer(&dev->i2c_adap, &tda8290_msg, 1); | ||
769 | if (ret != 1) | ||
770 | return -EIO; | ||
771 | msleep(20); | ||
772 | ret = philips_tda827xa_pll_set(0x61, fe, params); | ||
773 | if (ret != 0) | ||
774 | return ret; | ||
775 | /* open tda8290 i2c bridge */ | ||
776 | tda8290_msg.buf = tda8290_open; | ||
777 | i2c_transfer(&dev->i2c_adap, &tda8290_msg, 1); | ||
778 | return ret; | ||
779 | }; | ||
780 | |||
781 | static int philips_tiger_dvb_mode(struct dvb_frontend *fe) | ||
782 | { | ||
783 | struct saa7134_dev *dev = fe->dvb->priv; | ||
784 | static u8 data[] = { 0x3c, 0x33, 0x6a}; | ||
785 | struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)}; | ||
786 | |||
787 | if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1) | ||
788 | return -EIO; | ||
789 | return 0; | ||
790 | } | ||
791 | |||
792 | static void philips_tiger_analog_mode(struct dvb_frontend *fe) | ||
793 | { | ||
794 | struct saa7134_dev *dev = fe->dvb->priv; | ||
795 | static u8 data[] = { 0x3c, 0x33, 0x68}; | ||
796 | struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)}; | ||
797 | |||
798 | i2c_transfer(&dev->i2c_adap, &msg, 1); | ||
799 | philips_tda827xa_pll_sleep( 0x61, fe); | ||
800 | } | ||
801 | |||
802 | static struct tda1004x_config philips_tiger_config = { | ||
803 | .demod_address = 0x08, | ||
804 | .invert = 1, | ||
805 | .invert_oclk = 0, | ||
806 | .xtal_freq = TDA10046_XTAL_16M, | ||
807 | .agc_config = TDA10046_AGC_TDA827X, | ||
808 | .if_freq = TDA10046_FREQ_045, | ||
809 | .pll_init = philips_tiger_dvb_mode, | ||
810 | .pll_set = philips_tiger_pll_set, | ||
811 | .pll_sleep = philips_tiger_analog_mode, | ||
812 | .request_firmware = NULL, | ||
813 | }; | ||
814 | |||
629 | #endif | 815 | #endif |
630 | 816 | ||
817 | /* ------------------------------------------------------------------ */ | ||
818 | |||
631 | #ifdef HAVE_NXT200X | 819 | #ifdef HAVE_NXT200X |
632 | static struct nxt200x_config avertvhda180 = { | 820 | static struct nxt200x_config avertvhda180 = { |
633 | .demod_address = 0x0a, | 821 | .demod_address = 0x0a, |
@@ -688,6 +876,10 @@ static int dvb_init(struct saa7134_dev *dev) | |||
688 | dev->dvb.frontend = tda10046_attach(&philips_tu1216_61_config, | 876 | dev->dvb.frontend = tda10046_attach(&philips_tu1216_61_config, |
689 | &dev->i2c_adap); | 877 | &dev->i2c_adap); |
690 | break; | 878 | break; |
879 | case SAA7134_BOARD_PHILIPS_TIGER: | ||
880 | dev->dvb.frontend = tda10046_attach(&philips_tiger_config, | ||
881 | &dev->i2c_adap); | ||
882 | break; | ||
691 | #endif | 883 | #endif |
692 | #ifdef HAVE_NXT200X | 884 | #ifdef HAVE_NXT200X |
693 | case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180: | 885 | case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180: |