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/types.h>
25#include <linux/v4l2-subdev.h>
26#include <media/media-entity.h>
27#include <media/v4l2-common.h>
28#include <media/v4l2-dev.h>
29#include <media/v4l2-fh.h>
30#include <media/v4l2-mediabus.h>
31
32
33#define V4L2_SUBDEV_IR_RX_NOTIFY _IOW('v', 0, u32)
34#define V4L2_SUBDEV_IR_RX_FIFO_SERVICE_REQ 0x00000001
35#define V4L2_SUBDEV_IR_RX_END_OF_RX_DETECTED 0x00000002
36#define V4L2_SUBDEV_IR_RX_HW_FIFO_OVERRUN 0x00000004
37#define V4L2_SUBDEV_IR_RX_SW_FIFO_OVERRUN 0x00000008
38
39#define V4L2_SUBDEV_IR_TX_NOTIFY _IOW('v', 1, u32)
40#define V4L2_SUBDEV_IR_TX_FIFO_SERVICE_REQ 0x00000001
41
42struct v4l2_device;
43struct v4l2_ctrl_handler;
44struct v4l2_event_subscription;
45struct v4l2_fh;
46struct v4l2_subdev;
47struct v4l2_subdev_fh;
48struct tuner_setup;
49struct v4l2_mbus_frame_desc;
50
51
52struct v4l2_decode_vbi_line {
53 u32 is_second_field;
54
55 u8 *p;
56
57 u32 line;
58 u32 type;
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
103
104#define V4L2_SUBDEV_IO_PIN_DISABLE (1 << 0)
105#define V4L2_SUBDEV_IO_PIN_OUTPUT (1 << 1)
106#define V4L2_SUBDEV_IO_PIN_INPUT (1 << 2)
107#define V4L2_SUBDEV_IO_PIN_SET_VALUE (1 << 3)
108#define V4L2_SUBDEV_IO_PIN_ACTIVE_LOW (1 << 4)
109
110struct v4l2_subdev_io_pin_config {
111 u32 flags;
112 u8 pin;
113 u8 function;
114 u8 value;
115 u8 strength;
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
145
146
147struct v4l2_subdev_core_ops {
148 int (*g_chip_ident)(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip);
149 int (*log_status)(struct v4l2_subdev *sd);
150 int (*s_io_pin_config)(struct v4l2_subdev *sd, size_t n,
151 struct v4l2_subdev_io_pin_config *pincfg);
152 int (*init)(struct v4l2_subdev *sd, u32 val);
153 int (*load_fw)(struct v4l2_subdev *sd);
154 int (*reset)(struct v4l2_subdev *sd, u32 val);
155 int (*s_gpio)(struct v4l2_subdev *sd, u32 val);
156 int (*queryctrl)(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc);
157 int (*g_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl);
158 int (*s_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl);
159 int (*g_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls);
160 int (*s_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls);
161 int (*try_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls);
162 int (*querymenu)(struct v4l2_subdev *sd, struct v4l2_querymenu *qm);
163 int (*g_std)(struct v4l2_subdev *sd, v4l2_std_id *norm);
164 int (*s_std)(struct v4l2_subdev *sd, v4l2_std_id norm);
165 long (*ioctl)(struct v4l2_subdev *sd, unsigned int cmd, void *arg);
166#ifdef CONFIG_VIDEO_ADV_DEBUG
167 int (*g_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg);
168 int (*s_register)(struct v4l2_subdev *sd, const struct v4l2_dbg_register *reg);
169#endif
170 int (*s_power)(struct v4l2_subdev *sd, int on);
171 int (*interrupt_service_routine)(struct v4l2_subdev *sd,
172 u32 status, bool *handled);
173 int (*subscribe_event)(struct v4l2_subdev *sd, struct v4l2_fh *fh,
174 struct v4l2_event_subscription *sub);
175 int (*unsubscribe_event)(struct v4l2_subdev *sd, struct v4l2_fh *fh,
176 struct v4l2_event_subscription *sub);
177};
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192struct v4l2_subdev_tuner_ops {
193 int (*s_radio)(struct v4l2_subdev *sd);
194 int (*s_frequency)(struct v4l2_subdev *sd, const struct v4l2_frequency *freq);
195 int (*g_frequency)(struct v4l2_subdev *sd, struct v4l2_frequency *freq);
196 int (*g_tuner)(struct v4l2_subdev *sd, struct v4l2_tuner *vt);
197 int (*s_tuner)(struct v4l2_subdev *sd, const struct v4l2_tuner *vt);
198 int (*g_modulator)(struct v4l2_subdev *sd, struct v4l2_modulator *vm);
199 int (*s_modulator)(struct v4l2_subdev *sd, const struct v4l2_modulator *vm);
200 int (*s_type_addr)(struct v4l2_subdev *sd, struct tuner_setup *type);
201 int (*s_config)(struct v4l2_subdev *sd, const struct v4l2_priv_tun_config *config);
202};
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224struct v4l2_subdev_audio_ops {
225 int (*s_clock_freq)(struct v4l2_subdev *sd, u32 freq);
226 int (*s_i2s_clock_freq)(struct v4l2_subdev *sd, u32 freq);
227 int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
228 int (*s_stream)(struct v4l2_subdev *sd, int enable);
229};
230
231
232#define V4L2_MBUS_FRAME_DESC_FL_LEN_MAX (1U << 0)
233
234#define V4L2_MBUS_FRAME_DESC_FL_BLOB (1U << 1)
235
236
237
238
239
240
241
242
243struct v4l2_mbus_frame_desc_entry {
244 u16 flags;
245 u32 pixelcode;
246 u32 length;
247};
248
249#define V4L2_FRAME_DESC_ENTRY_MAX 4
250
251
252
253
254
255
256struct v4l2_mbus_frame_desc {
257 struct v4l2_mbus_frame_desc_entry entry[V4L2_FRAME_DESC_ENTRY_MAX];
258 unsigned short num_entries;
259};
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306struct v4l2_subdev_video_ops {
307 int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
308 int (*s_crystal_freq)(struct v4l2_subdev *sd, u32 freq, u32 flags);
309 int (*s_std_output)(struct v4l2_subdev *sd, v4l2_std_id std);
310 int (*g_std_output)(struct v4l2_subdev *sd, v4l2_std_id *std);
311 int (*querystd)(struct v4l2_subdev *sd, v4l2_std_id *std);
312 int (*g_tvnorms_output)(struct v4l2_subdev *sd, v4l2_std_id *std);
313 int (*g_input_status)(struct v4l2_subdev *sd, u32 *status);
314 int (*s_stream)(struct v4l2_subdev *sd, int enable);
315 int (*cropcap)(struct v4l2_subdev *sd, struct v4l2_cropcap *cc);
316 int (*g_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop);
317 int (*s_crop)(struct v4l2_subdev *sd, const struct v4l2_crop *crop);
318 int (*g_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param);
319 int (*s_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param);
320 int (*g_frame_interval)(struct v4l2_subdev *sd,
321 struct v4l2_subdev_frame_interval *interval);
322 int (*s_frame_interval)(struct v4l2_subdev *sd,
323 struct v4l2_subdev_frame_interval *interval);
324 int (*enum_framesizes)(struct v4l2_subdev *sd, struct v4l2_frmsizeenum *fsize);
325 int (*enum_frameintervals)(struct v4l2_subdev *sd, struct v4l2_frmivalenum *fival);
326 int (*s_dv_timings)(struct v4l2_subdev *sd,
327 struct v4l2_dv_timings *timings);
328 int (*g_dv_timings)(struct v4l2_subdev *sd,
329 struct v4l2_dv_timings *timings);
330 int (*enum_dv_timings)(struct v4l2_subdev *sd,
331 struct v4l2_enum_dv_timings *timings);
332 int (*query_dv_timings)(struct v4l2_subdev *sd,
333 struct v4l2_dv_timings *timings);
334 int (*dv_timings_cap)(struct v4l2_subdev *sd,
335 struct v4l2_dv_timings_cap *cap);
336 int (*enum_mbus_fmt)(struct v4l2_subdev *sd, unsigned int index,
337 enum v4l2_mbus_pixelcode *code);
338 int (*enum_mbus_fsizes)(struct v4l2_subdev *sd,
339 struct v4l2_frmsizeenum *fsize);
340 int (*g_mbus_fmt)(struct v4l2_subdev *sd,
341 struct v4l2_mbus_framefmt *fmt);
342 int (*try_mbus_fmt)(struct v4l2_subdev *sd,
343 struct v4l2_mbus_framefmt *fmt);
344 int (*s_mbus_fmt)(struct v4l2_subdev *sd,
345 struct v4l2_mbus_framefmt *fmt);
346 int (*g_mbus_config)(struct v4l2_subdev *sd,
347 struct v4l2_mbus_config *cfg);
348 int (*s_mbus_config)(struct v4l2_subdev *sd,
349 const struct v4l2_mbus_config *cfg);
350 int (*s_rx_buffer)(struct v4l2_subdev *sd, void *buf,
351 unsigned int *size);
352};
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383struct v4l2_subdev_vbi_ops {
384 int (*decode_vbi_line)(struct v4l2_subdev *sd, struct v4l2_decode_vbi_line *vbi_line);
385 int (*s_vbi_data)(struct v4l2_subdev *sd, const struct v4l2_sliced_vbi_data *vbi_data);
386 int (*g_vbi_data)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_data *vbi_data);
387 int (*g_sliced_vbi_cap)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_cap *cap);
388 int (*s_raw_fmt)(struct v4l2_subdev *sd, struct v4l2_vbi_format *fmt);
389 int (*g_sliced_fmt)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt);
390 int (*s_sliced_fmt)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt);
391};
392
393
394
395
396
397
398
399
400
401
402
403struct v4l2_subdev_sensor_ops {
404 int (*g_skip_top_lines)(struct v4l2_subdev *sd, u32 *lines);
405 int (*g_skip_frames)(struct v4l2_subdev *sd, u32 *frames);
406};
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431enum v4l2_subdev_ir_mode {
432 V4L2_SUBDEV_IR_MODE_PULSE_WIDTH,
433};
434
435struct v4l2_subdev_ir_parameters {
436
437 unsigned int bytes_per_data_element;
438 enum v4l2_subdev_ir_mode mode;
439
440 bool enable;
441 bool interrupt_enable;
442 bool shutdown;
443
444 bool modulation;
445 u32 max_pulse_width;
446 unsigned int carrier_freq;
447 unsigned int duty_cycle;
448 bool invert_level;
449
450
451 bool invert_carrier_sense;
452
453
454 u32 noise_filter_min_width;
455 unsigned int carrier_range_lower;
456 unsigned int carrier_range_upper;
457 u32 resolution;
458};
459
460struct v4l2_subdev_ir_ops {
461
462 int (*rx_read)(struct v4l2_subdev *sd, u8 *buf, size_t count,
463 ssize_t *num);
464
465 int (*rx_g_parameters)(struct v4l2_subdev *sd,
466 struct v4l2_subdev_ir_parameters *params);
467 int (*rx_s_parameters)(struct v4l2_subdev *sd,
468 struct v4l2_subdev_ir_parameters *params);
469
470
471 int (*tx_write)(struct v4l2_subdev *sd, u8 *buf, size_t count,
472 ssize_t *num);
473
474 int (*tx_g_parameters)(struct v4l2_subdev *sd,
475 struct v4l2_subdev_ir_parameters *params);
476 int (*tx_s_parameters)(struct v4l2_subdev *sd,
477 struct v4l2_subdev_ir_parameters *params);
478};
479
480
481
482
483
484
485
486struct v4l2_subdev_pad_ops {
487 int (*enum_mbus_code)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
488 struct v4l2_subdev_mbus_code_enum *code);
489 int (*enum_frame_size)(struct v4l2_subdev *sd,
490 struct v4l2_subdev_fh *fh,
491 struct v4l2_subdev_frame_size_enum *fse);
492 int (*enum_frame_interval)(struct v4l2_subdev *sd,
493 struct v4l2_subdev_fh *fh,
494 struct v4l2_subdev_frame_interval_enum *fie);
495 int (*get_fmt)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
496 struct v4l2_subdev_format *format);
497 int (*set_fmt)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
498 struct v4l2_subdev_format *format);
499 int (*set_crop)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
500 struct v4l2_subdev_crop *crop);
501 int (*get_crop)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
502 struct v4l2_subdev_crop *crop);
503 int (*get_selection)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
504 struct v4l2_subdev_selection *sel);
505 int (*set_selection)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
506 struct v4l2_subdev_selection *sel);
507 int (*get_edid)(struct v4l2_subdev *sd, struct v4l2_subdev_edid *edid);
508 int (*set_edid)(struct v4l2_subdev *sd, struct v4l2_subdev_edid *edid);
509#ifdef CONFIG_MEDIA_CONTROLLER
510 int (*link_validate)(struct v4l2_subdev *sd, struct media_link *link,
511 struct v4l2_subdev_format *source_fmt,
512 struct v4l2_subdev_format *sink_fmt);
513#endif
514 int (*get_frame_desc)(struct v4l2_subdev *sd, unsigned int pad,
515 struct v4l2_mbus_frame_desc *fd);
516 int (*set_frame_desc)(struct v4l2_subdev *sd, unsigned int pad,
517 struct v4l2_mbus_frame_desc *fd);
518};
519
520struct v4l2_subdev_ops {
521 const struct v4l2_subdev_core_ops *core;
522 const struct v4l2_subdev_tuner_ops *tuner;
523 const struct v4l2_subdev_audio_ops *audio;
524 const struct v4l2_subdev_video_ops *video;
525 const struct v4l2_subdev_vbi_ops *vbi;
526 const struct v4l2_subdev_ir_ops *ir;
527 const struct v4l2_subdev_sensor_ops *sensor;
528 const struct v4l2_subdev_pad_ops *pad;
529};
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545struct v4l2_subdev_internal_ops {
546 int (*registered)(struct v4l2_subdev *sd);
547 void (*unregistered)(struct v4l2_subdev *sd);
548 int (*open)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);
549 int (*close)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);
550};
551
552#define V4L2_SUBDEV_NAME_SIZE 32
553
554
555#define V4L2_SUBDEV_FL_IS_I2C (1U << 0)
556
557#define V4L2_SUBDEV_FL_IS_SPI (1U << 1)
558
559#define V4L2_SUBDEV_FL_HAS_DEVNODE (1U << 2)
560
561#define V4L2_SUBDEV_FL_HAS_EVENTS (1U << 3)
562
563
564
565
566struct v4l2_subdev {
567#if defined(CONFIG_MEDIA_CONTROLLER)
568 struct media_entity entity;
569#endif
570 struct list_head list;
571 struct module *owner;
572 u32 flags;
573 struct v4l2_device *v4l2_dev;
574 const struct v4l2_subdev_ops *ops;
575
576 const struct v4l2_subdev_internal_ops *internal_ops;
577
578 struct v4l2_ctrl_handler *ctrl_handler;
579
580 char name[V4L2_SUBDEV_NAME_SIZE];
581
582 u32 grp_id;
583
584 void *dev_priv;
585 void *host_priv;
586
587 struct video_device *devnode;
588};
589
590#define media_entity_to_v4l2_subdev(ent) \
591 container_of(ent, struct v4l2_subdev, entity)
592#define vdev_to_v4l2_subdev(vdev) \
593 ((struct v4l2_subdev *)video_get_drvdata(vdev))
594
595
596
597
598struct v4l2_subdev_fh {
599 struct v4l2_fh vfh;
600#if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
601 struct {
602 struct v4l2_mbus_framefmt try_fmt;
603 struct v4l2_rect try_crop;
604 struct v4l2_rect try_compose;
605 } *pad;
606#endif
607};
608
609#define to_v4l2_subdev_fh(fh) \
610 container_of(fh, struct v4l2_subdev_fh, vfh)
611
612#if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
613#define __V4L2_SUBDEV_MK_GET_TRY(rtype, fun_name, field_name) \
614 static inline struct rtype * \
615 v4l2_subdev_get_try_##fun_name(struct v4l2_subdev_fh *fh, \
616 unsigned int pad) \
617 { \
618 BUG_ON(unlikely(pad >= vdev_to_v4l2_subdev( \
619 fh->vfh.vdev)->entity.num_pads)); \
620 return &fh->pad[pad].field_name; \
621 }
622
623__V4L2_SUBDEV_MK_GET_TRY(v4l2_mbus_framefmt, format, try_fmt)
624__V4L2_SUBDEV_MK_GET_TRY(v4l2_rect, crop, try_compose)
625__V4L2_SUBDEV_MK_GET_TRY(v4l2_rect, compose, try_compose)
626#endif
627
628extern const struct v4l2_file_operations v4l2_subdev_fops;
629
630static inline void v4l2_set_subdevdata(struct v4l2_subdev *sd, void *p)
631{
632 sd->dev_priv = p;
633}
634
635static inline void *v4l2_get_subdevdata(const struct v4l2_subdev *sd)
636{
637 return sd->dev_priv;
638}
639
640static inline void v4l2_set_subdev_hostdata(struct v4l2_subdev *sd, void *p)
641{
642 sd->host_priv = p;
643}
644
645static inline void *v4l2_get_subdev_hostdata(const struct v4l2_subdev *sd)
646{
647 return sd->host_priv;
648}
649
650#ifdef CONFIG_MEDIA_CONTROLLER
651int v4l2_subdev_link_validate_default(struct v4l2_subdev *sd,
652 struct media_link *link,
653 struct v4l2_subdev_format *source_fmt,
654 struct v4l2_subdev_format *sink_fmt);
655int v4l2_subdev_link_validate(struct media_link *link);
656#endif
657void v4l2_subdev_init(struct v4l2_subdev *sd,
658 const struct v4l2_subdev_ops *ops);
659
660
661
662
663
664
665#define v4l2_subdev_call(sd, o, f, args...) \
666 (!(sd) ? -ENODEV : (((sd)->ops->o && (sd)->ops->o->f) ? \
667 (sd)->ops->o->f((sd) , ##args) : -ENOIOCTLCMD))
668
669
670#define v4l2_subdev_notify(sd, notification, arg) \
671 ((!(sd) || !(sd)->v4l2_dev || !(sd)->v4l2_dev->notify) ? -ENODEV : \
672 (sd)->v4l2_dev->notify((sd), (notification), (arg)))
673
674#define v4l2_subdev_has_op(sd, o, f) \
675 ((sd)->ops->o && (sd)->ops->o->f)
676
677#endif
678