Commit b412ba78 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

V4L/DVB (7399): Removes video_dev from tuner-xc2028 config struct

The video_dev parameter, on tuner-xc2028 were used to pass i2c private data to
tuner_callback. Since the driver already have a pointer to i2c_adap->algo_data,
uses this instead.

This parameter were used also as a magic number to idenfity if two drivers are
trying to register the same xc3028 tuner. This occurs with boards with DVB
support, where both DVB and V4L drivers will share the same tuner.

Instead of using the algo_data as a private number, after this patch, the
driver will use i2c_adap->dev, with seems more consistent.
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 0be51b46
...@@ -509,7 +509,6 @@ static int cxusb_dvico_xc3028_tuner_attach(struct dvb_usb_adapter *adap) ...@@ -509,7 +509,6 @@ static int cxusb_dvico_xc3028_tuner_attach(struct dvb_usb_adapter *adap)
struct xc2028_config cfg = { struct xc2028_config cfg = {
.i2c_adap = &adap->dev->i2c_adap, .i2c_adap = &adap->dev->i2c_adap,
.i2c_addr = 0x61, .i2c_addr = 0x61,
.video_dev = adap->dev,
.callback = dvico_bluebird_xc2028_callback, .callback = dvico_bluebird_xc2028_callback,
}; };
static struct xc2028_ctrl ctl = { static struct xc2028_ctrl ctl = {
......
...@@ -297,7 +297,6 @@ static int dvb_register(struct cx23885_tsport *port) ...@@ -297,7 +297,6 @@ static int dvb_register(struct cx23885_tsport *port)
struct xc2028_config cfg = { struct xc2028_config cfg = {
.i2c_adap = &i2c_bus->i2c_adap, .i2c_adap = &i2c_bus->i2c_adap,
.i2c_addr = 0x61, .i2c_addr = 0x61,
.video_dev = port,
.callback = cx23885_hvr1500_xc3028_callback, .callback = cx23885_hvr1500_xc3028_callback,
}; };
static struct xc2028_ctrl ctl = { static struct xc2028_ctrl ctl = {
......
...@@ -458,7 +458,6 @@ static int attach_xc3028(u8 addr, struct cx8802_dev *dev) ...@@ -458,7 +458,6 @@ static int attach_xc3028(u8 addr, struct cx8802_dev *dev)
struct xc2028_config cfg = { struct xc2028_config cfg = {
.i2c_adap = &dev->core->i2c_adap, .i2c_adap = &dev->core->i2c_adap,
.i2c_addr = addr, .i2c_addr = addr,
.video_dev = dev->core->i2c_adap.algo_data,
}; };
if (!dev->dvb.frontend) { if (!dev->dvb.frontend) {
...@@ -780,7 +779,6 @@ static int dvb_register(struct cx8802_dev *dev) ...@@ -780,7 +779,6 @@ static int dvb_register(struct cx8802_dev *dev)
struct xc2028_config cfg = { struct xc2028_config cfg = {
.i2c_adap = &dev->core->i2c_adap, .i2c_adap = &dev->core->i2c_adap,
.i2c_addr = 0x61, .i2c_addr = 0x61,
.video_dev = dev->core,
.callback = cx88_pci_nano_callback, .callback = cx88_pci_nano_callback,
}; };
static struct xc2028_ctrl ctl = { static struct xc2028_ctrl ctl = {
......
...@@ -419,7 +419,6 @@ static void set_type(struct i2c_client *c, unsigned int type, ...@@ -419,7 +419,6 @@ static void set_type(struct i2c_client *c, unsigned int type,
struct xc2028_config cfg = { struct xc2028_config cfg = {
.i2c_adap = t->i2c->adapter, .i2c_adap = t->i2c->adapter,
.i2c_addr = t->i2c->addr, .i2c_addr = t->i2c->addr,
.video_dev = c->adapter->algo_data,
.callback = t->tuner_callback, .callback = t->tuner_callback,
}; };
if (!xc2028_attach(&t->fe, &cfg)) { if (!xc2028_attach(&t->fe, &cfg)) {
......
...@@ -1155,7 +1155,7 @@ struct dvb_frontend *xc2028_attach(struct dvb_frontend *fe, ...@@ -1155,7 +1155,7 @@ struct dvb_frontend *xc2028_attach(struct dvb_frontend *fe,
if (debug) if (debug)
printk(KERN_DEBUG "xc2028: Xcv2028/3028 init called!\n"); printk(KERN_DEBUG "xc2028: Xcv2028/3028 init called!\n");
if (NULL == cfg || NULL == cfg->video_dev) if (NULL == cfg)
return NULL; return NULL;
if (!fe) { if (!fe) {
...@@ -1163,13 +1163,19 @@ struct dvb_frontend *xc2028_attach(struct dvb_frontend *fe, ...@@ -1163,13 +1163,19 @@ struct dvb_frontend *xc2028_attach(struct dvb_frontend *fe,
return NULL; return NULL;
} }
video_dev = cfg->video_dev; video_dev = cfg->i2c_adap->algo_data;
if (debug)
printk(KERN_DEBUG "xc2028: video_dev =%p\n", video_dev);
mutex_lock(&xc2028_list_mutex); mutex_lock(&xc2028_list_mutex);
list_for_each_entry(priv, &xc2028_list, xc2028_list) { list_for_each_entry(priv, &xc2028_list, xc2028_list) {
if (priv->video_dev == cfg->video_dev) { if (&priv->i2c_props.adap->dev == &cfg->i2c_adap->dev) {
video_dev = NULL; video_dev = NULL;
if (debug)
printk(KERN_DEBUG "xc2028: reusing device\n");
break; break;
} }
} }
...@@ -1197,6 +1203,9 @@ struct dvb_frontend *xc2028_attach(struct dvb_frontend *fe, ...@@ -1197,6 +1203,9 @@ struct dvb_frontend *xc2028_attach(struct dvb_frontend *fe,
fe->tuner_priv = priv; fe->tuner_priv = priv;
priv->count++; priv->count++;
if (debug)
printk(KERN_DEBUG "xc2028: usage count is %i\n", priv->count);
memcpy(&fe->ops.tuner_ops, &xc2028_dvb_tuner_ops, memcpy(&fe->ops.tuner_ops, &xc2028_dvb_tuner_ops,
sizeof(xc2028_dvb_tuner_ops)); sizeof(xc2028_dvb_tuner_ops));
......
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