Commit f1f32849 authored by Michael Krufky's avatar Michael Krufky Committed by Mauro Carvalho Chehab

V4L/DVB (6543): tda8290: enable probing of tda8295

Prevent the tda8295 from falsely being detected as a tda9887
Signed-off-by: default avatarMichael Krufky <mkrufky@linuxtv.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 9b15c025
...@@ -632,6 +632,46 @@ static int tda829x_find_tuner(struct dvb_frontend *fe) ...@@ -632,6 +632,46 @@ static int tda829x_find_tuner(struct dvb_frontend *fe)
return 0; return 0;
} }
static int tda8290_probe(struct tuner_i2c_props *i2c_props)
{
#define TDA8290_ID 0x89
unsigned char tda8290_id[] = { 0x1f, 0x00 };
/* detect tda8290 */
tuner_i2c_xfer_send(i2c_props, &tda8290_id[0], 1);
tuner_i2c_xfer_recv(i2c_props, &tda8290_id[1], 1);
if (tda8290_id[1] == TDA8290_ID) {
if (tuner_debug)
printk(KERN_DEBUG "%s: tda8290 detected @ %d-%04x\n",
__FUNCTION__, i2c_adapter_id(i2c_props->adap),
i2c_props->addr);
return 0;
}
return -1;
}
static int tda8295_probe(struct tuner_i2c_props *i2c_props)
{
#define TDA8295_ID 0x8a
unsigned char tda8295_id[] = { 0x2f, 0x00 };
/* detect tda8295 */
tuner_i2c_xfer_send(i2c_props, &tda8295_id[0], 1);
tuner_i2c_xfer_recv(i2c_props, &tda8295_id[1], 1);
if (tda8295_id[1] == TDA8295_ID) {
if (tuner_debug)
printk(KERN_DEBUG "%s: tda8295 detected @ %d-%04x\n",
__FUNCTION__, i2c_adapter_id(i2c_props->adap),
i2c_props->addr);
return 0;
}
return -1;
}
static struct analog_tuner_ops tda8290_tuner_ops = { static struct analog_tuner_ops tda8290_tuner_ops = {
.set_tv_freq = tda8290_set_freq, .set_tv_freq = tda8290_set_freq,
.set_radio_freq = tda8290_set_freq, .set_radio_freq = tda8290_set_freq,
...@@ -655,11 +695,6 @@ int tda829x_attach(struct tuner *t) ...@@ -655,11 +695,6 @@ int tda829x_attach(struct tuner *t)
struct dvb_frontend *fe = &t->fe; struct dvb_frontend *fe = &t->fe;
struct tda8290_priv *priv = NULL; struct tda8290_priv *priv = NULL;
unsigned char tda8290_id[] = { 0x1f, 0x00 };
#define TDA8290_ID 0x89
unsigned char tda8295_id[] = { 0x2f, 0x00 };
#define TDA8295_ID 0x8a
priv = kzalloc(sizeof(struct tda8290_priv), GFP_KERNEL); priv = kzalloc(sizeof(struct tda8290_priv), GFP_KERNEL);
if (priv == NULL) if (priv == NULL)
return -ENOMEM; return -ENOMEM;
...@@ -671,18 +706,12 @@ int tda829x_attach(struct tuner *t) ...@@ -671,18 +706,12 @@ int tda829x_attach(struct tuner *t)
priv->cfg.tuner_callback = t->tuner_callback; priv->cfg.tuner_callback = t->tuner_callback;
priv->t = t; priv->t = t;
/* detect tda8290 */ if (tda8290_probe(&priv->i2c_props) == 0) {
tuner_i2c_xfer_send(&priv->i2c_props, &tda8290_id[0], 1);
tuner_i2c_xfer_recv(&priv->i2c_props, &tda8290_id[1], 1);
if (tda8290_id[1] == TDA8290_ID) {
priv->ver = TDA8290; priv->ver = TDA8290;
fe->ops.analog_demod_ops = &tda8290_tuner_ops; fe->ops.analog_demod_ops = &tda8290_tuner_ops;
} }
/* detect tda8295 */ if (tda8295_probe(&priv->i2c_props) == 0) {
tuner_i2c_xfer_send(&priv->i2c_props, &tda8295_id[0], 1);
tuner_i2c_xfer_recv(&priv->i2c_props, &tda8295_id[1], 1);
if (tda8295_id[1] == TDA8295_ID) {
priv->ver = TDA8295; priv->ver = TDA8295;
fe->ops.analog_demod_ops = &tda8295_tuner_ops; fe->ops.analog_demod_ops = &tda8295_tuner_ops;
} }
...@@ -704,7 +733,7 @@ int tda829x_attach(struct tuner *t) ...@@ -704,7 +733,7 @@ int tda829x_attach(struct tuner *t)
} }
EXPORT_SYMBOL_GPL(tda829x_attach); EXPORT_SYMBOL_GPL(tda829x_attach);
int tda8290_probe(struct tuner *t) int tda829x_probe(struct tuner *t)
{ {
struct tuner_i2c_props i2c_props = { struct tuner_i2c_props i2c_props = {
.adap = t->i2c->adapter, .adap = t->i2c->adapter,
...@@ -718,6 +747,11 @@ int tda8290_probe(struct tuner *t) ...@@ -718,6 +747,11 @@ int tda8290_probe(struct tuner *t)
unsigned char addr_dto_lsb = 0x07; unsigned char addr_dto_lsb = 0x07;
unsigned char data; unsigned char data;
if ((tda8290_probe(&i2c_props) == 0) ||
(tda8295_probe(&i2c_props) == 0))
return 0;
/* fall back to old probing method */
tuner_i2c_xfer_send(&i2c_props, easy_mode_b, 2); tuner_i2c_xfer_send(&i2c_props, easy_mode_b, 2);
tuner_i2c_xfer_send(&i2c_props, soft_reset, 2); tuner_i2c_xfer_send(&i2c_props, soft_reset, 2);
tuner_i2c_xfer_send(&i2c_props, &addr_dto_lsb, 1); tuner_i2c_xfer_send(&i2c_props, &addr_dto_lsb, 1);
...@@ -734,7 +768,7 @@ int tda8290_probe(struct tuner *t) ...@@ -734,7 +768,7 @@ int tda8290_probe(struct tuner *t)
tuner_i2c_xfer_send(&i2c_props, restore_9886, 3); tuner_i2c_xfer_send(&i2c_props, restore_9886, 3);
return -1; return -1;
} }
EXPORT_SYMBOL_GPL(tda8290_probe); EXPORT_SYMBOL_GPL(tda829x_probe);
MODULE_DESCRIPTION("Philips/NXP TDA8290/TDA8295 analog IF demodulator driver"); MODULE_DESCRIPTION("Philips/NXP TDA8290/TDA8295 analog IF demodulator driver");
MODULE_AUTHOR("Gerd Knorr, Hartmut Hackmann, Michael Krufky"); MODULE_AUTHOR("Gerd Knorr, Hartmut Hackmann, Michael Krufky");
......
...@@ -21,11 +21,11 @@ ...@@ -21,11 +21,11 @@
#include "tuner-driver.h" #include "tuner-driver.h"
#if defined(CONFIG_TUNER_TDA8290) || (defined(CONFIG_TUNER_TDA8290_MODULE) && defined(MODULE)) #if defined(CONFIG_TUNER_TDA8290) || (defined(CONFIG_TUNER_TDA8290_MODULE) && defined(MODULE))
extern int tda8290_probe(struct tuner *t); extern int tda829x_probe(struct tuner *t);
extern int tda829x_attach(struct tuner *t); extern int tda829x_attach(struct tuner *t);
#else #else
static inline int tda8290_probe(struct tuner *t) static inline int tda829x_probe(struct tuner *t)
{ {
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __FUNCTION__); printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __FUNCTION__);
return -EINVAL; return -EINVAL;
......
...@@ -649,8 +649,8 @@ static int tuner_attach(struct i2c_adapter *adap, int addr, int kind) ...@@ -649,8 +649,8 @@ static int tuner_attach(struct i2c_adapter *adap, int addr, int kind)
case 0x4b: case 0x4b:
/* If chip is not tda8290, don't register. /* If chip is not tda8290, don't register.
since it can be tda9887*/ since it can be tda9887*/
if (tda8290_probe(t) == 0) { if (tda829x_probe(t) == 0) {
tuner_dbg("chip at addr %x is a tda8290\n", addr); tuner_dbg("tda829x detected\n");
} else { } else {
/* Default is being tda9887 */ /* Default is being tda9887 */
t->type = TUNER_TDA9887; t->type = TUNER_TDA9887;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment