Skip to content

Commit

Permalink
V4L/DVB (11080): au0828: Convert to use v4l2_device/subdev framework
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Devin Heitmueller authored and Mauro Carvalho Chehab committed Mar 30, 2009
1 parent 2eaf396 commit b14667f
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 8 deletions.
13 changes: 11 additions & 2 deletions drivers/media/video/au0828/au0828-cards.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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;
Expand Down
15 changes: 14 additions & 1 deletion drivers/media/video/au0828/au0828-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);

Expand All @@ -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);

Expand Down
5 changes: 2 additions & 3 deletions drivers/media/video/au0828/au0828-i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion drivers/media/video/au0828/au0828-video.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
4 changes: 3 additions & 1 deletion drivers/media/video/au0828/au0828.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
/* Analog */
#include <linux/videodev2.h>
#include <media/videobuf-vmalloc.h>
#include <media/v4l2-device.h>

/* DVB */
#include "demux.h"
Expand Down Expand Up @@ -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;

Expand All @@ -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;
Expand Down

0 comments on commit b14667f

Please sign in to comment.