summaryrefslogtreecommitdiff
path: root/linux/drivers/media/dvb/ttpci
diff options
context:
space:
mode:
authorAndrew de Quincy <devnull@localhost>2005-07-26 22:38:49 +0000
committerAndrew de Quincy <devnull@localhost>2005-07-26 22:38:49 +0000
commit33c4e7b6dbe5c3e4487d297908c0192fc7c9f3da (patch)
treecfc0cd75f31b2e4e77646c4141fca906d6dec0e6 /linux/drivers/media/dvb/ttpci
parentd57f358bcb3c68408bf1df0e373a07552d47004c (diff)
downloadmediapointer-dvb-s2-33c4e7b6dbe5c3e4487d297908c0192fc7c9f3da.tar.gz
mediapointer-dvb-s2-33c4e7b6dbe5c3e4487d297908c0192fc7c9f3da.tar.bz2
Update to new PLL code
Diffstat (limited to 'linux/drivers/media/dvb/ttpci')
-rw-r--r--linux/drivers/media/dvb/ttpci/budget-ci.c71
1 files changed, 54 insertions, 17 deletions
diff --git a/linux/drivers/media/dvb/ttpci/budget-ci.c b/linux/drivers/media/dvb/ttpci/budget-ci.c
index c5b3a406a..496df3b8a 100644
--- a/linux/drivers/media/dvb/ttpci/budget-ci.c
+++ b/linux/drivers/media/dvb/ttpci/budget-ci.c
@@ -851,34 +851,71 @@ static struct tda1004x_config philips_tdm1316l_config = {
static int dvbc_philips_tdm1316l_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
{
struct budget_ci *budget_ci = (struct budget_ci *) fe->dvb->priv;
- u8 tuner_buf[4];
- struct i2c_msg tuner_msg = {.addr = budget_ci->tuner_pll_address,.flags = 0,.buf = tuner_buf,.len = sizeof(tuner_buf) };
- u32 tuner_frequency = 0;
+ u8 tuner_buf[5];
+ struct i2c_msg tuner_msg = {.addr = budget_ci->tuner_pll_address,
+ .flags = 0,
+ .buf = tuner_buf,
+ .len = sizeof(tuner_buf) };
+ int tuner_frequency = 0;
+ u8 band, cp, filter;
+
+ // determine charge pump
+ tuner_frequency = params->frequency + 36125000;
+ if (tuner_frequency < 87000000)
+ return -EINVAL;
+ else if (tuner_frequency < 130000000) {
+ cp = 3;
+ band = 1;
+ } else if (tuner_frequency < 160000000) {
+ cp = 5;
+ band = 1;
+ } else if (tuner_frequency < 200000000) {
+ cp = 6;
+ band = 1;
+ } else if (tuner_frequency < 290000000) {
+ cp = 3;
+ band = 2;
+ } else if (tuner_frequency < 420000000) {
+ cp = 5;
+ band = 2;
+ } else if (tuner_frequency < 480000000) {
+ cp = 6;
+ band = 2;
+ } else if (tuner_frequency < 620000000) {
+ cp = 3;
+ band = 4;
+ } else if (tuner_frequency < 830000000) {
+ cp = 8; // FIXME: shouldn't this be 5?
+ band = 4;
+ } else if (tuner_frequency < 895000000) {
+ cp = 7;
+ band = 4;
+ } else
+ return -EINVAL;
+
+ // FIXME: setup PLL filter and TDA9889
+ filter = 1;
// calculate divisor
- tuner_frequency = (params->frequency + 36130000 + 62499) / 62500;
+ tuner_frequency = (params->frequency + 36125000 + (62500/2)) / 62500;
// setup tuner buffer
tuner_buf[0] = tuner_frequency >> 8;
tuner_buf[1] = tuner_frequency & 0xff;
- tuner_buf[2] = 0xc6;
+ tuner_buf[2] = 0xc8;
+ tuner_buf[3] = (cp << 5) | (filter << 3) | band;
+ tuner_buf[4] = 0x80;
- // determine band
- if (params->frequency < 49000000)
- return -EINVAL;
- else if (params->frequency < 167000000)
- tuner_buf[3] = 0x11;
- else if (params->frequency < 454000000)
- tuner_buf[3] = 0x12;
- else if (params->frequency < 860000000)
- tuner_buf[3] = 0x14;
- else
- return -EINVAL;
+ if (i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1) != 1)
+ return -EIO;
+
+ msleep(50);
if (i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1) != 1)
return -EIO;
msleep(1);
+
return 0;
}
@@ -912,7 +949,7 @@ static void frontend_init(struct budget_ci *budget_ci)
break;
case 0x1010: // TT DVB-C CI budget (stv0297/Philips tdm1316l(tda6651tt))
- budget_ci->tuner_pll_address = 0x63;
+ budget_ci->tuner_pll_address = 0x61;
budget_ci->budget.dvb_frontend =
stv0297_attach(&dvbc_philips_tdm1316l_config, &budget_ci->budget.i2c_adap, 0x7b);
if (budget_ci->budget.dvb_frontend) {