diff options
author | Mauro Carvalho Chehab <mchehab@infradead.org> | 2007-11-16 08:46:14 -0200 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2007-11-16 08:46:14 -0200 |
commit | f1c557c347ffdb71872fe4cc6c093c7a5c7026ef (patch) | |
tree | 0e5a0f298663ee71c1f4394e4c930d60de5ccd4d | |
parent | 534afd37ce92c2c58cbe3f3601592481bbd57f92 (diff) | |
download | mediapointer-dvb-s2-f1c557c347ffdb71872fe4cc6c093c7a5c7026ef.tar.gz mediapointer-dvb-s2-f1c557c347ffdb71872fe4cc6c093c7a5c7026ef.tar.bz2 |
Change xc2028_attach method to make easier for DVB
From: Michel Ludwig <michel.ludwig@gmail.com>
Removes uneeded parameters and adds an structure for passing the parameters
This patch is co-authored by Mauro Carvalho Chehab.
Signed-off-by: Michel Ludwig <michel.ludwig@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
-rw-r--r-- | linux/drivers/media/video/tuner-core.c | 11 | ||||
-rw-r--r-- | linux/drivers/media/video/tuner-xc2028.c | 66 | ||||
-rw-r--r-- | linux/drivers/media/video/tuner-xc2028.h | 20 |
3 files changed, 44 insertions, 53 deletions
diff --git a/linux/drivers/media/video/tuner-core.c b/linux/drivers/media/video/tuner-core.c index b1cf04f33..0b3bc1c91 100644 --- a/linux/drivers/media/video/tuner-core.c +++ b/linux/drivers/media/video/tuner-core.c @@ -365,10 +365,13 @@ static void set_type(struct i2c_client *c, unsigned int type, break; case TUNER_XC2028: { - int rc=xc2028_attach(&t->fe, t->i2c->adapter, t->i2c->addr, - &c->dev, c->adapter->algo_data, - t->tuner_callback); - if (rc<0) { + struct xc2028_config cfg = { + .i2c_adap = t->i2c->adapter, + .i2c_addr = t->i2c->addr, + .video_dev = c->adapter->algo_data, + .callback = t->tuner_callback, + }; + if (!xc2028_attach(&t->fe, &cfg)) { t->type = TUNER_ABSENT; t->mode_mask = T_UNINITIALIZED; return; diff --git a/linux/drivers/media/video/tuner-xc2028.c b/linux/drivers/media/video/tuner-xc2028.c index 89e5fedf5..4ed545bb1 100644 --- a/linux/drivers/media/video/tuner-xc2028.c +++ b/linux/drivers/media/video/tuner-xc2028.c @@ -64,7 +64,6 @@ struct xc2028_data { struct tuner_i2c_props i2c_props; int (*tuner_callback) (void *dev, int command, int arg); - struct device *dev; void *video_dev; int count; __u32 frequency; @@ -252,7 +251,8 @@ static int load_all_firmwares(struct dvb_frontend *fe) tuner_dbg("%s called\n", __FUNCTION__); tuner_info("Reading firmware %s\n", priv->ctrl.fname); - rc = request_firmware(&fw, priv->ctrl.fname, priv->dev); + rc = request_firmware(&fw, priv->ctrl.fname, + &priv->i2c_props.adap->dev); if (rc < 0) { if (rc == -ENOENT) tuner_err("Error: firmware %s not found.\n", @@ -558,8 +558,10 @@ static int check_firmware(struct dvb_frontend *fe, enum tuner_mode new_mode, tuner_dbg("%s called\n", __FUNCTION__); if (!priv->firm) { - if (!priv->ctrl.fname) + if (!priv->ctrl.fname) { + tuner_info("xc2028/3028 firmware name not set!\n"); return -EINVAL; + } rc = load_all_firmwares(fe); if (rc < 0) @@ -901,66 +903,51 @@ static const struct dvb_tuner_ops xc2028_dvb_tuner_ops = { #endif }; -int xc2028_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c_adap, - u8 i2c_addr, struct device *dev, void *video_dev, - int (*tuner_callback) (void *dev, int command, int arg)) +void *xc2028_attach(struct dvb_frontend *fe, struct xc2028_config *cfg) { struct xc2028_data *priv; + void *video_dev; if (debug) printk(KERN_DEBUG PREFIX "Xcv2028/3028 init called!\n"); - if (NULL == dev) - return -ENODEV; + if (NULL == cfg->video_dev) + return NULL; - if (NULL == video_dev) - return -ENODEV; - - if (!tuner_callback) { - printk(KERN_ERR PREFIX "No tuner callback!\n"); - return -EINVAL; + if (!fe) { + printk(KERN_ERR PREFIX "No frontend!\n"); + return NULL; } + video_dev = cfg->video_dev; + list_for_each_entry(priv, &xc2028_list, xc2028_list) { - if (priv->dev == dev) - dev = NULL; + if (priv->video_dev == cfg->video_dev) { + video_dev = NULL; + break; + } } - if (dev) { + if (video_dev) { priv = kzalloc(sizeof(*priv), GFP_KERNEL); if (priv == NULL) - return -ENOMEM; - - fe->tuner_priv = priv; + return NULL; priv->bandwidth = BANDWIDTH_6_MHZ; priv->need_load_generic = 1; priv->mode = T_UNINITIALIZED; - priv->i2c_props.addr = i2c_addr; - priv->i2c_props.adap = i2c_adap; - priv->dev = dev; + priv->i2c_props.addr = cfg->i2c_addr; + priv->i2c_props.adap = cfg->i2c_adap; priv->video_dev = video_dev; - priv->tuner_callback = tuner_callback; + priv->tuner_callback = cfg->callback; priv->max_len = 13; -#if 0 - /* Without fname, xc2028/3028 won't work. So, this - driver will only work after calling TUNER_SET_CONFIG */ - - priv->ctrl.fname = kmalloc(sizeof(DEFAULT_FIRMWARE) + 1, - GFP_KERNEL); - if (!priv->ctrl.fname) { - kfree(priv); - return -ENOMEM; - } - - strcpy(priv->ctrl.fname, DEFAULT_FIRMWARE); -#endif - mutex_init(&priv->lock); list_add_tail(&priv->xc2028_list, &xc2028_list); } + + fe->tuner_priv = priv; priv->count++; memcpy(&fe->ops.tuner_ops, &xc2028_dvb_tuner_ops, @@ -968,8 +955,9 @@ int xc2028_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c_adap, tuner_info("type set to %s\n", "XCeive xc2028/xc3028 tuner"); - return 0; + return fe; } + EXPORT_SYMBOL(xc2028_attach); MODULE_DESCRIPTION("Xceive xc2028/xc3028 tuner driver"); diff --git a/linux/drivers/media/video/tuner-xc2028.h b/linux/drivers/media/video/tuner-xc2028.h index e04611e65..a20eeb493 100644 --- a/linux/drivers/media/video/tuner-xc2028.h +++ b/linux/drivers/media/video/tuner-xc2028.h @@ -22,22 +22,22 @@ struct xc2028_ctrl { int max_len; }; +struct xc2028_config { + struct i2c_adapter *i2c_adap; + u8 i2c_addr; + void *video_dev; + int (*callback) (void *dev, int command, int arg); +}; + /* xc2028 commands for callback */ #define XC2028_TUNER_RESET 0 #define XC2028_RESET_CLK 1 #if defined(CONFIG_TUNER_XC2028) || (defined(CONFIG_TUNER_XC2028_MODULE) && defined(MODULE)) -int xc2028_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c_adap, - u8 i2c_addr, struct device *dev, void *video_dev, - int (*tuner_callback) (void *dev, int command, int arg)); - +void *xc2028_attach(struct dvb_frontend *fe, struct xc2028_config *cfg); #else -static inline int xc2028_attach(struct dvb_frontend *fe, - struct i2c_adapter *i2c_adap, - u8 i2c_addr, struct device *dev, - void *video_dev, - int (*tuner_callback) (void *dev, int command, - int arg)) +void *xc2028_attach(struct dvb_frontend *fe, + struct xc2028_config *cfg) { printk(KERN_INFO "%s: not probed - driver disabled by Kconfig\n", __FUNCTION__); |