1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
32#define V4L2_SUBDEV_IR_RX_NOTIFY _IOW('v', 0, u32)
33#define V4L2_SUBDEV_IR_RX_FIFO_SERVICE_REQ 0x00000001
34#define V4L2_SUBDEV_IR_RX_END_OF_RX_DETECTED 0x00000002
35#define V4L2_SUBDEV_IR_RX_HW_FIFO_OVERRUN 0x00000004
36#define V4L2_SUBDEV_IR_RX_SW_FIFO_OVERRUN 0x00000008
37
38#define V4L2_SUBDEV_IR_TX_NOTIFY _IOW('v', 1, u32)
39#define V4L2_SUBDEV_IR_TX_FIFO_SERVICE_REQ 0x00000001
40
41struct v4l2_device;
42struct v4l2_ctrl_handler;
43struct v4l2_event_subscription;
44struct v4l2_fh;
45struct v4l2_subdev;
46struct v4l2_subdev_fh;
47struct tuner_setup;
48
49
50struct v4l2_decode_vbi_line {
51 u32 is_second_field;
52
53 u8 *p;
54
55 u32 line;
56 u32 type;
57};
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102#define V4L2_SUBDEV_IO_PIN_DISABLE (1 << 0)
103#define V4L2_SUBDEV_IO_PIN_OUTPUT (1 << 1)
104#define V4L2_SUBDEV_IO_PIN_INPUT (1 << 2)
105#define V4L2_SUBDEV_IO_PIN_SET_VALUE (1 << 3)
106#define V4L2_SUBDEV_IO_PIN_ACTIVE_LOW (1 << 4)
107
108struct v4l2_subdev_io_pin_config {
109 u32 flags;
110 u8 pin;
111 u8 function;
112 u8 value;
113 u8 strength;
114};
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145struct v4l2_subdev_core_ops {
146 int (*g_chip_ident)(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip);
147 int (*log_status)(struct v4l2_subdev *sd);
148 int (*s_io_pin_config)(struct v4l2_subdev *sd, size_t n,
149 struct v4l2_subdev_io_pin_config *pincfg);
150 int (*init)(struct v4l2_subdev *sd, u32 val);
151 int (*load_fw)(struct v4l2_subdev *sd);
152 int (*reset)(struct v4l2_subdev *sd, u32 val);
153 int (*s_gpio)(struct v4l2_subdev *sd, u32 val);
154 int (*queryctrl)(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc);
155 int (*g_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl);
156 int (*s_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl);
157 int (*g_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls);
158 int (*s_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls);
159 int (*try_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls);
160 int (*querymenu)(struct v4l2_subdev *sd, struct v4l2_querymenu *qm);
161 int (*g_std)(struct v4l2_subdev *sd, v4l2_std_id *norm);
162 int (*s_std)(struct v4l2_subdev *sd, v4l2_std_id norm);
163 long (*ioctl)(struct v4l2_subdev *sd, unsigned int cmd, void *arg);
164#ifdef CONFIG_VIDEO_ADV_DEBUG
165 int (*g_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg);
166 int (*s_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg);
167#endif
168 int (*s_power)(struct v4l2_subdev *sd, int on);
169 int (*interrupt_service_routine)(struct v4l2_subdev *sd,
170 u32 status, bool *handled);
171 int (*subscribe_event)(struct v4l2_subdev *sd, struct v4l2_fh *fh,
172 struct v4l2_event_subscription *sub);
173 int (*unsubscribe_event)(struct v4l2_subdev *sd, struct v4l2_fh *fh,
174 struct v4l2_event_subscription *sub);
175};
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190struct v4l2_subdev_tuner_ops {
191 int (*s_radio)(struct v4l2_subdev *sd);
192 int (*s_frequency)(struct v4l2_subdev *sd, struct v4l2_frequency *freq);
193 int (*g_frequency)(struct v4l2_subdev *sd, struct v4l2_frequency *freq);
194 int (*g_tuner)(struct v4l2_subdev *sd, struct v4l2_tuner *vt);
195 int (*s_tuner)(struct v4l2_subdev *sd, struct v4l2_tuner *vt);
196 int (*g_modulator)(struct v4l2_subdev *sd, struct v4l2_modulator *vm);
197 int (*s_modulator)(struct v4l2_subdev *sd, struct v4l2_modulator *vm);
198 int (*s_type_addr)(struct v4l2_subdev *sd, struct tuner_setup *type);
199 int (*s_config)(struct v4l2_subdev *sd, const struct v4l2_priv_tun_config *config);
200};
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222struct v4l2_subdev_audio_ops {
223 int (*s_clock_freq)(struct v4l2_subdev *sd, u32 freq);
224 int (*s_i2s_clock_freq)(struct v4l2_subdev *sd, u32 freq);
225 int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
226 int (*s_stream)(struct v4l2_subdev *sd, int enable);
227};
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278struct v4l2_subdev_video_ops {
279 int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
280 int (*s_crystal_freq)(struct v4l2_subdev *sd, u32 freq, u32 flags);
281 int (*s_std_output)(struct v4l2_subdev *sd, v4l2_std_id std);
282 int (*g_std_output)(struct v4l2_subdev *sd, v4l2_std_id *std);
283 int (*querystd)(struct v4l2_subdev *sd, v4l2_std_id *std);
284 int (*g_tvnorms_output)(struct v4l2_subdev *sd, v4l2_std_id *std);
285 int (*g_input_status)(struct v4l2_subdev *sd, u32 *status);
286 int (*s_stream)(struct v4l2_subdev *sd, int enable);
287 int (*cropcap)(struct v4l2_subdev *sd, struct v4l2_cropcap *cc);
288 int (*g_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop);
289 int (*s_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop);
290 int (*g_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param);
291 int (*s_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param);
292 int (*g_frame_interval)(struct v4l2_subdev *sd,
293 struct v4l2_subdev_frame_interval *interval);
294 int (*s_frame_interval)(struct v4l2_subdev *sd,
295 struct v4l2_subdev_frame_interval *interval);
296 int (*enum_framesizes)(struct v4l2_subdev *sd, struct v4l2_frmsizeenum *fsize);
297 int (*enum_frameintervals)(struct v4l2_subdev *sd, struct v4l2_frmivalenum *fival);
298 int (*enum_dv_presets) (struct v4l2_subdev *sd,
299 struct v4l2_dv_enum_preset *preset);
300 int (*s_dv_preset)(struct v4l2_subdev *sd,
301 struct v4l2_dv_preset *preset);
302 int (*g_dv_preset)(struct v4l2_subdev *sd,
303 struct v4l2_dv_preset *preset);
304 int (*query_dv_preset)(struct v4l2_subdev *sd,
305 struct v4l2_dv_preset *preset);
306 int (*s_dv_timings)(struct v4l2_subdev *sd,
307 struct v4l2_dv_timings *timings);
308 int (*g_dv_timings)(struct v4l2_subdev *sd,
309 struct v4l2_dv_timings *timings);
310 int (*enum_mbus_fmt)(struct v4l2_subdev *sd, unsigned int index,
311 enum v4l2_mbus_pixelcode *code);
312 int (*enum_mbus_fsizes)(struct v4l2_subdev *sd,
313 struct v4l2_frmsizeenum *fsize);
314 int (*g_mbus_fmt)(struct v4l2_subdev *sd,
315 struct v4l2_mbus_framefmt *fmt);
316 int (*try_mbus_fmt)(struct v4l2_subdev *sd,
317 struct v4l2_mbus_framefmt *fmt);
318 int (*s_mbus_fmt)(struct v4l2_subdev *sd,
319 struct v4l2_mbus_framefmt *fmt);
320 int (*g_mbus_config)(struct v4l2_subdev *sd,
321 struct v4l2_mbus_config *cfg);
322 int (*s_mbus_config)(struct v4l2_subdev *sd,
323 const struct v4l2_mbus_config *cfg);
324};
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355struct v4l2_subdev_vbi_ops {
356 int (*decode_vbi_line)(struct v4l2_subdev *sd, struct v4l2_decode_vbi_line *vbi_line);
357 int (*s_vbi_data)(struct v4l2_subdev *sd, const struct v4l2_sliced_vbi_data *vbi_data);
358 int (*g_vbi_data)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_data *vbi_data);
359 int (*g_sliced_vbi_cap)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_cap *cap);
360 int (*s_raw_fmt)(struct v4l2_subdev *sd, struct v4l2_vbi_format *fmt);
361 int (*g_sliced_fmt)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt);
362 int (*s_sliced_fmt)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt);
363};
364
365
366
367
368
369
370
371
372
373
374
375struct v4l2_subdev_sensor_ops {
376 int (*g_skip_top_lines)(struct v4l2_subdev *sd, u32 *lines);
377 int (*g_skip_frames)(struct v4l2_subdev *sd, u32 *frames);
378};
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403enum v4l2_subdev_ir_mode {
404 V4L2_SUBDEV_IR_MODE_PULSE_WIDTH,
405};
406
407struct v4l2_subdev_ir_parameters {
408
409 unsigned int bytes_per_data_element;
410 enum v4l2_subdev_ir_mode mode;
411
412 bool enable;
413 bool interrupt_enable;
414 bool shutdown;
415
416 bool modulation;
417 u32 max_pulse_width;
418 unsigned int carrier_freq;
419 unsigned int duty_cycle;
420 bool invert_level;
421
422
423 bool invert_carrier_sense;
424
425
426 u32 noise_filter_min_width;
427 unsigned int carrier_range_lower;
428 unsigned int carrier_range_upper;
429 u32 resolution;
430};
431
432struct v4l2_subdev_ir_ops {
433
434 int (*rx_read)(struct v4l2_subdev *sd, u8 *buf, size_t count,
435 ssize_t *num);
436
437 int (*rx_g_parameters)(struct v4l2_subdev *sd,
438 struct v4l2_subdev_ir_parameters *params);
439 int (*rx_s_parameters)(struct v4l2_subdev *sd,
440 struct v4l2_subdev_ir_parameters *params);
441
442
443 int (*tx_write)(struct v4l2_subdev *sd, u8 *buf, size_t count,
444 ssize_t *num);
445
446 int (*tx_g_parameters)(struct v4l2_subdev *sd,
447 struct v4l2_subdev_ir_parameters *params);
448 int (*tx_s_parameters)(struct v4l2_subdev *sd,
449 struct v4l2_subdev_ir_parameters *params);
450};
451
452struct v4l2_subdev_pad_ops {
453 int (*enum_mbus_code)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
454 struct v4l2_subdev_mbus_code_enum *code);
455 int (*enum_frame_size)(struct v4l2_subdev *sd,
456 struct v4l2_subdev_fh *fh,
457 struct v4l2_subdev_frame_size_enum *fse);
458 int (*enum_frame_interval)(struct v4l2_subdev *sd,
459 struct v4l2_subdev_fh *fh,
460 struct v4l2_subdev_frame_interval_enum *fie);
461 int (*get_fmt)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
462 struct v4l2_subdev_format *format);
463 int (*set_fmt)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
464 struct v4l2_subdev_format *format);
465 int (*set_crop)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
466 struct v4l2_subdev_crop *crop);
467 int (*get_crop)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
468 struct v4l2_subdev_crop *crop);
469};
470
471struct v4l2_subdev_ops {
472 const struct v4l2_subdev_core_ops *core;
473 const struct v4l2_subdev_tuner_ops *tuner;
474 const struct v4l2_subdev_audio_ops *audio;
475 const struct v4l2_subdev_video_ops *video;
476 const struct v4l2_subdev_vbi_ops *vbi;
477 const struct v4l2_subdev_ir_ops *ir;
478 const struct v4l2_subdev_sensor_ops *sensor;
479 const struct v4l2_subdev_pad_ops *pad;
480};
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496struct v4l2_subdev_internal_ops {
497 int (*registered)(struct v4l2_subdev *sd);
498 void (*unregistered)(struct v4l2_subdev *sd);
499 int (*open)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);
500 int (*close)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);
501};
502
503#define V4L2_SUBDEV_NAME_SIZE 32
504
505
506#define V4L2_SUBDEV_FL_IS_I2C (1U << 0)
507
508#define V4L2_SUBDEV_FL_IS_SPI (1U << 1)
509
510#define V4L2_SUBDEV_FL_HAS_DEVNODE (1U << 2)
511
512#define V4L2_SUBDEV_FL_HAS_EVENTS (1U << 3)
513
514
515
516
517struct v4l2_subdev {
518#if defined(CONFIG_MEDIA_CONTROLLER)
519 struct media_entity entity;
520#endif
521 struct list_head list;
522 struct module *owner;
523 u32 flags;
524 struct v4l2_device *v4l2_dev;
525 const struct v4l2_subdev_ops *ops;
526
527 const struct v4l2_subdev_internal_ops *internal_ops;
528
529 struct v4l2_ctrl_handler *ctrl_handler;
530
531 char name[V4L2_SUBDEV_NAME_SIZE];
532
533 u32 grp_id;
534
535 void *dev_priv;
536 void *host_priv;
537
538 struct video_device *devnode;
539};
540
541#define media_entity_to_v4l2_subdev(ent) \
542 container_of(ent, struct v4l2_subdev, entity)
543#define vdev_to_v4l2_subdev(vdev) \
544 video_get_drvdata(vdev)
545
546
547
548
549struct v4l2_subdev_fh {
550 struct v4l2_fh vfh;
551#if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
552 struct v4l2_mbus_framefmt *try_fmt;
553 struct v4l2_rect *try_crop;
554#endif
555};
556
557#define to_v4l2_subdev_fh(fh) \
558 container_of(fh, struct v4l2_subdev_fh, vfh)
559
560#if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
561static inline struct v4l2_mbus_framefmt *
562v4l2_subdev_get_try_format(struct v4l2_subdev_fh *fh, unsigned int pad)
563{
564 return &fh->try_fmt[pad];
565}
566
567static inline struct v4l2_rect *
568v4l2_subdev_get_try_crop(struct v4l2_subdev_fh *fh, unsigned int pad)
569{
570 return &fh->try_crop[pad];
571}
572#endif
573
574extern const struct v4l2_file_operations v4l2_subdev_fops;
575
576static inline void v4l2_set_subdevdata(struct v4l2_subdev *sd, void *p)
577{
578 sd->dev_priv = p;
579}
580
581static inline void *v4l2_get_subdevdata(const struct v4l2_subdev *sd)
582{
583 return sd->dev_priv;
584}
585
586static inline void v4l2_set_subdev_hostdata(struct v4l2_subdev *sd, void *p)
587{
588 sd->host_priv = p;
589}
590
591static inline void *v4l2_get_subdev_hostdata(const struct v4l2_subdev *sd)
592{
593 return sd->host_priv;
594}
595
596void v4l2_subdev_init(struct v4l2_subdev *sd,
597 const struct v4l2_subdev_ops *ops);
598
599
600
601
602
603
604#define v4l2_subdev_call(sd, o, f, args...) \
605 (!(sd) ? -ENODEV : (((sd)->ops->o && (sd)->ops->o->f) ? \
606 (sd)->ops->o->f((sd) , ##args) : -ENOIOCTLCMD))
607
608
609#define v4l2_subdev_notify(sd, notification, arg) \
610 ((!(sd) || !(sd)->v4l2_dev || !(sd)->v4l2_dev->notify) ? -ENODEV : \
611 (sd)->v4l2_dev->notify((sd), (notification), (arg)))
612
613#endif
614