Commit 90e9df7f186876584b938e01fcf7f40a50c950b9
Committed by
Linus Torvalds
1 parent
12b0e1df5c
Exists in
master
and in
4 other branches
[PATCH] V4L: 904: added dvb support for tda8275a philips tiger reference design
Added dvb support for tda8275a (Philips Tiger reference design) Signed-off-by: Hartmut Hackmann <hartmut.hackmann@t.online.de> Signed-off-by: Mauro Carvalho Chehab <mchehab@brturbo.com.br> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Showing 4 changed files with 231 additions and 1 deletions Side-by-side Diff
drivers/media/video/saa7134/saa7134-cards.c
... | ... | @@ -2490,6 +2490,29 @@ |
2490 | 2490 | .amux = LINE1, |
2491 | 2491 | }}, |
2492 | 2492 | }, |
2493 | + [SAA7134_BOARD_PHILIPS_TIGER] = { | |
2494 | + .name = "Philips Tiger reference design", | |
2495 | + .audio_clock = 0x00187de7, | |
2496 | + .tuner_type = TUNER_PHILIPS_TDA8290, | |
2497 | + .radio_type = UNSET, | |
2498 | + .tuner_addr = ADDR_UNSET, | |
2499 | + .radio_addr = ADDR_UNSET, | |
2500 | + .mpeg = SAA7134_MPEG_DVB, | |
2501 | + .inputs = {{ | |
2502 | + .name = name_tv, | |
2503 | + .vmux = 1, | |
2504 | + .amux = TV, | |
2505 | + .tv = 1, | |
2506 | + },{ | |
2507 | + .name = name_comp1, | |
2508 | + .vmux = 3, | |
2509 | + .amux = LINE1, | |
2510 | + },{ | |
2511 | + .name = name_svideo, | |
2512 | + .vmux = 8, | |
2513 | + .amux = LINE1, | |
2514 | + }}, | |
2515 | + }, | |
2493 | 2516 | }; |
2494 | 2517 | |
2495 | 2518 | const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards); |
... | ... | @@ -2919,6 +2942,12 @@ |
2919 | 2942 | .subvendor = 0x1043, |
2920 | 2943 | .subdevice = 0x4862, |
2921 | 2944 | .driver_data = SAA7134_BOARD_ASUSTeK_P7131_DUAL, |
2945 | + },{ | |
2946 | + .vendor = PCI_VENDOR_ID_PHILIPS, | |
2947 | + .device = PCI_DEVICE_ID_PHILIPS_SAA7133, | |
2948 | + .subvendor = PCI_VENDOR_ID_PHILIPS, | |
2949 | + .subdevice = 0x2018, | |
2950 | + .driver_data = SAA7134_BOARD_PHILIPS_TIGER, | |
2922 | 2951 | },{ |
2923 | 2952 | /* --- boards without eeprom + subsystem ID --- */ |
2924 | 2953 | .vendor = PCI_VENDOR_ID_PHILIPS, |
... | ... | @@ -3175,6 +3204,14 @@ |
3175 | 3204 | tun_setup.addr = dev->tuner_addr; |
3176 | 3205 | |
3177 | 3206 | saa7134_i2c_call_clients (dev, TUNER_SET_TYPE_ADDR,&tun_setup); |
3207 | + } | |
3208 | + break; | |
3209 | + case SAA7134_BOARD_PHILIPS_TIGER: | |
3210 | + /* this is a hybrid board, initialize to analog mode */ | |
3211 | + { | |
3212 | + u8 data[] = { 0x3c, 0x33, 0x68}; | |
3213 | + struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)}; | |
3214 | + i2c_transfer(&dev->i2c_adap, &msg, 1); | |
3178 | 3215 | } |
3179 | 3216 | break; |
3180 | 3217 | } |
drivers/media/video/saa7134/saa7134-dvb.c
... | ... | @@ -626,8 +626,196 @@ |
626 | 626 | .pll_sleep = philips_tda827x_pll_sleep, |
627 | 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 | 815 | #endif |
630 | 816 | |
817 | +/* ------------------------------------------------------------------ */ | |
818 | + | |
631 | 819 | #ifdef HAVE_NXT200X |
632 | 820 | static struct nxt200x_config avertvhda180 = { |
633 | 821 | .demod_address = 0x0a, |
... | ... | @@ -686,6 +874,10 @@ |
686 | 874 | break; |
687 | 875 | case SAA7134_BOARD_VIDEOMATE_DVBT_200: |
688 | 876 | dev->dvb.frontend = tda10046_attach(&philips_tu1216_61_config, |
877 | + &dev->i2c_adap); | |
878 | + break; | |
879 | + case SAA7134_BOARD_PHILIPS_TIGER: | |
880 | + dev->dvb.frontend = tda10046_attach(&philips_tiger_config, | |
689 | 881 | &dev->i2c_adap); |
690 | 882 | break; |
691 | 883 | #endif |
drivers/media/video/saa7134/saa7134.h
... | ... | @@ -207,6 +207,7 @@ |
207 | 207 | #define SAA7134_BOARD_ASUSTeK_P7131_DUAL 78 |
208 | 208 | #define SAA7134_BOARD_PCTV_CARDBUS 79 |
209 | 209 | #define SAA7134_BOARD_ASUSTEK_DIGIMATRIX_TV 80 |
210 | +#define SAA7134_BOARD_PHILIPS_TIGER 81 | |
210 | 211 | |
211 | 212 | #define SAA7134_MAXBOARDS 8 |
212 | 213 | #define SAA7134_INPUT_MAX 8 |
include/media/tuner.h
... | ... | @@ -211,10 +211,10 @@ |
211 | 211 | |
212 | 212 | extern int microtune_init(struct i2c_client *c); |
213 | 213 | extern int tda8290_init(struct i2c_client *c); |
214 | +extern int tda8290_probe(struct i2c_client *c); | |
214 | 215 | extern int tea5767_tuner_init(struct i2c_client *c); |
215 | 216 | extern int default_tuner_init(struct i2c_client *c); |
216 | 217 | extern int tea5767_autodetection(struct i2c_client *c); |
217 | -extern int tda8290_probe(struct i2c_client *c); | |
218 | 218 | |
219 | 219 | #define tuner_warn(fmt, arg...) do {\ |
220 | 220 | printk(KERN_WARNING "%s %d-%04x: " fmt, t->i2c.driver->name, \ |