blob: defd4bc02bc5b3a5b3ea1c2f0852cd8764fc22bb [file] [log] [blame]
Nicholas Flintham1e3d3112013-04-10 10:48:38 +01001/*
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 <linux/v4l2-subdev.h>
25#include <media/media-entity.h>
26#include <media/v4l2-common.h>
27#include <media/v4l2-dev.h>
28#include <media/v4l2-fh.h>
29#include <media/v4l2-mediabus.h>
30
31#define V4L2_SUBDEV_IR_RX_NOTIFY _IOW('v', 0, u32)
32#define V4L2_SUBDEV_IR_RX_FIFO_SERVICE_REQ 0x00000001
33#define V4L2_SUBDEV_IR_RX_END_OF_RX_DETECTED 0x00000002
34#define V4L2_SUBDEV_IR_RX_HW_FIFO_OVERRUN 0x00000004
35#define V4L2_SUBDEV_IR_RX_SW_FIFO_OVERRUN 0x00000008
36
37#define V4L2_SUBDEV_IR_TX_NOTIFY _IOW('v', 1, u32)
38#define V4L2_SUBDEV_IR_TX_FIFO_SERVICE_REQ 0x00000001
39
40struct v4l2_device;
41struct v4l2_ctrl_handler;
42struct v4l2_event_subscription;
43struct v4l2_fh;
44struct v4l2_subdev;
45struct v4l2_subdev_fh;
46struct tuner_setup;
47
48struct v4l2_decode_vbi_line {
49 u32 is_second_field;
50 u8 *p;
51 u32 line;
52 u32 type;
53};
54
55
56
57#define V4L2_SUBDEV_IO_PIN_DISABLE (1 << 0)
58#define V4L2_SUBDEV_IO_PIN_OUTPUT (1 << 1)
59#define V4L2_SUBDEV_IO_PIN_INPUT (1 << 2)
60#define V4L2_SUBDEV_IO_PIN_SET_VALUE (1 << 3)
61#define V4L2_SUBDEV_IO_PIN_ACTIVE_LOW (1 << 4)
62
63struct v4l2_subdev_io_pin_config {
64 u32 flags;
65 u8 pin;
66 u8 function;
67 u8 value;
68 u8 strength;
69};
70
71struct v4l2_subdev_core_ops {
72 int (*g_chip_ident)(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip);
73 int (*log_status)(struct v4l2_subdev *sd);
74 int (*s_io_pin_config)(struct v4l2_subdev *sd, size_t n,
75 struct v4l2_subdev_io_pin_config *pincfg);
76 int (*init)(struct v4l2_subdev *sd, u32 val);
77 int (*load_fw)(struct v4l2_subdev *sd);
78 int (*reset)(struct v4l2_subdev *sd, u32 val);
79 int (*s_gpio)(struct v4l2_subdev *sd, u32 val);
80 int (*queryctrl)(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc);
81 int (*g_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl);
82 int (*s_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl);
83 int (*g_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls);
84 int (*s_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls);
85 int (*try_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls);
86 int (*querymenu)(struct v4l2_subdev *sd, struct v4l2_querymenu *qm);
87 int (*s_std)(struct v4l2_subdev *sd, v4l2_std_id norm);
88 long (*ioctl)(struct v4l2_subdev *sd, unsigned int cmd, void *arg);
89#ifdef CONFIG_VIDEO_ADV_DEBUG
90 int (*g_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg);
91 int (*s_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg);
92#endif
93 int (*s_power)(struct v4l2_subdev *sd, int on);
94 int (*interrupt_service_routine)(struct v4l2_subdev *sd,
95 u32 status, bool *handled);
96 int (*subscribe_event)(struct v4l2_subdev *sd, struct v4l2_fh *fh,
97 struct v4l2_event_subscription *sub);
98 int (*unsubscribe_event)(struct v4l2_subdev *sd, struct v4l2_fh *fh,
99 struct v4l2_event_subscription *sub);
100};
101
102struct v4l2_subdev_tuner_ops {
103 int (*s_radio)(struct v4l2_subdev *sd);
104 int (*s_frequency)(struct v4l2_subdev *sd, struct v4l2_frequency *freq);
105 int (*g_frequency)(struct v4l2_subdev *sd, struct v4l2_frequency *freq);
106 int (*g_tuner)(struct v4l2_subdev *sd, struct v4l2_tuner *vt);
107 int (*s_tuner)(struct v4l2_subdev *sd, struct v4l2_tuner *vt);
108 int (*g_modulator)(struct v4l2_subdev *sd, struct v4l2_modulator *vm);
109 int (*s_modulator)(struct v4l2_subdev *sd, struct v4l2_modulator *vm);
110 int (*s_type_addr)(struct v4l2_subdev *sd, struct tuner_setup *type);
111 int (*s_config)(struct v4l2_subdev *sd, const struct v4l2_priv_tun_config *config);
112};
113
114struct v4l2_subdev_audio_ops {
115 int (*s_clock_freq)(struct v4l2_subdev *sd, u32 freq);
116 int (*s_i2s_clock_freq)(struct v4l2_subdev *sd, u32 freq);
117 int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
118 int (*s_stream)(struct v4l2_subdev *sd, int enable);
119};
120
121struct v4l2_subdev_video_ops {
122 int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
123 int (*s_crystal_freq)(struct v4l2_subdev *sd, u32 freq, u32 flags);
124 int (*s_std_output)(struct v4l2_subdev *sd, v4l2_std_id std);
125 int (*querystd)(struct v4l2_subdev *sd, v4l2_std_id *std);
126 int (*g_input_status)(struct v4l2_subdev *sd, u32 *status);
127 int (*s_stream)(struct v4l2_subdev *sd, int enable);
128 int (*cropcap)(struct v4l2_subdev *sd, struct v4l2_cropcap *cc);
129 int (*g_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop);
130 int (*s_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop);
131 int (*g_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param);
132 int (*s_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param);
133 int (*g_frame_interval)(struct v4l2_subdev *sd,
134 struct v4l2_subdev_frame_interval *interval);
135 int (*s_frame_interval)(struct v4l2_subdev *sd,
136 struct v4l2_subdev_frame_interval *interval);
137 int (*enum_framesizes)(struct v4l2_subdev *sd, struct v4l2_frmsizeenum *fsize);
138 int (*enum_frameintervals)(struct v4l2_subdev *sd, struct v4l2_frmivalenum *fival);
139 int (*enum_dv_presets) (struct v4l2_subdev *sd,
140 struct v4l2_dv_enum_preset *preset);
141 int (*s_dv_preset)(struct v4l2_subdev *sd,
142 struct v4l2_dv_preset *preset);
143 int (*query_dv_preset)(struct v4l2_subdev *sd,
144 struct v4l2_dv_preset *preset);
145 int (*s_dv_timings)(struct v4l2_subdev *sd,
146 struct v4l2_dv_timings *timings);
147 int (*g_dv_timings)(struct v4l2_subdev *sd,
148 struct v4l2_dv_timings *timings);
149 int (*enum_mbus_fmt)(struct v4l2_subdev *sd, unsigned int index,
150 enum v4l2_mbus_pixelcode *code);
151 int (*enum_mbus_fsizes)(struct v4l2_subdev *sd,
152 struct v4l2_frmsizeenum *fsize);
153 int (*g_mbus_fmt)(struct v4l2_subdev *sd,
154 struct v4l2_mbus_framefmt *fmt);
155 int (*try_mbus_fmt)(struct v4l2_subdev *sd,
156 struct v4l2_mbus_framefmt *fmt);
157 int (*s_mbus_fmt)(struct v4l2_subdev *sd,
158 struct v4l2_mbus_framefmt *fmt);
159};
160
161struct v4l2_subdev_vbi_ops {
162 int (*decode_vbi_line)(struct v4l2_subdev *sd, struct v4l2_decode_vbi_line *vbi_line);
163 int (*s_vbi_data)(struct v4l2_subdev *sd, const struct v4l2_sliced_vbi_data *vbi_data);
164 int (*g_vbi_data)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_data *vbi_data);
165 int (*g_sliced_vbi_cap)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_cap *cap);
166 int (*s_raw_fmt)(struct v4l2_subdev *sd, struct v4l2_vbi_format *fmt);
167 int (*g_sliced_fmt)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt);
168 int (*s_sliced_fmt)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt);
169};
170
171struct v4l2_subdev_sensor_ops {
172 int (*g_skip_top_lines)(struct v4l2_subdev *sd, u32 *lines);
173 int (*g_skip_frames)(struct v4l2_subdev *sd, u32 *frames);
174};
175
176
177enum v4l2_subdev_ir_mode {
178 V4L2_SUBDEV_IR_MODE_PULSE_WIDTH,
179};
180
181struct v4l2_subdev_ir_parameters {
182
183 unsigned int bytes_per_data_element;
184 enum v4l2_subdev_ir_mode mode;
185
186 bool enable;
187 bool interrupt_enable;
188 bool shutdown;
189
190 bool modulation;
191 u32 max_pulse_width;
192 unsigned int carrier_freq;
193 unsigned int duty_cycle;
194 bool invert_level;
195
196
197 bool invert_carrier_sense;
198
199
200 u32 noise_filter_min_width;
201 unsigned int carrier_range_lower;
202 unsigned int carrier_range_upper;
203 u32 resolution;
204};
205
206struct v4l2_subdev_ir_ops {
207
208 int (*rx_read)(struct v4l2_subdev *sd, u8 *buf, size_t count,
209 ssize_t *num);
210
211 int (*rx_g_parameters)(struct v4l2_subdev *sd,
212 struct v4l2_subdev_ir_parameters *params);
213 int (*rx_s_parameters)(struct v4l2_subdev *sd,
214 struct v4l2_subdev_ir_parameters *params);
215
216
217 int (*tx_write)(struct v4l2_subdev *sd, u8 *buf, size_t count,
218 ssize_t *num);
219
220 int (*tx_g_parameters)(struct v4l2_subdev *sd,
221 struct v4l2_subdev_ir_parameters *params);
222 int (*tx_s_parameters)(struct v4l2_subdev *sd,
223 struct v4l2_subdev_ir_parameters *params);
224};
225
226struct v4l2_subdev_pad_ops {
227 int (*enum_mbus_code)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
228 struct v4l2_subdev_mbus_code_enum *code);
229 int (*enum_frame_size)(struct v4l2_subdev *sd,
230 struct v4l2_subdev_fh *fh,
231 struct v4l2_subdev_frame_size_enum *fse);
232 int (*enum_frame_interval)(struct v4l2_subdev *sd,
233 struct v4l2_subdev_fh *fh,
234 struct v4l2_subdev_frame_interval_enum *fie);
235 int (*get_fmt)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
236 struct v4l2_subdev_format *format);
237 int (*set_fmt)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
238 struct v4l2_subdev_format *format);
239 int (*set_crop)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
240 struct v4l2_subdev_crop *crop);
241 int (*get_crop)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
242 struct v4l2_subdev_crop *crop);
243};
244
245struct v4l2_subdev_ops {
246 const struct v4l2_subdev_core_ops *core;
247 const struct v4l2_subdev_tuner_ops *tuner;
248 const struct v4l2_subdev_audio_ops *audio;
249 const struct v4l2_subdev_video_ops *video;
250 const struct v4l2_subdev_vbi_ops *vbi;
251 const struct v4l2_subdev_ir_ops *ir;
252 const struct v4l2_subdev_sensor_ops *sensor;
253 const struct v4l2_subdev_pad_ops *pad;
254};
255
256struct v4l2_subdev_internal_ops {
257 int (*registered)(struct v4l2_subdev *sd);
258 void (*unregistered)(struct v4l2_subdev *sd);
259 int (*open)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);
260 int (*close)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);
261};
262
263#define V4L2_SUBDEV_NAME_SIZE 32
264
265#define V4L2_SUBDEV_FL_IS_I2C (1U << 0)
266#define V4L2_SUBDEV_FL_IS_SPI (1U << 1)
267#define V4L2_SUBDEV_FL_HAS_DEVNODE (1U << 2)
268#define V4L2_SUBDEV_FL_HAS_EVENTS (1U << 3)
269
270struct v4l2_subdev {
271#if defined(CONFIG_MEDIA_CONTROLLER)
272 struct media_entity entity;
273#endif
274 struct list_head list;
275 struct module *owner;
276 u32 flags;
277 struct v4l2_device *v4l2_dev;
278 const struct v4l2_subdev_ops *ops;
279
280 const struct v4l2_subdev_internal_ops *internal_ops;
281
282 struct v4l2_ctrl_handler *ctrl_handler;
283
284 char name[V4L2_SUBDEV_NAME_SIZE];
285
286 u32 grp_id;
287
288 void *dev_priv;
289 void *host_priv;
290
291 struct video_device devnode;
292
293 unsigned int nevents;
294};
295
296#define media_entity_to_v4l2_subdev(ent) \
297 container_of(ent, struct v4l2_subdev, entity)
298#define vdev_to_v4l2_subdev(vdev) \
299 container_of(vdev, struct v4l2_subdev, devnode)
300
301struct v4l2_subdev_fh {
302 struct v4l2_fh vfh;
303#if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
304 struct v4l2_mbus_framefmt *try_fmt;
305 struct v4l2_rect *try_crop;
306#endif
307};
308
309#define to_v4l2_subdev_fh(fh) \
310 container_of(fh, struct v4l2_subdev_fh, vfh)
311
312#if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
313static inline struct v4l2_mbus_framefmt *
314v4l2_subdev_get_try_format(struct v4l2_subdev_fh *fh, unsigned int pad)
315{
316 return &fh->try_fmt[pad];
317}
318
319static inline struct v4l2_rect *
320v4l2_subdev_get_try_crop(struct v4l2_subdev_fh *fh, unsigned int pad)
321{
322 return &fh->try_crop[pad];
323}
324#endif
325
326extern const struct v4l2_file_operations v4l2_subdev_fops;
327
328static inline void v4l2_set_subdevdata(struct v4l2_subdev *sd, void *p)
329{
330 sd->dev_priv = p;
331}
332
333static inline void *v4l2_get_subdevdata(const struct v4l2_subdev *sd)
334{
335 return sd->dev_priv;
336}
337
338static inline void v4l2_set_subdev_hostdata(struct v4l2_subdev *sd, void *p)
339{
340 sd->host_priv = p;
341}
342
343static inline void *v4l2_get_subdev_hostdata(const struct v4l2_subdev *sd)
344{
345 return sd->host_priv;
346}
347
348void v4l2_subdev_init(struct v4l2_subdev *sd,
349 const struct v4l2_subdev_ops *ops);
350
351#define v4l2_subdev_call(sd, o, f, args...) \
352 (!(sd) ? -ENODEV : (((sd)->ops && (sd)->ops->o && (sd)->ops->o->f) ? \
353 (sd)->ops->o->f((sd) , ##args) : -ENOIOCTLCMD))
354
355#define v4l2_subdev_notify(sd, notification, arg) \
356 ((!(sd) || !(sd)->v4l2_dev || !(sd)->v4l2_dev->notify) ? -ENODEV : \
357 (sd)->v4l2_dev->notify((sd), (notification), (arg)))
358
359#endif