V4L/DVB (11080): au0828: Convert to use v4l2_device/subdev framework
authorDevin Heitmueller <dheitmueller@linuxtv.org>
Wed, 11 Mar 2009 06:01:04 +0000 (03:01 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 30 Mar 2009 15:43:27 +0000 (12:43 -0300)
Convert over to using the new subdev framework for the au0828 bridge.  This
includes using the new i2c probing mechanism.

Signed-off-by: Devin Heitmueller <dheitmueller@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/au0828/au0828-cards.c
drivers/media/video/au0828/au0828-core.c
drivers/media/video/au0828/au0828-i2c.c
drivers/media/video/au0828/au0828-video.c
drivers/media/video/au0828/au0828.h

index 0516c060810e9b214d13c8a3e43f72719cad0353..a12c92c037460afa77a5b3663521f57353a011df 100644 (file)
@@ -173,6 +173,7 @@ void au0828_card_setup(struct au0828_dev *dev)
 {
        static u8 eeprom[256];
        struct tuner_setup tun_setup;
+       struct v4l2_subdev *sd;
        unsigned int mode_mask = T_ANALOG_TV |
                                 T_DIGITAL_TV;
 
@@ -199,13 +200,21 @@ void au0828_card_setup(struct au0828_dev *dev)
                /* Load the analog demodulator driver (note this would need to
                   be abstracted out if we ever need to support a different
                   demod) */
-               request_module("au8522");
+               sd = v4l2_i2c_new_subdev(&dev->i2c_adap, "au8522", "au8522",
+                                        0x8e >> 1);
+               if (sd == NULL) {
+                       printk("analog subdev registration failure\n");
+               }
        }
 
        /* Setup tuners */
        if (dev->board.tuner_type != TUNER_ABSENT) {
                /* Load the tuner module, which does the attach */
-               request_module("tuner");
+               sd = v4l2_i2c_new_subdev(&dev->i2c_adap, "tuner", "tuner",
+                                        dev->board.tuner_addr);
+               if (sd == NULL) {
+                       printk("analog tuner subdev registration failure\n");
+               }
 
                tun_setup.mode_mask      = mode_mask;
                tun_setup.type           = dev->board.tuner_type;
index 5199c8aa58889bf8bc2b5a737710552c71b7b9ae..3281a17fa2cdf306279acf3458027e6f57364594 100644 (file)
@@ -152,6 +152,8 @@ static void au0828_usb_disconnect(struct usb_interface *interface)
        /* I2C */
        au0828_i2c_unregister(dev);
 
+       v4l2_device_unregister(&dev->v4l2_dev);
+
        usb_set_intfdata(interface, NULL);
 
        mutex_lock(&dev->mutex);
@@ -165,7 +167,7 @@ static void au0828_usb_disconnect(struct usb_interface *interface)
 static int au0828_usb_probe(struct usb_interface *interface,
        const struct usb_device_id *id)
 {
-       int ifnum;
+       int ifnum, retval;
        struct au0828_dev *dev;
        struct usb_device *usbdev = interface_to_usbdev(interface);
 
@@ -192,6 +194,17 @@ static int au0828_usb_probe(struct usb_interface *interface,
 
        usb_set_intfdata(interface, dev);
 
+       /* Create the v4l2_device */
+       snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name), "%s-%03d",
+                "au0828", 0);
+       retval = v4l2_device_register(&dev->usbdev->dev, &dev->v4l2_dev);
+       if (retval) {
+               printk(KERN_ERR "%s() v4l2_device_register failed\n",
+                      __func__);
+               kfree(dev);
+               return -EIO;
+       }
+
        /* Power Up the bridge */
        au0828_write(dev, REG_600, 1 << 4);
 
index d57a38f5c738a57679d8ff2411475159cb2774ce..e841ba5a64241de50020d95297b021743b7d05ad 100644 (file)
@@ -345,7 +345,6 @@ static struct i2c_adapter au0828_i2c_adap_template = {
        .owner             = THIS_MODULE,
        .id                = I2C_HW_B_AU0828,
        .algo              = &au0828_i2c_algo_template,
-       .class             = I2C_CLASS_TV_ANALOG,
        .client_register   = attach_inform,
        .client_unregister = detach_inform,
 };
@@ -392,9 +391,9 @@ int au0828_i2c_register(struct au0828_dev *dev)
        strlcpy(dev->i2c_adap.name, DRIVER_NAME,
                sizeof(dev->i2c_adap.name));
 
-       dev->i2c_algo.data = dev;
+       dev->i2c_adap.algo = &dev->i2c_algo;
        dev->i2c_adap.algo_data = dev;
-       i2c_set_adapdata(&dev->i2c_adap, dev);
+       i2c_set_adapdata(&dev->i2c_adap, &dev->v4l2_dev);
        i2c_add_adapter(&dev->i2c_adap);
 
        dev->i2c_client.adapter = &dev->i2c_adap;
index 6abdd8bf44948689df61a9ca1faf31d6f88e8253..f6e8cb17445b45b40b408aab79e1ad68b94771a9 100644 (file)
@@ -1021,7 +1021,7 @@ static int vidioc_querycap(struct file *file, void  *priv,
        memset(cap, 0, sizeof(*cap));
        strlcpy(cap->driver, "au0828", sizeof(cap->driver));
        strlcpy(cap->card, dev->board.name, sizeof(cap->card));
-       strlcpy(cap->bus_info, dev->usbdev->dev.bus_id, sizeof(cap->bus_info));
+       strlcpy(cap->bus_info, dev->v4l2_dev.name, sizeof(cap->bus_info));
 
        cap->version = AU0828_VERSION_CODE;
 
index 590d15e461dc9fd1d1c2bf150bb0b0c841d36c73..876b18cfbf55092a310bf93e13203217e075fca1 100644 (file)
@@ -27,6 +27,7 @@
 /* Analog */
 #include <linux/videodev2.h>
 #include <media/videobuf-vmalloc.h>
+#include <media/v4l2-device.h>
 
 /* DVB */
 #include "demux.h"
@@ -188,7 +189,7 @@ struct au0828_dev {
 
        /* I2C */
        struct i2c_adapter              i2c_adap;
-       struct i2c_algo_bit_data        i2c_algo;
+       struct i2c_algorithm            i2c_algo;
        struct i2c_client               i2c_client;
        u32                             i2c_rc;
 
@@ -197,6 +198,7 @@ struct au0828_dev {
 
        /* Analog */
        struct list_head au0828list;
+       struct v4l2_device v4l2_dev;
        int users;
        unsigned int stream_on:1;       /* Locks streams */
        struct video_device *vdev;