V4L/DVB (9049): convert tuner drivers to use dvb_frontend->callback
authorMichael Krufky <mkrufky@linuxtv.org>
Fri, 12 Sep 2008 16:31:45 +0000 (13:31 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sun, 12 Oct 2008 11:37:09 +0000 (09:37 -0200)
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
31 files changed:
drivers/media/common/tuners/tda827x.c
drivers/media/common/tuners/tda827x.h
drivers/media/common/tuners/tda8290.c
drivers/media/common/tuners/tda8290.h
drivers/media/common/tuners/tuner-xc2028.c
drivers/media/common/tuners/tuner-xc2028.h
drivers/media/common/tuners/xc5000.c
drivers/media/common/tuners/xc5000.h
drivers/media/dvb/dvb-usb/cxusb.c
drivers/media/dvb/dvb-usb/dib0700_devices.c
drivers/media/video/au0828/au0828-cards.c
drivers/media/video/au0828/au0828-dvb.c
drivers/media/video/au0828/au0828.h
drivers/media/video/cx18/cx18-gpio.c
drivers/media/video/cx18/cx18-gpio.h
drivers/media/video/cx23885/cx23885-cards.c
drivers/media/video/cx23885/cx23885-dvb.c
drivers/media/video/cx23885/cx23885.h
drivers/media/video/cx88/cx88-cards.c
drivers/media/video/cx88/cx88-dvb.c
drivers/media/video/cx88/cx88.h
drivers/media/video/em28xx/em28xx-cards.c
drivers/media/video/em28xx/em28xx-dvb.c
drivers/media/video/em28xx/em28xx.h
drivers/media/video/ivtv/ivtv-gpio.c
drivers/media/video/ivtv/ivtv-gpio.h
drivers/media/video/saa7134/saa7134-cards.c
drivers/media/video/saa7134/saa7134-dvb.c
drivers/media/video/saa7134/saa7134.h
drivers/media/video/tuner-core.c
include/media/tuner.h

index 8555d9c..4a74f65 100644 (file)
@@ -447,17 +447,19 @@ static void tda827xa_lna_gain(struct dvb_frontend *fe, int high,
                        else
                                arg = 0;
                }
-               if (priv->cfg->tuner_callback)
-                       priv->cfg->tuner_callback(priv->i2c_adap->algo_data,
-                                                               gp_func, arg);
+               if (fe->callback)
+                       fe->callback(priv->i2c_adap->algo_data,
+                                    DVB_FRONTEND_COMPONENT_TUNER,
+                                    gp_func, arg);
                buf[1] = high ? 0 : 1;
                if (priv->cfg->config == 2)
                        buf[1] = high ? 1 : 0;
                i2c_transfer(priv->i2c_adap, &msg, 1);
                break;
        case 3: /* switch with GPIO of saa713x */
-               if (priv->cfg->tuner_callback)
-                       priv->cfg->tuner_callback(priv->i2c_adap->algo_data, 0, high);
+               if (fe->callback)
+                       fe->callback(priv->i2c_adap->algo_data,
+                                    DVB_FRONTEND_COMPONENT_TUNER, 0, high);
                break;
        }
 }
index 7850a9a..7d72ce0 100644 (file)
@@ -36,7 +36,6 @@ struct tda827x_config
        /* interface to tda829x driver */
        unsigned int config;
        int          switch_addr;
-       int (*tuner_callback) (void *dev, int command, int arg);
 
        void (*agcf)(struct dvb_frontend *fe);
 };
index 91204d3..c112bdd 100644 (file)
@@ -672,10 +672,8 @@ struct dvb_frontend *tda829x_attach(struct dvb_frontend *fe,
        priv->i2c_props.addr     = i2c_addr;
        priv->i2c_props.adap     = i2c_adap;
        priv->i2c_props.name     = "tda829x";
-       if (cfg) {
+       if (cfg)
                priv->cfg.config         = cfg->lna_cfg;
-               priv->cfg.tuner_callback = cfg->tuner_callback;
-       }
 
        if (tda8290_probe(&priv->i2c_props) == 0) {
                priv->ver = TDA8290;
index aa074f3..7e288b2 100644 (file)
@@ -22,7 +22,6 @@
 
 struct tda829x_config {
        unsigned int lna_cfg;
-       int (*tuner_callback) (void *dev, int command, int arg);
 
        unsigned int probe_tuner:1;
 #define TDA829X_PROBE_TUNER 0
index 4dd1d24..fc82d15 100644 (file)
@@ -71,9 +71,6 @@ struct firmware_properties {
 struct xc2028_data {
        struct list_head        hybrid_tuner_instance_list;
        struct tuner_i2c_props  i2c_props;
-       int                     (*tuner_callback) (void *dev,
-                                                  int command, int arg);
-       void                    *video_dev;
        __u32                   frequency;
 
        struct firmware_description *firm;
@@ -492,6 +489,23 @@ ret:
        return i;
 }
 
+static inline int do_tuner_callback(struct dvb_frontend *fe, int cmd, int arg)
+{
+       struct xc2028_data *priv = fe->tuner_priv;
+
+       /* analog side (tuner-core) uses i2c_adap->algo_data.
+        * digital side is not guaranteed to have algo_data defined.
+        *
+        * digital side will always have fe->dvb defined.
+        * analog side (tuner-core) doesn't (yet) define fe->dvb.
+        */
+
+       return (!fe->callback) ? -EINVAL :
+               fe->callback(((fe->dvb) && (fe->dvb->priv)) ?
+                               fe->dvb->priv : priv->i2c_props.adap->algo_data,
+                            DVB_FRONTEND_COMPONENT_TUNER, cmd, arg);
+}
+
 static int load_firmware(struct dvb_frontend *fe, unsigned int type,
                         v4l2_std_id *id)
 {
@@ -530,8 +544,7 @@ static int load_firmware(struct dvb_frontend *fe, unsigned int type,
 
                if (!size) {
                        /* Special callback command received */
-                       rc = priv->tuner_callback(priv->video_dev,
-                                                 XC2028_TUNER_RESET, 0);
+                       rc = do_tuner_callback(fe, XC2028_TUNER_RESET, 0);
                        if (rc < 0) {
                                tuner_err("Error at RESET code %d\n",
                                           (*p) & 0x7f);
@@ -542,8 +555,7 @@ static int load_firmware(struct dvb_frontend *fe, unsigned int type,
                if (size >= 0xff00) {
                        switch (size) {
                        case 0xff00:
-                               rc = priv->tuner_callback(priv->video_dev,
-                                                       XC2028_RESET_CLK, 0);
+                               rc = do_tuner_callback(fe, XC2028_RESET_CLK, 0);
                                if (rc < 0) {
                                        tuner_err("Error at RESET code %d\n",
                                                  (*p) & 0x7f);
@@ -715,8 +727,7 @@ retry:
        memset(&priv->cur_fw, 0, sizeof(priv->cur_fw));
 
        /* Reset is needed before loading firmware */
-       rc = priv->tuner_callback(priv->video_dev,
-                                 XC2028_TUNER_RESET, 0);
+       rc = do_tuner_callback(fe, XC2028_TUNER_RESET, 0);
        if (rc < 0)
                goto fail;
 
@@ -933,7 +944,7 @@ static int generic_set_freq(struct dvb_frontend *fe, u32 freq /* in HZ */,
           The reset CLK is needed only with tm6000.
           Driver should work fine even if this fails.
         */
-       priv->tuner_callback(priv->video_dev, XC2028_RESET_CLK, 1);
+       do_tuner_callback(fe, XC2028_RESET_CLK, 1);
 
        msleep(10);
 
@@ -1177,20 +1188,10 @@ struct dvb_frontend *xc2028_attach(struct dvb_frontend *fe,
                break;
        case 1:
                /* new tuner instance */
-               priv->tuner_callback = cfg->callback;
                priv->ctrl.max_len = 13;
 
                mutex_init(&priv->lock);
 
-               /* analog side (tuner-core) uses i2c_adap->algo_data.
-                * digital side is not guaranteed to have algo_data defined.
-                *
-                * digital side will always have fe->dvb defined.
-                * analog side (tuner-core) doesn't (yet) define fe->dvb.
-                */
-               priv->video_dev = ((fe->dvb) && (fe->dvb->priv)) ?
-                                  fe->dvb->priv : cfg->i2c_adap->algo_data;
-
                fe->tuner_priv = priv;
                break;
        case 2:
index 2c5b628..1af69f4 100644 (file)
@@ -39,9 +39,7 @@ struct xc2028_ctrl {
 struct xc2028_config {
        struct i2c_adapter *i2c_adap;
        u8                 i2c_addr;
-       void               *video_dev;
        struct xc2028_ctrl *ctrl;
-       int                (*callback) (void *dev, int command, int arg);
 };
 
 /* xc2028 commands for callback */
index ccc4dae..f9c2bb9 100644 (file)
@@ -58,8 +58,6 @@ struct xc5000_priv {
        u32 bandwidth;
        u8  video_standard;
        u8  rf_mode;
-
-       int  (*tuner_callback) (void *priv, int command, int arg);
 };
 
 /* Misc Defines */
@@ -232,10 +230,11 @@ static void xc5000_TunerReset(struct dvb_frontend *fe)
 
        dprintk(1, "%s()\n", __func__);
 
-       if (priv->tuner_callback) {
-               ret = priv->tuner_callback(((fe->dvb) && (fe->dvb->priv)) ?
+       if (fe->callback) {
+               ret = fe->callback(((fe->dvb) && (fe->dvb->priv)) ?
                                           fe->dvb->priv :
                                           priv->i2c_props.adap->algo_data,
+                                          DVB_FRONTEND_COMPONENT_TUNER,
                                           XC5000_TUNER_RESET, 0);
                if (ret)
                        printk(KERN_ERR "xc5000: reset failed\n");
@@ -975,7 +974,6 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
                /* new tuner instance */
                priv->bandwidth = BANDWIDTH_6_MHZ;
                priv->if_khz = cfg->if_khz;
-               priv->tuner_callback = cfg->tuner_callback;
 
                fe->tuner_priv = priv;
                break;
index fa0321c..cf1a558 100644 (file)
@@ -30,8 +30,6 @@ struct i2c_adapter;
 struct xc5000_config {
        u8   i2c_address;
        u32  if_khz;
-
-       int  (*tuner_callback) (void *priv, int command, int arg);
 };
 
 /* xc5000 callback command */
index 1a74612..406d7fb 100644 (file)
@@ -742,7 +742,8 @@ static int cxusb_lgh064f_tuner_attach(struct dvb_usb_adapter *adap)
        return 0;
 }
 
-static int dvico_bluebird_xc2028_callback(void *ptr, int command, int arg)
+static int dvico_bluebird_xc2028_callback(void *ptr, int component,
+                                         int command, int arg)
 {
        struct dvb_usb_adapter *adap = ptr;
        struct dvb_usb_device *d = adap->dev;
@@ -770,7 +771,6 @@ static int cxusb_dvico_xc3028_tuner_attach(struct dvb_usb_adapter *adap)
        struct xc2028_config      cfg = {
                .i2c_adap  = &adap->dev->i2c_adap,
                .i2c_addr  = 0x61,
-               .callback  = dvico_bluebird_xc2028_callback,
        };
        static struct xc2028_ctrl ctl = {
                .fname       = XC2028_DEFAULT_FIRMWARE,
@@ -778,6 +778,9 @@ static int cxusb_dvico_xc3028_tuner_attach(struct dvb_usb_adapter *adap)
                .demod       = XC3028_FE_ZARLINK456,
        };
 
+       /* FIXME: generalize & move to common area */
+       adap->fe->callback = dvico_bluebird_xc2028_callback;
+
        fe = dvb_attach(xc2028_attach, adap->fe, &cfg);
        if (fe == NULL || fe->ops.tuner_ops.set_config == NULL)
                return -EIO;
index 565563e..8b74e13 100644 (file)
@@ -368,7 +368,8 @@ static struct dib7000p_config stk7700ph_dib7700_xc3028_config = {
        .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
 };
 
-static int stk7700ph_xc3028_callback(void *ptr, int command, int arg)
+static int stk7700ph_xc3028_callback(void *ptr, int component,
+                                    int command, int arg)
 {
        struct dvb_usb_adapter *adap = ptr;
 
@@ -396,7 +397,6 @@ static struct xc2028_ctrl stk7700ph_xc3028_ctrl = {
 
 static struct xc2028_config stk7700ph_xc3028_config = {
        .i2c_addr = 0x61,
-       .callback = stk7700ph_xc3028_callback,
        .ctrl = &stk7700ph_xc3028_ctrl,
 };
 
@@ -437,7 +437,9 @@ static int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap)
                DIBX000_I2C_INTERFACE_TUNER, 1);
 
        stk7700ph_xc3028_config.i2c_adap = tun_i2c;
-       stk7700ph_xc3028_config.video_dev = adap;
+
+       /* FIXME: generalize & move to common area */
+       adap->fe->callback = stk7700ph_xc3028_callback;
 
        return dvb_attach(xc2028_attach, adap->fe, &stk7700ph_xc3028_config)
                == NULL ? -ENODEV : 0;
index ed48908..5f07a8a 100644 (file)
@@ -46,7 +46,7 @@ struct au0828_board au0828_boards[] = {
 /* Tuner callback function for au0828 boards. Currently only needed
  * for HVR1500Q, which has an xc5000 tuner.
  */
-int au0828_tuner_callback(void *priv, int command, int arg)
+int au0828_tuner_callback(void *priv, int component, int command, int arg)
 {
        struct au0828_dev *dev = priv;
 
index 9624695..a52abce 100644 (file)
@@ -53,7 +53,6 @@ static struct au8522_config hauppauge_woodbury_config = {
 static struct xc5000_config hauppauge_hvr950q_tunerconfig = {
        .i2c_address      = 0x61,
        .if_khz           = 6000,
-       .tuner_callback   = au0828_tuner_callback
 };
 
 static struct mxl5007t_config mxl5007t_hvr950q_config = {
@@ -389,6 +388,8 @@ int au0828_dvb_register(struct au0828_dev *dev)
                       __func__);
                return -1;
        }
+       /* define general-purpose callback pointer */
+       dvb->frontend->callback = au0828_tuner_callback;
 
        /* register everything */
        ret = dvb_register(dev);
index 4f10ff3..9d6a116 100644 (file)
@@ -103,7 +103,8 @@ extern int au0828_debug;
 extern struct au0828_board au0828_boards[];
 extern struct usb_device_id au0828_usb_id_table[];
 extern void au0828_gpio_setup(struct au0828_dev *dev);
-extern int au0828_tuner_callback(void *priv, int command, int arg);
+extern int au0828_tuner_callback(void *priv, int component,
+                                int command, int arg);
 extern void au0828_card_setup(struct au0828_dev *dev);
 
 /* ----------------------------------------------------------- */
index 3bdffbf..0e56042 100644 (file)
@@ -152,7 +152,7 @@ void cx18_gpio_init(struct cx18 *cx)
 }
 
 /* Xceive tuner reset function */
-int cx18_reset_tuner_gpio(void *dev, int cmd, int value)
+int cx18_reset_tuner_gpio(void *dev, int component, int cmd, int value)
 {
        struct i2c_algo_bit_data *algo = dev;
        struct cx18_i2c_algo_callback_data *cb_data = algo->data;
index 22cd7dd..beb7424 100644 (file)
@@ -23,5 +23,5 @@
 void cx18_gpio_init(struct cx18 *cx);
 void cx18_reset_i2c_slaves_gpio(struct cx18 *cx);
 void cx18_reset_ir_gpio(void *data);
-int cx18_reset_tuner_gpio(void *dev, int cmd, int value);
+int cx18_reset_tuner_gpio(void *dev, int component, int cmd, int value);
 int cx18_gpio(struct cx18 *cx, unsigned int command, void *arg);
index ccea8de..2cda15f 100644 (file)
@@ -337,7 +337,7 @@ static void hauppauge_eeprom(struct cx23885_dev *dev, u8 *eeprom_data)
                        dev->name, tv.model);
 }
 
-int cx23885_tuner_callback(void *priv, int command, int arg)
+int cx23885_tuner_callback(void *priv, int component, int command, int arg)
 {
        struct cx23885_tsport *port = priv;
        struct cx23885_dev *dev = port->dev;
index 3b54f13..6c5475d 100644 (file)
@@ -189,13 +189,11 @@ static struct s5h1411_config dvico_s5h1411_config = {
 static struct xc5000_config hauppauge_hvr1500q_tunerconfig = {
        .i2c_address      = 0x61,
        .if_khz           = 5380,
-       .tuner_callback   = cx23885_tuner_callback,
 };
 
 static struct xc5000_config dvico_xc5000_tunerconfig = {
        .i2c_address      = 0x64,
        .if_khz           = 5380,
-       .tuner_callback   = cx23885_tuner_callback,
 };
 
 static struct tda829x_config tda829x_no_probe = {
@@ -403,8 +401,6 @@ static int dvb_register(struct cx23885_tsport *port)
                        struct xc2028_config cfg = {
                                .i2c_adap  = &i2c_bus->i2c_adap,
                                .i2c_addr  = 0x61,
-                               .video_dev = port,
-                               .callback  = cx23885_tuner_callback,
                        };
                        static struct xc2028_ctrl ctl = {
                                .fname       = XC2028_DEFAULT_FIRMWARE,
@@ -443,8 +439,6 @@ static int dvb_register(struct cx23885_tsport *port)
                        struct xc2028_config cfg = {
                                .i2c_adap  = &dev->i2c_bus[1].i2c_adap,
                                .i2c_addr  = 0x64,
-                               .video_dev = port,
-                               .callback  = cx23885_tuner_callback,
                        };
                        static struct xc2028_ctrl ctl = {
                                .fname   = XC3028L_DEFAULT_FIRMWARE,
@@ -485,8 +479,6 @@ static int dvb_register(struct cx23885_tsport *port)
                        struct xc2028_config      cfg = {
                                .i2c_adap  = &i2c_bus->i2c_adap,
                                .i2c_addr  = 0x61,
-                               .video_dev = port,
-                               .callback  = cx23885_tuner_callback,
                        };
                        static struct xc2028_ctrl ctl = {
                                .fname       = XC2028_DEFAULT_FIRMWARE,
@@ -512,8 +504,6 @@ static int dvb_register(struct cx23885_tsport *port)
                        struct xc2028_config      cfg = {
                                .i2c_adap  = &dev->i2c_bus[1].i2c_adap,
                                .i2c_addr  = 0x61,
-                               .video_dev = port,
-                               .callback  = cx23885_tuner_callback,
                        };
                        static struct xc2028_ctrl ctl = {
                                .fname       = XC2028_DEFAULT_FIRMWARE,
@@ -536,6 +526,8 @@ static int dvb_register(struct cx23885_tsport *port)
                printk("%s: frontend initialization failed\n", dev->name);
                return -1;
        }
+       /* define general-purpose callback pointer */
+       port->dvb.frontend->callback = cx23885_tuner_callback;
 
        /* Put the analog decoder in standby to keep it quiet */
        cx23885_call_i2c_clients(i2c_bus, TUNER_SET_STANDBY, NULL);
index 4e0fcb3..ba4e0aa 100644 (file)
@@ -411,7 +411,7 @@ extern const unsigned int cx23885_bcount;
 extern struct cx23885_subid cx23885_subids[];
 extern const unsigned int cx23885_idcount;
 
-extern int cx23885_tuner_callback(void *priv, int command, int arg);
+extern int cx23885_tuner_callback(void *priv, int component, int command, int arg);
 extern void cx23885_card_list(struct cx23885_dev *dev);
 extern int  cx23885_ir_init(struct cx23885_dev *dev);
 extern void cx23885_gpio_setup(struct cx23885_dev *dev);
index 16bb9c3..b5a2509 100644 (file)
@@ -2308,9 +2308,21 @@ static int cx88_dvico_xc2028_callback(struct cx88_core *core,
 {
        switch (command) {
        case XC2028_TUNER_RESET:
-               cx_write(MO_GP0_IO, 0x101000);
-               mdelay(5);
-               cx_set(MO_GP0_IO, 0x101010);
+               switch (core->boardnr) {
+               case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
+                       /* GPIO-4 xc3028 tuner */
+
+                       cx_set(MO_GP0_IO, 0x00001000);
+                       cx_clear(MO_GP0_IO, 0x00000010);
+                       msleep(100);
+                       cx_set(MO_GP0_IO, 0x00000010);
+                       msleep(100);
+                       break;
+               default:
+                       cx_write(MO_GP0_IO, 0x101000);
+                       mdelay(5);
+                       cx_set(MO_GP0_IO, 0x101010);
+               }
                break;
        default:
                return -EINVAL;
@@ -2419,6 +2431,7 @@ static int cx88_xc2028_tuner_callback(struct cx88_core *core,
        case CX88_BOARD_PROLINK_PV_8000GT:
                return cx88_pv_8000gt_callback(core, command, arg);
        case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
+       case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
                return cx88_dvico_xc2028_callback(core, command, arg);
        }
 
@@ -2486,7 +2499,7 @@ static int cx88_xc5000_tuner_callback(struct cx88_core *core,
        return 0; /* Should never be here */
 }
 
-int cx88_tuner_callback(void *priv, int command, int arg)
+int cx88_tuner_callback(void *priv, int component, int command, int arg)
 {
        struct i2c_algo_bit_data *i2c_algo = priv;
        struct cx88_core *core;
@@ -2503,6 +2516,9 @@ int cx88_tuner_callback(void *priv, int command, int arg)
                return -EINVAL;
        }
 
+       if (component != DVB_FRONTEND_COMPONENT_TUNER)
+               return -EINVAL;
+
        switch (core->board.tuner_type) {
                case TUNER_XC2028:
                        info_printk(core, "Calling XC2028/3028 callback\n");
index cd368b5..6751f36 100644 (file)
@@ -405,40 +405,6 @@ static int tevii_dvbs_set_voltage(struct dvb_frontend *fe,
        return 0;
 }
 
-static int cx88_pci_nano_callback(void *ptr, int command, int arg)
-{
-       struct cx88_core *core = ptr;
-
-       switch (command) {
-       case XC2028_TUNER_RESET:
-               /* Send the tuner in then out of reset */
-               dprintk(1, "%s: XC2028_TUNER_RESET %d\n", __func__, arg);
-
-               switch (core->boardnr) {
-               case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
-                       /* GPIO-4 xc3028 tuner */
-
-                       cx_set(MO_GP0_IO, 0x00001000);
-                       cx_clear(MO_GP0_IO, 0x00000010);
-                       msleep(100);
-                       cx_set(MO_GP0_IO, 0x00000010);
-                       msleep(100);
-                       break;
-               }
-
-               break;
-       case XC2028_RESET_CLK:
-               dprintk(1, "%s: XC2028_RESET_CLK %d\n", __func__, arg);
-               break;
-       default:
-               dprintk(1, "%s: unknown command %d, arg %d\n", __func__,
-                       command, arg);
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
 static struct cx24123_config geniatech_dvbs_config = {
        .demod_address = 0x55,
        .set_ts_params = cx24123_set_ts_param,
@@ -486,7 +452,6 @@ static struct s5h1409_config kworld_atsc_120_config = {
 static struct xc5000_config pinnacle_pctv_hd_800i_tuner_config = {
        .i2c_address    = 0x64,
        .if_khz         = 5380,
-       .tuner_callback = cx88_tuner_callback,
 };
 
 static struct zl10353_config cx88_geniatech_x8000_mt = {
@@ -507,7 +472,6 @@ static struct s5h1411_config dvico_fusionhdtv7_config = {
 static struct xc5000_config dvico_fusionhdtv7_tuner_config = {
        .i2c_address    = 0xc2 >> 1,
        .if_khz         = 5380,
-       .tuner_callback = cx88_tuner_callback,
 };
 
 static int attach_xc3028(u8 addr, struct cx8802_dev *dev)
@@ -518,7 +482,6 @@ static int attach_xc3028(u8 addr, struct cx8802_dev *dev)
                .i2c_adap  = &dev->core->i2c_adap,
                .i2c_addr  = addr,
                .ctrl      = &ctl,
-               .callback  = cx88_tuner_callback,
        };
 
        if (!dev->dvb.frontend) {
@@ -912,7 +875,6 @@ static int dvb_register(struct cx8802_dev *dev)
                        struct xc2028_config cfg = {
                                .i2c_adap  = &core->i2c_adap,
                                .i2c_addr  = 0x61,
-                               .callback  = cx88_pci_nano_callback,
                        };
                        static struct xc2028_ctrl ctl = {
                                .fname       = XC2028_DEFAULT_FIRMWARE,
@@ -1035,6 +997,8 @@ static int dvb_register(struct cx8802_dev *dev)
                       core->name);
                return -EINVAL;
        }
+       /* define general-purpose callback pointer */
+       dev->dvb.frontend->callback = cx88_tuner_callback;
 
        /* Ensure all frontends negotiate bus access */
        dev->dvb.frontend->ops.ts_bus_ctrl = cx88_dvb_bus_ctrl;
index e17bd51..30b750e 100644 (file)
@@ -607,7 +607,7 @@ extern void cx88_call_i2c_clients(struct cx88_core *core,
 /* ----------------------------------------------------------- */
 /* cx88-cards.c                                                */
 
-extern int cx88_tuner_callback(void *dev, int command, int arg);
+extern int cx88_tuner_callback(void *dev, int component, int command, int arg);
 extern int cx88_get_resources(const struct cx88_core *core,
                              struct pci_dev *pci);
 extern struct cx88_core *cx88_core_create(struct pci_dev *pci, int nr);
index 01804fa..d65d057 100644 (file)
@@ -1271,7 +1271,7 @@ static struct em28xx_hash_table em28xx_i2c_hash[] = {
        {0x1ba50080, EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA, TUNER_ABSENT},
 };
 
-int em28xx_tuner_callback(void *ptr, int command, int arg)
+int em28xx_tuner_callback(void *ptr, int component, int command, int arg)
 {
        int rc = 0;
        struct em28xx *dev = ptr;
index ea4f2a9..855ad39 100644 (file)
@@ -249,7 +249,6 @@ static int attach_xc3028(u8 addr, struct em28xx *dev)
        memset(&cfg, 0, sizeof(cfg));
        cfg.i2c_adap  = &dev->i2c_adap;
        cfg.i2c_addr  = addr;
-       cfg.callback  = em28xx_tuner_callback;
 
        if (!dev->dvb->frontend) {
                printk(KERN_ERR "%s/2: dvb frontend not attached. "
@@ -474,6 +473,8 @@ static int dvb_init(struct em28xx *dev)
                result = -EINVAL;
                goto out_free;
        }
+       /* define general-purpose callback pointer */
+       dvb->frontend->callback = em28xx_tuner_callback;
 
        /* register everything */
        result = register_dvb(dvb, THIS_MODULE, dev, &dev->udev->dev);
index d992280..8278117 100644 (file)
@@ -528,7 +528,7 @@ extern struct em28xx_board em28xx_boards[];
 extern struct usb_device_id em28xx_id_table[];
 extern const unsigned int em28xx_bcount;
 void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir);
-int em28xx_tuner_callback(void *ptr, int command, int arg);
+int em28xx_tuner_callback(void *ptr, int component, int command, int arg);
 
 /* Provided by em28xx-input.c */
 /* TODO: Check if the standard get_key handlers on ir-common can be used */
index bc22905..74a4484 100644 (file)
@@ -124,7 +124,7 @@ void ivtv_reset_ir_gpio(struct ivtv *itv)
 }
 
 /* Xceive tuner reset function */
-int ivtv_reset_tuner_gpio(void *dev, int cmd, int value)
+int ivtv_reset_tuner_gpio(void *dev, int component, int cmd, int value)
 {
        struct i2c_algo_bit_data *algo = dev;
        struct ivtv *itv = algo->data;
index 964a265..48b6291 100644 (file)
@@ -24,7 +24,7 @@
 /* GPIO stuff */
 void ivtv_gpio_init(struct ivtv *itv);
 void ivtv_reset_ir_gpio(struct ivtv *itv);
-int ivtv_reset_tuner_gpio(void *dev, int cmd, int value);
+int ivtv_reset_tuner_gpio(void *dev, int component, int cmd, int value);
 int ivtv_gpio(struct ivtv *itv, unsigned int command, void *arg);
 
 #endif
index 3c2f09f..622d3ba 100644 (file)
@@ -5576,7 +5576,7 @@ static int saa7134_tda8290_callback(struct saa7134_dev *dev,
        return 0;
 }
 
-int saa7134_tuner_callback(void *priv, int command, int arg)
+int saa7134_tuner_callback(void *priv, int component, int command, int arg)
 {
        struct saa7134_dev *dev = priv;
        if (dev != NULL) {
index 7fa6ce7..0dd6b98 100644 (file)
@@ -553,7 +553,6 @@ static int configure_tda827x_fe(struct saa7134_dev *dev,
 /* ------------------------------------------------------------------ */
 
 static struct tda827x_config tda827x_cfg_0 = {
-       .tuner_callback = saa7134_tuner_callback,
        .init = philips_tda827x_tuner_init,
        .sleep = philips_tda827x_tuner_sleep,
        .config = 0,
@@ -561,7 +560,6 @@ static struct tda827x_config tda827x_cfg_0 = {
 };
 
 static struct tda827x_config tda827x_cfg_1 = {
-       .tuner_callback = saa7134_tuner_callback,
        .init = philips_tda827x_tuner_init,
        .sleep = philips_tda827x_tuner_sleep,
        .config = 1,
@@ -569,7 +567,6 @@ static struct tda827x_config tda827x_cfg_1 = {
 };
 
 static struct tda827x_config tda827x_cfg_2 = {
-       .tuner_callback = saa7134_tuner_callback,
        .init = philips_tda827x_tuner_init,
        .sleep = philips_tda827x_tuner_sleep,
        .config = 2,
@@ -577,7 +574,6 @@ static struct tda827x_config tda827x_cfg_2 = {
 };
 
 static struct tda827x_config tda827x_cfg_2_sw42 = {
-       .tuner_callback = saa7134_tuner_callback,
        .init = philips_tda827x_tuner_init,
        .sleep = philips_tda827x_tuner_sleep,
        .config = 2,
@@ -836,7 +832,6 @@ static int ads_duo_tuner_sleep(struct dvb_frontend *fe)
 }
 
 static struct tda827x_config ads_duo_cfg = {
-       .tuner_callback = saa7134_tuner_callback,
        .init = ads_duo_tuner_init,
        .sleep = ads_duo_tuner_sleep,
        .config = 0
@@ -1366,6 +1361,8 @@ static int dvb_init(struct saa7134_dev *dev)
                printk(KERN_ERR "%s/dvb: frontend initialization failed\n", dev->name);
                return -1;
        }
+       /* define general-purpose callback pointer */
+       dev->dvb.frontend->callback = saa7134_tuner_callback;
 
        /* register everything else */
        ret = videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev, &dev->pci->dev,
index cbfdac2..4005335 100644 (file)
@@ -653,7 +653,7 @@ extern struct pci_device_id __devinitdata saa7134_pci_tbl[];
 
 extern int saa7134_board_init1(struct saa7134_dev *dev);
 extern int saa7134_board_init2(struct saa7134_dev *dev);
-int saa7134_tuner_callback(void *priv, int command, int arg);
+int saa7134_tuner_callback(void *priv, int component, int command, int arg);
 
 
 /* ----------------------------------------------------------- */
index 39c7b9b..4a7735c 100644 (file)
@@ -92,7 +92,6 @@ struct tuner {
 
        unsigned int        type; /* chip type id */
        unsigned int        config;
-       int (*tuner_callback) (void *dev, int command, int arg);
        const char          *name;
 };
 
@@ -346,7 +345,7 @@ static struct xc5000_config xc5000_cfg;
 
 static void set_type(struct i2c_client *c, unsigned int type,
                     unsigned int new_mode_mask, unsigned int new_config,
-                    int (*tuner_callback) (void *dev, int command,int arg))
+                    int (*tuner_callback) (void *dev, int component, int cmd, int arg))
 {
        struct tuner *t = i2c_get_clientdata(c);
        struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
@@ -362,7 +361,7 @@ static void set_type(struct i2c_client *c, unsigned int type,
        t->config = new_config;
        if (tuner_callback != NULL) {
                tuner_dbg("defining GPIO callback\n");
-               t->tuner_callback = tuner_callback;
+               t->fe.callback = tuner_callback;
        }
 
        if (t->mode == T_UNINITIALIZED) {
@@ -385,7 +384,6 @@ static void set_type(struct i2c_client *c, unsigned int type,
        {
                struct tda829x_config cfg = {
                        .lna_cfg        = t->config,
-                       .tuner_callback = t->tuner_callback,
                };
                if (!dvb_attach(tda829x_attach, &t->fe, t->i2c->adapter,
                                t->i2c->addr, &cfg))
@@ -433,7 +431,6 @@ static void set_type(struct i2c_client *c, unsigned int type,
                struct xc2028_config cfg = {
                        .i2c_adap  = t->i2c->adapter,
                        .i2c_addr  = t->i2c->addr,
-                       .callback  = t->tuner_callback,
                };
                if (!dvb_attach(xc2028_attach, &t->fe, &cfg))
                        goto attach_failed;
@@ -450,7 +447,6 @@ static void set_type(struct i2c_client *c, unsigned int type,
 
                xc5000_cfg.i2c_address    = t->i2c->addr;
                xc5000_cfg.if_khz         = 5380;
-               xc5000_cfg.tuner_callback = t->tuner_callback;
                if (!dvb_attach(xc5000_attach,
                                &t->fe, t->i2c->adapter, &xc5000_cfg))
                        goto attach_failed;
@@ -1224,7 +1220,7 @@ register_client:
        } else {
                t->mode = V4L2_TUNER_DIGITAL_TV;
        }
-       set_type(client, t->type, t->mode_mask, t->config, t->tuner_callback);
+       set_type(client, t->type, t->mode_mask, t->config, t->fe.callback);
        list_add_tail(&t->list, &tuner_list);
        return 0;
 }
index ba81898..67c1f51 100644 (file)
@@ -179,7 +179,7 @@ struct tuner_setup {
        unsigned int    type;   /* Tuner type */
        unsigned int    mode_mask;  /* Allowed tuner modes */
        unsigned int    config; /* configuraion for more complex tuners */
-       int (*tuner_callback) (void *dev, int command,int arg);
+       int (*tuner_callback) (void *dev, int component, int cmd, int arg);
 };
 
 #endif /* __KERNEL__ */