diff options
author | Michael Krufky <mkrufky@linuxtv.org> | 2008-09-06 13:54:45 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2008-10-12 09:37:01 -0200 |
commit | 2a6003c20771ca16fc6386b5fd258df2f2fa8232 (patch) | |
tree | 7f577409cdb779d72b4a657e5f5fc736fde91100 | |
parent | 89fd28545c7390eb6c63d3d9e6faac78942dd1a4 (diff) | |
download | kernel_samsung_crespo-2a6003c20771ca16fc6386b5fd258df2f2fa8232.zip kernel_samsung_crespo-2a6003c20771ca16fc6386b5fd258df2f2fa8232.tar.gz kernel_samsung_crespo-2a6003c20771ca16fc6386b5fd258df2f2fa8232.tar.bz2 |
V4L/DVB (8950): xc5000: prevent an OOPS if analog driver is unloaded while digital is in use
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.
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r-- | drivers/media/common/tuners/xc5000.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/drivers/media/common/tuners/xc5000.c b/drivers/media/common/tuners/xc5000.c index 1850f7b..72efc65 100644 --- a/drivers/media/common/tuners/xc5000.c +++ b/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 @@ -692,10 +691,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; } @@ -972,9 +971,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; |