diff options
author | Antti Palosaari <crope@iki.fi> | 2007-01-27 14:41:35 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2007-02-21 10:35:31 -0500 |
commit | 705d41e5da674b449f900df97ad13ebe53e82b82 (patch) | |
tree | 058036817b0d597f778dc9e48f78ebb3c7df2efe | |
parent | 38d0629fd80464247290450d8641890d6f94b6fa (diff) |
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>
-rw-r--r-- | drivers/media/dvb/dvb-usb/au6610.c | 13 | ||||
-rw-r--r-- | drivers/media/dvb/dvb-usb/gl861.c | 13 | ||||
-rw-r--r-- | drivers/media/dvb/frontends/qt1010.c | 16 |
3 files changed, 15 insertions, 27 deletions
diff --git a/drivers/media/dvb/dvb-usb/au6610.c b/drivers/media/dvb/dvb-usb/au6610.c index 456b89f4f761..0dc66a8d2baf 100644 --- a/drivers/media/dvb/dvb-usb/au6610.c +++ b/drivers/media/dvb/dvb-usb/au6610.c | |||
@@ -145,19 +145,6 @@ static struct qt1010_config au6610_qt1010_config = { | |||
145 | 145 | ||
146 | static int au6610_qt1010_tuner_attach(struct dvb_usb_adapter *adap) | 146 | static int au6610_qt1010_tuner_attach(struct dvb_usb_adapter *adap) |
147 | { | 147 | { |
148 | /* TODO FIXME; probably I2C gate. | ||
149 | QT1010 tuner does not respond before we write 0x1a to ZL10353 demod | ||
150 | register 0x62. This ought to be done somewhere in demod initialization. | ||
151 | This solution is temporary hack. */ | ||
152 | |||
153 | u8 buf[2] = { 0x62, 0x1a }; | ||
154 | struct i2c_msg msg = { .addr = au6610_zl10353_config.demod_address, | ||
155 | .flags = 0, .buf = buf, .len = 2 }; | ||
156 | |||
157 | if (i2c_transfer(&adap->dev->i2c_adap, &msg, 1) != 1) { | ||
158 | printk(KERN_WARNING "au6610 tuner attach failed\n"); | ||
159 | return -EREMOTEIO; | ||
160 | } | ||
161 | return dvb_attach(qt1010_attach, | 148 | return dvb_attach(qt1010_attach, |
162 | adap->fe, &adap->dev->i2c_adap, | 149 | adap->fe, &adap->dev->i2c_adap, |
163 | &au6610_qt1010_config) == NULL ? -ENODEV : 0; | 150 | &au6610_qt1010_config) == NULL ? -ENODEV : 0; |
diff --git a/drivers/media/dvb/dvb-usb/gl861.c b/drivers/media/dvb/dvb-usb/gl861.c index d62edb533d00..c9f38a5e70d3 100644 --- a/drivers/media/dvb/dvb-usb/gl861.c +++ b/drivers/media/dvb/dvb-usb/gl861.c | |||
@@ -122,19 +122,6 @@ static struct qt1010_config gl861_qt1010_config = { | |||
122 | 122 | ||
123 | static int gl861_tuner_attach(struct dvb_usb_adapter *adap) | 123 | static int gl861_tuner_attach(struct dvb_usb_adapter *adap) |
124 | { | 124 | { |
125 | /* TODO FIXME; probably I2C gate. | ||
126 | QT1010 tuner does not respond before we write 0x1a to ZL10353 demod | ||
127 | register 0x62. This ought to be done somewhere in demod initialization. | ||
128 | This solution is temporary hack. */ | ||
129 | |||
130 | u8 buf[2] = { 0x62, 0x1a }; | ||
131 | struct i2c_msg msg = { .addr = gl861_zl10353_config.demod_address, | ||
132 | .flags = 0, .buf = buf, .len = 2 }; | ||
133 | |||
134 | if (i2c_transfer(&adap->dev->i2c_adap, &msg, 1) != 1) { | ||
135 | printk(KERN_WARNING "gl861 tuner attach failed\n"); | ||
136 | return -EREMOTEIO; | ||
137 | } | ||
138 | return dvb_attach(qt1010_attach, | 125 | return dvb_attach(qt1010_attach, |
139 | adap->fe, &adap->dev->i2c_adap, | 126 | adap->fe, &adap->dev->i2c_adap, |
140 | &gl861_qt1010_config) == NULL ? -ENODEV : 0; | 127 | &gl861_qt1010_config) == NULL ? -ENODEV : 0; |
diff --git a/drivers/media/dvb/frontends/qt1010.c b/drivers/media/dvb/frontends/qt1010.c index d7360f45355a..c3408dcabe87 100644 --- a/drivers/media/dvb/frontends/qt1010.c +++ b/drivers/media/dvb/frontends/qt1010.c | |||
@@ -149,6 +149,9 @@ static int qt1010_set_params(struct dvb_frontend *fe, struct dvb_frontend_parame | |||
149 | priv->bandwidth = (fe->ops.info.type == FE_OFDM) ? params->u.ofdm.bandwidth : 0; | 149 | priv->bandwidth = (fe->ops.info.type == FE_OFDM) ? params->u.ofdm.bandwidth : 0; |
150 | priv->frequency = freq; | 150 | priv->frequency = freq; |
151 | 151 | ||
152 | if (fe->ops.i2c_gate_ctrl) | ||
153 | fe->ops.i2c_gate_ctrl(fe, 1); /* open i2c_gate */ | ||
154 | |||
152 | /* reg 05 base value */ | 155 | /* reg 05 base value */ |
153 | if (freq < 290000000) reg05 = 0x14; /* 290 MHz */ | 156 | if (freq < 290000000) reg05 = 0x14; /* 290 MHz */ |
154 | else if (freq < 610000000) reg05 = 0x34; /* 610 MHz */ | 157 | 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 | |||
242 | if (debug) | 245 | if (debug) |
243 | qt1010_dump_regs(priv); | 246 | qt1010_dump_regs(priv); |
244 | 247 | ||
248 | if (fe->ops.i2c_gate_ctrl) | ||
249 | fe->ops.i2c_gate_ctrl(fe, 0); /* close i2c_gate */ | ||
250 | |||
245 | return 0; | 251 | return 0; |
246 | } | 252 | } |
247 | 253 | ||
@@ -277,7 +283,6 @@ static int qt1010_init_meas1(struct qt1010_priv *priv, u8 oper, u8 reg, u8 reg_i | |||
277 | return qt1010_writereg(priv, 0x1e, 0x00); | 283 | return qt1010_writereg(priv, 0x1e, 0x00); |
278 | } | 284 | } |
279 | 285 | ||
280 | |||
281 | static u8 qt1010_init_meas2(struct qt1010_priv *priv, u8 reg_init_val, u8 *retval) | 286 | static u8 qt1010_init_meas2(struct qt1010_priv *priv, u8 reg_init_val, u8 *retval) |
282 | { | 287 | { |
283 | u8 i, val; | 288 | u8 i, val; |
@@ -347,6 +352,9 @@ static int qt1010_init(struct dvb_frontend *fe) | |||
347 | { QT1010_WR, 0x08, 0x08 } | 352 | { QT1010_WR, 0x08, 0x08 } |
348 | }; | 353 | }; |
349 | 354 | ||
355 | if (fe->ops.i2c_gate_ctrl) | ||
356 | fe->ops.i2c_gate_ctrl(fe, 1); /* open i2c_gate */ | ||
357 | |||
350 | for (i = 0; i < sizeof(i2c_data) / sizeof(*i2c_data); i++) { | 358 | for (i = 0; i < sizeof(i2c_data) / sizeof(*i2c_data); i++) { |
351 | switch (i2c_data[i].oper) { | 359 | switch (i2c_data[i].oper) { |
352 | case QT1010_WR: | 360 | case QT1010_WR: |
@@ -430,6 +438,9 @@ struct dvb_frontend * qt1010_attach(struct dvb_frontend *fe, | |||
430 | priv->cfg = cfg; | 438 | priv->cfg = cfg; |
431 | priv->i2c = i2c; | 439 | priv->i2c = i2c; |
432 | 440 | ||
441 | if (fe->ops.i2c_gate_ctrl) | ||
442 | fe->ops.i2c_gate_ctrl(fe, 1); /* open i2c_gate */ | ||
443 | |||
433 | 444 | ||
434 | /* Try to detect tuner chip. Probably this is not correct register. */ | 445 | /* Try to detect tuner chip. Probably this is not correct register. */ |
435 | if (qt1010_readreg(priv, 0x29, &id) != 0 || (id != 0x39)) { | 446 | if (qt1010_readreg(priv, 0x29, &id) != 0 || (id != 0x39)) { |
@@ -437,6 +448,9 @@ struct dvb_frontend * qt1010_attach(struct dvb_frontend *fe, | |||
437 | return NULL; | 448 | return NULL; |
438 | } | 449 | } |
439 | 450 | ||
451 | if (fe->ops.i2c_gate_ctrl) | ||
452 | fe->ops.i2c_gate_ctrl(fe, 0); /* close i2c_gate */ | ||
453 | |||
440 | printk(KERN_INFO "Quantek QT1010 successfully identified.\n"); | 454 | printk(KERN_INFO "Quantek QT1010 successfully identified.\n"); |
441 | memcpy(&fe->ops.tuner_ops, &qt1010_tuner_ops, sizeof(struct dvb_tuner_ops)); | 455 | memcpy(&fe->ops.tuner_ops, &qt1010_tuner_ops, sizeof(struct dvb_tuner_ops)); |
442 | 456 | ||