Commit db85a040 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

[media] omap24xx/tcm825x: remove deprecated omap2 camera drivers.

The omap2 camera driver and the tcm825x sensor driver have been
deprecated for a year and are now being removed. They are unmaintained
and they use an internal API that has long since been superseded by a
much better API. Worse, that internal API has been abused by out-of-kernel
trees (i.MX6).

In addition, Sakari stated that these drivers have never been in a
usable state in the mainline kernel due to missing platform data.
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Acked-by: default avatarSakari Ailus <sakari.ailus@iki.fi>
Cc: David Cohen <dacohen@gmail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent 1b65729a
...@@ -31,8 +31,6 @@ source "drivers/staging/media/mn88472/Kconfig" ...@@ -31,8 +31,6 @@ source "drivers/staging/media/mn88472/Kconfig"
source "drivers/staging/media/mn88473/Kconfig" source "drivers/staging/media/mn88473/Kconfig"
source "drivers/staging/media/omap24xx/Kconfig"
source "drivers/staging/media/omap4iss/Kconfig" source "drivers/staging/media/omap4iss/Kconfig"
# Keep LIRC at the end, as it has sub-menus # Keep LIRC at the end, as it has sub-menus
......
...@@ -4,7 +4,6 @@ obj-$(CONFIG_LIRC_STAGING) += lirc/ ...@@ -4,7 +4,6 @@ obj-$(CONFIG_LIRC_STAGING) += lirc/
obj-$(CONFIG_VIDEO_DT3155) += dt3155v4l/ obj-$(CONFIG_VIDEO_DT3155) += dt3155v4l/
obj-$(CONFIG_VIDEO_DM365_VPFE) += davinci_vpfe/ obj-$(CONFIG_VIDEO_DM365_VPFE) += davinci_vpfe/
obj-$(CONFIG_VIDEO_OMAP4) += omap4iss/ obj-$(CONFIG_VIDEO_OMAP4) += omap4iss/
obj-$(CONFIG_VIDEO_OMAP2) += omap24xx/
obj-$(CONFIG_VIDEO_TCM825X) += omap24xx/ obj-$(CONFIG_VIDEO_TCM825X) += omap24xx/
obj-$(CONFIG_DVB_MN88472) += mn88472/ obj-$(CONFIG_DVB_MN88472) += mn88472/
obj-$(CONFIG_DVB_MN88473) += mn88473/ obj-$(CONFIG_DVB_MN88473) += mn88473/
......
config VIDEO_V4L2_INT_DEVICE
tristate
config VIDEO_OMAP2
tristate "OMAP2 Camera Capture Interface driver (DEPRECATED)"
depends on VIDEO_DEV && ARCH_OMAP2
select VIDEOBUF_DMA_SG
select VIDEO_V4L2_INT_DEVICE
---help---
This is a v4l2 driver for the TI OMAP2 camera capture interface
It uses the deprecated int-device API. Since this driver is no
longer actively maintained and nobody is interested in converting
it to the subdev API, this driver will be removed soon.
If you do want to keep this driver in the kernel, and are willing
to convert it to the subdev API, then please contact the linux-media
mailinglist.
config VIDEO_TCM825X
tristate "TCM825x camera sensor support (DEPRECATED)"
depends on I2C && VIDEO_V4L2
depends on MEDIA_CAMERA_SUPPORT
select VIDEO_V4L2_INT_DEVICE
---help---
This is a driver for the Toshiba TCM825x VGA camera sensor.
It is used for example in Nokia N800.
It uses the deprecated int-device API. Since this driver is no
longer actively maintained and nobody is interested in converting
it to the subdev API, this driver will be removed soon.
If you do want to keep this driver in the kernel, and are willing
to convert it to the subdev API, then please contact the linux-media
mailinglist.
omap2cam-objs := omap24xxcam.o omap24xxcam-dma.o
obj-$(CONFIG_VIDEO_OMAP2) += omap2cam.o
obj-$(CONFIG_VIDEO_TCM825X) += tcm825x.o
obj-$(CONFIG_VIDEO_V4L2_INT_DEVICE) += v4l2-int-device.o
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
/*
* drivers/media/i2c/tcm825x.h
*
* Register definitions for the TCM825X CameraChip.
*
* Author: David Cohen (david.cohen@indt.org.br)
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed "as is" without any warranty of any
* kind, whether express or implied.
*
* This file was based on ov9640.h from MontaVista
*/
#ifndef TCM825X_H
#define TCM825X_H
#include <linux/videodev2.h>
#include "v4l2-int-device.h"
#define TCM825X_NAME "tcm825x"
#define TCM825X_MASK(x) (x & 0x00ff)
#define TCM825X_ADDR(x) ((x & 0xff00) >> 8)
/* The TCM825X I2C sensor chip has a fixed slave address of 0x3d. */
#define TCM825X_I2C_ADDR 0x3d
/*
* define register offsets for the TCM825X sensor chip
* OFFSET(8 bits) + MASK(8 bits)
* MASK bit 4 and 3 are used when the register uses more than one address
*/
#define TCM825X_FPS 0x0280
#define TCM825X_ACF 0x0240
#define TCM825X_DOUTBUF 0x020C
#define TCM825X_DCLKP 0x0202
#define TCM825X_ACFDET 0x0201
#define TCM825X_DOUTSW 0x0380
#define TCM825X_DATAHZ 0x0340
#define TCM825X_PICSIZ 0x033c
#define TCM825X_PICFMT 0x0302
#define TCM825X_V_INV 0x0480
#define TCM825X_H_INV 0x0440
#define TCM825X_ESRLSW 0x0430
#define TCM825X_V_LENGTH 0x040F
#define TCM825X_ALCSW 0x0580
#define TCM825X_ESRLIM 0x0560
#define TCM825X_ESRSPD_U 0x051F
#define TCM825X_ESRSPD_L 0x06FF
#define TCM825X_AG 0x07FF
#define TCM825X_ESRSPD2 0x06FF
#define TCM825X_ALCMODE 0x0830
#define TCM825X_ALCH 0x080F
#define TCM825X_ALCL 0x09FF
#define TCM825X_AWBSW 0x0A80
#define TCM825X_MRG 0x0BFF
#define TCM825X_MBG 0x0CFF
#define TCM825X_GAMSW 0x0D80
#define TCM825X_HDTG 0x0EFF
#define TCM825X_VDTG 0x0FFF
#define TCM825X_HDTCORE 0x10F0
#define TCM825X_VDTCORE 0x100F
#define TCM825X_CONT 0x11FF
#define TCM825X_BRIGHT 0x12FF
#define TCM825X_VHUE 0x137F
#define TCM825X_UHUE 0x147F
#define TCM825X_VGAIN 0x153F
#define TCM825X_UGAIN 0x163F
#define TCM825X_UVCORE 0x170F
#define TCM825X_SATU 0x187F
#define TCM825X_MHMODE 0x1980
#define TCM825X_MHLPFSEL 0x1940
#define TCM825X_YMODE 0x1930
#define TCM825X_MIXHG 0x1907
#define TCM825X_LENS 0x1A3F
#define TCM825X_AGLIM 0x1BE0
#define TCM825X_LENSRPOL 0x1B10
#define TCM825X_LENSRGAIN 0x1B0F
#define TCM825X_ES100S 0x1CFF
#define TCM825X_ES120S 0x1DFF
#define TCM825X_DMASK 0x1EC0
#define TCM825X_CODESW 0x1E20
#define TCM825X_CODESEL 0x1E10
#define TCM825X_TESPIC 0x1E04
#define TCM825X_PICSEL 0x1E03
#define TCM825X_HNUM 0x20FF
#define TCM825X_VOUTPH 0x287F
#define TCM825X_ESROUT 0x327F
#define TCM825X_ESROUT2 0x33FF
#define TCM825X_AGOUT 0x34FF
#define TCM825X_DGOUT 0x353F
#define TCM825X_AGSLOW1 0x39C0
#define TCM825X_FLLSMODE 0x3930
#define TCM825X_FLLSLIM 0x390F
#define TCM825X_DETSEL 0x3AF0
#define TCM825X_ACDETNC 0x3A0F
#define TCM825X_AGSLOW2 0x3BC0
#define TCM825X_DG 0x3B3F
#define TCM825X_REJHLEV 0x3CFF
#define TCM825X_ALCLOCK 0x3D80
#define TCM825X_FPSLNKSW 0x3D40
#define TCM825X_ALCSPD 0x3D30
#define TCM825X_REJH 0x3D03
#define TCM825X_SHESRSW 0x3E80
#define TCM825X_ESLIMSEL 0x3E40
#define TCM825X_SHESRSPD 0x3E30
#define TCM825X_ELSTEP 0x3E0C
#define TCM825X_ELSTART 0x3E03
#define TCM825X_AGMIN 0x3FFF
#define TCM825X_PREGRG 0x423F
#define TCM825X_PREGBG 0x433F
#define TCM825X_PRERG 0x443F
#define TCM825X_PREBG 0x453F
#define TCM825X_MSKBR 0x477F
#define TCM825X_MSKGR 0x487F
#define TCM825X_MSKRB 0x497F
#define TCM825X_MSKGB 0x4A7F
#define TCM825X_MSKRG 0x4B7F
#define TCM825X_MSKBG 0x4C7F
#define TCM825X_HDTCSW 0x4D80
#define TCM825X_VDTCSW 0x4D40
#define TCM825X_DTCYL 0x4D3F
#define TCM825X_HDTPSW 0x4E80
#define TCM825X_VDTPSW 0x4E40
#define TCM825X_DTCGAIN 0x4E3F
#define TCM825X_DTLLIMSW 0x4F10
#define TCM825X_DTLYLIM 0x4F0F
#define TCM825X_YLCUTLMSK 0x5080
#define TCM825X_YLCUTL 0x503F
#define TCM825X_YLCUTHMSK 0x5180
#define TCM825X_YLCUTH 0x513F
#define TCM825X_UVSKNC 0x527F
#define TCM825X_UVLJ 0x537F
#define TCM825X_WBGMIN 0x54FF
#define TCM825X_WBGMAX 0x55FF
#define TCM825X_WBSPDUP 0x5603
#define TCM825X_ALLAREA 0x5820
#define TCM825X_WBLOCK 0x5810
#define TCM825X_WB2SP 0x580F
#define TCM825X_KIZUSW 0x5920
#define TCM825X_PBRSW 0x5910
#define TCM825X_ABCSW 0x5903
#define TCM825X_PBDLV 0x5AFF
#define TCM825X_PBC1LV 0x5BFF
#define TCM825X_NUM_REGS (TCM825X_ADDR(TCM825X_PBC1LV) + 1)
#define TCM825X_BYTES_PER_PIXEL 2
#define TCM825X_REG_TERM 0xff /* terminating list entry for reg */
#define TCM825X_VAL_TERM 0xff /* terminating list entry for val */
/* define a structure for tcm825x register initialization values */
struct tcm825x_reg {
u8 val;
u16 reg;
};
enum image_size { subQCIF = 0, QQVGA, QCIF, QVGA, CIF, VGA };
enum pixel_format { YUV422 = 0, RGB565 };
#define NUM_IMAGE_SIZES 6
#define NUM_PIXEL_FORMATS 2
#define TCM825X_XCLK_MIN 11900000
#define TCM825X_XCLK_MAX 25000000
struct capture_size {
unsigned long width;
unsigned long height;
};
struct tcm825x_platform_data {
/* Is the sensor usable? Doesn't yet mean it's there, but you
* can try! */
int (*is_okay)(void);
/* Set power state, zero is off, non-zero is on. */
int (*power_set)(int power);
/* Default registers written after power-on or reset. */
const struct tcm825x_reg * (*default_regs)(void);
int (*needs_reset)(struct v4l2_int_device *s, void *buf,
struct v4l2_pix_format *fmt);
int (*ifparm)(struct v4l2_ifparm *p);
int (*is_upside_down)(void);
};
/* Array of image sizes supported by TCM825X. These must be ordered from
* smallest image size to largest.
*/
static const struct capture_size tcm825x_sizes[] = {
{ 128, 96 }, /* subQCIF */
{ 160, 120 }, /* QQVGA */
{ 176, 144 }, /* QCIF */
{ 320, 240 }, /* QVGA */
{ 352, 288 }, /* CIF */
{ 640, 480 }, /* VGA */
};
#endif /* ifndef TCM825X_H */
/*
* drivers/media/video/v4l2-int-device.c
*
* V4L2 internal ioctl interface.
*
* Copyright (C) 2007 Nokia Corporation.
*
* Contact: Sakari Ailus <sakari.ailus@nokia.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/sort.h>
#include <linux/string.h>
#include <linux/module.h>
#include "v4l2-int-device.h"
static DEFINE_MUTEX(mutex);
static LIST_HEAD(int_list);
void v4l2_int_device_try_attach_all(void)
{
struct v4l2_int_device *m, *s;
list_for_each_entry(m, &int_list, head) {
if (m->type != v4l2_int_type_master)
continue;
list_for_each_entry(s, &int_list, head) {
if (s->type != v4l2_int_type_slave)
continue;
/* Slave is connected? */
if (s->u.slave->master)
continue;
/* Slave wants to attach to master? */
if (s->u.slave->attach_to[0] != 0
&& strncmp(m->name, s->u.slave->attach_to,
V4L2NAMESIZE))
continue;
if (!try_module_get(m->module))
continue;
s->u.slave->master = m;
if (m->u.master->attach(s)) {
s->u.slave->master = NULL;
module_put(m->module);
continue;
}
}
}
}
EXPORT_SYMBOL_GPL(v4l2_int_device_try_attach_all);
static int ioctl_sort_cmp(const void *a, const void *b)
{
const struct v4l2_int_ioctl_desc *d1 = a, *d2 = b;
if (d1->num > d2->num)
return 1;
if (d1->num < d2->num)
return -1;
return 0;
}
int v4l2_int_device_register(struct v4l2_int_device *d)
{
if (d->type == v4l2_int_type_slave)
sort(d->u.slave->ioctls, d->u.slave->num_ioctls,
sizeof(struct v4l2_int_ioctl_desc),
&ioctl_sort_cmp, NULL);
mutex_lock(&mutex);
list_add(&d->head, &int_list);
v4l2_int_device_try_attach_all();
mutex_unlock(&mutex);
return 0;
}
EXPORT_SYMBOL_GPL(v4l2_int_device_register);
void v4l2_int_device_unregister(struct v4l2_int_device *d)
{
mutex_lock(&mutex);
list_del(&d->head);
if (d->type == v4l2_int_type_slave
&& d->u.slave->master != NULL) {
d->u.slave->master->u.master->detach(d);
module_put(d->u.slave->master->module);
d->u.slave->master = NULL;
}
mutex_unlock(&mutex);
}
EXPORT_SYMBOL_GPL(v4l2_int_device_unregister);
/* Adapted from search_extable in extable.c. */
static v4l2_int_ioctl_func *find_ioctl(struct v4l2_int_slave *slave, int cmd,
v4l2_int_ioctl_func *no_such_ioctl)
{
const struct v4l2_int_ioctl_desc *first = slave->ioctls;
const struct v4l2_int_ioctl_desc *last =
first + slave->num_ioctls - 1;
while (first <= last) {
const struct v4l2_int_ioctl_desc *mid;
mid = (last - first) / 2 + first;
if (mid->num < cmd)
first = mid + 1;
else if (mid->num > cmd)
last = mid - 1;
else
return mid->func;
}
return no_such_ioctl;
}
static int no_such_ioctl_0(struct v4l2_int_device *d)
{
return -ENOIOCTLCMD;
}
int v4l2_int_ioctl_0(struct v4l2_int_device *d, int cmd)
{
return ((v4l2_int_ioctl_func_0 *)
find_ioctl(d->u.slave, cmd,
(v4l2_int_ioctl_func *)no_such_ioctl_0))(d);
}
EXPORT_SYMBOL_GPL(v4l2_int_ioctl_0);
static int no_such_ioctl_1(struct v4l2_int_device *d, void *arg)
{
return -ENOIOCTLCMD;
}
int v4l2_int_ioctl_1(struct v4l2_int_device *d, int cmd, void *arg)
{
return ((v4l2_int_ioctl_func_1 *)
find_ioctl(d->u.slave, cmd,
(v4l2_int_ioctl_func *)no_such_ioctl_1))(d, arg);
}
EXPORT_SYMBOL_GPL(v4l2_int_ioctl_1);
MODULE_LICENSE("GPL");
/*
* include/media/v4l2-int-device.h
*
* V4L2 internal ioctl interface.
*
* Copyright (C) 2007 Nokia Corporation.
*
* Contact: Sakari Ailus <sakari.ailus@nokia.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#ifndef V4L2_INT_DEVICE_H
#define V4L2_INT_DEVICE_H
#include <media/v4l2-common.h>
#define V4L2NAMESIZE 32
/*
*
* The internal V4L2 device interface core.
*
*/
enum v4l2_int_type {
v4l2_int_type_master = 1,
v4l2_int_type_slave
};
struct module;
struct v4l2_int_device;
struct v4l2_int_master {
int (*attach)(struct v4l2_int_device *slave);
void (*detach)(struct v4l2_int_device *slave);
};
typedef int (v4l2_int_ioctl_func)(struct v4l2_int_device *);
typedef int (v4l2_int_ioctl_func_0)(struct v4l2_int_device *);
typedef int (v4l2_int_ioctl_func_1)(struct v4l2_int_device *, void *);
struct v4l2_int_ioctl_desc {
int num;
v4l2_int_ioctl_func *func;
};
struct v4l2_int_slave {
/* Don't touch master. */
struct v4l2_int_device *master;
char attach_to[V4L2NAMESIZE];
int num_ioctls;
struct v4l2_int_ioctl_desc *ioctls;
};
struct v4l2_int_device {
/* Don't touch head. */
struct list_head head;
struct module *module;
char name[V4L2NAMESIZE];
enum v4l2_int_type type;
union {
struct v4l2_int_master *master;
struct v4l2_int_slave *slave;
} u;
void *priv;
};
void v4l2_int_device_try_attach_all(void);
int v4l2_int_device_register(struct v4l2_int_device *d);
void v4l2_int_device_unregister(struct v4l2_int_device *d);
int v4l2_int_ioctl_0(struct v4l2_int_device *d, int cmd);
int v4l2_int_ioctl_1(struct v4l2_int_device *d, int cmd, void *arg);
/*
*
* Types and definitions for IOCTL commands.
*
*/
enum v4l2_power {
V4L2_POWER_OFF = 0,
V4L2_POWER_ON,
V4L2_POWER_STANDBY,
};
/* Slave interface type. */
enum v4l2_if_type {
/*
* Parallel 8-, 10- or 12-bit interface, used by for example
* on certain image sensors.
*/
V4L2_IF_TYPE_BT656,
};
enum v4l2_if_type_bt656_mode {
/*
* Modes without Bt synchronisation codes. Separate
* synchronisation signal lines are used.
*/
V4L2_IF_TYPE_BT656_MODE_NOBT_8BIT,
V4L2_IF_TYPE_BT656_MODE_NOBT_10BIT,
V4L2_IF_TYPE_BT656_MODE_NOBT_12BIT,
/*
* Use Bt synchronisation codes. The vertical and horizontal
* synchronisation is done based on synchronisation codes.
*/
V4L2_IF_TYPE_BT656_MODE_BT_8BIT,
V4L2_IF_TYPE_BT656_MODE_BT_10BIT,
};
struct v4l2_if_type_bt656 {
/*
* 0: Frame begins when vsync is high.
* 1: Frame begins when vsync changes from low to high.
*/
unsigned frame_start_on_rising_vs:1;
/* Use Bt synchronisation codes for sync correction. */
unsigned bt_sync_correct:1;
/* Swap every two adjacent image data elements. */
unsigned swap:1;
/* Inverted latch clock polarity from slave. */
unsigned latch_clk_inv:1;
/* Hs polarity. 0 is active high, 1 active low. */
unsigned nobt_hs_inv:1;
/* Vs polarity. 0 is active high, 1 active low. */
unsigned nobt_vs_inv:1;
enum v4l2_if_type_bt656_mode mode;
/* Minimum accepted bus clock for slave (in Hz). */
u32 clock_min;
/* Maximum accepted bus clock for slave. */
u32 clock_max;
/*
* Current wish of the slave. May only change in response to
* ioctls that affect image capture.
*/
u32 clock_curr;
};
struct v4l2_ifparm {
enum v4l2_if_type if_type;
union {
struct v4l2_if_type_bt656 bt656;
} u;
};
/* IOCTL command numbers. */
enum v4l2_int_ioctl_num {
/*
*
* "Proper" V4L ioctls, as in struct video_device.
*
*/
vidioc_int_enum_fmt_cap_num = 1,
vidioc_int_g_fmt_cap_num,
vidioc_int_s_fmt_cap_num,
vidioc_int_try_fmt_cap_num,
vidioc_int_queryctrl_num,
vidioc_int_g_ctrl_num,
vidioc_int_s_ctrl_num,
vidioc_int_cropcap_num,
vidioc_int_g_crop_num,
vidioc_int_s_crop_num,
vidioc_int_g_parm_num,
vidioc_int_s_parm_num,
vidioc_int_querystd_num,
vidioc_int_s_std_num,
vidioc_int_s_video_routing_num,
/*
*
* Strictly internal ioctls.
*
*/
/* Initialise the device when slave attaches to the master. */
vidioc_int_dev_init_num = 1000,
/* Delinitialise the device at slave detach. */
vidioc_int_dev_exit_num,
/* Set device power state. */
vidioc_int_s_power_num,
/*
* Get slave private data, e.g. platform-specific slave
* configuration used by the master.
*/
vidioc_int_g_priv_num,
/* Get slave interface parameters. */
vidioc_int_g_ifparm_num,
/* Does the slave need to be reset after VIDIOC_DQBUF? */
vidioc_int_g_needs_reset_num,
vidioc_int_enum_framesizes_num,
vidioc_int_enum_frameintervals_num,
/*
*
* VIDIOC_INT_* ioctls.
*
*/
/* VIDIOC_INT_RESET */
vidioc_int_reset_num,
/* VIDIOC_INT_INIT */
vidioc_int_init_num,
/*
*
* Start of private ioctls.
*
*/
vidioc_int_priv_start_num = 2000,
};
/*
*
* IOCTL wrapper functions for better type checking.
*
*/
#define V4L2_INT_WRAPPER_0(name) \
static inline int vidioc_int_##name(struct v4l2_int_device *d) \
{ \
return v4l2_int_ioctl_0(d, vidioc_int_##name##_num); \
} \
\
static inline struct v4l2_int_ioctl_desc \
vidioc_int_##name##_cb(int (*func) \
(struct v4l2_int_device *)) \
{ \
struct v4l2_int_ioctl_desc desc; \
\
desc.num = vidioc_int_##name##_num; \
desc.func = (v4l2_int_ioctl_func *)func; \
\
return desc; \
}
#define V4L2_INT_WRAPPER_1(name, arg_type, asterisk) \
static inline int vidioc_int_##name(struct v4l2_int_device *d, \
arg_type asterisk arg) \
{ \
return v4l2_int_ioctl_1(d, vidioc_int_##name##_num, \
(void *)(unsigned long)arg); \
} \
\
static inline struct v4l2_int_ioctl_desc \
vidioc_int_##name##_cb(int (*func) \
(struct v4l2_int_device *, \
arg_type asterisk)) \
{ \
struct v4l2_int_ioctl_desc desc; \
\
desc.num = vidioc_int_##name##_num; \
desc.func = (v4l2_int_ioctl_func *)func; \
\
return desc; \
}
V4L2_INT_WRAPPER_1(enum_fmt_cap, struct v4l2_fmtdesc, *);
V4L2_INT_WRAPPER_1(g_fmt_cap, struct v4l2_format, *);
V4L2_INT_WRAPPER_1(s_fmt_cap, struct v4l2_format, *);
V4L2_INT_WRAPPER_1(try_fmt_cap, struct v4l2_format, *);
V4L2_INT_WRAPPER_1(queryctrl, struct v4l2_queryctrl, *);
V4L2_INT_WRAPPER_1(g_ctrl, struct v4l2_control, *);
V4L2_INT_WRAPPER_1(s_ctrl, struct v4l2_control, *);
V4L2_INT_WRAPPER_1(cropcap, struct v4l2_cropcap, *);
V4L2_INT_WRAPPER_1(g_crop, struct v4l2_crop, *);
V4L2_INT_WRAPPER_1(s_crop, struct v4l2_crop, *);
V4L2_INT_WRAPPER_1(g_parm, struct v4l2_streamparm, *);
V4L2_INT_WRAPPER_1(s_parm, struct v4l2_streamparm, *);
V4L2_INT_WRAPPER_1(querystd, v4l2_std_id, *);
V4L2_INT_WRAPPER_1(s_std, v4l2_std_id, *);
V4L2_INT_WRAPPER_1(s_video_routing, struct v4l2_routing, *);
V4L2_INT_WRAPPER_0(dev_init);
V4L2_INT_WRAPPER_0(dev_exit);
V4L2_INT_WRAPPER_1(s_power, enum v4l2_power, );
V4L2_INT_WRAPPER_1(g_priv, void, *);
V4L2_INT_WRAPPER_1(g_ifparm, struct v4l2_ifparm, *);
V4L2_INT_WRAPPER_1(g_needs_reset, void, *);
V4L2_INT_WRAPPER_1(enum_framesizes, struct v4l2_frmsizeenum, *);
V4L2_INT_WRAPPER_1(enum_frameintervals, struct v4l2_frmivalenum, *);
V4L2_INT_WRAPPER_0(reset);
V4L2_INT_WRAPPER_0(init);
#endif
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