From: Michael Krufky Date: Fri, 7 Dec 2007 04:40:36 +0000 (-0300) Subject: V4L/DVB (6900): cx23885: enable EZ-QAM mode for Hauppauge WinTV HVR-1800 X-Git-Tag: v2.6.25-rc1~1235^2~132 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=3ba71d2194500d1a9fef1b8491b9e0c168e7d46e;p=karo-tx-linux.git V4L/DVB (6900): cx23885: enable EZ-QAM mode for Hauppauge WinTV HVR-1800 Add module option 'alt_tuner' disabled by default. When set to one, the dvb_frontend of HVR1800 will consist of: s5h1409 demod + tda18271 tuner When set zero (default), the dvb_frontend of HVR1800 will consist of: s5h1409 demod + mt2131 tuner If the tda18271 is used in digital mode, you will not be able to tune an analog channel at the same time. Signed-off-by: Michael Krufky Signed-off-by: Mauro Carvalho Chehab --- diff --git a/drivers/media/video/cx23885/cx23885-cards.c b/drivers/media/video/cx23885/cx23885-cards.c index e11fa10a13a6..fbf93c63dcaa 100644 --- a/drivers/media/video/cx23885/cx23885-cards.c +++ b/drivers/media/video/cx23885/cx23885-cards.c @@ -246,7 +246,8 @@ void cx23885_gpio_setup(struct cx23885_dev *dev) /* GPIO-11-14 cx23417 addr0-3 */ /* GPIO-15-18 cx23417 READY, CS, RD, WR */ /* GPIO-19 IR_RX */ - // FIXME: Analog requires the tuner is brought out of reset + + cx_set(GP0_IO, 0x00040004); /* Bring the tuner out of reset */ break; } } diff --git a/drivers/media/video/cx23885/cx23885-dvb.c b/drivers/media/video/cx23885/cx23885-dvb.c index c1309118ea87..0f7e9dfcd73f 100644 --- a/drivers/media/video/cx23885/cx23885-dvb.c +++ b/drivers/media/video/cx23885/cx23885-dvb.c @@ -32,6 +32,7 @@ #include "s5h1409.h" #include "mt2131.h" +#include "tda8290.h" #include "lgdt330x.h" #include "xc5000.h" #include "dvb-pll.h" @@ -45,6 +46,12 @@ static unsigned int debug = 0; /* ------------------------------------------------------------------ */ +static unsigned int alt_tuner; +module_param(alt_tuner, int, 0644); +MODULE_PARM_DESC(alt_tuner, "Enable alternate tuner configuration"); + +/* ------------------------------------------------------------------ */ + static int dvb_buf_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size) { @@ -119,6 +126,15 @@ static struct s5h1409_config hauppauge_generic_config = { .status_mode = S5H1409_DEMODLOCKING }; +static struct s5h1409_config hauppauge_ezqam_config = { + .demod_address = 0x32 >> 1, + .output_mode = S5H1409_SERIAL_OUTPUT, + .gpio = S5H1409_GPIO_OFF, + .qam_if = 4000, + .inversion = S5H1409_INVERSION_ON, + .status_mode = S5H1409_DEMODLOCKING +}; + static struct s5h1409_config hauppauge_hvr1800lp_config = { .demod_address = 0x32 >> 1, .output_mode = S5H1409_SERIAL_OUTPUT, @@ -203,7 +219,6 @@ static int dvb_register(struct cx23885_tsport *port) /* init frontend */ switch (dev->board) { case CX23885_BOARD_HAUPPAUGE_HVR1250: - case CX23885_BOARD_HAUPPAUGE_HVR1800: i2c_bus = &dev->i2c_bus[0]; port->dvb.frontend = dvb_attach(s5h1409_attach, &hauppauge_generic_config, @@ -214,6 +229,33 @@ static int dvb_register(struct cx23885_tsport *port) &hauppauge_generic_tunerconfig, 0); } break; + case CX23885_BOARD_HAUPPAUGE_HVR1800: + i2c_bus = &dev->i2c_bus[0]; + switch (alt_tuner) { + case 1: + port->dvb.frontend = + dvb_attach(s5h1409_attach, + &hauppauge_ezqam_config, + &i2c_bus->i2c_adap); + if (port->dvb.frontend != NULL) { + dvb_attach(tda829x_attach, port->dvb.frontend, + &dev->i2c_bus[1].i2c_adap, 0x42, + NULL); + } + break; + case 0: + default: + port->dvb.frontend = + dvb_attach(s5h1409_attach, + &hauppauge_generic_config, + &i2c_bus->i2c_adap); + if (port->dvb.frontend != NULL) + dvb_attach(mt2131_attach, port->dvb.frontend, + &i2c_bus->i2c_adap, + &hauppauge_generic_tunerconfig, 0); + break; + } + break; case CX23885_BOARD_HAUPPAUGE_HVR1800lp: i2c_bus = &dev->i2c_bus[0]; port->dvb.frontend = dvb_attach(s5h1409_attach, @@ -284,6 +326,9 @@ static int dvb_register(struct cx23885_tsport *port) /* Put the analog decoder in standby to keep it quiet */ cx23885_call_i2c_clients(i2c_bus, TUNER_SET_STANDBY, NULL); + if (port->dvb.frontend->ops.analog_ops.standby) + port->dvb.frontend->ops.analog_ops.standby(port->dvb.frontend); + /* register everything */ return videobuf_dvb_register(&port->dvb, THIS_MODULE, port, &dev->pci->dev);