Commit 90e9df7f186876584b938e01fcf7f40a50c950b9

Authored by Hartmut Hackmann
Committed by Linus Torvalds
1 parent 12b0e1df5c

[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, \