From: "Frank Schäfer" <fschaefer.oss@googlemail.com>
To: Mauro Carvalho Chehab <m.chehab@samsung.com>, unlisted-recipients:;
Cc: Linux Media Mailing List <linux-media@vger.kernel.org>,
Mauro Carvalho Chehab <mchehab@infradead.org>
Subject: Re: [PATCH v4 04/22] [media] em28xx: make em28xx-video to be a separate module
Date: Sun, 05 Jan 2014 11:47:00 +0100 [thread overview]
Message-ID: <52C93824.1000206@googlemail.com> (raw)
In-Reply-To: <1388832951-11195-5-git-send-email-m.chehab@samsung.com>
Am 04.01.2014 11:55, schrieb Mauro Carvalho Chehab:
> Now that all analog-specific code are at em28xx-video, convert
> it into an em28xx extension and load it as a separate module.
>
> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
> ---
> drivers/media/usb/em28xx/Kconfig | 6 ++-
> drivers/media/usb/em28xx/Makefile | 5 ++-
> drivers/media/usb/em28xx/em28xx-camera.c | 1 +
> drivers/media/usb/em28xx/em28xx-cards.c | 45 ++++---------------
> drivers/media/usb/em28xx/em28xx-core.c | 12 ++++++
> drivers/media/usb/em28xx/em28xx-v4l.h | 20 +++++++++
> drivers/media/usb/em28xx/em28xx-vbi.c | 1 +
> drivers/media/usb/em28xx/em28xx-video.c | 74 +++++++++++++++++++++++---------
> drivers/media/usb/em28xx/em28xx.h | 23 ++--------
> 9 files changed, 107 insertions(+), 80 deletions(-)
> create mode 100644 drivers/media/usb/em28xx/em28xx-v4l.h
>
> diff --git a/drivers/media/usb/em28xx/Kconfig b/drivers/media/usb/em28xx/Kconfig
> index d6ba514d31eb..838fc9dbb747 100644
> --- a/drivers/media/usb/em28xx/Kconfig
> +++ b/drivers/media/usb/em28xx/Kconfig
> @@ -1,8 +1,12 @@
> config VIDEO_EM28XX
> - tristate "Empia EM28xx USB video capture support"
> + tristate "Empia EM28xx USB devices support"
> depends on VIDEO_DEV && I2C
> select VIDEO_TUNER
> select VIDEO_TVEEPROM
> +
> +config VIDEO_EM28XX_V4L2
> + tristate "Empia EM28xx analog TV, video capture and/or webcam support"
> + depends on VIDEO_EM28XX && I2C
VIDEO_EM28XX already depends on I2C.
> select VIDEOBUF2_VMALLOC
> select VIDEO_SAA711X if MEDIA_SUBDRV_AUTOSELECT
> select VIDEO_TVP5150 if MEDIA_SUBDRV_AUTOSELECT
> diff --git a/drivers/media/usb/em28xx/Makefile b/drivers/media/usb/em28xx/Makefile
> index ad6d48557940..3f850d5063d0 100644
> --- a/drivers/media/usb/em28xx/Makefile
> +++ b/drivers/media/usb/em28xx/Makefile
> @@ -1,10 +1,11 @@
> -em28xx-y += em28xx-video.o em28xx-i2c.o em28xx-cards.o
> -em28xx-y += em28xx-core.o em28xx-vbi.o em28xx-camera.o
> +em28xx-y += em28xx-core.o em28xx-i2c.o em28xx-cards.o em28xx-camera.o
>
> +em28xx-v4l-objs := em28xx-video.o em28xx-vbi.o
> em28xx-alsa-objs := em28xx-audio.o
> em28xx-rc-objs := em28xx-input.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_DVB) += em28xx-dvb.o
> obj-$(CONFIG_VIDEO_EM28XX_RC) += em28xx-rc.o
> diff --git a/drivers/media/usb/em28xx/em28xx-camera.c b/drivers/media/usb/em28xx/em28xx-camera.c
> index d666741797d4..c29f5c4e7b40 100644
> --- a/drivers/media/usb/em28xx/em28xx-camera.c
> +++ b/drivers/media/usb/em28xx/em28xx-camera.c
> @@ -454,3 +454,4 @@ int em28xx_init_camera(struct em28xx *dev)
>
> return ret;
> }
> +EXPORT_SYMBOL_GPL(em28xx_init_camera);
em28xx-camera should also be part of the em28xx-v4l module.
> diff --git a/drivers/media/usb/em28xx/em28xx-cards.c b/drivers/media/usb/em28xx/em28xx-cards.c
> index 175cd776e0a1..938daaabd8e0 100644
> --- a/drivers/media/usb/em28xx/em28xx-cards.c
> +++ b/drivers/media/usb/em28xx/em28xx-cards.c
> @@ -2159,6 +2159,8 @@ struct em28xx_board em28xx_boards[] = {
> .ir_codes = RC_MAP_PINNACLE_PCTV_HD,
> },
> };
> +EXPORT_SYMBOL_GPL(em28xx_boards);
> +
> const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
>
> /* table of devices that work with this driver */
> @@ -2827,10 +2829,6 @@ static void em28xx_card_setup(struct em28xx *dev)
> "tuner", dev->tuner_addr, NULL);
> }
> }
> -
> - em28xx_tuner_setup(dev);
> -
> - em28xx_init_camera(dev);
> }
Here you are fixing half of the em28xx_card_setup() oopses which you've
introduced with patch 3/22.
This needs to be done together with patch 5/22 before patch 3/22.
> @@ -2848,11 +2846,12 @@ static void request_module_async(struct work_struct *work)
> em28xx_init_extension(dev);
>
> #if defined(CONFIG_MODULES) && defined(MODULE)
> + if (dev->has_video)
> + request_module("em28xx-v4l");
> if (dev->has_audio_class)
> request_module("snd-usb-audio");
> else if (dev->has_alsa_audio)
> request_module("em28xx-alsa");
> -
> if (dev->board.has_dvb)
> request_module("em28xx-dvb");
> if (dev->board.buttons ||
> @@ -2881,18 +2880,12 @@ void em28xx_release_resources(struct em28xx *dev)
> {
> /*FIXME: I2C IR should be disconnected */
>
> - em28xx_release_analog_resources(dev);
> -
> if (dev->def_i2c_bus)
> em28xx_i2c_unregister(dev, 1);
> em28xx_i2c_unregister(dev, 0);
> if (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);
>
> /* Mark device as unused */
> @@ -3043,7 +3036,7 @@ static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev,
> if (retval < 0) {
> em28xx_errdev("%s: em28xx_i2c_register bus 0 - error [%d]!\n",
> __func__, retval);
> - goto unregister_dev;
> + return retval;
> }
>
> /* register i2c bus 1 */
> @@ -3057,30 +3050,14 @@ static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev,
> if (retval < 0) {
> em28xx_errdev("%s: em28xx_i2c_register bus 1 - error [%d]!\n",
> __func__, retval);
> - goto unregister_dev;
> + return retval;
> }
> }
Hmm... if registering of bus 1 fails, we need to unregister bus 0.
But that's an old bug which we can fix later...
> /* Do board specific init and eeprom reading */
> em28xx_card_setup(dev);
>
> - retval = em28xx_register_analog_devices(dev);
> - if (retval < 0) {
> - goto fail;
> - }
> -
> return 0;
> -
> -fail:
> - if (dev->def_i2c_bus)
> - em28xx_i2c_unregister(dev, 1);
> - em28xx_i2c_unregister(dev, 0);
> - v4l2_ctrl_handler_free(&dev->ctrl_handler);
> -
> -unregister_dev:
> - v4l2_device_unregister(&dev->v4l2_dev);
> -
> - return retval;
> }
>
> /* high bandwidth multiplier, as encoded in highspeed endpoint descriptors */
> @@ -3283,6 +3260,7 @@ static int em28xx_usb_probe(struct usb_interface *interface,
> dev->alt = -1;
> dev->is_audio_only = has_audio && !(has_video || has_dvb);
> dev->has_alsa_audio = has_audio;
> + dev->has_video = has_video;
> dev->audio_ifnum = ifnum;
>
> /* Checks if audio is provided by some interface */
> @@ -3322,10 +3300,9 @@ static int em28xx_usb_probe(struct usb_interface *interface,
>
> /* allocate device struct */
> mutex_init(&dev->lock);
> - mutex_lock(&dev->lock);
> retval = em28xx_init_dev(dev, udev, interface, nr);
> if (retval) {
> - goto unlock_and_free;
> + goto err_free;
> }
>
> if (usb_xfer_mode < 0) {
> @@ -3368,7 +3345,7 @@ static int em28xx_usb_probe(struct usb_interface *interface,
> if (retval) {
> printk(DRIVER_NAME
> ": Failed to pre-allocate USB transfer buffers for DVB.\n");
> - goto unlock_and_free;
> + goto err_free;
> }
> }
>
> @@ -3377,13 +3354,9 @@ static int em28xx_usb_probe(struct usb_interface *interface,
> /* Should be the last thing to do, to avoid newer udev's to
> open the device before fully initializing it
> */
> - mutex_unlock(&dev->lock);
>
> return 0;
>
> -unlock_and_free:
> - mutex_unlock(&dev->lock);
> -
> err_free:
> kfree(dev->alt_max_pkt_size_isoc);
> kfree(dev);
> diff --git a/drivers/media/usb/em28xx/em28xx-core.c b/drivers/media/usb/em28xx/em28xx-core.c
> index 3012912d2997..1113d4e107d8 100644
> --- a/drivers/media/usb/em28xx/em28xx-core.c
> +++ b/drivers/media/usb/em28xx/em28xx-core.c
> @@ -33,6 +33,18 @@
>
> #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 */
>
> static unsigned int core_debug;
> diff --git a/drivers/media/usb/em28xx/em28xx-v4l.h b/drivers/media/usb/em28xx/em28xx-v4l.h
> new file mode 100644
> index 000000000000..bce438691e0e
> --- /dev/null
> +++ b/drivers/media/usb/em28xx/em28xx-v4l.h
> @@ -0,0 +1,20 @@
> +/*
> + em28xx-video.c - driver for Empia EM2800/EM2820/2840 USB
> + video capture devices
The information about supported chips is outdated everywhere in the driver,
but if you introduce a new header file it should really be up to date.
Just talk about EM27xx/EM28xx.
> +
> + 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;
> diff --git a/drivers/media/usb/em28xx/em28xx-vbi.c b/drivers/media/usb/em28xx/em28xx-vbi.c
> index 39f39c527c13..db3d655600df 100644
> --- a/drivers/media/usb/em28xx/em28xx-vbi.c
> +++ b/drivers/media/usb/em28xx/em28xx-vbi.c
> @@ -27,6 +27,7 @@
> #include <linux/init.h>
>
> #include "em28xx.h"
> +#include "em28xx-v4l.h"
>
> static unsigned int vbibufs = 5;
> module_param(vbibufs, int, 0644);
> diff --git a/drivers/media/usb/em28xx/em28xx-video.c b/drivers/media/usb/em28xx/em28xx-video.c
> index 85284626dbd6..d615bff8ac09 100644
> --- a/drivers/media/usb/em28xx/em28xx-video.c
> +++ b/drivers/media/usb/em28xx/em28xx-video.c
> @@ -38,6 +38,7 @@
> #include <linux/slab.h>
>
> #include "em28xx.h"
> +#include "em28xx-v4l.h"
> #include <media/v4l2-common.h>
> #include <media/v4l2-ioctl.h>
> #include <media/v4l2-event.h>
> @@ -141,11 +142,13 @@ static struct em28xx_fmt format[] = {
> },
> };
>
> +static int em28xx_vbi_supported(struct em28xx *dev);
> +
Or move em28xx_vbi_supported() before em28xx_set_outfmt() and
em28xx_resolution_set() again.
If you had not changed the functions order in patch 1/22, this wouldn't
be necessary.
> /*
> * em28xx_wake_i2c()
> * 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, video, s_routing,
> @@ -153,7 +156,7 @@ void em28xx_wake_i2c(struct em28xx *dev)
> 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_R21_YOFFSET, BRIGHTNESS_DEFAULT);
> @@ -171,7 +174,7 @@ int em28xx_colorlevels_set_default(struct em28xx *dev)
> 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;
> u8 fmt, vinctrl;
> @@ -278,7 +281,7 @@ static int em28xx_scaler_set(struct em28xx *dev, u16 h, u16 v)
> }
>
> /* 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;
> width = norm_maxw(dev);
> @@ -310,7 +313,7 @@ int em28xx_resolution_set(struct em28xx *dev)
> return em28xx_scaler_set(dev, dev->hscale, dev->vscale);
> }
>
> -int em28xx_vbi_supported(struct em28xx *dev)
> +static int em28xx_vbi_supported(struct em28xx *dev)
> {
> /* Modprobe option to manually disable */
> if (disable_vbi == 1)
> @@ -330,7 +333,7 @@ int em28xx_vbi_supported(struct em28xx *dev)
> }
>
> /* 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 i;
> @@ -1020,7 +1023,7 @@ static struct vb2_ops em28xx_video_qops = {
> .wait_finish = vb2_ops_wait_finish,
> };
>
> -int em28xx_vb2_setup(struct em28xx *dev)
> +static int em28xx_vb2_setup(struct em28xx *dev)
> {
> int rc;
> struct vb2_queue *q;
> @@ -1088,7 +1091,7 @@ static void video_mux(struct em28xx *dev, int index)
> 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;
>
> @@ -1625,7 +1628,7 @@ static int vidioc_g_register(struct file *file, void *priv,
> reg->val = ret;
> } else {
> __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);
Urgh... is it really necessary to start using these pointers again ?
Ok... keep it as is, I'll send a patch to clean this up later.
> if (ret < 0)
> return ret;
> @@ -1872,11 +1875,11 @@ static int em28xx_v4l2_open(struct file *filp)
> }
>
> /*
> - * em28xx_realease_resources()
> + * em28xx_v4l2_fini()
> * unregisters the v4l2,i2c and usb devices
> * 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)
> {
>
> /*FIXME: I2C IR should be disconnected */
> @@ -1906,6 +1909,8 @@ void em28xx_release_analog_resources(struct em28xx *dev)
> video_device_release(dev->vdev);
> dev->vdev = NULL;
> }
> +
> + return 0;
> }
>
> /*
> @@ -1927,12 +1932,12 @@ static int em28xx_v4l2_close(struct file *filp)
> if (dev->users == 1) {
> /* the device is already disconnect,
> free the remaining resources */
> +
> if (dev->disconnected) {
> - em28xx_release_resources(dev);
Who releases the resources now ?
> + v4l2_ctrl_handler_free(&dev->ctrl_handler);
> + v4l2_device_unregister(&dev->v4l2_dev);
> kfree(dev->alt_max_pkt_size_isoc);
> - mutex_unlock(&dev->lock);
> - kfree(dev);
> - return 0;
> + goto exit;
> }
>
> /* Save some power by putting tuner to sleep */
> @@ -1951,6 +1956,7 @@ static int em28xx_v4l2_close(struct file *filp)
> }
> }
>
> +exit:
> dev->users--;
Nice bugfix.
> mutex_unlock(&dev->lock);
> return 0;
> @@ -2047,8 +2053,6 @@ static struct video_device em28xx_radio_template = {
>
> /******************************** usb interface ******************************/
>
> -
> -
> static struct video_device *em28xx_vdev_init(struct em28xx *dev,
> const struct video_device *template,
> const char *type_name)
> @@ -2122,7 +2126,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 v4l2_frequency f;
> @@ -2181,14 +2185,14 @@ void em28xx_tuner_setup(struct em28xx *dev)
> 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;
> int ret;
> unsigned int maxw;
> 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 */
> return 0;
> }
> @@ -2196,6 +2200,8 @@ int em28xx_register_analog_devices(struct em28xx *dev)
> printk(KERN_INFO "%s: v4l2 driver version %s\n",
> dev->name, EM28XX_VERSION);
>
> + mutex_lock(&dev->lock);
> +
> ret = v4l2_device_register(&dev->udev->dev, &dev->v4l2_dev);
> if (ret < 0) {
> em28xx_errdev("Call to v4l2_device_register() failed!\n");
> @@ -2212,6 +2218,10 @@ int em28xx_register_analog_devices(struct em28xx *dev)
> dev->vinctl = EM28XX_VINCTRL_INTERLACED |
> EM28XX_VINCTRL_CCIR656_ENABLE;
>
> + /* Initialize tuner and camera */
> + em28xx_tuner_setup(dev);
> + em28xx_init_camera(dev);
> +
> /* Configure audio */
> ret = em28xx_audio_setup(dev);
> if (ret < 0) {
> @@ -2422,6 +2432,28 @@ int em28xx_register_analog_devices(struct em28xx *dev)
>
> /* initialize videobuf2 stuff */
> em28xx_vb2_setup(dev);
> +
> err:
> - return 0;
> + mutex_unlock(&dev->lock);
> + 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);
> diff --git a/drivers/media/usb/em28xx/em28xx.h b/drivers/media/usb/em28xx/em28xx.h
> index 7ae05ebc13c1..9d6f43e4681f 100644
> --- a/drivers/media/usb/em28xx/em28xx.h
> +++ b/drivers/media/usb/em28xx/em28xx.h
> @@ -26,7 +26,7 @@
> #ifndef _EM28XX_H
> #define _EM28XX_H
>
> -#define EM28XX_VERSION "0.2.0"
> +#define EM28XX_VERSION "0.2.1"
>
> #include <linux/workqueue.h>
> #include <linux/i2c.h>
> @@ -474,6 +474,7 @@ struct em28xx_eeprom {
> #define EM28XX_AUDIO 0x10
> #define EM28XX_DVB 0x20
> #define EM28XX_RC 0x30
> +#define EM28XX_V4L2 0x40
>
> /* em28xx resource types (used for res_get/res_lock etc */
> #define EM28XX_RESOURCE_VIDEO 0x01
> @@ -527,6 +528,7 @@ struct em28xx {
>
> unsigned int is_em25xx:1; /* em25xx/em276x/7x/8x family bridge */
> unsigned char disconnected:1; /* device has been diconnected */
> + unsigned int has_video:1;
> unsigned int has_audio_class:1;
> unsigned int has_alsa_audio:1;
> unsigned int is_audio_only:1;
> @@ -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_setup(struct em28xx *dev);
>
> -int em28xx_colorlevels_set_default(struct em28xx *dev);
> const struct em28xx_led *em28xx_find_led(struct em28xx *dev,
> enum em28xx_led_role role);
> 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 num_bufs, int max_pkt_size, int packet_multiplier);
> 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);
> void em28xx_stop_urbs(struct em28xx *dev);
> int em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode);
> 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);
> void em28xx_unregister_extension(struct em28xx_ops *dev);
> void em28xx_init_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 */
> extern struct em28xx_board em28xx_boards[];
> extern struct usb_device_id em28xx_id_table[];
> int em28xx_tuner_callback(void *ptr, int component, int command, int arg);
> void em28xx_release_resources(struct em28xx *dev);
>
> -/* Provided by em28xx-vbi.c */
> -extern struct vb2_ops em28xx_vbi_qops;
> -
> /* Provided by em28xx-camera.c */
> int em28xx_detect_sensor(struct em28xx *dev);
> int em28xx_init_camera(struct em28xx *dev);
Nice clean-up ! :)
next prev parent reply other threads:[~2014-01-05 10:45 UTC|newest]
Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-04 10:55 [PATCH v4 00/22] em28xx: split analog part into a separate module Mauro Carvalho Chehab
2014-01-04 10:55 ` [PATCH v4 01/22] [media] em28xx: move some video-specific functions to em28xx-video Mauro Carvalho Chehab
2014-01-05 10:11 ` Frank Schäfer
2014-01-05 13:28 ` Mauro Carvalho Chehab
2014-01-04 10:55 ` [PATCH v4 02/22] [media] em28xx: some cosmetic changes Mauro Carvalho Chehab
2014-01-05 10:13 ` Frank Schäfer
2014-01-04 10:55 ` [PATCH v4 03/22] [media] em28xx: move analog-specific init to em28xx-video Mauro Carvalho Chehab
2014-01-05 10:26 ` Frank Schäfer
2014-01-05 14:40 ` Mauro Carvalho Chehab
2014-01-06 21:28 ` Frank Schäfer
2014-01-04 10:55 ` [PATCH v4 04/22] [media] em28xx: make em28xx-video to be a separate module Mauro Carvalho Chehab
2014-01-05 10:47 ` Frank Schäfer [this message]
2014-01-05 12:56 ` Mauro Carvalho Chehab
2014-01-05 15:18 ` Mauro Carvalho Chehab
2014-01-06 21:35 ` Frank Schäfer
2014-01-06 17:38 ` Frank Schäfer
2014-01-04 10:55 ` [PATCH v4 05/22] [media] em28xx: initialize analog I2C devices at the right place Mauro Carvalho Chehab
2014-01-05 10:48 ` Frank Schäfer
2014-01-04 10:55 ` [PATCH v4 06/22] [media] em28xx: add warn messages for timeout Mauro Carvalho Chehab
2014-01-05 10:51 ` Frank Schäfer
2014-01-05 13:05 ` Mauro Carvalho Chehab
2014-01-05 13:25 ` Mauro Carvalho Chehab
2014-01-04 10:55 ` [PATCH v4 07/22] [media] em28xx: improve extension information messages Mauro Carvalho Chehab
2014-01-05 10:55 ` Frank Schäfer
2014-01-05 13:08 ` Mauro Carvalho Chehab
2014-01-05 15:31 ` Mauro Carvalho Chehab
2014-01-06 17:44 ` Frank Schäfer
2014-01-06 18:17 ` Mauro Carvalho Chehab
2014-01-04 10:55 ` [PATCH v4 08/22] [media] em28xx: convert i2c wait completion logic to use jiffies Mauro Carvalho Chehab
2014-01-05 11:03 ` Frank Schäfer
2014-01-05 13:10 ` Mauro Carvalho Chehab
2014-01-06 17:48 ` Frank Schäfer
2014-01-04 10:55 ` [PATCH v4 09/22] [media] tvp5150: make read operations atomic Mauro Carvalho Chehab
2014-01-05 11:07 ` Frank Schäfer
2014-01-04 10:55 ` [PATCH v4 10/22] [media] tuner-xc2028: remove unused code Mauro Carvalho Chehab
2014-01-05 11:07 ` Frank Schäfer
2014-01-04 10:55 ` [PATCH v4 11/22] [media] em28xx: check if a device has audio earlier Mauro Carvalho Chehab
2014-01-05 11:12 ` Frank Schäfer
2014-01-05 13:22 ` Mauro Carvalho Chehab
2014-01-04 10:55 ` [PATCH v4 12/22] [media] em28xx: properly implement AC97 wait code Mauro Carvalho Chehab
2014-01-05 11:19 ` Frank Schäfer
2014-01-05 13:20 ` Mauro Carvalho Chehab
2014-01-05 15:44 ` Mauro Carvalho Chehab
2014-01-07 16:50 ` Frank Schäfer
2014-01-04 10:55 ` [PATCH v4 13/22] [media] em28xx: initialize audio latter Mauro Carvalho Chehab
2014-01-05 11:29 ` Frank Schäfer
2014-01-05 13:17 ` Mauro Carvalho Chehab
2014-01-07 17:00 ` Frank Schäfer
2014-01-08 14:29 ` Mauro Carvalho Chehab
2014-01-04 10:55 ` [PATCH v4 14/22] [media] em28xx: unify module version Mauro Carvalho Chehab
2014-01-05 11:33 ` Frank Schäfer
2014-01-04 10:55 ` [PATCH v4 15/22] [media] em28xx: Fix em28xx deplock Mauro Carvalho Chehab
2014-01-05 11:38 ` Frank Schäfer
2014-01-04 10:55 ` [PATCH v4 16/22] [media] em28xx: use a better value for I2C timeouts Mauro Carvalho Chehab
2014-01-05 20:38 ` Frank Schäfer
2014-01-05 20:57 ` Mauro Carvalho Chehab
2014-01-07 17:15 ` Frank Schäfer
2014-01-08 14:39 ` Mauro Carvalho Chehab
2014-01-04 10:55 ` [PATCH v4 17/22] [media] em28xx-i2c: Fix error code for I2C error transfers Mauro Carvalho Chehab
2014-01-05 20:40 ` Frank Schäfer
2014-01-06 9:55 ` Mauro Carvalho Chehab
2014-01-07 17:28 ` Frank Schäfer
2014-01-08 11:55 ` Mauro Carvalho Chehab
2014-01-08 19:37 ` Frank Schäfer
2014-01-04 10:55 ` [PATCH v4 18/22] [media] em28xx: don't return -ENODEV for I2C xfer errors Mauro Carvalho Chehab
2014-01-05 20:49 ` Frank Schäfer
2014-01-06 10:37 ` Mauro Carvalho Chehab
2014-01-04 10:55 ` [PATCH v4 19/22] [media] em28xx: cleanup I2C debug messages Mauro Carvalho Chehab
2014-01-05 20:54 ` Frank Schäfer
2014-01-04 10:55 ` [PATCH v4 20/22] [media] em28xx: use usb_alloc_coherent() for audio Mauro Carvalho Chehab
2014-01-05 20:57 ` Frank Schäfer
2014-01-04 10:55 ` [PATCH v4 21/22] [media] em28xx-audio: allocate URBs at device driver init Mauro Carvalho Chehab
2014-01-05 21:02 ` Frank Schäfer
2014-01-05 21:25 ` Mauro Carvalho Chehab
2014-01-06 16:25 ` Mauro Carvalho Chehab
2014-01-07 17:03 ` Frank Schäfer
2014-01-08 14:10 ` Mauro Carvalho Chehab
2014-01-08 19:14 ` Frank Schäfer
2014-01-04 10:55 ` [PATCH v4 22/22] [media] em28xx: retry read operation if it fails Mauro Carvalho Chehab
2014-01-05 21:06 ` Frank Schäfer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52C93824.1000206@googlemail.com \
--to=fschaefer.oss@googlemail.com \
--cc=linux-media@vger.kernel.org \
--cc=m.chehab@samsung.com \
--cc=mchehab@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.