mirror of https://gitee.com/openkylin/linux.git
V4L/DVB (11080): au0828: Convert to use v4l2_device/subdev framework
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>
This commit is contained in:
parent
2eaf396020
commit
b14667f32a
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue