xref: /openbmc/linux/include/media/v4l2-common.h (revision b0d3159be9a36fd8b7b1cf88b812d951add53d11)
1b2f0648fSHans Verkuil /*
2b2f0648fSHans Verkuil     v4l2 common internal API header
3b2f0648fSHans Verkuil 
4b2f0648fSHans Verkuil     This header contains internal shared ioctl definitions for use by the
5b2f0648fSHans Verkuil     internal low-level v4l2 drivers.
6b2f0648fSHans Verkuil     Each ioctl begins with VIDIOC_INT_ to clearly mark that it is an internal
7b2f0648fSHans Verkuil     define,
8b2f0648fSHans Verkuil 
9b2f0648fSHans Verkuil     Copyright (C) 2005  Hans Verkuil <hverkuil@xs4all.nl>
10b2f0648fSHans Verkuil 
11b2f0648fSHans Verkuil     This program is free software; you can redistribute it and/or modify
12b2f0648fSHans Verkuil     it under the terms of the GNU General Public License as published by
13b2f0648fSHans Verkuil     the Free Software Foundation; either version 2 of the License, or
14b2f0648fSHans Verkuil     (at your option) any later version.
15b2f0648fSHans Verkuil 
16b2f0648fSHans Verkuil     This program is distributed in the hope that it will be useful,
17b2f0648fSHans Verkuil     but WITHOUT ANY WARRANTY; without even the implied warranty of
18b2f0648fSHans Verkuil     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19b2f0648fSHans Verkuil     GNU General Public License for more details.
20b2f0648fSHans Verkuil 
21b2f0648fSHans Verkuil     You should have received a copy of the GNU General Public License
22b2f0648fSHans Verkuil     along with this program; if not, write to the Free Software
23b2f0648fSHans Verkuil     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24b2f0648fSHans Verkuil  */
25b2f0648fSHans Verkuil 
26b2f0648fSHans Verkuil #ifndef V4L2_COMMON_H_
27b2f0648fSHans Verkuil #define V4L2_COMMON_H_
28b2f0648fSHans Verkuil 
29401998faSMauro Carvalho Chehab #include <media/v4l2-dev.h>
30401998faSMauro Carvalho Chehab 
317e8b09eaSHans Verkuil /* Common printk constucts for v4l-i2c drivers. These macros create a unique
327e8b09eaSHans Verkuil    prefix consisting of the driver name, the adapter number and the i2c
337e8b09eaSHans Verkuil    address. */
347e8b09eaSHans Verkuil #define v4l_printk(level, name, adapter, addr, fmt, arg...) \
357e8b09eaSHans Verkuil 	printk(level "%s %d-%04x: " fmt, name, i2c_adapter_id(adapter), addr , ## arg)
367e8b09eaSHans Verkuil 
377e8b09eaSHans Verkuil #define v4l_client_printk(level, client, fmt, arg...)			    \
387e8b09eaSHans Verkuil 	v4l_printk(level, (client)->driver->driver.name, (client)->adapter, \
397e8b09eaSHans Verkuil 		   (client)->addr, fmt , ## arg)
407e8b09eaSHans Verkuil 
417e8b09eaSHans Verkuil #define v4l_err(client, fmt, arg...) \
427e8b09eaSHans Verkuil 	v4l_client_printk(KERN_ERR, client, fmt , ## arg)
437e8b09eaSHans Verkuil 
447e8b09eaSHans Verkuil #define v4l_warn(client, fmt, arg...) \
457e8b09eaSHans Verkuil 	v4l_client_printk(KERN_WARNING, client, fmt , ## arg)
467e8b09eaSHans Verkuil 
477e8b09eaSHans Verkuil #define v4l_info(client, fmt, arg...) \
487e8b09eaSHans Verkuil 	v4l_client_printk(KERN_INFO, client, fmt , ## arg)
497e8b09eaSHans Verkuil 
507e8b09eaSHans Verkuil /* These three macros assume that the debug level is set with a module
517e8b09eaSHans Verkuil    parameter called 'debug'. */
52f167cb4eSMauro Carvalho Chehab #define v4l_dbg(level, debug, client, fmt, arg...)			     \
537e8b09eaSHans Verkuil 	do { 								     \
547e8b09eaSHans Verkuil 		if (debug >= (level))					     \
557e8b09eaSHans Verkuil 			v4l_client_printk(KERN_DEBUG, client, fmt , ## arg); \
567e8b09eaSHans Verkuil 	} while (0)
577e8b09eaSHans Verkuil 
587e8b09eaSHans Verkuil /* ------------------------------------------------------------------------- */
597e8b09eaSHans Verkuil 
60dd99120cSHans Verkuil /* These printk constructs can be used with v4l2_device and v4l2_subdev */
61dd99120cSHans Verkuil #define v4l2_printk(level, dev, fmt, arg...) \
62dd99120cSHans Verkuil 	printk(level "%s: " fmt, (dev)->name , ## arg)
63dd99120cSHans Verkuil 
64dd99120cSHans Verkuil #define v4l2_err(dev, fmt, arg...) \
65dd99120cSHans Verkuil 	v4l2_printk(KERN_ERR, dev, fmt , ## arg)
66dd99120cSHans Verkuil 
67dd99120cSHans Verkuil #define v4l2_warn(dev, fmt, arg...) \
68dd99120cSHans Verkuil 	v4l2_printk(KERN_WARNING, dev, fmt , ## arg)
69dd99120cSHans Verkuil 
70dd99120cSHans Verkuil #define v4l2_info(dev, fmt, arg...) \
71dd99120cSHans Verkuil 	v4l2_printk(KERN_INFO, dev, fmt , ## arg)
72dd99120cSHans Verkuil 
73dd99120cSHans Verkuil /* These three macros assume that the debug level is set with a module
74dd99120cSHans Verkuil    parameter called 'debug'. */
75dd99120cSHans Verkuil #define v4l2_dbg(level, debug, dev, fmt, arg...)			\
76dd99120cSHans Verkuil 	do { 								\
77dd99120cSHans Verkuil 		if (debug >= (level))					\
78dd99120cSHans Verkuil 			v4l2_printk(KERN_DEBUG, dev, fmt , ## arg); 	\
79dd99120cSHans Verkuil 	} while (0)
80dd99120cSHans Verkuil 
81dd99120cSHans Verkuil /* ------------------------------------------------------------------------- */
82dd99120cSHans Verkuil 
8335ea11ffSHans Verkuil /* Priority helper functions */
8435ea11ffSHans Verkuil 
8535ea11ffSHans Verkuil struct v4l2_prio_state {
8635ea11ffSHans Verkuil 	atomic_t prios[4];
8735ea11ffSHans Verkuil };
8835ea11ffSHans Verkuil int v4l2_prio_init(struct v4l2_prio_state *global);
8935ea11ffSHans Verkuil int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local,
9035ea11ffSHans Verkuil 		     enum v4l2_priority new);
9135ea11ffSHans Verkuil int v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local);
9235ea11ffSHans Verkuil int v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority *local);
9335ea11ffSHans Verkuil enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global);
9435ea11ffSHans Verkuil int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority *local);
9535ea11ffSHans Verkuil 
9635ea11ffSHans Verkuil /* ------------------------------------------------------------------------- */
9735ea11ffSHans Verkuil 
989cb2318bSHans Verkuil /* Control helper functions */
999cb2318bSHans Verkuil 
1009cb2318bSHans Verkuil int v4l2_ctrl_check(struct v4l2_ext_control *ctrl, struct v4l2_queryctrl *qctrl,
1019cb2318bSHans Verkuil 		const char **menu_items);
10269028d70SHans Verkuil const char *v4l2_ctrl_get_name(u32 id);
1039cb2318bSHans Verkuil const char **v4l2_ctrl_get_menu(u32 id);
1049cb2318bSHans Verkuil int v4l2_ctrl_query_fill(struct v4l2_queryctrl *qctrl, s32 min, s32 max, s32 step, s32 def);
1059cb2318bSHans Verkuil int v4l2_ctrl_query_menu(struct v4l2_querymenu *qmenu,
1069cb2318bSHans Verkuil 		struct v4l2_queryctrl *qctrl, const char **menu_items);
1071e551266SHans Verkuil #define V4L2_CTRL_MENU_IDS_END (0xffffffff)
1081e551266SHans Verkuil int v4l2_ctrl_query_menu_valid_items(struct v4l2_querymenu *qmenu, const u32 *ids);
1092ba58894SHans Verkuil 
1102ba58894SHans Verkuil /* Note: ctrl_classes points to an array of u32 pointers. Each u32 array is a
1112ba58894SHans Verkuil    0-terminated array of control IDs. Each array must be sorted low to high
1122ba58894SHans Verkuil    and belong to the same control class. The array of u32 pointers must also
1132ba58894SHans Verkuil    be sorted, from low class IDs to high class IDs. */
1149cb2318bSHans Verkuil u32 v4l2_ctrl_next(const u32 * const *ctrl_classes, u32 id);
1159cb2318bSHans Verkuil 
1169cb2318bSHans Verkuil /* ------------------------------------------------------------------------- */
1179cb2318bSHans Verkuil 
118f3d092b8SHans Verkuil /* Register/chip ident helper function */
119f3d092b8SHans Verkuil 
120f3d092b8SHans Verkuil struct i2c_client; /* forward reference */
121aecde8b5SHans Verkuil int v4l2_chip_match_i2c_client(struct i2c_client *c, const struct v4l2_dbg_match *match);
122aecde8b5SHans Verkuil int v4l2_chip_ident_i2c_client(struct i2c_client *c, struct v4l2_dbg_chip_ident *chip,
1233434eb7eSHans Verkuil 		u32 ident, u32 revision);
124aecde8b5SHans Verkuil int v4l2_chip_match_host(const struct v4l2_dbg_match *match);
125f3d092b8SHans Verkuil 
126f3d092b8SHans Verkuil /* ------------------------------------------------------------------------- */
127f3d092b8SHans Verkuil 
12878a3b4dbSHans Verkuil /* I2C Helper functions */
1298ffbc655SHans Verkuil 
1308ffbc655SHans Verkuil struct i2c_driver;
1318ffbc655SHans Verkuil struct i2c_adapter;
1328ffbc655SHans Verkuil struct i2c_client;
133d2653e92SJean Delvare struct i2c_device_id;
134dd99120cSHans Verkuil struct v4l2_device;
135dd99120cSHans Verkuil struct v4l2_subdev;
136dd99120cSHans Verkuil struct v4l2_subdev_ops;
1378ffbc655SHans Verkuil 
1388ffbc655SHans Verkuil 
139dd99120cSHans Verkuil /* Load an i2c module and return an initialized v4l2_subdev struct.
140dd99120cSHans Verkuil    Only call request_module if module_name != NULL.
141dd99120cSHans Verkuil    The client_type argument is the name of the chip that's on the adapter. */
142e6574f2fSHans Verkuil struct v4l2_subdev *v4l2_i2c_new_subdev(struct v4l2_device *v4l2_dev,
143e6574f2fSHans Verkuil 		struct i2c_adapter *adapter,
144dd99120cSHans Verkuil 		const char *module_name, const char *client_type, u8 addr);
145dd99120cSHans Verkuil /* Probe and load an i2c module and return an initialized v4l2_subdev struct.
146dd99120cSHans Verkuil    Only call request_module if module_name != NULL.
147dd99120cSHans Verkuil    The client_type argument is the name of the chip that's on the adapter. */
148e6574f2fSHans Verkuil struct v4l2_subdev *v4l2_i2c_new_probed_subdev(struct v4l2_device *v4l2_dev,
149e6574f2fSHans Verkuil 		struct i2c_adapter *adapter,
150dd99120cSHans Verkuil 		const char *module_name, const char *client_type,
151dd99120cSHans Verkuil 		const unsigned short *addrs);
152868f985cSHans Verkuil /* Like v4l2_i2c_new_probed_subdev, except probe for a single address. */
153868f985cSHans Verkuil struct v4l2_subdev *v4l2_i2c_new_probed_subdev_addr(struct v4l2_device *v4l2_dev,
154868f985cSHans Verkuil 		struct i2c_adapter *adapter,
155868f985cSHans Verkuil 		const char *module_name, const char *client_type, u8 addr);
156f0222c7dSHans Verkuil 
157f0222c7dSHans Verkuil /* Load an i2c module and return an initialized v4l2_subdev struct.
158f0222c7dSHans Verkuil    Only call request_module if module_name != NULL.
159f0222c7dSHans Verkuil    The client_type argument is the name of the chip that's on the adapter. */
160f0222c7dSHans Verkuil struct v4l2_subdev *v4l2_i2c_new_subdev_cfg(struct v4l2_device *v4l2_dev,
161f0222c7dSHans Verkuil 		struct i2c_adapter *adapter,
162f0222c7dSHans Verkuil 		const char *module_name, const char *client_type,
163f0222c7dSHans Verkuil 		int irq, void *platform_data,
164f0222c7dSHans Verkuil 		u8 addr, const unsigned short *probe_addrs);
165f0222c7dSHans Verkuil 
166f0222c7dSHans Verkuil struct i2c_board_info;
167f0222c7dSHans Verkuil 
168f0222c7dSHans Verkuil struct v4l2_subdev *v4l2_i2c_new_subdev_board(struct v4l2_device *v4l2_dev,
169f0222c7dSHans Verkuil 		struct i2c_adapter *adapter, const char *module_name,
170f0222c7dSHans Verkuil 		struct i2c_board_info *info, const unsigned short *probe_addrs);
171f0222c7dSHans Verkuil 
172dd99120cSHans Verkuil /* Initialize an v4l2_subdev with data from an i2c_client struct */
173dd99120cSHans Verkuil void v4l2_i2c_subdev_init(struct v4l2_subdev *sd, struct i2c_client *client,
174dd99120cSHans Verkuil 		const struct v4l2_subdev_ops *ops);
175ab373190SHans Verkuil /* Return i2c client address of v4l2_subdev. */
176ab373190SHans Verkuil unsigned short v4l2_i2c_subdev_addr(struct v4l2_subdev *sd);
177dd99120cSHans Verkuil 
178c7d29e2fSHans Verkuil enum v4l2_i2c_tuner_type {
179c7d29e2fSHans Verkuil 	ADDRS_RADIO,	/* Radio tuner addresses */
180c7d29e2fSHans Verkuil 	ADDRS_DEMOD,	/* Demod tuner addresses */
181c7d29e2fSHans Verkuil 	ADDRS_TV,	/* TV tuner addresses */
182c7d29e2fSHans Verkuil 	/* TV tuner addresses if demod is present, this excludes
183c7d29e2fSHans Verkuil 	   addresses used by the demodulator from the list of
184c7d29e2fSHans Verkuil 	   candidates. */
185c7d29e2fSHans Verkuil 	ADDRS_TV_WITH_DEMOD,
186c7d29e2fSHans Verkuil };
187c7d29e2fSHans Verkuil /* Return a list of I2C tuner addresses to probe. Use only if the tuner
188c7d29e2fSHans Verkuil    addresses are unknown. */
189c7d29e2fSHans Verkuil const unsigned short *v4l2_i2c_tuner_addrs(enum v4l2_i2c_tuner_type type);
190c7d29e2fSHans Verkuil 
1918ffbc655SHans Verkuil /* ------------------------------------------------------------------------- */
1928ffbc655SHans Verkuil 
1936c31e598SHans Verkuil /* Note: these remaining ioctls/structs should be removed as well, but they are
1946c31e598SHans Verkuil    still used in tuner-simple.c (TUNER_SET_CONFIG), cx18/ivtv (RESET) and
1956c31e598SHans Verkuil    v4l2-int-device.h (v4l2_routing). To remove these ioctls some more cleanup
1966c31e598SHans Verkuil    is needed in those modules. */
1977e8b09eaSHans Verkuil 
19878a3b4dbSHans Verkuil /* s_config */
1997f171123SMauro Carvalho Chehab struct v4l2_priv_tun_config {
2007f171123SMauro Carvalho Chehab 	int tuner;
2017f171123SMauro Carvalho Chehab 	void *priv;
2027f171123SMauro Carvalho Chehab };
2037f171123SMauro Carvalho Chehab #define TUNER_SET_CONFIG           _IOW('d', 92, struct v4l2_priv_tun_config)
2045e453dc7SMichael Krufky 
2056c31e598SHans Verkuil #define VIDIOC_INT_RESET            	_IOW ('d', 102, u32)
2066c31e598SHans Verkuil 
207757d2505SHans Verkuil struct v4l2_routing {
208757d2505SHans Verkuil 	u32 input;
209757d2505SHans Verkuil 	u32 output;
210757d2505SHans Verkuil };
2111b6f1d96SHans Verkuil 
212*b0d3159bSTrent Piepho /* ------------------------------------------------------------------------- */
213*b0d3159bSTrent Piepho 
214*b0d3159bSTrent Piepho /* Miscellaneous helper functions */
215*b0d3159bSTrent Piepho 
216*b0d3159bSTrent Piepho void v4l_bound_align_image(unsigned int *w, unsigned int wmin,
217*b0d3159bSTrent Piepho 			   unsigned int wmax, unsigned int walign,
218*b0d3159bSTrent Piepho 			   unsigned int *h, unsigned int hmin,
219*b0d3159bSTrent Piepho 			   unsigned int hmax, unsigned int halign,
220*b0d3159bSTrent Piepho 			   unsigned int salign);
221*b0d3159bSTrent Piepho 
222b2f0648fSHans Verkuil #endif /* V4L2_COMMON_H_ */
223