Skip to content

Commit

Permalink
V4L/DVB (6611): Change xc2028_attach method to make easier for DVB
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Michel Ludwig authored and Mauro Carvalho Chehab committed Jan 25, 2008
1 parent 2fc580f commit a37b4c9
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 40 deletions.
11 changes: 7 additions & 4 deletions drivers/media/video/tuner-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -336,10 +336,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;
Expand Down
53 changes: 27 additions & 26 deletions drivers/media/video/tuner-xc2028.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,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;
Expand Down Expand Up @@ -240,7 +239,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",
Expand Down Expand Up @@ -546,8 +546,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)
Expand Down Expand Up @@ -882,62 +884,61 @@ static const struct dvb_tuner_ops xc2028_dvb_tuner_ops = {

};

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;


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,
sizeof(xc2028_dvb_tuner_ops));

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");
Expand Down
20 changes: 10 additions & 10 deletions drivers/media/video/tuner-xc2028.h
Original file line number Diff line number Diff line change
Expand Up @@ -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__);
Expand Down

0 comments on commit a37b4c9

Please sign in to comment.