V4L/DVB (5240): Qt1010: use i2c_gate_ctrl where appropriate
This patch adds calls to i2c_gate_ctrl in the qt1010 dvb tuner module, while removing the temporary hack in au6610 and gl861. Tested successfully against fi-Oulu frequencies with MSI Megasky 580 GL861 and Sigmatek DVB-110 AU6610. Signed-off-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Michael Krufky <mkrufky@linuxtv.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
committed by
Mauro Carvalho Chehab
parent
38d0629fd8
commit
705d41e5da
@@ -145,19 +145,6 @@ static struct qt1010_config au6610_qt1010_config = {
|
|||||||
|
|
||||||
static int au6610_qt1010_tuner_attach(struct dvb_usb_adapter *adap)
|
static int au6610_qt1010_tuner_attach(struct dvb_usb_adapter *adap)
|
||||||
{
|
{
|
||||||
/* TODO FIXME; probably I2C gate.
|
|
||||||
QT1010 tuner does not respond before we write 0x1a to ZL10353 demod
|
|
||||||
register 0x62. This ought to be done somewhere in demod initialization.
|
|
||||||
This solution is temporary hack. */
|
|
||||||
|
|
||||||
u8 buf[2] = { 0x62, 0x1a };
|
|
||||||
struct i2c_msg msg = { .addr = au6610_zl10353_config.demod_address,
|
|
||||||
.flags = 0, .buf = buf, .len = 2 };
|
|
||||||
|
|
||||||
if (i2c_transfer(&adap->dev->i2c_adap, &msg, 1) != 1) {
|
|
||||||
printk(KERN_WARNING "au6610 tuner attach failed\n");
|
|
||||||
return -EREMOTEIO;
|
|
||||||
}
|
|
||||||
return dvb_attach(qt1010_attach,
|
return dvb_attach(qt1010_attach,
|
||||||
adap->fe, &adap->dev->i2c_adap,
|
adap->fe, &adap->dev->i2c_adap,
|
||||||
&au6610_qt1010_config) == NULL ? -ENODEV : 0;
|
&au6610_qt1010_config) == NULL ? -ENODEV : 0;
|
||||||
|
@@ -122,19 +122,6 @@ static struct qt1010_config gl861_qt1010_config = {
|
|||||||
|
|
||||||
static int gl861_tuner_attach(struct dvb_usb_adapter *adap)
|
static int gl861_tuner_attach(struct dvb_usb_adapter *adap)
|
||||||
{
|
{
|
||||||
/* TODO FIXME; probably I2C gate.
|
|
||||||
QT1010 tuner does not respond before we write 0x1a to ZL10353 demod
|
|
||||||
register 0x62. This ought to be done somewhere in demod initialization.
|
|
||||||
This solution is temporary hack. */
|
|
||||||
|
|
||||||
u8 buf[2] = { 0x62, 0x1a };
|
|
||||||
struct i2c_msg msg = { .addr = gl861_zl10353_config.demod_address,
|
|
||||||
.flags = 0, .buf = buf, .len = 2 };
|
|
||||||
|
|
||||||
if (i2c_transfer(&adap->dev->i2c_adap, &msg, 1) != 1) {
|
|
||||||
printk(KERN_WARNING "gl861 tuner attach failed\n");
|
|
||||||
return -EREMOTEIO;
|
|
||||||
}
|
|
||||||
return dvb_attach(qt1010_attach,
|
return dvb_attach(qt1010_attach,
|
||||||
adap->fe, &adap->dev->i2c_adap,
|
adap->fe, &adap->dev->i2c_adap,
|
||||||
&gl861_qt1010_config) == NULL ? -ENODEV : 0;
|
&gl861_qt1010_config) == NULL ? -ENODEV : 0;
|
||||||
|
@@ -149,6 +149,9 @@ static int qt1010_set_params(struct dvb_frontend *fe, struct dvb_frontend_parame
|
|||||||
priv->bandwidth = (fe->ops.info.type == FE_OFDM) ? params->u.ofdm.bandwidth : 0;
|
priv->bandwidth = (fe->ops.info.type == FE_OFDM) ? params->u.ofdm.bandwidth : 0;
|
||||||
priv->frequency = freq;
|
priv->frequency = freq;
|
||||||
|
|
||||||
|
if (fe->ops.i2c_gate_ctrl)
|
||||||
|
fe->ops.i2c_gate_ctrl(fe, 1); /* open i2c_gate */
|
||||||
|
|
||||||
/* reg 05 base value */
|
/* reg 05 base value */
|
||||||
if (freq < 290000000) reg05 = 0x14; /* 290 MHz */
|
if (freq < 290000000) reg05 = 0x14; /* 290 MHz */
|
||||||
else if (freq < 610000000) reg05 = 0x34; /* 610 MHz */
|
else if (freq < 610000000) reg05 = 0x34; /* 610 MHz */
|
||||||
@@ -242,6 +245,9 @@ static int qt1010_set_params(struct dvb_frontend *fe, struct dvb_frontend_parame
|
|||||||
if (debug)
|
if (debug)
|
||||||
qt1010_dump_regs(priv);
|
qt1010_dump_regs(priv);
|
||||||
|
|
||||||
|
if (fe->ops.i2c_gate_ctrl)
|
||||||
|
fe->ops.i2c_gate_ctrl(fe, 0); /* close i2c_gate */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,7 +283,6 @@ static int qt1010_init_meas1(struct qt1010_priv *priv, u8 oper, u8 reg, u8 reg_i
|
|||||||
return qt1010_writereg(priv, 0x1e, 0x00);
|
return qt1010_writereg(priv, 0x1e, 0x00);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static u8 qt1010_init_meas2(struct qt1010_priv *priv, u8 reg_init_val, u8 *retval)
|
static u8 qt1010_init_meas2(struct qt1010_priv *priv, u8 reg_init_val, u8 *retval)
|
||||||
{
|
{
|
||||||
u8 i, val;
|
u8 i, val;
|
||||||
@@ -347,6 +352,9 @@ static int qt1010_init(struct dvb_frontend *fe)
|
|||||||
{ QT1010_WR, 0x08, 0x08 }
|
{ QT1010_WR, 0x08, 0x08 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (fe->ops.i2c_gate_ctrl)
|
||||||
|
fe->ops.i2c_gate_ctrl(fe, 1); /* open i2c_gate */
|
||||||
|
|
||||||
for (i = 0; i < sizeof(i2c_data) / sizeof(*i2c_data); i++) {
|
for (i = 0; i < sizeof(i2c_data) / sizeof(*i2c_data); i++) {
|
||||||
switch (i2c_data[i].oper) {
|
switch (i2c_data[i].oper) {
|
||||||
case QT1010_WR:
|
case QT1010_WR:
|
||||||
@@ -430,6 +438,9 @@ struct dvb_frontend * qt1010_attach(struct dvb_frontend *fe,
|
|||||||
priv->cfg = cfg;
|
priv->cfg = cfg;
|
||||||
priv->i2c = i2c;
|
priv->i2c = i2c;
|
||||||
|
|
||||||
|
if (fe->ops.i2c_gate_ctrl)
|
||||||
|
fe->ops.i2c_gate_ctrl(fe, 1); /* open i2c_gate */
|
||||||
|
|
||||||
|
|
||||||
/* Try to detect tuner chip. Probably this is not correct register. */
|
/* Try to detect tuner chip. Probably this is not correct register. */
|
||||||
if (qt1010_readreg(priv, 0x29, &id) != 0 || (id != 0x39)) {
|
if (qt1010_readreg(priv, 0x29, &id) != 0 || (id != 0x39)) {
|
||||||
@@ -437,6 +448,9 @@ struct dvb_frontend * qt1010_attach(struct dvb_frontend *fe,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fe->ops.i2c_gate_ctrl)
|
||||||
|
fe->ops.i2c_gate_ctrl(fe, 0); /* close i2c_gate */
|
||||||
|
|
||||||
printk(KERN_INFO "Quantek QT1010 successfully identified.\n");
|
printk(KERN_INFO "Quantek QT1010 successfully identified.\n");
|
||||||
memcpy(&fe->ops.tuner_ops, &qt1010_tuner_ops, sizeof(struct dvb_tuner_ops));
|
memcpy(&fe->ops.tuner_ops, &qt1010_tuner_ops, sizeof(struct dvb_tuner_ops));
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user