The patch number 8950 was added via Michael Krufky <[EMAIL PROTECTED]>
to http://linuxtv.org/hg/v4l-dvb master development tree.

Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel

If anyone has any objections, please let us know by sending a message to:
        [EMAIL PROTECTED]

------

From: Michael Krufky  <[EMAIL PROTECTED]>
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.

Priority: normal

Signed-off-by: Michael Krufky <[EMAIL PROTECTED]>


---

 linux/drivers/media/common/tuners/xc5000.c |   16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff -r 9b8c420376d9 -r 924f7bd058d0 linux/drivers/media/common/tuners/xc5000.c
--- a/linux/drivers/media/common/tuners/xc5000.c        Sat Sep 06 10:44:53 
2008 -0400
+++ b/linux/drivers/media/common/tuners/xc5000.c        Sat Sep 06 12:54:45 
2008 -0400
@@ -50,17 +50,17 @@ static LIST_HEAD(hybrid_tuner_instance_l
 #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
 
        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_
                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(struc
                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;


---

Patch is available at: 
http://linuxtv.org/hg/v4l-dvb/rev/924f7bd058d088f5292744e01d9a7ea581b76883

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to