V4L/DVB (12540): v4l: simplify v4l2_i2c_new_subdev and friends
Hans Verkuil [Mon, 10 Aug 2009 05:49:08 +0000 (02:49 -0300)]
Rewrite v4l2_i2c_new_subdev as a simplified version of v4l2_i2c_new_subdev_cfg
and remove v4l2_i2c_new_probed_subdev and v4l2_i2c_new_probed_subdev_addr.

This simplifies this API substantially.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

23 files changed:
Documentation/video4linux/v4l2-framework.txt
drivers/media/video/au0828/au0828-cards.c
drivers/media/video/bt8xx/bttv-cards.c
drivers/media/video/cafe_ccic.c
drivers/media/video/cx18/cx18-i2c.c
drivers/media/video/cx231xx/cx231xx-cards.c
drivers/media/video/cx23885/cx23885-cards.c
drivers/media/video/cx23885/cx23885-video.c
drivers/media/video/cx88/cx88-cards.c
drivers/media/video/cx88/cx88-video.c
drivers/media/video/davinci/vpif_display.c
drivers/media/video/em28xx/em28xx-cards.c
drivers/media/video/ivtv/ivtv-i2c.c
drivers/media/video/mxb.c
drivers/media/video/pvrusb2/pvrusb2-hdw.c
drivers/media/video/saa7134/saa7134-cards.c
drivers/media/video/saa7134/saa7134-core.c
drivers/media/video/usbvision/usbvision-i2c.c
drivers/media/video/v4l2-common.c
drivers/media/video/vino.c
drivers/media/video/w9968cf.c
drivers/media/video/zoran/zoran_card.c
include/media/v4l2-common.h

index ba4706a..e395a9c 100644 (file)
@@ -370,19 +370,20 @@ from the remove() callback ensures that this is always done correctly.
 The bridge driver also has some helper functions it can use:
 
 struct v4l2_subdev *sd = v4l2_i2c_new_subdev(v4l2_dev, adapter,
-              "module_foo", "chipid", 0x36);
+              "module_foo", "chipid", 0x36, NULL);
 
 This loads the given module (can be NULL if no module needs to be loaded) and
 calls i2c_new_device() with the given i2c_adapter and chip/address arguments.
 If all goes well, then it registers the subdev with the v4l2_device.
 
-You can also use v4l2_i2c_new_probed_subdev() which is very similar to
-v4l2_i2c_new_subdev(), except that it has an array of possible I2C addresses
-that it should probe. Internally it calls i2c_new_probed_device().
+You can also use the last argument of v4l2_i2c_new_subdev() to pass an array
+of possible I2C addresses that it should probe. These probe addresses are
+only used if the previous argument is 0. A non-zero argument means that you
+know the exact i2c address so in that case no probing will take place.
 
 Both functions return NULL if something went wrong.
 
-Note that the chipid you pass to v4l2_i2c_new_(probed_)subdev() is usually
+Note that the chipid you pass to v4l2_i2c_new_subdev() is usually
 the same as the module name. It allows you to specify a chip variant, e.g.
 "saa7114" or "saa7115". In general though the i2c driver autodetects this.
 The use of chipid is something that needs to be looked at more closely at a
@@ -410,11 +411,6 @@ the irq and platform_data arguments after the subdev was setup. The older
 v4l2_i2c_new_(probed_)subdev functions will call s_config as well, but with
 irq set to 0 and platform_data set to NULL.
 
-Note that in the next kernel release the functions v4l2_i2c_new_subdev,
-v4l2_i2c_new_probed_subdev and v4l2_i2c_new_probed_subdev_addr will all be
-replaced by a single v4l2_i2c_new_subdev that is identical to
-v4l2_i2c_new_subdev_cfg but without the irq and platform_data arguments.
-
 struct video_device
 -------------------
 
index 830c4a9..57dd919 100644 (file)
@@ -212,7 +212,7 @@ void au0828_card_setup(struct au0828_dev *dev)
                   be abstracted out if we ever need to support a different
                   demod) */
                sd = v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
-                               "au8522", "au8522", 0x8e >> 1);
+                               "au8522", "au8522", 0x8e >> 1, NULL);
                if (sd == NULL)
                        printk(KERN_ERR "analog subdev registration failed\n");
        }
@@ -221,7 +221,7 @@ void au0828_card_setup(struct au0828_dev *dev)
        if (dev->board.tuner_type != TUNER_ABSENT) {
                /* Load the tuner module, which does the attach */
                sd = v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
-                               "tuner", "tuner", dev->board.tuner_addr);
+                               "tuner", "tuner", dev->board.tuner_addr, NULL);
                if (sd == NULL)
                        printk(KERN_ERR "tuner subdev registration fail\n");
 
index b42251f..12279f6 100644 (file)
@@ -3524,8 +3524,8 @@ void __devinit bttv_init_card2(struct bttv *btv)
                };
                struct v4l2_subdev *sd;
 
-               sd = v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
-                       &btv->c.i2c_adap, "saa6588", "saa6588", addrs);
+               sd = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
+                       &btv->c.i2c_adap, "saa6588", "saa6588", 0, addrs);
                btv->has_saa6588 = (sd != NULL);
        }
 
@@ -3549,8 +3549,8 @@ void __devinit bttv_init_card2(struct bttv *btv)
                        I2C_CLIENT_END
                };
 
-               btv->sd_msp34xx = v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
-                       &btv->c.i2c_adap, "msp3400", "msp3400", addrs);
+               btv->sd_msp34xx = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
+                       &btv->c.i2c_adap, "msp3400", "msp3400", 0, addrs);
                if (btv->sd_msp34xx)
                        return;
                goto no_audio;
@@ -3563,16 +3563,16 @@ void __devinit bttv_init_card2(struct bttv *btv)
                        I2C_CLIENT_END
                };
 
-               if (v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
-                               &btv->c.i2c_adap, "tda7432", "tda7432", addrs))
+               if (v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
+                               &btv->c.i2c_adap, "tda7432", "tda7432", 0, addrs))
                        return;
                goto no_audio;
        }
 
        case 3: {
                /* The user specified that we should probe for tvaudio */
-               btv->sd_tvaudio = v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
-                       &btv->c.i2c_adap, "tvaudio", "tvaudio", tvaudio_addrs());
+               btv->sd_tvaudio = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
+                       &btv->c.i2c_adap, "tvaudio", "tvaudio", 0, tvaudio_addrs());
                if (btv->sd_tvaudio)
                        return;
                goto no_audio;
@@ -3591,13 +3591,13 @@ void __devinit bttv_init_card2(struct bttv *btv)
           it really is a msp3400, so it will return NULL when the device
           found is really something else (e.g. a tea6300). */
        if (!bttv_tvcards[btv->c.type].no_msp34xx) {
-               btv->sd_msp34xx = v4l2_i2c_new_probed_subdev_addr(&btv->c.v4l2_dev,
+               btv->sd_msp34xx = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
                        &btv->c.i2c_adap, "msp3400", "msp3400",
-                       I2C_ADDR_MSP3400 >> 1);
+                       0, I2C_ADDRS(I2C_ADDR_MSP3400 >> 1));
        } else if (bttv_tvcards[btv->c.type].msp34xx_alt) {
-               btv->sd_msp34xx = v4l2_i2c_new_probed_subdev_addr(&btv->c.v4l2_dev,
+               btv->sd_msp34xx = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
                        &btv->c.i2c_adap, "msp3400", "msp3400",
-                       I2C_ADDR_MSP3400_ALT >> 1);
+                       0, I2C_ADDRS(I2C_ADDR_MSP3400_ALT >> 1));
        }
 
        /* If we found a msp34xx, then we're done. */
@@ -3611,14 +3611,14 @@ void __devinit bttv_init_card2(struct bttv *btv)
                        I2C_CLIENT_END
                };
 
-               if (v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
-                               &btv->c.i2c_adap, "tda7432", "tda7432", addrs))
+               if (v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
+                               &btv->c.i2c_adap, "tda7432", "tda7432", 0, addrs))
                        return;
        }
 
        /* Now see if we can find one of the tvaudio devices. */
-       btv->sd_tvaudio = v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
-               &btv->c.i2c_adap, "tvaudio", "tvaudio", tvaudio_addrs());
+       btv->sd_tvaudio = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
+               &btv->c.i2c_adap, "tvaudio", "tvaudio", 0, tvaudio_addrs());
        if (btv->sd_tvaudio)
                return;
 
@@ -3641,15 +3641,15 @@ void __devinit bttv_init_tuner(struct bttv *btv)
 
                /* Load tuner module before issuing tuner config call! */
                if (bttv_tvcards[btv->c.type].has_radio)
-                       v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
+                       v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
                                &btv->c.i2c_adap, "tuner", "tuner",
-                               v4l2_i2c_tuner_addrs(ADDRS_RADIO));
-               v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
+                               0, v4l2_i2c_tuner_addrs(ADDRS_RADIO));
+               v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
                                &btv->c.i2c_adap, "tuner", "tuner",
-                               v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
-               v4l2_i2c_new_probed_subdev(&btv->c.v4l2_dev,
+                               0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
+               v4l2_i2c_new_subdev(&btv->c.v4l2_dev,
                                &btv->c.i2c_adap, "tuner", "tuner",
-                               v4l2_i2c_tuner_addrs(ADDRS_TV_WITH_DEMOD));
+                               0, v4l2_i2c_tuner_addrs(ADDRS_TV_WITH_DEMOD));
 
                tun_setup.mode_mask = T_ANALOG_TV | T_DIGITAL_TV;
                tun_setup.type = btv->tuner_type;
index 9c149a7..657c481 100644 (file)
@@ -1955,7 +1955,7 @@ static int cafe_pci_probe(struct pci_dev *pdev,
 
        cam->sensor_addr = 0x42;
        cam->sensor = v4l2_i2c_new_subdev(&cam->v4l2_dev, &cam->i2c_adapter,
-                       "ov7670", "ov7670", cam->sensor_addr);
+                       "ov7670", "ov7670", cam->sensor_addr, NULL);
        if (cam->sensor == NULL) {
                ret = -ENODEV;
                goto out_smbus;
index dbbf93d..2477461 100644 (file)
@@ -139,16 +139,16 @@ int cx18_i2c_register(struct cx18 *cx, unsigned idx)
 
        if (hw == CX18_HW_TUNER) {
                /* special tuner group handling */
-               sd = v4l2_i2c_new_probed_subdev(&cx->v4l2_dev,
-                               adap, mod, type, cx->card_i2c->radio);
+               sd = v4l2_i2c_new_subdev(&cx->v4l2_dev,
+                               adap, mod, type, 0, cx->card_i2c->radio);
                if (sd != NULL)
                        sd->grp_id = hw;
-               sd = v4l2_i2c_new_probed_subdev(&cx->v4l2_dev,
-                               adap, mod, type, cx->card_i2c->demod);
+               sd = v4l2_i2c_new_subdev(&cx->v4l2_dev,
+                               adap, mod, type, 0, cx->card_i2c->demod);
                if (sd != NULL)
                        sd->grp_id = hw;
-               sd = v4l2_i2c_new_probed_subdev(&cx->v4l2_dev,
-                               adap, mod, type, cx->card_i2c->tv);
+               sd = v4l2_i2c_new_subdev(&cx->v4l2_dev,
+                               adap, mod, type, 0, cx->card_i2c->tv);
                if (sd != NULL)
                        sd->grp_id = hw;
                return sd != NULL ? 0 : -1;
@@ -162,7 +162,7 @@ int cx18_i2c_register(struct cx18 *cx, unsigned idx)
                return -1;
 
        /* It's an I2C device other than an analog tuner or IR chip */
-       sd = v4l2_i2c_new_subdev(&cx->v4l2_dev, adap, mod, type, hw_addrs[idx]);
+       sd = v4l2_i2c_new_subdev(&cx->v4l2_dev, adap, mod, type, hw_addrs[idx], NULL);
        if (sd != NULL)
                sd->grp_id = hw;
        return sd != NULL ? 0 : -1;
index 63d2239..319c459 100644 (file)
@@ -313,7 +313,7 @@ void cx231xx_card_setup(struct cx231xx *dev)
        if (dev->board.decoder == CX231XX_AVDECODER) {
                dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev,
                                        &dev->i2c_bus[0].i2c_adap,
-                                       "cx25840", "cx25840", 0x88 >> 1);
+                                       "cx25840", "cx25840", 0x88 >> 1, NULL);
                if (dev->sd_cx25840 == NULL)
                        cx231xx_info("cx25840 subdev registration failure\n");
                cx25840_call(dev, core, load_fw);
@@ -323,7 +323,7 @@ void cx231xx_card_setup(struct cx231xx *dev)
        if (dev->board.tuner_type != TUNER_ABSENT) {
                dev->sd_tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev,
                                &dev->i2c_bus[1].i2c_adap,
-                               "tuner", "tuner", 0xc2 >> 1);
+                               "tuner", "tuner", 0xc2 >> 1, NULL);
                if (dev->sd_tuner == NULL)
                        cx231xx_info("tuner subdev registration failure\n");
 
index 3143d85..02ba4ae 100644 (file)
@@ -929,7 +929,7 @@ void cx23885_card_setup(struct cx23885_dev *dev)
        case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
                dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev,
                                &dev->i2c_bus[2].i2c_adap,
-                               "cx25840", "cx25840", 0x88 >> 1);
+                               "cx25840", "cx25840", 0x88 >> 1, NULL);
                v4l2_subdev_call(dev->sd_cx25840, core, load_fw);
                break;
        }
index 5d60933..654cc25 100644 (file)
@@ -1521,11 +1521,11 @@ int cx23885_video_register(struct cx23885_dev *dev)
                if (dev->tuner_addr)
                        sd = v4l2_i2c_new_subdev(&dev->v4l2_dev,
                                &dev->i2c_bus[1].i2c_adap,
-                               "tuner", "tuner", dev->tuner_addr);
+                               "tuner", "tuner", dev->tuner_addr, NULL);
                else
-                       sd = v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
+                       sd = v4l2_i2c_new_subdev(&dev->v4l2_dev,
                                &dev->i2c_bus[1].i2c_adap,
-                               "tuner", "tuner", v4l2_i2c_tuner_addrs(ADDRS_TV));
+                               "tuner", "tuner", 0, v4l2_i2c_tuner_addrs(ADDRS_TV));
                if (sd) {
                        struct tuner_setup tun_setup;
 
index e5f07fb..33be636 100644 (file)
@@ -3439,20 +3439,20 @@ struct cx88_core *cx88_core_create(struct pci_dev *pci, int nr)
                   The radio_type is sometimes missing, or set to UNSET but
                   later code configures a tea5767.
                 */
-               v4l2_i2c_new_probed_subdev(&core->v4l2_dev, &core->i2c_adap,
+               v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,
                                "tuner", "tuner",
-                               v4l2_i2c_tuner_addrs(ADDRS_RADIO));
+                               0, v4l2_i2c_tuner_addrs(ADDRS_RADIO));
                if (has_demod)
-                       v4l2_i2c_new_probed_subdev(&core->v4l2_dev,
+                       v4l2_i2c_new_subdev(&core->v4l2_dev,
                                &core->i2c_adap, "tuner", "tuner",
-                               v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
+                               0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
                if (core->board.tuner_addr == ADDR_UNSET) {
-                       v4l2_i2c_new_probed_subdev(&core->v4l2_dev,
+                       v4l2_i2c_new_subdev(&core->v4l2_dev,
                                &core->i2c_adap, "tuner", "tuner",
-                               has_demod ? tv_addrs + 4 : tv_addrs);
+                               0, has_demod ? tv_addrs + 4 : tv_addrs);
                } else {
                        v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,
-                               "tuner", "tuner", core->board.tuner_addr);
+                               "tuner", "tuner", core->board.tuner_addr, NULL);
                }
        }
 
index 2bb54c3..81d2b5d 100644 (file)
@@ -1881,14 +1881,14 @@ static int __devinit cx8800_initdev(struct pci_dev *pci_dev,
 
        if (core->board.audio_chip == V4L2_IDENT_WM8775)
                v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,
-                               "wm8775", "wm8775", 0x36 >> 1);
+                               "wm8775", "wm8775", 0x36 >> 1, NULL);
 
        if (core->board.audio_chip == V4L2_IDENT_TVAUDIO) {
                /* This probes for a tda9874 as is used on some
                   Pixelview Ultra boards. */
-               v4l2_i2c_new_probed_subdev_addr(&core->v4l2_dev,
+               v4l2_i2c_new_subdev(&core->v4l2_dev,
                                &core->i2c_adap,
-                               "tvaudio", "tvaudio", 0xb0 >> 1);
+                               "tvaudio", "tvaudio", 0, I2C_ADDRS(0xb0 >> 1));
        }
 
        switch (core->boardnr) {
index 8ea65d7..a125a45 100644 (file)
@@ -1566,10 +1566,10 @@ static __init int vpif_probe(struct platform_device *pdev)
        }
 
        for (i = 0; i < subdev_count; i++) {
-               vpif_obj.sd[i] = v4l2_i2c_new_probed_subdev(&vpif_obj.v4l2_dev,
+               vpif_obj.sd[i] = v4l2_i2c_new_subdev(&vpif_obj.v4l2_dev,
                                                i2c_adap, subdevdata[i].name,
                                                subdevdata[i].name,
-                                               &subdevdata[i].addr);
+                                               0, I2C_ADDRS(subdevdata[i].addr));
                if (!vpif_obj.sd[i]) {
                        vpif_err("Error registering v4l2 subdevice\n");
                        goto probe_subdev_out;
index 8a5ce81..bdb249b 100644 (file)
@@ -2372,55 +2372,55 @@ void em28xx_card_setup(struct em28xx *dev)
 
        /* request some modules */
        if (dev->board.has_msp34xx)
-               v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap,
-                       "msp3400", "msp3400", msp3400_addrs);
+               v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
+                       "msp3400", "msp3400", 0, msp3400_addrs);
 
        if (dev->board.decoder == EM28XX_SAA711X)
-               v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap,
-                       "saa7115", "saa7115_auto", saa711x_addrs);
+               v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
+                       "saa7115", "saa7115_auto", 0, saa711x_addrs);
 
        if (dev->board.decoder == EM28XX_TVP5150)
-               v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap,
-                       "tvp5150", "tvp5150", tvp5150_addrs);
+               v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
+                       "tvp5150", "tvp5150", 0, tvp5150_addrs);
 
        if (dev->em28xx_sensor == EM28XX_MT9V011) {
                struct v4l2_subdev *sd;
 
-               sd = v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
-                        &dev->i2c_adap, "mt9v011", "mt9v011", mt9v011_addrs);
+               sd = v4l2_i2c_new_subdev(&dev->v4l2_dev,
+                        &dev->i2c_adap, "mt9v011", "mt9v011", 0, mt9v011_addrs);
                v4l2_subdev_call(sd, core, s_config, 0, &dev->sensor_xtal);
        }
 
 
        if (dev->board.adecoder == EM28XX_TVAUDIO)
                v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
-                       "tvaudio", "tvaudio", dev->board.tvaudio_addr);
+                       "tvaudio", "tvaudio", dev->board.tvaudio_addr, NULL);
 
        if (dev->board.tuner_type != TUNER_ABSENT) {
                int has_demod = (dev->tda9887_conf & TDA9887_PRESENT);
 
                if (dev->board.radio.type)
                        v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
-                               "tuner", "tuner", dev->board.radio_addr);
+                               "tuner", "tuner", dev->board.radio_addr, NULL);
 
                if (has_demod)
-                       v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
+                       v4l2_i2c_new_subdev(&dev->v4l2_dev,
                                &dev->i2c_adap, "tuner", "tuner",
-                               v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
+                               0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
                if (dev->tuner_addr == 0) {
                        enum v4l2_i2c_tuner_type type =
                                has_demod ? ADDRS_TV_WITH_DEMOD : ADDRS_TV;
                        struct v4l2_subdev *sd;
 
-                       sd = v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
+                       sd = v4l2_i2c_new_subdev(&dev->v4l2_dev,
                                &dev->i2c_adap, "tuner", "tuner",
-                               v4l2_i2c_tuner_addrs(type));
+                               0, v4l2_i2c_tuner_addrs(type));
 
                        if (sd)
                                dev->tuner_addr = v4l2_i2c_subdev_addr(sd);
                } else {
                        v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
-                               "tuner", "tuner", dev->tuner_addr);
+                               "tuner", "tuner", dev->tuner_addr, NULL);
                }
        }
 
index 8f15a31..b9c71e6 100644 (file)
@@ -161,19 +161,19 @@ int ivtv_i2c_register(struct ivtv *itv, unsigned idx)
                return -1;
        if (hw == IVTV_HW_TUNER) {
                /* special tuner handling */
-               sd = v4l2_i2c_new_probed_subdev(&itv->v4l2_dev,
+               sd = v4l2_i2c_new_subdev(&itv->v4l2_dev,
                                adap, mod, type,
-                               itv->card_i2c->radio);
+                               0, itv->card_i2c->radio);
                if (sd)
                        sd->grp_id = 1 << idx;
-               sd = v4l2_i2c_new_probed_subdev(&itv->v4l2_dev,
+               sd = v4l2_i2c_new_subdev(&itv->v4l2_dev,
                                adap, mod, type,
-                               itv->card_i2c->demod);
+                               0, itv->card_i2c->demod);
                if (sd)
                        sd->grp_id = 1 << idx;
-               sd = v4l2_i2c_new_probed_subdev(&itv->v4l2_dev,
+               sd = v4l2_i2c_new_subdev(&itv->v4l2_dev,
                                adap, mod, type,
-                               itv->card_i2c->tv);
+                               0, itv->card_i2c->tv);
                if (sd)
                        sd->grp_id = 1 << idx;
                return sd ? 0 : -1;
@@ -181,11 +181,11 @@ int ivtv_i2c_register(struct ivtv *itv, unsigned idx)
        if (!hw_addrs[idx])
                return -1;
        if (hw == IVTV_HW_UPD64031A || hw == IVTV_HW_UPD6408X) {
-               sd = v4l2_i2c_new_probed_subdev_addr(&itv->v4l2_dev,
-                               adap, mod, type, hw_addrs[idx]);
+               sd = v4l2_i2c_new_subdev(&itv->v4l2_dev,
+                               adap, mod, type, 0, I2C_ADDRS(hw_addrs[idx]));
        } else {
                sd = v4l2_i2c_new_subdev(&itv->v4l2_dev,
-                               adap, mod, type, hw_addrs[idx]);
+                               adap, mod, type, hw_addrs[idx], NULL);
        }
        if (sd)
                sd->grp_id = 1 << idx;
index 35890e8..3454070 100644 (file)
@@ -186,19 +186,19 @@ static int mxb_probe(struct saa7146_dev *dev)
        }
 
        mxb->saa7111a = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
-                       "saa7115", "saa7111", I2C_SAA7111A);
+                       "saa7115", "saa7111", I2C_SAA7111A, NULL);
        mxb->tea6420_1 = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
-                       "tea6420", "tea6420", I2C_TEA6420_1);
+                       "tea6420", "tea6420", I2C_TEA6420_1, NULL);
        mxb->tea6420_2 = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
-                       "tea6420", "tea6420", I2C_TEA6420_2);
+                       "tea6420", "tea6420", I2C_TEA6420_2, NULL);
        mxb->tea6415c = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
-                       "tea6415c", "tea6415c", I2C_TEA6415C);
+                       "tea6415c", "tea6415c", I2C_TEA6415C, NULL);
        mxb->tda9840 = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
-                       "tda9840", "tda9840", I2C_TDA9840);
+                       "tda9840", "tda9840", I2C_TDA9840, NULL);
        mxb->tuner = v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
-                       "tuner", "tuner", I2C_TUNER);
+                       "tuner", "tuner", I2C_TUNER, NULL);
        if (v4l2_i2c_new_subdev(&dev->v4l2_dev, &mxb->i2c_adapter,
-                       "saa5246a", "saa5246a", I2C_SAA5246A)) {
+                       "saa5246a", "saa5246a", I2C_SAA5246A, NULL)) {
                printk(KERN_INFO "mxb: found teletext decoder\n");
        }
 
index cbc3887..13639b3 100644 (file)
@@ -2063,8 +2063,8 @@ static int pvr2_hdw_load_subdev(struct pvr2_hdw *hdw,
                return -EINVAL;
        }
 
-       /* Note how the 2nd and 3rd arguments are the same for both
-        * v4l2_i2c_new_subdev() and v4l2_i2c_new_probed_subdev().  Why?
+       /* Note how the 2nd and 3rd arguments are the same for
+        * v4l2_i2c_new_subdev().  Why?
         * Well the 2nd argument is the module name to load, while the 3rd
         * argument is documented in the framework as being the "chipid" -
         * and every other place where I can find examples of this, the
@@ -2077,15 +2077,15 @@ static int pvr2_hdw_load_subdev(struct pvr2_hdw *hdw,
                           mid, i2caddr[0]);
                sd = v4l2_i2c_new_subdev(&hdw->v4l2_dev, &hdw->i2c_adap,
                                         fname, fname,
-                                        i2caddr[0]);
+                                        i2caddr[0], NULL);
        } else {
                pvr2_trace(PVR2_TRACE_INIT,
                           "Module ID %u:"
                           " Setting up with address probe list",
                           mid);
-               sd = v4l2_i2c_new_probed_subdev(&hdw->v4l2_dev, &hdw->i2c_adap,
+               sd = v4l2_i2c_new_subdev(&hdw->v4l2_dev, &hdw->i2c_adap,
                                                fname, fname,
-                                               i2caddr);
+                                               0, i2caddr);
        }
 
        if (!sd) {
index 1b29487..14b9ba4 100644 (file)
@@ -7208,22 +7208,22 @@ int saa7134_board_init2(struct saa7134_dev *dev)
                if (dev->radio_type != UNSET)
                        v4l2_i2c_new_subdev(&dev->v4l2_dev,
                                &dev->i2c_adap, "tuner", "tuner",
-                               dev->radio_addr);
+                               dev->radio_addr, NULL);
                if (has_demod)
-                       v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
+                       v4l2_i2c_new_subdev(&dev->v4l2_dev,
                                &dev->i2c_adap, "tuner", "tuner",
-                               v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
+                               0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
                if (dev->tuner_addr == ADDR_UNSET) {
                        enum v4l2_i2c_tuner_type type =
                                has_demod ? ADDRS_TV_WITH_DEMOD : ADDRS_TV;
 
-                       v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
+                       v4l2_i2c_new_subdev(&dev->v4l2_dev,
                                &dev->i2c_adap, "tuner", "tuner",
-                               v4l2_i2c_tuner_addrs(type));
+                               0, v4l2_i2c_tuner_addrs(type));
                } else {
                        v4l2_i2c_new_subdev(&dev->v4l2_dev,
                                &dev->i2c_adap, "tuner", "tuner",
-                               dev->tuner_addr);
+                               dev->tuner_addr, NULL);
                }
        }
 
index cb78c95..f87757f 100644 (file)
@@ -1000,7 +1000,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
                struct v4l2_subdev *sd =
                        v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
                                "saa6752hs", "saa6752hs",
-                               saa7134_boards[dev->board].empress_addr);
+                               saa7134_boards[dev->board].empress_addr, NULL);
 
                if (sd)
                        sd->grp_id = GRP_EMPRESS;
@@ -1009,9 +1009,9 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
        if (saa7134_boards[dev->board].rds_addr) {
                struct v4l2_subdev *sd;
 
-               sd = v4l2_i2c_new_probed_subdev_addr(&dev->v4l2_dev,
+               sd = v4l2_i2c_new_subdev(&dev->v4l2_dev,
                                &dev->i2c_adap, "saa6588", "saa6588",
-                               saa7134_boards[dev->board].rds_addr);
+                               0, I2C_ADDRS(saa7134_boards[dev->board].rds_addr));
                if (sd) {
                        printk(KERN_INFO "%s: found RDS decoder\n", dev->name);
                        dev->has_rds = 1;
index 1fe5bef..f97fd06 100644 (file)
@@ -246,9 +246,9 @@ int usbvision_i2c_register(struct usb_usbvision *usbvision)
        switch (usbvision_device_data[usbvision->DevModel].Codec) {
        case CODEC_SAA7113:
        case CODEC_SAA7111:
-               v4l2_i2c_new_probed_subdev(&usbvision->v4l2_dev,
+               v4l2_i2c_new_subdev(&usbvision->v4l2_dev,
                                &usbvision->i2c_adap, "saa7115",
-                               "saa7115_auto", saa711x_addrs);
+                               "saa7115_auto", 0, saa711x_addrs);
                break;
        }
        if (usbvision_device_data[usbvision->DevModel].Tuner == 1) {
@@ -256,16 +256,16 @@ int usbvision_i2c_register(struct usb_usbvision *usbvision)
                enum v4l2_i2c_tuner_type type;
                struct tuner_setup tun_setup;
 
-               sd = v4l2_i2c_new_probed_subdev(&usbvision->v4l2_dev,
+               sd = v4l2_i2c_new_subdev(&usbvision->v4l2_dev,
                                &usbvision->i2c_adap, "tuner",
-                               "tuner", v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
+                               "tuner", 0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
                /* depending on whether we found a demod or not, select
                   the tuner type. */
                type = sd ? ADDRS_TV_WITH_DEMOD : ADDRS_TV;
 
-               sd = v4l2_i2c_new_probed_subdev(&usbvision->v4l2_dev,
+               sd = v4l2_i2c_new_subdev(&usbvision->v4l2_dev,
                                &usbvision->i2c_adap, "tuner",
-                               "tuner", v4l2_i2c_tuner_addrs(type));
+                               "tuner", 0, v4l2_i2c_tuner_addrs(type));
 
                if (usbvision->tuner_type != -1) {
                        tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
index 3a0c649..f5a93ae 100644 (file)
@@ -814,139 +814,6 @@ EXPORT_SYMBOL_GPL(v4l2_i2c_subdev_init);
 
 
 /* Load an i2c sub-device. */
-struct v4l2_subdev *v4l2_i2c_new_subdev(struct v4l2_device *v4l2_dev,
-               struct i2c_adapter *adapter,
-               const char *module_name, const char *client_type, u8 addr)
-{
-       struct v4l2_subdev *sd = NULL;
-       struct i2c_client *client;
-       struct i2c_board_info info;
-
-       BUG_ON(!v4l2_dev);
-
-       if (module_name)
-               request_module(module_name);
-
-       /* Setup the i2c board info with the device type and
-          the device address. */
-       memset(&info, 0, sizeof(info));
-       strlcpy(info.type, client_type, sizeof(info.type));
-       info.addr = addr;
-
-       /* Create the i2c client */
-       client = i2c_new_device(adapter, &info);
-       /* Note: it is possible in the future that
-          c->driver is NULL if the driver is still being loaded.
-          We need better support from the kernel so that we
-          can easily wait for the load to finish. */
-       if (client == NULL || client->driver == NULL)
-               goto error;
-
-       /* Lock the module so we can safely get the v4l2_subdev pointer */
-       if (!try_module_get(client->driver->driver.owner))
-               goto error;
-       sd = i2c_get_clientdata(client);
-
-       /* Register with the v4l2_device which increases the module's
-          use count as well. */
-       if (v4l2_device_register_subdev(v4l2_dev, sd))
-               sd = NULL;
-       /* Decrease the module use count to match the first try_module_get. */
-       module_put(client->driver->driver.owner);
-
-       if (sd) {
-               /* We return errors from v4l2_subdev_call only if we have the
-                  callback as the .s_config is not mandatory */
-               int err = v4l2_subdev_call(sd, core, s_config, 0, NULL);
-
-               if (err && err != -ENOIOCTLCMD) {
-                       v4l2_device_unregister_subdev(sd);
-                       sd = NULL;
-               }
-       }
-
-error:
-       /* If we have a client but no subdev, then something went wrong and
-          we must unregister the client. */
-       if (client && sd == NULL)
-               i2c_unregister_device(client);
-       return sd;
-}
-EXPORT_SYMBOL_GPL(v4l2_i2c_new_subdev);
-
-/* Probe and load an i2c sub-device. */
-struct v4l2_subdev *v4l2_i2c_new_probed_subdev(struct v4l2_device *v4l2_dev,
-       struct i2c_adapter *adapter,
-       const char *module_name, const char *client_type,
-       const unsigned short *addrs)
-{
-       struct v4l2_subdev *sd = NULL;
-       struct i2c_client *client = NULL;
-       struct i2c_board_info info;
-
-       BUG_ON(!v4l2_dev);
-
-       if (module_name)
-               request_module(module_name);
-
-       /* Setup the i2c board info with the device type and
-          the device address. */
-       memset(&info, 0, sizeof(info));
-       strlcpy(info.type, client_type, sizeof(info.type));
-
-       /* Probe and create the i2c client */
-       client = i2c_new_probed_device(adapter, &info, addrs);
-       /* Note: it is possible in the future that
-          c->driver is NULL if the driver is still being loaded.
-          We need better support from the kernel so that we
-          can easily wait for the load to finish. */
-       if (client == NULL || client->driver == NULL)
-               goto error;
-
-       /* Lock the module so we can safely get the v4l2_subdev pointer */
-       if (!try_module_get(client->driver->driver.owner))
-               goto error;
-       sd = i2c_get_clientdata(client);
-
-       /* Register with the v4l2_device which increases the module's
-          use count as well. */
-       if (v4l2_device_register_subdev(v4l2_dev, sd))
-               sd = NULL;
-       /* Decrease the module use count to match the first try_module_get. */
-       module_put(client->driver->driver.owner);
-
-       if (sd) {
-               /* We return errors from v4l2_subdev_call only if we have the
-                  callback as the .s_config is not mandatory */
-               int err = v4l2_subdev_call(sd, core, s_config, 0, NULL);
-
-               if (err && err != -ENOIOCTLCMD) {
-                       v4l2_device_unregister_subdev(sd);
-                       sd = NULL;
-               }
-       }
-
-error:
-       /* If we have a client but no subdev, then something went wrong and
-          we must unregister the client. */
-       if (client && sd == NULL)
-               i2c_unregister_device(client);
-       return sd;
-}
-EXPORT_SYMBOL_GPL(v4l2_i2c_new_probed_subdev);
-
-struct v4l2_subdev *v4l2_i2c_new_probed_subdev_addr(struct v4l2_device *v4l2_dev,
-               struct i2c_adapter *adapter,
-               const char *module_name, const char *client_type, u8 addr)
-{
-       unsigned short addrs[2] = { addr, I2C_CLIENT_END };
-
-       return v4l2_i2c_new_probed_subdev(v4l2_dev, adapter,
-                       module_name, client_type, addrs);
-}
-EXPORT_SYMBOL_GPL(v4l2_i2c_new_probed_subdev_addr);
-
-/* Load an i2c sub-device. */
 struct v4l2_subdev *v4l2_i2c_new_subdev_board(struct v4l2_device *v4l2_dev,
                struct i2c_adapter *adapter, const char *module_name,
                struct i2c_board_info *info, const unsigned short *probe_addrs)
index f3b6e15..cd6a344 100644 (file)
@@ -4333,11 +4333,11 @@ static int __init vino_module_init(void)
        vino_init_stage++;
 
        vino_drvdata->decoder =
-               v4l2_i2c_new_probed_subdev_addr(&vino_drvdata->v4l2_dev,
-                       &vino_i2c_adapter, "saa7191", "saa7191", 0x45);
+               v4l2_i2c_new_subdev(&vino_drvdata->v4l2_dev, &vino_i2c_adapter,
+                              "saa7191", "saa7191", 0, I2C_ADDRS(0x45));
        vino_drvdata->camera =
-               v4l2_i2c_new_probed_subdev_addr(&vino_drvdata->v4l2_dev,
-                       &vino_i2c_adapter, "indycam", "indycam", 0x2b);
+               v4l2_i2c_new_subdev(&vino_drvdata->v4l2_dev, &vino_i2c_adapter,
+                              "indycam", "indycam", 0, I2C_ADDRS(0x2b));
 
        dprintk("init complete!\n");
 
index 602484d..37fcdc4 100644 (file)
@@ -3515,9 +3515,9 @@ w9968cf_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
        w9968cf_turn_on_led(cam);
 
        w9968cf_i2c_init(cam);
-       cam->sensor_sd = v4l2_i2c_new_probed_subdev(&cam->v4l2_dev,
+       cam->sensor_sd = v4l2_i2c_new_subdev(&cam->v4l2_dev,
                        &cam->i2c_adapter,
-                       "ovcamchip", "ovcamchip", addrs);
+                       "ovcamchip", "ovcamchip", 0, addrs);
 
        usb_set_intfdata(intf, cam);
        mutex_unlock(&cam->dev_mutex);
index 0c4d9b1..be70574 100644 (file)
@@ -1357,15 +1357,15 @@ static int __devinit zoran_probe(struct pci_dev *pdev,
                goto zr_free_irq;
        }
 
-       zr->decoder = v4l2_i2c_new_probed_subdev(&zr->v4l2_dev,
+       zr->decoder = v4l2_i2c_new_subdev(&zr->v4l2_dev,
                &zr->i2c_adapter, zr->card.mod_decoder, zr->card.i2c_decoder,
-               zr->card.addrs_decoder);
+               0, zr->card.addrs_decoder);
 
        if (zr->card.mod_encoder)
-               zr->encoder = v4l2_i2c_new_probed_subdev(&zr->v4l2_dev,
+               zr->encoder = v4l2_i2c_new_subdev(&zr->v4l2_dev,
                        &zr->i2c_adapter,
                        zr->card.mod_encoder, zr->card.i2c_encoder,
-                       zr->card.addrs_encoder);
+                       0, zr->card.addrs_encoder);
 
        dprintk(2,
                KERN_INFO "%s: Initializing videocodec bus...\n",
index 33a1842..1c25b10 100644 (file)
@@ -139,29 +139,23 @@ struct v4l2_subdev_ops;
 /* Load an i2c module and return an initialized v4l2_subdev struct.
    Only call request_module if module_name != NULL.
    The client_type argument is the name of the chip that's on the adapter. */
-struct v4l2_subdev *v4l2_i2c_new_subdev(struct v4l2_device *v4l2_dev,
-               struct i2c_adapter *adapter,
-               const char *module_name, const char *client_type, u8 addr);
-/* Probe and load an i2c module and return an initialized v4l2_subdev struct.
-   Only call request_module if module_name != NULL.
-   The client_type argument is the name of the chip that's on the adapter. */
-struct v4l2_subdev *v4l2_i2c_new_probed_subdev(struct v4l2_device *v4l2_dev,
+struct v4l2_subdev *v4l2_i2c_new_subdev_cfg(struct v4l2_device *v4l2_dev,
                struct i2c_adapter *adapter,
                const char *module_name, const char *client_type,
-               const unsigned short *addrs);
-/* Like v4l2_i2c_new_probed_subdev, except probe for a single address. */
-struct v4l2_subdev *v4l2_i2c_new_probed_subdev_addr(struct v4l2_device *v4l2_dev,
-               struct i2c_adapter *adapter,
-               const char *module_name, const char *client_type, u8 addr);
+               int irq, void *platform_data,
+               u8 addr, const unsigned short *probe_addrs);
 
 /* Load an i2c module and return an initialized v4l2_subdev struct.
    Only call request_module if module_name != NULL.
    The client_type argument is the name of the chip that's on the adapter. */
-struct v4l2_subdev *v4l2_i2c_new_subdev_cfg(struct v4l2_device *v4l2_dev,
+static inline struct v4l2_subdev *v4l2_i2c_new_subdev(struct v4l2_device *v4l2_dev,
                struct i2c_adapter *adapter,
                const char *module_name, const char *client_type,
-               int irq, void *platform_data,
-               u8 addr, const unsigned short *probe_addrs);
+               u8 addr, const unsigned short *probe_addrs)
+{
+       return v4l2_i2c_new_subdev_cfg(v4l2_dev, adapter, module_name,
+                               client_type, 0, NULL, addr, probe_addrs);
+}
 
 struct i2c_board_info;