aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrent Piepho <xyzzy@speakeasy.org>2009-06-11 18:31:22 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-09-12 11:17:52 -0400
commit7a6fbd83378dd0a6127b5d59a51d35688bcd6d9d (patch)
tree56f394027da52b1fc6219a2402898381bf87f79b
parent016e53de0a5929c7b2ce2661e3af240e7f85fd55 (diff)
V4L/DVB (12294): b2c2: Use dvb-pll for Cablestar2
The dvb-pll code should do the same thing that alps_tdee4_stv0297_tuner_set_params() was doing. Except the dvb-pll code will check for tuner presence when attaching, while the old code didn't. This tuner appears to not be behind the stv0297's I2C gate but is instead on a different I2C adapter provided by the flexcop chip. The old code would turn the I2C gate off each time the tuner was used. I've changed it to turn the gate off when the tuner is attached and then disable the gate control function. This should result in the gate staying off, which should be even better. [hverkuil@xs4all.nl: fix compile error] Signed-off-by: Trent Piepho <xyzzy@speakeasy.org> Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/dvb/b2c2/flexcop-fe-tuner.c73
1 files changed, 19 insertions, 54 deletions
diff --git a/drivers/media/dvb/b2c2/flexcop-fe-tuner.c b/drivers/media/dvb/b2c2/flexcop-fe-tuner.c
index 5bf9049c6c00..850a6c606750 100644
--- a/drivers/media/dvb/b2c2/flexcop-fe-tuner.c
+++ b/drivers/media/dvb/b2c2/flexcop-fe-tuner.c
@@ -511,54 +511,7 @@ static int airstar_atsc3_attach(struct flexcop_device *fc,
511#endif 511#endif
512 512
513/* CableStar2 DVB-C */ 513/* CableStar2 DVB-C */
514#if FE_SUPPORTED(STV0297) 514#if FE_SUPPORTED(STV0297) && FE_SUPPORTED(PLL)
515static int alps_tdee4_stv0297_tuner_set_params(struct dvb_frontend* fe,
516 struct dvb_frontend_parameters *fep)
517{
518 struct flexcop_device *fc = fe->dvb->priv;
519 u8 buf[4];
520 u16 div;
521 int ret;
522
523/* 62.5 kHz * 10 */
524#define REF_FREQ 625
525#define FREQ_OFFSET 36125
526
527 div = ((fep->frequency/1000 + FREQ_OFFSET) * 10) / REF_FREQ;
528/* 4 MHz = 4000 KHz */
529
530 buf[0] = (u8)( div >> 8) & 0x7f;
531 buf[1] = (u8) div & 0xff;
532
533/* F(osc) = N * Reference Freq. (62.5 kHz)
534 * byte 2 : 0 N14 N13 N12 N11 N10 N9 N8
535 * byte 3 : N7 N6 N5 N4 N3 N2 N1 N0
536 * byte 4 : 1 * * AGD R3 R2 R1 R0
537 * byte 5 : C1 * RE RTS BS4 BS3 BS2 BS1
538 * AGD = 1, R3 R2 R1 R0 = 0 1 0 1 => byte 4 = 1**10101 = 0x95 */
539 buf[2] = 0x95;
540
541/* Range(MHz) C1 * RE RTS BS4 BS3 BS2 BS1 Byte 5
542 * 47 - 153 0 * 0 0 0 0 0 1 0x01
543 * 153 - 430 0 * 0 0 0 0 1 0 0x02
544 * 430 - 822 0 * 0 0 1 0 0 0 0x08
545 * 822 - 862 1 * 0 0 1 0 0 0 0x88 */
546
547 if (fep->frequency <= 153000000) buf[3] = 0x01;
548 else if (fep->frequency <= 430000000) buf[3] = 0x02;
549 else if (fep->frequency <= 822000000) buf[3] = 0x08;
550 else buf[3] = 0x88;
551
552 if (fe->ops.i2c_gate_ctrl)
553 fe->ops.i2c_gate_ctrl(fe, 0);
554 deb_tuner("tuner buffer for %d Hz: %x %x %x %x\n", fep->frequency,
555 buf[0], buf[1], buf[2], buf[3]);
556 ret = fc->i2c_request(&fc->fc_i2c_adap[2],
557 FC_WRITE, 0x61, buf[0], &buf[1], 3);
558 deb_tuner("tuner write returned: %d\n",ret);
559 return ret;
560}
561
562static u8 alps_tdee4_stv0297_inittab[] = { 515static u8 alps_tdee4_stv0297_inittab[] = {
563 0x80, 0x01, 516 0x80, 0x01,
564 0x80, 0x00, 517 0x80, 0x00,
@@ -642,13 +595,25 @@ static int cablestar2_attach(struct flexcop_device *fc,
642{ 595{
643 fc->fc_i2c_adap[0].no_base_addr = 1; 596 fc->fc_i2c_adap[0].no_base_addr = 1;
644 fc->fe = dvb_attach(stv0297_attach, &alps_tdee4_stv0297_config, i2c); 597 fc->fe = dvb_attach(stv0297_attach, &alps_tdee4_stv0297_config, i2c);
645 if (!fc->fe) { 598 if (!fc->fe)
646 /* Reset for next frontend to try */ 599 goto fail;
647 fc->fc_i2c_adap[0].no_base_addr = 0; 600
648 return 0; 601 /* This tuner doesn't use the stv0297's I2C gate, but instead the
649 } 602 * tuner is connected to a different flexcop I2C adapter. */
650 fc->fe->ops.tuner_ops.set_params = alps_tdee4_stv0297_tuner_set_params; 603 if (fc->fe->ops.i2c_gate_ctrl)
604 fc->fe->ops.i2c_gate_ctrl(fc->fe, 0);
605 fc->fe->ops.i2c_gate_ctrl = NULL;
606
607 if (!dvb_attach(dvb_pll_attach, fc->fe, 0x61,
608 &fc->fc_i2c_adap[2].i2c_adap, DVB_PLL_TDEE4))
609 goto fail;
610
651 return 1; 611 return 1;
612
613fail:
614 /* Reset for next frontend to try */
615 fc->fc_i2c_adap[0].no_base_addr = 0;
616 return 0;
652} 617}
653#else 618#else
654#define cablestar2_attach NULL 619#define cablestar2_attach NULL