| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 1 | /* | 
 | 2 |     V4L2 sub-device support header. | 
 | 3 |  | 
 | 4 |     Copyright (C) 2008  Hans Verkuil <hverkuil@xs4all.nl> | 
 | 5 |  | 
 | 6 |     This program is free software; you can redistribute it and/or modify | 
 | 7 |     it under the terms of the GNU General Public License as published by | 
 | 8 |     the Free Software Foundation; either version 2 of the License, or | 
 | 9 |     (at your option) any later version. | 
 | 10 |  | 
 | 11 |     This program is distributed in the hope that it will be useful, | 
 | 12 |     but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 | 13 |     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 | 14 |     GNU General Public License for more details. | 
 | 15 |  | 
 | 16 |     You should have received a copy of the GNU General Public License | 
 | 17 |     along with this program; if not, write to the Free Software | 
 | 18 |     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | 
 | 19 |  */ | 
 | 20 |  | 
 | 21 | #ifndef _V4L2_SUBDEV_H | 
 | 22 | #define _V4L2_SUBDEV_H | 
 | 23 |  | 
 | 24 | #include <media/v4l2-common.h> | 
 | 25 |  | 
 | 26 | struct v4l2_device; | 
 | 27 | struct v4l2_subdev; | 
 | 28 | struct tuner_setup; | 
 | 29 |  | 
| Hans Verkuil | 78a3b4d | 2009-04-01 03:41:09 -0300 | [diff] [blame] | 30 | /* decode_vbi_line */ | 
 | 31 | struct v4l2_decode_vbi_line { | 
 | 32 | 	u32 is_second_field;	/* Set to 0 for the first (odd) field, | 
 | 33 | 				   set to 1 for the second (even) field. */ | 
 | 34 | 	u8 *p; 			/* Pointer to the sliced VBI data from the decoder. | 
 | 35 | 				   On exit points to the start of the payload. */ | 
 | 36 | 	u32 line;		/* Line number of the sliced VBI data (1-23) */ | 
 | 37 | 	u32 type;		/* VBI service type (V4L2_SLICED_*). 0 if no service found */ | 
 | 38 | }; | 
 | 39 |  | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 40 | /* Sub-devices are devices that are connected somehow to the main bridge | 
 | 41 |    device. These devices are usually audio/video muxers/encoders/decoders or | 
 | 42 |    sensors and webcam controllers. | 
 | 43 |  | 
 | 44 |    Usually these devices are controlled through an i2c bus, but other busses | 
 | 45 |    may also be used. | 
 | 46 |  | 
 | 47 |    The v4l2_subdev struct provides a way of accessing these devices in a | 
 | 48 |    generic manner. Most operations that these sub-devices support fall in | 
 | 49 |    a few categories: core ops, audio ops, video ops and tuner ops. | 
 | 50 |  | 
 | 51 |    More categories can be added if needed, although this should remain a | 
 | 52 |    limited set (no more than approx. 8 categories). | 
 | 53 |  | 
 | 54 |    Each category has its own set of ops that subdev drivers can implement. | 
 | 55 |  | 
 | 56 |    A subdev driver can leave the pointer to the category ops NULL if | 
 | 57 |    it does not implement them (e.g. an audio subdev will generally not | 
 | 58 |    implement the video category ops). The exception is the core category: | 
 | 59 |    this must always be present. | 
 | 60 |  | 
 | 61 |    These ops are all used internally so it is no problem to change, remove | 
 | 62 |    or add ops or move ops from one to another category. Currently these | 
 | 63 |    ops are based on the original ioctls, but since ops are not limited to | 
 | 64 |    one argument there is room for improvement here once all i2c subdev | 
 | 65 |    drivers are converted to use these ops. | 
 | 66 |  */ | 
 | 67 |  | 
 | 68 | /* Core ops: it is highly recommended to implement at least these ops: | 
 | 69 |  | 
 | 70 |    g_chip_ident | 
 | 71 |    log_status | 
 | 72 |    g_register | 
 | 73 |    s_register | 
 | 74 |  | 
 | 75 |    This provides basic debugging support. | 
 | 76 |  | 
 | 77 |    The ioctl ops is meant for generic ioctl-like commands. Depending on | 
 | 78 |    the use-case it might be better to use subdev-specific ops (currently | 
 | 79 |    not yet implemented) since ops provide proper type-checking. | 
 | 80 |  */ | 
| Hans Verkuil | 78a3b4d | 2009-04-01 03:41:09 -0300 | [diff] [blame] | 81 |  | 
| Hans Verkuil | f0222c7 | 2009-06-09 17:12:33 -0300 | [diff] [blame] | 82 | /* s_config: if set, then it is always called by the v4l2_i2c_new_subdev* | 
 | 83 | 	functions after the v4l2_subdev was registered. It is used to pass | 
 | 84 | 	platform data to the subdev which can be used during initialization. | 
 | 85 |  | 
 | 86 |    init: initialize the sensor registors to some sort of reasonable default | 
| Hans Verkuil | 78a3b4d | 2009-04-01 03:41:09 -0300 | [diff] [blame] | 87 | 	values. Do not use for new drivers and should be removed in existing | 
 | 88 | 	drivers. | 
 | 89 |  | 
| Hans Verkuil | cc26b07 | 2009-03-29 19:20:26 -0300 | [diff] [blame] | 90 |    load_fw: load firmware. | 
 | 91 |  | 
 | 92 |    reset: generic reset command. The argument selects which subsystems to | 
| Hans Verkuil | 78a3b4d | 2009-04-01 03:41:09 -0300 | [diff] [blame] | 93 | 	reset. Passing 0 will always reset the whole chip. Do not use for new | 
 | 94 | 	drivers without discussing this first on the linux-media mailinglist. | 
 | 95 | 	There should be no reason normally to reset a device. | 
 | 96 |  | 
 | 97 |    s_gpio: set GPIO pins. Very simple right now, might need to be extended with | 
 | 98 | 	a direction argument if needed. | 
| Hans Verkuil | 78a3b4d | 2009-04-01 03:41:09 -0300 | [diff] [blame] | 99 |  */ | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 100 | struct v4l2_subdev_core_ops { | 
| Hans Verkuil | aecde8b5 | 2008-12-30 07:14:19 -0300 | [diff] [blame] | 101 | 	int (*g_chip_ident)(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip); | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 102 | 	int (*log_status)(struct v4l2_subdev *sd); | 
| Hans Verkuil | f0222c7 | 2009-06-09 17:12:33 -0300 | [diff] [blame] | 103 | 	int (*s_config)(struct v4l2_subdev *sd, int irq, void *platform_data); | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 104 | 	int (*init)(struct v4l2_subdev *sd, u32 val); | 
| Hans Verkuil | cc26b07 | 2009-03-29 19:20:26 -0300 | [diff] [blame] | 105 | 	int (*load_fw)(struct v4l2_subdev *sd); | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 106 | 	int (*reset)(struct v4l2_subdev *sd, u32 val); | 
 | 107 | 	int (*s_gpio)(struct v4l2_subdev *sd, u32 val); | 
 | 108 | 	int (*queryctrl)(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc); | 
 | 109 | 	int (*g_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl); | 
 | 110 | 	int (*s_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl); | 
| Hans Verkuil | 952617f | 2009-01-12 18:17:14 -0300 | [diff] [blame] | 111 | 	int (*g_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls); | 
 | 112 | 	int (*s_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls); | 
 | 113 | 	int (*try_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls); | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 114 | 	int (*querymenu)(struct v4l2_subdev *sd, struct v4l2_querymenu *qm); | 
| Hans Verkuil | f41737e | 2009-04-01 03:52:39 -0300 | [diff] [blame] | 115 | 	int (*s_std)(struct v4l2_subdev *sd, v4l2_std_id norm); | 
| Hans Verkuil | 069b747 | 2008-12-30 07:04:34 -0300 | [diff] [blame] | 116 | 	long (*ioctl)(struct v4l2_subdev *sd, unsigned int cmd, void *arg); | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 117 | #ifdef CONFIG_VIDEO_ADV_DEBUG | 
| Hans Verkuil | aecde8b5 | 2008-12-30 07:14:19 -0300 | [diff] [blame] | 118 | 	int (*g_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg); | 
 | 119 | 	int (*s_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg); | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 120 | #endif | 
 | 121 | }; | 
 | 122 |  | 
| Hans Verkuil | 78a3b4d | 2009-04-01 03:41:09 -0300 | [diff] [blame] | 123 | /* s_mode: switch the tuner to a specific tuner mode. Replacement of s_radio. | 
 | 124 |  | 
 | 125 |    s_radio: v4l device was opened in Radio mode, to be replaced by s_mode. | 
 | 126 |  | 
 | 127 |    s_type_addr: sets tuner type and its I2C addr. | 
 | 128 |  | 
 | 129 |    s_config: sets tda9887 specific stuff, like port1, port2 and qss | 
| Hans Verkuil | 7c9fc9d | 2009-04-01 03:49:59 -0300 | [diff] [blame] | 130 |  | 
 | 131 |    s_standby: puts tuner on powersaving state, disabling it, except for i2c. | 
| Hans Verkuil | 78a3b4d | 2009-04-01 03:41:09 -0300 | [diff] [blame] | 132 |  */ | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 133 | struct v4l2_subdev_tuner_ops { | 
 | 134 | 	int (*s_mode)(struct v4l2_subdev *sd, enum v4l2_tuner_type); | 
 | 135 | 	int (*s_radio)(struct v4l2_subdev *sd); | 
 | 136 | 	int (*s_frequency)(struct v4l2_subdev *sd, struct v4l2_frequency *freq); | 
 | 137 | 	int (*g_frequency)(struct v4l2_subdev *sd, struct v4l2_frequency *freq); | 
 | 138 | 	int (*g_tuner)(struct v4l2_subdev *sd, struct v4l2_tuner *vt); | 
 | 139 | 	int (*s_tuner)(struct v4l2_subdev *sd, struct v4l2_tuner *vt); | 
| Eduardo Valentin | d6bacea | 2009-08-08 08:34:18 -0300 | [diff] [blame] | 140 | 	int (*g_modulator)(struct v4l2_subdev *sd, struct v4l2_modulator *vm); | 
 | 141 | 	int (*s_modulator)(struct v4l2_subdev *sd, struct v4l2_modulator *vm); | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 142 | 	int (*s_type_addr)(struct v4l2_subdev *sd, struct tuner_setup *type); | 
 | 143 | 	int (*s_config)(struct v4l2_subdev *sd, const struct v4l2_priv_tun_config *config); | 
| Hans Verkuil | 7c9fc9d | 2009-04-01 03:49:59 -0300 | [diff] [blame] | 144 | 	int (*s_standby)(struct v4l2_subdev *sd); | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 145 | }; | 
 | 146 |  | 
| Hans Verkuil | 78a3b4d | 2009-04-01 03:41:09 -0300 | [diff] [blame] | 147 | /* s_clock_freq: set the frequency (in Hz) of the audio clock output. | 
 | 148 | 	Used to slave an audio processor to the video decoder, ensuring that | 
 | 149 | 	audio and video remain synchronized. Usual values for the frequency | 
 | 150 | 	are 48000, 44100 or 32000 Hz. If the frequency is not supported, then | 
 | 151 | 	-EINVAL is returned. | 
 | 152 |  | 
 | 153 |    s_i2s_clock_freq: sets I2S speed in bps. This is used to provide a standard | 
 | 154 | 	way to select I2S clock used by driving digital audio streams at some | 
 | 155 | 	board designs. Usual values for the frequency are 1024000 and 2048000. | 
 | 156 | 	If the frequency is not supported, then -EINVAL is returned. | 
 | 157 |  | 
| Hans Verkuil | 5325b42 | 2009-04-02 11:26:22 -0300 | [diff] [blame] | 158 |    s_routing: used to define the input and/or output pins of an audio chip, | 
 | 159 | 	and any additional configuration data. | 
| Hans Verkuil | 78a3b4d | 2009-04-01 03:41:09 -0300 | [diff] [blame] | 160 | 	Never attempt to use user-level input IDs (e.g. Composite, S-Video, | 
 | 161 | 	Tuner) at this level. An i2c device shouldn't know about whether an | 
 | 162 | 	input pin is connected to a Composite connector, become on another | 
 | 163 | 	board or platform it might be connected to something else entirely. | 
 | 164 | 	The calling driver is responsible for mapping a user-level input to | 
 | 165 | 	the right pins on the i2c device. | 
 | 166 |  */ | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 167 | struct v4l2_subdev_audio_ops { | 
 | 168 | 	int (*s_clock_freq)(struct v4l2_subdev *sd, u32 freq); | 
 | 169 | 	int (*s_i2s_clock_freq)(struct v4l2_subdev *sd, u32 freq); | 
| Hans Verkuil | 5325b42 | 2009-04-02 11:26:22 -0300 | [diff] [blame] | 170 | 	int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config); | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 171 | }; | 
 | 172 |  | 
| Hans Verkuil | 78a3b4d | 2009-04-01 03:41:09 -0300 | [diff] [blame] | 173 | /* | 
 | 174 |    decode_vbi_line: video decoders that support sliced VBI need to implement | 
 | 175 | 	this ioctl. Field p of the v4l2_sliced_vbi_line struct is set to the | 
 | 176 | 	start of the VBI data that was generated by the decoder. The driver | 
 | 177 | 	then parses the sliced VBI data and sets the other fields in the | 
 | 178 | 	struct accordingly. The pointer p is updated to point to the start of | 
 | 179 | 	the payload which can be copied verbatim into the data field of the | 
 | 180 | 	v4l2_sliced_vbi_data struct. If no valid VBI data was found, then the | 
 | 181 | 	type field is set to 0 on return. | 
 | 182 |  | 
| Hans Verkuil | cc26b07 | 2009-03-29 19:20:26 -0300 | [diff] [blame] | 183 |    s_vbi_data: used to generate VBI signals on a video signal. | 
| Hans Verkuil | 78a3b4d | 2009-04-01 03:41:09 -0300 | [diff] [blame] | 184 | 	v4l2_sliced_vbi_data is filled with the data packets that should be | 
 | 185 | 	output. Note that if you set the line field to 0, then that VBI signal | 
 | 186 | 	is disabled. If no valid VBI data was found, then the type field is | 
 | 187 | 	set to 0 on return. | 
 | 188 |  | 
| Hans Verkuil | cc26b07 | 2009-03-29 19:20:26 -0300 | [diff] [blame] | 189 |    g_vbi_data: used to obtain the sliced VBI packet from a readback register. | 
| Hans Verkuil | 78a3b4d | 2009-04-01 03:41:09 -0300 | [diff] [blame] | 190 | 	Not all video decoders support this. If no data is available because | 
 | 191 | 	the readback register contains invalid or erroneous data -EIO is | 
 | 192 | 	returned. Note that you must fill in the 'id' member and the 'field' | 
 | 193 | 	member (to determine whether CC data from the first or second field | 
 | 194 | 	should be obtained). | 
 | 195 |  | 
| Hans Verkuil | cc26b07 | 2009-03-29 19:20:26 -0300 | [diff] [blame] | 196 |    s_std_output: set v4l2_std_id for video OUTPUT devices. This is ignored by | 
| Hans Verkuil | 78a3b4d | 2009-04-01 03:41:09 -0300 | [diff] [blame] | 197 | 	video input devices. | 
 | 198 |  | 
| Hans Verkuil | 3ff4ad8 | 2009-04-01 03:15:52 -0300 | [diff] [blame] | 199 |   s_crystal_freq: sets the frequency of the crystal used to generate the | 
 | 200 | 	clocks in Hz. An extra flags field allows device specific configuration | 
| Hans Verkuil | 78a3b4d | 2009-04-01 03:41:09 -0300 | [diff] [blame] | 201 | 	regarding clock frequency dividers, etc. If not used, then set flags | 
 | 202 | 	to 0. If the frequency is not supported, then -EINVAL is returned. | 
 | 203 |  | 
| Hans Verkuil | cc26b07 | 2009-03-29 19:20:26 -0300 | [diff] [blame] | 204 |    g_input_status: get input status. Same as the status field in the v4l2_input | 
| Hans Verkuil | 78a3b4d | 2009-04-01 03:41:09 -0300 | [diff] [blame] | 205 | 	struct. | 
 | 206 |  | 
| Hans Verkuil | cc26b07 | 2009-03-29 19:20:26 -0300 | [diff] [blame] | 207 |    s_routing: see s_routing in audio_ops, except this version is for video | 
| Hans Verkuil | 78a3b4d | 2009-04-01 03:41:09 -0300 | [diff] [blame] | 208 | 	devices. | 
 | 209 |  */ | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 210 | struct v4l2_subdev_video_ops { | 
| Hans Verkuil | 5325b42 | 2009-04-02 11:26:22 -0300 | [diff] [blame] | 211 | 	int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config); | 
| Hans Verkuil | 3ff4ad8 | 2009-04-01 03:15:52 -0300 | [diff] [blame] | 212 | 	int (*s_crystal_freq)(struct v4l2_subdev *sd, u32 freq, u32 flags); | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 213 | 	int (*decode_vbi_line)(struct v4l2_subdev *sd, struct v4l2_decode_vbi_line *vbi_line); | 
 | 214 | 	int (*s_vbi_data)(struct v4l2_subdev *sd, const struct v4l2_sliced_vbi_data *vbi_data); | 
 | 215 | 	int (*g_vbi_data)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_data *vbi_data); | 
| Hans Verkuil | 1fe2740 | 2008-12-18 11:16:24 -0300 | [diff] [blame] | 216 | 	int (*g_sliced_vbi_cap)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_cap *cap); | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 217 | 	int (*s_std_output)(struct v4l2_subdev *sd, v4l2_std_id std); | 
| Hans Verkuil | 1b6f1d9 | 2009-02-13 07:48:21 -0300 | [diff] [blame] | 218 | 	int (*querystd)(struct v4l2_subdev *sd, v4l2_std_id *std); | 
 | 219 | 	int (*g_input_status)(struct v4l2_subdev *sd, u32 *status); | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 220 | 	int (*s_stream)(struct v4l2_subdev *sd, int enable); | 
| Hans Verkuil | 2da9479 | 2009-02-06 18:59:35 -0300 | [diff] [blame] | 221 | 	int (*enum_fmt)(struct v4l2_subdev *sd, struct v4l2_fmtdesc *fmtdesc); | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 222 | 	int (*g_fmt)(struct v4l2_subdev *sd, struct v4l2_format *fmt); | 
| Hans Verkuil | 2da9479 | 2009-02-06 18:59:35 -0300 | [diff] [blame] | 223 | 	int (*try_fmt)(struct v4l2_subdev *sd, struct v4l2_format *fmt); | 
 | 224 | 	int (*s_fmt)(struct v4l2_subdev *sd, struct v4l2_format *fmt); | 
| Guennadi Liakhovetski | b7f2cef | 2009-06-24 10:31:25 -0300 | [diff] [blame] | 225 | 	int (*cropcap)(struct v4l2_subdev *sd, struct v4l2_cropcap *cc); | 
 | 226 | 	int (*g_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop); | 
 | 227 | 	int (*s_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop); | 
| Hans Verkuil | 2da9479 | 2009-02-06 18:59:35 -0300 | [diff] [blame] | 228 | 	int (*g_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param); | 
 | 229 | 	int (*s_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param); | 
| Hans Verkuil | 4b2ce11 | 2009-03-29 19:23:16 -0300 | [diff] [blame] | 230 | 	int (*enum_framesizes)(struct v4l2_subdev *sd, struct v4l2_frmsizeenum *fsize); | 
 | 231 | 	int (*enum_frameintervals)(struct v4l2_subdev *sd, struct v4l2_frmivalenum *fival); | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 232 | }; | 
 | 233 |  | 
 | 234 | struct v4l2_subdev_ops { | 
 | 235 | 	const struct v4l2_subdev_core_ops  *core; | 
 | 236 | 	const struct v4l2_subdev_tuner_ops *tuner; | 
 | 237 | 	const struct v4l2_subdev_audio_ops *audio; | 
 | 238 | 	const struct v4l2_subdev_video_ops *video; | 
 | 239 | }; | 
 | 240 |  | 
 | 241 | #define V4L2_SUBDEV_NAME_SIZE 32 | 
 | 242 |  | 
| Hans Verkuil | b5b2b7e | 2009-05-02 10:58:51 -0300 | [diff] [blame] | 243 | /* Set this flag if this subdev is a i2c device. */ | 
 | 244 | #define V4L2_SUBDEV_FL_IS_I2C (1U << 0) | 
 | 245 |  | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 246 | /* Each instance of a subdev driver should create this struct, either | 
 | 247 |    stand-alone or embedded in a larger struct. | 
 | 248 |  */ | 
 | 249 | struct v4l2_subdev { | 
 | 250 | 	struct list_head list; | 
 | 251 | 	struct module *owner; | 
| Hans Verkuil | b5b2b7e | 2009-05-02 10:58:51 -0300 | [diff] [blame] | 252 | 	u32 flags; | 
| Hans Verkuil | b016760 | 2009-02-14 12:00:53 -0300 | [diff] [blame] | 253 | 	struct v4l2_device *v4l2_dev; | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 254 | 	const struct v4l2_subdev_ops *ops; | 
 | 255 | 	/* name must be unique */ | 
 | 256 | 	char name[V4L2_SUBDEV_NAME_SIZE]; | 
 | 257 | 	/* can be used to group similar subdevs, value is driver-specific */ | 
 | 258 | 	u32 grp_id; | 
 | 259 | 	/* pointer to private data */ | 
 | 260 | 	void *priv; | 
 | 261 | }; | 
 | 262 |  | 
 | 263 | static inline void v4l2_set_subdevdata(struct v4l2_subdev *sd, void *p) | 
 | 264 | { | 
 | 265 | 	sd->priv = p; | 
 | 266 | } | 
 | 267 |  | 
 | 268 | static inline void *v4l2_get_subdevdata(const struct v4l2_subdev *sd) | 
 | 269 | { | 
 | 270 | 	return sd->priv; | 
 | 271 | } | 
 | 272 |  | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 273 | static inline void v4l2_subdev_init(struct v4l2_subdev *sd, | 
 | 274 | 					const struct v4l2_subdev_ops *ops) | 
 | 275 | { | 
 | 276 | 	INIT_LIST_HEAD(&sd->list); | 
 | 277 | 	/* ops->core MUST be set */ | 
 | 278 | 	BUG_ON(!ops || !ops->core); | 
 | 279 | 	sd->ops = ops; | 
| Hans Verkuil | b016760 | 2009-02-14 12:00:53 -0300 | [diff] [blame] | 280 | 	sd->v4l2_dev = NULL; | 
| Hans Verkuil | b5b2b7e | 2009-05-02 10:58:51 -0300 | [diff] [blame] | 281 | 	sd->flags = 0; | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 282 | 	sd->name[0] = '\0'; | 
 | 283 | 	sd->grp_id = 0; | 
 | 284 | 	sd->priv = NULL; | 
 | 285 | } | 
 | 286 |  | 
 | 287 | /* Call an ops of a v4l2_subdev, doing the right checks against | 
 | 288 |    NULL pointers. | 
 | 289 |  | 
 | 290 |    Example: err = v4l2_subdev_call(sd, core, g_chip_ident, &chip); | 
 | 291 |  */ | 
 | 292 | #define v4l2_subdev_call(sd, o, f, args...)				\ | 
 | 293 | 	(!(sd) ? -ENODEV : (((sd) && (sd)->ops->o && (sd)->ops->o->f) ?	\ | 
 | 294 | 		(sd)->ops->o->f((sd) , ##args) : -ENOIOCTLCMD)) | 
 | 295 |  | 
| Hans Verkuil | 98ec633 | 2009-03-08 17:02:10 -0300 | [diff] [blame] | 296 | /* Send a notification to v4l2_device. */ | 
 | 297 | #define v4l2_subdev_notify(sd, notification, arg)			   \ | 
 | 298 | 	((!(sd) || !(sd)->v4l2_dev || !(sd)->v4l2_dev->notify) ? -ENODEV : \ | 
 | 299 | 	 (sd)->v4l2_dev->notify((sd), (notification), (arg))) | 
 | 300 |  | 
| Hans Verkuil | 2a1fcdf | 2008-11-29 21:36:58 -0300 | [diff] [blame] | 301 | #endif |