V4L/DVB (3351): adding support for knc1 Tv Star dvb-s
authorRegis Prevot <regis.prevot@anevia.com>
Thu, 12 Jan 2006 01:31:53 +0000 (23:31 -0200)
committerMauro Carvalho Chehab <mchehab@brturbo.com.br>
Thu, 12 Jan 2006 02:11:32 +0000 (00:11 -0200)
- Added knc1 tv star dvb-s support with philips tuner sd1878.

Signed-off-by: Regis Prevot <regis.prevot@anevia.com>
Signed-off-by: Michael Krufky <mkrufky@m1k.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/dvb/frontends/dvb-pll.c
drivers/media/dvb/frontends/dvb-pll.h
drivers/media/dvb/ttpci/budget-av.c
drivers/media/dvb/ttpci/budget.h

index a3d57ce..757075f 100644 (file)
@@ -345,6 +345,23 @@ struct dvb_pll_desc dvb_pll_tbmv30111in = {
 };
 EXPORT_SYMBOL(dvb_pll_tbmv30111in);
 
+/*
+ * Philips SD1878 Tuner.
+ */
+struct dvb_pll_desc dvb_pll_philips_sd1878_tda8261 = {
+       .name  = "Philips SD1878",
+       .min   =  950000,
+       .max   = 2150000,
+       .count = 4,
+       .entries = {
+               { 1250000, 499, 500, 0xc4, 0x00},
+               { 1550000, 499, 500, 0xc4, 0x40},
+               { 2050000, 499, 500, 0xc4, 0x80},
+               { 2150000, 499, 500, 0xc4, 0xc0},
+       },
+};
+EXPORT_SYMBOL(dvb_pll_philips_sd1878_tda8261);
+
 /* ----------------------------------------------------------- */
 /* code                                                        */
 
index 24d4d2e..f682c09 100644 (file)
@@ -39,6 +39,7 @@ extern struct dvb_pll_desc dvb_pll_tded4;
 extern struct dvb_pll_desc dvb_pll_tuv1236d;
 extern struct dvb_pll_desc dvb_pll_tdhu2;
 extern struct dvb_pll_desc dvb_pll_tbmv30111in;
+extern struct dvb_pll_desc dvb_pll_philips_sd1878_tda8261;
 
 int dvb_pll_configure(struct dvb_pll_desc *desc, u8 *buf,
                      u32 freq, int bandwidth);
index aa26458..1465c04 100644 (file)
@@ -37,6 +37,7 @@
 #include "stv0299.h"
 #include "tda10021.h"
 #include "tda1004x.h"
+#include "dvb-pll.h"
 #include <media/saa7146_vv.h>
 #include <linux/module.h>
 #include <linux/errno.h>
@@ -864,8 +865,117 @@ static struct tda1004x_config philips_tu1216_config = {
        .request_firmware = philips_tu1216_request_firmware,
 };
 
+static u8 philips_sd1878_inittab[] = {
+       0x01, 0x15,
+       0x02, 0x30,
+       0x03, 0x00,
+       0x04, 0x7d,
+       0x05, 0x35,
+       0x06, 0x40,
+       0x07, 0x00,
+       0x08, 0x43,
+       0x09, 0x02,
+       0x0C, 0x51,
+       0x0D, 0x82,
+       0x0E, 0x23,
+       0x10, 0x3f,
+       0x11, 0x84,
+       0x12, 0xb9,
+       0x15, 0xc9,
+       0x16, 0x19,
+       0x17, 0x8c,
+       0x18, 0x59,
+       0x19, 0xf8,
+       0x1a, 0xfe,
+       0x1c, 0x7f,
+       0x1d, 0x00,
+       0x1e, 0x00,
+       0x1f, 0x50,
+       0x20, 0x00,
+       0x21, 0x00,
+       0x22, 0x00,
+       0x23, 0x00,
+       0x28, 0x00,
+       0x29, 0x28,
+       0x2a, 0x14,
+       0x2b, 0x0f,
+       0x2c, 0x09,
+       0x2d, 0x09,
+       0x31, 0x1f,
+       0x32, 0x19,
+       0x33, 0xfc,
+       0x34, 0x93,
+       0xff, 0xff
+};
+
+static int philips_sd1878_tda8261_pll_set(struct dvb_frontend *fe,
+               struct i2c_adapter *i2c,
+               struct dvb_frontend_parameters *params)
+{
+       u8              buf[4];
+       int             rc;
+       struct i2c_msg  tuner_msg = {.addr=0x60,.flags=0,.buf=buf,.len=sizeof(buf)};
+
+       if((params->frequency < 950000) || (params->frequency > 2150000))
+               return -EINVAL;
+
+       rc=dvb_pll_configure(&dvb_pll_philips_sd1878_tda8261, buf,
+                       params->frequency, 0);
+       if(rc < 0) return rc;
 
+       if(i2c_transfer(i2c, &tuner_msg, 1) != 1)
+               return -EIO;
 
+    return 0;
+}
+
+static int philips_sd1878_ci_set_symbol_rate(struct dvb_frontend *fe,
+               u32 srate, u32 ratio)
+{
+       u8 aclk = 0;
+       u8 bclk = 0;
+       u8 m1;
+
+       aclk = 0xb5;
+       if (srate < 2000000)
+               bclk = 0x86;
+       else if (srate < 5000000)
+               bclk = 0x89;
+       else if (srate < 15000000)
+               bclk = 0x8f;
+       else if (srate < 45000000)
+               bclk = 0x95;
+
+       m1 = 0x14;
+       if (srate < 4000000)
+               m1 = 0x10;
+
+       stv0299_writereg(fe, 0x0e, 0x23);
+       stv0299_writereg(fe, 0x0f, 0x94);
+       stv0299_writereg(fe, 0x10, 0x39);
+       stv0299_writereg(fe, 0x13, aclk);
+       stv0299_writereg(fe, 0x14, bclk);
+       stv0299_writereg(fe, 0x15, 0xc9);
+       stv0299_writereg(fe, 0x1f, (ratio >> 16) & 0xff);
+       stv0299_writereg(fe, 0x20, (ratio >> 8) & 0xff);
+       stv0299_writereg(fe, 0x21, (ratio) & 0xf0);
+       stv0299_writereg(fe, 0x0f, 0x80 | m1);
+
+       return 0;
+}
+
+static struct stv0299_config philips_sd1878_config = {
+       .demod_address = 0x68,
+       .inittab = philips_sd1878_inittab,
+       .mclk = 88000000UL,
+       .invert = 0,
+       .skip_reinit = 0,
+       .lock_output = STV0229_LOCKOUTPUT_1,
+       .volt13_op0_op1 = STV0299_VOLT13_OP0,
+       .min_delay_ms = 100,
+       .set_symbol_rate = philips_sd1878_ci_set_symbol_rate,
+       .pll_set = philips_sd1878_tda8261_pll_set,
+};
 
 static u8 read_pwm(struct budget_av *budget_av)
 {
@@ -886,7 +996,10 @@ static u8 read_pwm(struct budget_av *budget_av)
 #define SUBID_DVBS_KNC1_PLUS   0x0011
 #define SUBID_DVBS_TYPHOON     0x4f56
 #define SUBID_DVBS_CINERGY1200 0x1154
+#define SUBID_DVBS_CYNERGY1200N 0x1155
 
+#define SUBID_DVBS_TV_STAR     0x0014
+#define SUBID_DVBS_TV_STAR_CI  0x0016
 #define SUBID_DVBC_KNC1                0x0020
 #define SUBID_DVBC_KNC1_PLUS   0x0021
 #define SUBID_DVBC_CINERGY1200 0x1156
@@ -922,6 +1035,13 @@ static void frontend_init(struct budget_av *budget_av)
                }
                break;
 
+       case SUBID_DVBS_TV_STAR:
+       case SUBID_DVBS_TV_STAR_CI:
+       case SUBID_DVBS_CYNERGY1200N:
+               fe = stv0299_attach(&philips_sd1878_config,
+                               &budget_av->budget.i2c_adap);
+               break;
+
        case SUBID_DVBS_KNC1_PLUS:
        case SUBID_DVBS_TYPHOON:
                fe = stv0299_attach(&typhoon_config,
@@ -1164,10 +1284,12 @@ static struct saa7146_extension budget_extension;
 MAKE_BUDGET_INFO(knc1s, "KNC1 DVB-S", BUDGET_KNC1S);
 MAKE_BUDGET_INFO(knc1c, "KNC1 DVB-C", BUDGET_KNC1C);
 MAKE_BUDGET_INFO(knc1t, "KNC1 DVB-T", BUDGET_KNC1T);
+MAKE_BUDGET_INFO(kncxs, "KNC TV STAR DVB-S", BUDGET_TVSTAR);
 MAKE_BUDGET_INFO(knc1sp, "KNC1 DVB-S Plus", BUDGET_KNC1SP);
 MAKE_BUDGET_INFO(knc1cp, "KNC1 DVB-C Plus", BUDGET_KNC1CP);
 MAKE_BUDGET_INFO(knc1tp, "KNC1 DVB-T Plus", BUDGET_KNC1TP);
 MAKE_BUDGET_INFO(cin1200s, "TerraTec Cinergy 1200 DVB-S", BUDGET_CIN1200S);
+MAKE_BUDGET_INFO(cin1200sn, "TerraTec Cinergy 1200 DVB-S", BUDGET_CIN1200S);
 MAKE_BUDGET_INFO(cin1200c, "Terratec Cinergy 1200 DVB-C", BUDGET_CIN1200C);
 MAKE_BUDGET_INFO(cin1200t, "Terratec Cinergy 1200 DVB-T", BUDGET_CIN1200T);
 
@@ -1176,11 +1298,14 @@ static struct pci_device_id pci_tbl[] = {
        MAKE_EXTENSION_PCI(knc1s, 0x1131, 0x0010),
        MAKE_EXTENSION_PCI(knc1s, 0x1894, 0x0010),
        MAKE_EXTENSION_PCI(knc1sp, 0x1131, 0x0011),
+       MAKE_EXTENSION_PCI(kncxs, 0x1894, 0x0014),
+       MAKE_EXTENSION_PCI(kncxs, 0x1894, 0x0016),
        MAKE_EXTENSION_PCI(knc1c, 0x1894, 0x0020),
        MAKE_EXTENSION_PCI(knc1cp, 0x1894, 0x0021),
        MAKE_EXTENSION_PCI(knc1t, 0x1894, 0x0030),
        MAKE_EXTENSION_PCI(knc1tp, 0x1894, 0x0031),
        MAKE_EXTENSION_PCI(cin1200s, 0x153b, 0x1154),
+       MAKE_EXTENSION_PCI(cin1200sn, 0x153b, 0x1155),
        MAKE_EXTENSION_PCI(cin1200c, 0x153b, 0x1156),
        MAKE_EXTENSION_PCI(cin1200t, 0x153b, 0x1157),
        {
index c8d48cf..c7bb63c 100644 (file)
@@ -95,6 +95,7 @@ static struct saa7146_pci_extension_data x_var = { \
 #define BUDGET_KNC1SP             11
 #define BUDGET_KNC1CP             12
 #define BUDGET_KNC1TP             13
+#define BUDGET_TVSTAR             14
 
 #define BUDGET_VIDEO_PORTA         0
 #define BUDGET_VIDEO_PORTB         1