Commit 01c28193 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

[media] em28xx: make em28xx-video to be a separate module

Now that all analog-specific code are at em28xx-video, convert
it into an em28xx extension and load it as a separate module.
Reviewed-by: default avatarFrank Schäfer <fschaefer.oss@googlemail.com>
Tested-by: default avatarFrank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent 1f0ee65a
config VIDEO_EM28XX config VIDEO_EM28XX
tristate "Empia EM28xx USB video capture support" tristate "Empia EM28xx USB devices support"
depends on VIDEO_DEV && I2C depends on VIDEO_DEV && I2C
select VIDEO_TUNER select VIDEO_TUNER
select VIDEO_TVEEPROM select VIDEO_TVEEPROM
config VIDEO_EM28XX_V4L2
tristate "Empia EM28xx analog TV, video capture and/or webcam support"
depends on VIDEO_EM28XX
select VIDEOBUF2_VMALLOC select VIDEOBUF2_VMALLOC
select VIDEO_SAA711X if MEDIA_SUBDRV_AUTOSELECT select VIDEO_SAA711X if MEDIA_SUBDRV_AUTOSELECT
select VIDEO_TVP5150 if MEDIA_SUBDRV_AUTOSELECT select VIDEO_TVP5150 if MEDIA_SUBDRV_AUTOSELECT
......
em28xx-y += em28xx-video.o em28xx-i2c.o em28xx-cards.o em28xx-y += em28xx-core.o em28xx-i2c.o em28xx-cards.o em28xx-camera.o
em28xx-y += em28xx-core.o em28xx-vbi.o em28xx-camera.o
em28xx-v4l-objs := em28xx-video.o em28xx-vbi.o
em28xx-alsa-objs := em28xx-audio.o em28xx-alsa-objs := em28xx-audio.o
em28xx-rc-objs := em28xx-input.o em28xx-rc-objs := em28xx-input.o
obj-$(CONFIG_VIDEO_EM28XX) += em28xx.o obj-$(CONFIG_VIDEO_EM28XX) += em28xx.o
obj-$(CONFIG_VIDEO_EM28XX_V4L2) += em28xx-v4l.o
obj-$(CONFIG_VIDEO_EM28XX_ALSA) += em28xx-alsa.o obj-$(CONFIG_VIDEO_EM28XX_ALSA) += em28xx-alsa.o
obj-$(CONFIG_VIDEO_EM28XX_DVB) += em28xx-dvb.o obj-$(CONFIG_VIDEO_EM28XX_DVB) += em28xx-dvb.o
obj-$(CONFIG_VIDEO_EM28XX_RC) += em28xx-rc.o obj-$(CONFIG_VIDEO_EM28XX_RC) += em28xx-rc.o
......
...@@ -454,3 +454,4 @@ int em28xx_init_camera(struct em28xx *dev) ...@@ -454,3 +454,4 @@ int em28xx_init_camera(struct em28xx *dev)
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(em28xx_init_camera);
...@@ -2159,6 +2159,8 @@ struct em28xx_board em28xx_boards[] = { ...@@ -2159,6 +2159,8 @@ struct em28xx_board em28xx_boards[] = {
.ir_codes = RC_MAP_PINNACLE_PCTV_HD, .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
}, },
}; };
EXPORT_SYMBOL_GPL(em28xx_boards);
const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards); const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
/* table of devices that work with this driver */ /* table of devices that work with this driver */
...@@ -2780,11 +2782,12 @@ static void request_module_async(struct work_struct *work) ...@@ -2780,11 +2782,12 @@ static void request_module_async(struct work_struct *work)
em28xx_init_extension(dev); em28xx_init_extension(dev);
#if defined(CONFIG_MODULES) && defined(MODULE) #if defined(CONFIG_MODULES) && defined(MODULE)
if (dev->has_video)
request_module("em28xx-v4l");
if (dev->has_audio_class) if (dev->has_audio_class)
request_module("snd-usb-audio"); request_module("snd-usb-audio");
else if (dev->has_alsa_audio) else if (dev->has_alsa_audio)
request_module("em28xx-alsa"); request_module("em28xx-alsa");
if (dev->board.has_dvb) if (dev->board.has_dvb)
request_module("em28xx-dvb"); request_module("em28xx-dvb");
if (dev->board.buttons || if (dev->board.buttons ||
...@@ -2813,18 +2816,12 @@ void em28xx_release_resources(struct em28xx *dev) ...@@ -2813,18 +2816,12 @@ void em28xx_release_resources(struct em28xx *dev)
{ {
/*FIXME: I2C IR should be disconnected */ /*FIXME: I2C IR should be disconnected */
em28xx_release_analog_resources(dev);
if (dev->def_i2c_bus) if (dev->def_i2c_bus)
em28xx_i2c_unregister(dev, 1); em28xx_i2c_unregister(dev, 1);
em28xx_i2c_unregister(dev, 0); em28xx_i2c_unregister(dev, 0);
if (dev->clk) if (dev->clk)
v4l2_clk_unregister_fixed(dev->clk); v4l2_clk_unregister_fixed(dev->clk);
v4l2_ctrl_handler_free(&dev->ctrl_handler);
v4l2_device_unregister(&dev->v4l2_dev);
usb_put_dev(dev->udev); usb_put_dev(dev->udev);
/* Mark device as unused */ /* Mark device as unused */
...@@ -2999,18 +2996,7 @@ static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev, ...@@ -2999,18 +2996,7 @@ static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev,
/* Do board specific init and eeprom reading */ /* Do board specific init and eeprom reading */
em28xx_card_setup(dev); em28xx_card_setup(dev);
retval = em28xx_register_analog_devices(dev);
if (retval < 0)
goto fail;
return 0; return 0;
fail:
if (dev->def_i2c_bus)
em28xx_i2c_unregister(dev, 1);
em28xx_i2c_unregister(dev, 0);
return retval;
} }
/* high bandwidth multiplier, as encoded in highspeed endpoint descriptors */ /* high bandwidth multiplier, as encoded in highspeed endpoint descriptors */
...@@ -3213,6 +3199,7 @@ static int em28xx_usb_probe(struct usb_interface *interface, ...@@ -3213,6 +3199,7 @@ static int em28xx_usb_probe(struct usb_interface *interface,
dev->alt = -1; dev->alt = -1;
dev->is_audio_only = has_audio && !(has_video || has_dvb); dev->is_audio_only = has_audio && !(has_video || has_dvb);
dev->has_alsa_audio = has_audio; dev->has_alsa_audio = has_audio;
dev->has_video = has_video;
dev->audio_ifnum = ifnum; dev->audio_ifnum = ifnum;
/* Checks if audio is provided by some interface */ /* Checks if audio is provided by some interface */
...@@ -3252,10 +3239,9 @@ static int em28xx_usb_probe(struct usb_interface *interface, ...@@ -3252,10 +3239,9 @@ static int em28xx_usb_probe(struct usb_interface *interface,
/* allocate device struct */ /* allocate device struct */
mutex_init(&dev->lock); mutex_init(&dev->lock);
mutex_lock(&dev->lock);
retval = em28xx_init_dev(dev, udev, interface, nr); retval = em28xx_init_dev(dev, udev, interface, nr);
if (retval) { if (retval) {
goto unlock_and_free; goto err_free;
} }
if (usb_xfer_mode < 0) { if (usb_xfer_mode < 0) {
...@@ -3298,7 +3284,7 @@ static int em28xx_usb_probe(struct usb_interface *interface, ...@@ -3298,7 +3284,7 @@ static int em28xx_usb_probe(struct usb_interface *interface,
if (retval) { if (retval) {
printk(DRIVER_NAME printk(DRIVER_NAME
": Failed to pre-allocate USB transfer buffers for DVB.\n"); ": Failed to pre-allocate USB transfer buffers for DVB.\n");
goto unlock_and_free; goto err_free;
} }
} }
...@@ -3307,13 +3293,9 @@ static int em28xx_usb_probe(struct usb_interface *interface, ...@@ -3307,13 +3293,9 @@ static int em28xx_usb_probe(struct usb_interface *interface,
/* Should be the last thing to do, to avoid newer udev's to /* Should be the last thing to do, to avoid newer udev's to
open the device before fully initializing it open the device before fully initializing it
*/ */
mutex_unlock(&dev->lock);
return 0; return 0;
unlock_and_free:
mutex_unlock(&dev->lock);
err_free: err_free:
kfree(dev->alt_max_pkt_size_isoc); kfree(dev->alt_max_pkt_size_isoc);
kfree(dev); kfree(dev);
......
...@@ -33,6 +33,18 @@ ...@@ -33,6 +33,18 @@
#include "em28xx.h" #include "em28xx.h"
#define DRIVER_AUTHOR "Ludovico Cavedon <cavedon@sssup.it>, " \
"Markus Rechberger <mrechberger@gmail.com>, " \
"Mauro Carvalho Chehab <mchehab@infradead.org>, " \
"Sascha Sommer <saschasommer@freenet.de>"
#define DRIVER_DESC "Empia em28xx based USB core driver"
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_LICENSE("GPL");
MODULE_VERSION(EM28XX_VERSION);
/* #define ENABLE_DEBUG_ISOC_FRAMES */ /* #define ENABLE_DEBUG_ISOC_FRAMES */
static unsigned int core_debug; static unsigned int core_debug;
......
/*
em28xx-video.c - driver for Empia EM2800/EM2820/2840 USB
video capture devices
Copyright (C) 2013-2014 Mauro Carvalho Chehab <m.chehab@samsung.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
*/
int em28xx_start_analog_streaming(struct vb2_queue *vq, unsigned int count);
int em28xx_stop_vbi_streaming(struct vb2_queue *vq);
extern struct vb2_ops em28xx_vbi_qops;
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <linux/init.h> #include <linux/init.h>
#include "em28xx.h" #include "em28xx.h"
#include "em28xx-v4l.h"
static unsigned int vbibufs = 5; static unsigned int vbibufs = 5;
module_param(vbibufs, int, 0644); module_param(vbibufs, int, 0644);
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include "em28xx.h" #include "em28xx.h"
#include "em28xx-v4l.h"
#include <media/v4l2-common.h> #include <media/v4l2-common.h>
#include <media/v4l2-ioctl.h> #include <media/v4l2-ioctl.h>
#include <media/v4l2-event.h> #include <media/v4l2-event.h>
...@@ -141,7 +142,7 @@ static struct em28xx_fmt format[] = { ...@@ -141,7 +142,7 @@ static struct em28xx_fmt format[] = {
}, },
}; };
int em28xx_vbi_supported(struct em28xx *dev) static int em28xx_vbi_supported(struct em28xx *dev)
{ {
/* Modprobe option to manually disable */ /* Modprobe option to manually disable */
if (disable_vbi == 1) if (disable_vbi == 1)
...@@ -164,7 +165,7 @@ int em28xx_vbi_supported(struct em28xx *dev) ...@@ -164,7 +165,7 @@ int em28xx_vbi_supported(struct em28xx *dev)
* em28xx_wake_i2c() * em28xx_wake_i2c()
* configure i2c attached devices * configure i2c attached devices
*/ */
void em28xx_wake_i2c(struct em28xx *dev) static void em28xx_wake_i2c(struct em28xx *dev)
{ {
v4l2_device_call_all(&dev->v4l2_dev, 0, core, reset, 0); v4l2_device_call_all(&dev->v4l2_dev, 0, core, reset, 0);
v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing, v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_routing,
...@@ -172,7 +173,7 @@ void em28xx_wake_i2c(struct em28xx *dev) ...@@ -172,7 +173,7 @@ void em28xx_wake_i2c(struct em28xx *dev)
v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 0); v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_stream, 0);
} }
int em28xx_colorlevels_set_default(struct em28xx *dev) static int em28xx_colorlevels_set_default(struct em28xx *dev)
{ {
em28xx_write_reg(dev, EM28XX_R20_YGAIN, CONTRAST_DEFAULT); em28xx_write_reg(dev, EM28XX_R20_YGAIN, CONTRAST_DEFAULT);
em28xx_write_reg(dev, EM28XX_R21_YOFFSET, BRIGHTNESS_DEFAULT); em28xx_write_reg(dev, EM28XX_R21_YOFFSET, BRIGHTNESS_DEFAULT);
...@@ -190,7 +191,7 @@ int em28xx_colorlevels_set_default(struct em28xx *dev) ...@@ -190,7 +191,7 @@ int em28xx_colorlevels_set_default(struct em28xx *dev)
return em28xx_write_reg(dev, EM28XX_R1A_BOFFSET, 0x00); return em28xx_write_reg(dev, EM28XX_R1A_BOFFSET, 0x00);
} }
int em28xx_set_outfmt(struct em28xx *dev) static int em28xx_set_outfmt(struct em28xx *dev)
{ {
int ret; int ret;
u8 fmt, vinctrl; u8 fmt, vinctrl;
...@@ -297,7 +298,7 @@ static int em28xx_scaler_set(struct em28xx *dev, u16 h, u16 v) ...@@ -297,7 +298,7 @@ static int em28xx_scaler_set(struct em28xx *dev, u16 h, u16 v)
} }
/* FIXME: this only function read values from dev */ /* FIXME: this only function read values from dev */
int em28xx_resolution_set(struct em28xx *dev) static int em28xx_resolution_set(struct em28xx *dev)
{ {
int width, height; int width, height;
width = norm_maxw(dev); width = norm_maxw(dev);
...@@ -330,7 +331,7 @@ int em28xx_resolution_set(struct em28xx *dev) ...@@ -330,7 +331,7 @@ int em28xx_resolution_set(struct em28xx *dev)
} }
/* Set USB alternate setting for analog video */ /* Set USB alternate setting for analog video */
int em28xx_set_alternate(struct em28xx *dev) static int em28xx_set_alternate(struct em28xx *dev)
{ {
int errCode; int errCode;
int i; int i;
...@@ -1020,7 +1021,7 @@ static struct vb2_ops em28xx_video_qops = { ...@@ -1020,7 +1021,7 @@ static struct vb2_ops em28xx_video_qops = {
.wait_finish = vb2_ops_wait_finish, .wait_finish = vb2_ops_wait_finish,
}; };
int em28xx_vb2_setup(struct em28xx *dev) static int em28xx_vb2_setup(struct em28xx *dev)
{ {
int rc; int rc;
struct vb2_queue *q; struct vb2_queue *q;
...@@ -1088,7 +1089,7 @@ static void video_mux(struct em28xx *dev, int index) ...@@ -1088,7 +1089,7 @@ static void video_mux(struct em28xx *dev, int index)
em28xx_audio_analog_set(dev); em28xx_audio_analog_set(dev);
} }
void em28xx_ctrl_notify(struct v4l2_ctrl *ctrl, void *priv) static void em28xx_ctrl_notify(struct v4l2_ctrl *ctrl, void *priv)
{ {
struct em28xx *dev = priv; struct em28xx *dev = priv;
...@@ -1625,7 +1626,7 @@ static int vidioc_g_register(struct file *file, void *priv, ...@@ -1625,7 +1626,7 @@ static int vidioc_g_register(struct file *file, void *priv,
reg->val = ret; reg->val = ret;
} else { } else {
__le16 val = 0; __le16 val = 0;
ret = em28xx_read_reg_req_len(dev, USB_REQ_GET_STATUS, ret = dev->em28xx_read_reg_req_len(dev, USB_REQ_GET_STATUS,
reg->reg, (char *)&val, 2); reg->reg, (char *)&val, 2);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -1872,14 +1873,16 @@ static int em28xx_v4l2_open(struct file *filp) ...@@ -1872,14 +1873,16 @@ static int em28xx_v4l2_open(struct file *filp)
} }
/* /*
* em28xx_realease_resources() * em28xx_v4l2_fini()
* unregisters the v4l2,i2c and usb devices * unregisters the v4l2,i2c and usb devices
* called when the device gets disconected or at module unload * called when the device gets disconected or at module unload
*/ */
void em28xx_release_analog_resources(struct em28xx *dev) static int em28xx_v4l2_fini(struct em28xx *dev)
{ {
if (!dev->has_video) {
/*FIXME: I2C IR should be disconnected */ /* This device does not support the v4l2 extension */
return 0;
}
if (dev->radio_dev) { if (dev->radio_dev) {
if (video_is_registered(dev->radio_dev)) if (video_is_registered(dev->radio_dev))
...@@ -1906,6 +1909,8 @@ void em28xx_release_analog_resources(struct em28xx *dev) ...@@ -1906,6 +1909,8 @@ void em28xx_release_analog_resources(struct em28xx *dev)
video_device_release(dev->vdev); video_device_release(dev->vdev);
dev->vdev = NULL; dev->vdev = NULL;
} }
return 0;
} }
/* /*
...@@ -1927,12 +1932,13 @@ static int em28xx_v4l2_close(struct file *filp) ...@@ -1927,12 +1932,13 @@ static int em28xx_v4l2_close(struct file *filp)
if (dev->users == 1) { if (dev->users == 1) {
/* the device is already disconnect, /* the device is already disconnect,
free the remaining resources */ free the remaining resources */
if (dev->disconnected) { if (dev->disconnected) {
em28xx_release_resources(dev); em28xx_release_resources(dev);
v4l2_ctrl_handler_free(&dev->ctrl_handler);
v4l2_device_unregister(&dev->v4l2_dev);
kfree(dev->alt_max_pkt_size_isoc); kfree(dev->alt_max_pkt_size_isoc);
mutex_unlock(&dev->lock); goto exit;
kfree(dev);
return 0;
} }
/* Save some power by putting tuner to sleep */ /* Save some power by putting tuner to sleep */
...@@ -1951,6 +1957,7 @@ static int em28xx_v4l2_close(struct file *filp) ...@@ -1951,6 +1957,7 @@ static int em28xx_v4l2_close(struct file *filp)
} }
} }
exit:
dev->users--; dev->users--;
mutex_unlock(&dev->lock); mutex_unlock(&dev->lock);
return 0; return 0;
...@@ -2065,8 +2072,6 @@ static unsigned short msp3400_addrs[] = { ...@@ -2065,8 +2072,6 @@ static unsigned short msp3400_addrs[] = {
/******************************** usb interface ******************************/ /******************************** usb interface ******************************/
static struct video_device *em28xx_vdev_init(struct em28xx *dev, static struct video_device *em28xx_vdev_init(struct em28xx *dev,
const struct video_device *template, const struct video_device *template,
const char *type_name) const char *type_name)
...@@ -2140,7 +2145,7 @@ static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl) ...@@ -2140,7 +2145,7 @@ static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
} }
} }
void em28xx_tuner_setup(struct em28xx *dev) static void em28xx_tuner_setup(struct em28xx *dev)
{ {
struct tuner_setup tun_setup; struct tuner_setup tun_setup;
struct v4l2_frequency f; struct v4l2_frequency f;
...@@ -2199,14 +2204,14 @@ void em28xx_tuner_setup(struct em28xx *dev) ...@@ -2199,14 +2204,14 @@ void em28xx_tuner_setup(struct em28xx *dev)
v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, &f); v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, &f);
} }
int em28xx_register_analog_devices(struct em28xx *dev) static int em28xx_v4l2_init(struct em28xx *dev)
{ {
u8 val; u8 val;
int ret; int ret;
unsigned int maxw; unsigned int maxw;
struct v4l2_ctrl_handler *hdl = &dev->ctrl_handler; struct v4l2_ctrl_handler *hdl = &dev->ctrl_handler;
if (dev->is_audio_only) { if (!dev->has_video) {
/* This device does not support the v4l2 extension */ /* This device does not support the v4l2 extension */
return 0; return 0;
} }
...@@ -2214,6 +2219,8 @@ int em28xx_register_analog_devices(struct em28xx *dev) ...@@ -2214,6 +2219,8 @@ int em28xx_register_analog_devices(struct em28xx *dev)
printk(KERN_INFO "%s: v4l2 driver version %s\n", printk(KERN_INFO "%s: v4l2 driver version %s\n",
dev->name, EM28XX_VERSION); dev->name, EM28XX_VERSION);
mutex_lock(&dev->lock);
ret = v4l2_device_register(&dev->udev->dev, &dev->v4l2_dev); ret = v4l2_device_register(&dev->udev->dev, &dev->v4l2_dev);
if (ret < 0) { if (ret < 0) {
em28xx_errdev("Call to v4l2_device_register() failed!\n"); em28xx_errdev("Call to v4l2_device_register() failed!\n");
...@@ -2492,11 +2499,33 @@ int em28xx_register_analog_devices(struct em28xx *dev) ...@@ -2492,11 +2499,33 @@ int em28xx_register_analog_devices(struct em28xx *dev)
/* initialize videobuf2 stuff */ /* initialize videobuf2 stuff */
em28xx_vb2_setup(dev); em28xx_vb2_setup(dev);
mutex_unlock(&dev->lock);
return 0; return 0;
unregister_dev: unregister_dev:
v4l2_ctrl_handler_free(&dev->ctrl_handler); v4l2_ctrl_handler_free(&dev->ctrl_handler);
v4l2_device_unregister(&dev->v4l2_dev); v4l2_device_unregister(&dev->v4l2_dev);
err: err:
mutex_unlock(&dev->lock);
return ret; return ret;
} }
static struct em28xx_ops v4l2_ops = {
.id = EM28XX_V4L2,
.name = "Em28xx v4l2 Extension",
.init = em28xx_v4l2_init,
.fini = em28xx_v4l2_fini,
};
static int __init em28xx_video_register(void)
{
return em28xx_register_extension(&v4l2_ops);
}
static void __exit em28xx_video_unregister(void)
{
em28xx_unregister_extension(&v4l2_ops);
}
module_init(em28xx_video_register);
module_exit(em28xx_video_unregister);
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
#ifndef _EM28XX_H #ifndef _EM28XX_H
#define _EM28XX_H #define _EM28XX_H
#define EM28XX_VERSION "0.2.0" #define EM28XX_VERSION "0.2.1"
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/i2c.h> #include <linux/i2c.h>
...@@ -474,6 +474,7 @@ struct em28xx_eeprom { ...@@ -474,6 +474,7 @@ struct em28xx_eeprom {
#define EM28XX_AUDIO 0x10 #define EM28XX_AUDIO 0x10
#define EM28XX_DVB 0x20 #define EM28XX_DVB 0x20
#define EM28XX_RC 0x30 #define EM28XX_RC 0x30
#define EM28XX_V4L2 0x40
/* em28xx resource types (used for res_get/res_lock etc */ /* em28xx resource types (used for res_get/res_lock etc */
#define EM28XX_RESOURCE_VIDEO 0x01 #define EM28XX_RESOURCE_VIDEO 0x01
...@@ -527,6 +528,7 @@ struct em28xx { ...@@ -527,6 +528,7 @@ struct em28xx {
unsigned int is_em25xx:1; /* em25xx/em276x/7x/8x family bridge */ unsigned int is_em25xx:1; /* em25xx/em276x/7x/8x family bridge */
unsigned char disconnected:1; /* device has been diconnected */ unsigned char disconnected:1; /* device has been diconnected */
unsigned int has_video:1;
unsigned int has_audio_class:1; unsigned int has_audio_class:1;
unsigned int has_alsa_audio:1; unsigned int has_alsa_audio:1;
unsigned int is_audio_only:1; unsigned int is_audio_only:1;
...@@ -723,14 +725,9 @@ int em28xx_write_ac97(struct em28xx *dev, u8 reg, u16 val); ...@@ -723,14 +725,9 @@ int em28xx_write_ac97(struct em28xx *dev, u8 reg, u16 val);
int em28xx_audio_analog_set(struct em28xx *dev); int em28xx_audio_analog_set(struct em28xx *dev);
int em28xx_audio_setup(struct em28xx *dev); int em28xx_audio_setup(struct em28xx *dev);
int em28xx_colorlevels_set_default(struct em28xx *dev);
const struct em28xx_led *em28xx_find_led(struct em28xx *dev, const struct em28xx_led *em28xx_find_led(struct em28xx *dev,
enum em28xx_led_role role); enum em28xx_led_role role);
int em28xx_capture_start(struct em28xx *dev, int start); int em28xx_capture_start(struct em28xx *dev, int start);
int em28xx_vbi_supported(struct em28xx *dev);
int em28xx_set_outfmt(struct em28xx *dev);
int em28xx_resolution_set(struct em28xx *dev);
int em28xx_set_alternate(struct em28xx *dev);
int em28xx_alloc_urbs(struct em28xx *dev, enum em28xx_mode mode, int xfer_bulk, int em28xx_alloc_urbs(struct em28xx *dev, enum em28xx_mode mode, int xfer_bulk,
int num_bufs, int max_pkt_size, int packet_multiplier); int num_bufs, int max_pkt_size, int packet_multiplier);
int em28xx_init_usb_xfer(struct em28xx *dev, enum em28xx_mode mode, int em28xx_init_usb_xfer(struct em28xx *dev, enum em28xx_mode mode,
...@@ -742,31 +739,17 @@ void em28xx_uninit_usb_xfer(struct em28xx *dev, enum em28xx_mode mode); ...@@ -742,31 +739,17 @@ void em28xx_uninit_usb_xfer(struct em28xx *dev, enum em28xx_mode mode);
void em28xx_stop_urbs(struct em28xx *dev); void em28xx_stop_urbs(struct em28xx *dev);
int em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode); int em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode);
int em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio); int em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio);
void em28xx_wake_i2c(struct em28xx *dev);
int em28xx_register_extension(struct em28xx_ops *dev); int em28xx_register_extension(struct em28xx_ops *dev);
void em28xx_unregister_extension(struct em28xx_ops *dev); void em28xx_unregister_extension(struct em28xx_ops *dev);
void em28xx_init_extension(struct em28xx *dev); void em28xx_init_extension(struct em28xx *dev);
void em28xx_close_extension(struct em28xx *dev); void em28xx_close_extension(struct em28xx *dev);
/* Provided by em28xx-video.c */
void em28xx_tuner_setup(struct em28xx *dev);
int em28xx_vb2_setup(struct em28xx *dev);
int em28xx_register_analog_devices(struct em28xx *dev);
void em28xx_release_analog_resources(struct em28xx *dev);
void em28xx_ctrl_notify(struct v4l2_ctrl *ctrl, void *priv);
int em28xx_start_analog_streaming(struct vb2_queue *vq, unsigned int count);
int em28xx_stop_vbi_streaming(struct vb2_queue *vq);
extern const struct v4l2_ctrl_ops em28xx_ctrl_ops;
/* Provided by em28xx-cards.c */ /* Provided by em28xx-cards.c */
extern struct em28xx_board em28xx_boards[]; extern struct em28xx_board em28xx_boards[];
extern struct usb_device_id em28xx_id_table[]; extern struct usb_device_id em28xx_id_table[];
int em28xx_tuner_callback(void *ptr, int component, int command, int arg); int em28xx_tuner_callback(void *ptr, int component, int command, int arg);
void em28xx_release_resources(struct em28xx *dev); void em28xx_release_resources(struct em28xx *dev);
/* Provided by em28xx-vbi.c */
extern struct vb2_ops em28xx_vbi_qops;
/* Provided by em28xx-camera.c */ /* Provided by em28xx-camera.c */
int em28xx_detect_sensor(struct em28xx *dev); int em28xx_detect_sensor(struct em28xx *dev);
int em28xx_init_camera(struct em28xx *dev); int em28xx_init_camera(struct em28xx *dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment