提交 b14667f3 编写于 作者: D Devin Heitmueller 提交者: Mauro Carvalho Chehab

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: NDevin Heitmueller <dheitmueller@linuxtv.org>
Signed-off-by: NMauro Carvalho Chehab <mchehab@redhat.com>
上级 2eaf3960
...@@ -173,6 +173,7 @@ void au0828_card_setup(struct au0828_dev *dev) ...@@ -173,6 +173,7 @@ void au0828_card_setup(struct au0828_dev *dev)
{ {
static u8 eeprom[256]; static u8 eeprom[256];
struct tuner_setup tun_setup; struct tuner_setup tun_setup;
struct v4l2_subdev *sd;
unsigned int mode_mask = T_ANALOG_TV | unsigned int mode_mask = T_ANALOG_TV |
T_DIGITAL_TV; T_DIGITAL_TV;
...@@ -199,13 +200,21 @@ void au0828_card_setup(struct au0828_dev *dev) ...@@ -199,13 +200,21 @@ void au0828_card_setup(struct au0828_dev *dev)
/* Load the analog demodulator driver (note this would need to /* Load the analog demodulator driver (note this would need to
be abstracted out if we ever need to support a different be abstracted out if we ever need to support a different
demod) */ 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 */ /* Setup tuners */
if (dev->board.tuner_type != TUNER_ABSENT) { if (dev->board.tuner_type != TUNER_ABSENT) {
/* Load the tuner module, which does the attach */ /* 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.mode_mask = mode_mask;
tun_setup.type = dev->board.tuner_type; tun_setup.type = dev->board.tuner_type;
......
...@@ -152,6 +152,8 @@ static void au0828_usb_disconnect(struct usb_interface *interface) ...@@ -152,6 +152,8 @@ static void au0828_usb_disconnect(struct usb_interface *interface)
/* I2C */ /* I2C */
au0828_i2c_unregister(dev); au0828_i2c_unregister(dev);
v4l2_device_unregister(&dev->v4l2_dev);
usb_set_intfdata(interface, NULL); usb_set_intfdata(interface, NULL);
mutex_lock(&dev->mutex); mutex_lock(&dev->mutex);
...@@ -165,7 +167,7 @@ static void au0828_usb_disconnect(struct usb_interface *interface) ...@@ -165,7 +167,7 @@ static void au0828_usb_disconnect(struct usb_interface *interface)
static int au0828_usb_probe(struct usb_interface *interface, static int au0828_usb_probe(struct usb_interface *interface,
const struct usb_device_id *id) const struct usb_device_id *id)
{ {
int ifnum; int ifnum, retval;
struct au0828_dev *dev; struct au0828_dev *dev;
struct usb_device *usbdev = interface_to_usbdev(interface); struct usb_device *usbdev = interface_to_usbdev(interface);
...@@ -192,6 +194,17 @@ static int au0828_usb_probe(struct usb_interface *interface, ...@@ -192,6 +194,17 @@ static int au0828_usb_probe(struct usb_interface *interface,
usb_set_intfdata(interface, dev); 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 */ /* Power Up the bridge */
au0828_write(dev, REG_600, 1 << 4); au0828_write(dev, REG_600, 1 << 4);
......
...@@ -345,7 +345,6 @@ static struct i2c_adapter au0828_i2c_adap_template = { ...@@ -345,7 +345,6 @@ static struct i2c_adapter au0828_i2c_adap_template = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.id = I2C_HW_B_AU0828, .id = I2C_HW_B_AU0828,
.algo = &au0828_i2c_algo_template, .algo = &au0828_i2c_algo_template,
.class = I2C_CLASS_TV_ANALOG,
.client_register = attach_inform, .client_register = attach_inform,
.client_unregister = detach_inform, .client_unregister = detach_inform,
}; };
...@@ -392,9 +391,9 @@ int au0828_i2c_register(struct au0828_dev *dev) ...@@ -392,9 +391,9 @@ int au0828_i2c_register(struct au0828_dev *dev)
strlcpy(dev->i2c_adap.name, DRIVER_NAME, strlcpy(dev->i2c_adap.name, DRIVER_NAME,
sizeof(dev->i2c_adap.name)); sizeof(dev->i2c_adap.name));
dev->i2c_algo.data = dev; dev->i2c_adap.algo = &dev->i2c_algo;
dev->i2c_adap.algo_data = dev; 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); i2c_add_adapter(&dev->i2c_adap);
dev->i2c_client.adapter = &dev->i2c_adap; dev->i2c_client.adapter = &dev->i2c_adap;
......
...@@ -1021,7 +1021,7 @@ static int vidioc_querycap(struct file *file, void *priv, ...@@ -1021,7 +1021,7 @@ static int vidioc_querycap(struct file *file, void *priv,
memset(cap, 0, sizeof(*cap)); memset(cap, 0, sizeof(*cap));
strlcpy(cap->driver, "au0828", sizeof(cap->driver)); strlcpy(cap->driver, "au0828", sizeof(cap->driver));
strlcpy(cap->card, dev->board.name, sizeof(cap->card)); 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; cap->version = AU0828_VERSION_CODE;
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
/* Analog */ /* Analog */
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <media/videobuf-vmalloc.h> #include <media/videobuf-vmalloc.h>
#include <media/v4l2-device.h>
/* DVB */ /* DVB */
#include "demux.h" #include "demux.h"
...@@ -188,7 +189,7 @@ struct au0828_dev { ...@@ -188,7 +189,7 @@ struct au0828_dev {
/* I2C */ /* I2C */
struct i2c_adapter i2c_adap; struct i2c_adapter i2c_adap;
struct i2c_algo_bit_data i2c_algo; struct i2c_algorithm i2c_algo;
struct i2c_client i2c_client; struct i2c_client i2c_client;
u32 i2c_rc; u32 i2c_rc;
...@@ -197,6 +198,7 @@ struct au0828_dev { ...@@ -197,6 +198,7 @@ struct au0828_dev {
/* Analog */ /* Analog */
struct list_head au0828list; struct list_head au0828list;
struct v4l2_device v4l2_dev;
int users; int users;
unsigned int stream_on:1; /* Locks streams */ unsigned int stream_on:1; /* Locks streams */
struct video_device *vdev; struct video_device *vdev;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册