diff options
author | Michael Krufky <mkrufky@linuxtv.org> | 2008-09-06 12:54:45 -0400 |
---|---|---|
committer | Michael Krufky <mkrufky@linuxtv.org> | 2008-09-06 12:54:45 -0400 |
commit | 8cab49c4acd229cb28d9add11a80eed55859ba2d (patch) | |
tree | 7cba68ef46af5ed12095c99af31f18c22d5a09be /linux/drivers | |
parent | dbd3f1f18f6dc2b7e14b1a4576af6f5f8376ad41 (diff) | |
download | mediapointer-dvb-s2-8cab49c4acd229cb28d9add11a80eed55859ba2d.tar.gz mediapointer-dvb-s2-8cab49c4acd229cb28d9add11a80eed55859ba2d.tar.bz2 |
xc5000: prevent an OOPS if analog driver is unloaded while digital is in use
From: Michael Krufky <mkrufky@linuxtv.org>
Prevent an OOPS if xc5000_attach was called by tuner.ko before being called by
the DVB adapter driver. The OOPS occurs when a digital tune request is made
after tuner.ko is unloaded.
When tuner.ko is unloaded, it takes the xc5000_config structure with it.
Rather than storing a pointer to the xc5000_config structure, just store the
if_khz and tuner_callback inside the xc5000_priv internal state structure.
Priority: normal
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Diffstat (limited to 'linux/drivers')
-rw-r--r-- | linux/drivers/media/common/tuners/xc5000.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/linux/drivers/media/common/tuners/xc5000.c b/linux/drivers/media/common/tuners/xc5000.c index 54049415c..134366525 100644 --- a/linux/drivers/media/common/tuners/xc5000.c +++ b/linux/drivers/media/common/tuners/xc5000.c @@ -50,17 +50,17 @@ static LIST_HEAD(hybrid_tuner_instance_list); #define XC5000_DEFAULT_FIRMWARE_SIZE 12332 struct xc5000_priv { - struct xc5000_config *cfg; - struct tuner_i2c_props i2c_props; struct list_head hybrid_tuner_instance_list; + u32 if_khz; u32 freq_hz; u32 bandwidth; u8 video_standard; u8 rf_mode; void *devptr; + int (*tuner_callback) (void *priv, int command, int arg); }; /* Misc Defines */ @@ -233,9 +233,8 @@ static void xc5000_TunerReset(struct dvb_frontend *fe) dprintk(1, "%s()\n", __func__); - if (priv->cfg->tuner_callback) { - ret = priv->cfg->tuner_callback(priv->devptr, - XC5000_TUNER_RESET, 0); + if (priv->tuner_callback) { + ret = priv->tuner_callback(priv->devptr, XC5000_TUNER_RESET, 0); if (ret) printk(KERN_ERR "xc5000: reset failed\n"); } else @@ -711,10 +710,10 @@ static int xc5000_set_params(struct dvb_frontend *fe, return -EREMOTEIO; } - ret = xc_set_IF_frequency(priv, priv->cfg->if_khz); + ret = xc_set_IF_frequency(priv, priv->if_khz); if (ret != XC_RESULT_SUCCESS) { printk(KERN_ERR "xc5000: xc_Set_IF_frequency(%d) failed\n", - priv->cfg->if_khz); + priv->if_khz); return -EIO; } @@ -991,9 +990,10 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe, break; case 1: /* new tuner instance */ - priv->cfg = cfg; priv->bandwidth = BANDWIDTH_6_MHZ; priv->devptr = devptr; + priv->if_khz = cfg->if_khz; + priv->tuner_callback = cfg->tuner_callback; fe->tuner_priv = priv; break; |