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, 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, 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, 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
306
307
308
309
310
311
312
313
314struct v4l2_subdev_video_ops {
315 int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
316 int (*s_crystal_freq)(struct v4l2_subdev *sd, u32 freq, u32 flags);
317 int (*s_std_output)(struct v4l2_subdev *sd, v4l2_std_id std);
318 int (*g_std_output)(struct v4l2_subdev *sd, v4l2_std_id *std);
319 int (*querystd)(struct v4l2_subdev *sd, v4l2_std_id *std);
320 int (*g_tvnorms_output)(struct v4l2_subdev *sd, v4l2_std_id *std);
321 int (*g_input_status)(struct v4l2_subdev *sd, u32 *status);
322 int (*s_stream)(struct v4l2_subdev *sd, int enable);
323 int (*cropcap)(struct v4l2_subdev *sd, struct v4l2_cropcap *cc);
324 int (*g_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop);
325 int (*s_crop)(struct v4l2_subdev *sd, const struct v4l2_crop *crop);
326 int (*g_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param);
327 int (*s_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param);
328 int (*g_frame_interval)(struct v4l2_subdev *sd,
329 struct v4l2_subdev_frame_interval *interval);
330 int (*s_frame_interval)(struct v4l2_subdev *sd,
331 struct v4l2_subdev_frame_interval *interval);
332 int (*enum_framesizes)(struct v4l2_subdev *sd, struct v4l2_frmsizeenum *fsize);
333 int (*enum_frameintervals)(struct v4l2_subdev *sd, struct v4l2_frmivalenum *fival);
334 int (*enum_dv_presets) (struct v4l2_subdev *sd,
335 struct v4l2_dv_enum_preset *preset);
336 int (*s_dv_preset)(struct v4l2_subdev *sd,
337 struct v4l2_dv_preset *preset);
338 int (*g_dv_preset)(struct v4l2_subdev *sd,
339 struct v4l2_dv_preset *preset);
340 int (*query_dv_preset)(struct v4l2_subdev *sd,
341 struct v4l2_dv_preset *preset);
342 int (*s_dv_timings)(struct v4l2_subdev *sd,
343 struct v4l2_dv_timings *timings);
344 int (*g_dv_timings)(struct v4l2_subdev *sd,
345 struct v4l2_dv_timings *timings);
346 int (*enum_dv_timings)(struct v4l2_subdev *sd,
347 struct v4l2_enum_dv_timings *timings);
348 int (*query_dv_timings)(struct v4l2_subdev *sd,
349 struct v4l2_dv_timings *timings);
350 int (*dv_timings_cap)(struct v4l2_subdev *sd,
351 struct v4l2_dv_timings_cap *cap);
352 int (*enum_mbus_fmt)(struct v4l2_subdev *sd, unsigned int index,
353 enum v4l2_mbus_pixelcode *code);
354 int (*enum_mbus_fsizes)(struct v4l2_subdev *sd,
355 struct v4l2_frmsizeenum *fsize);
356 int (*g_mbus_fmt)(struct v4l2_subdev *sd,
357 struct v4l2_mbus_framefmt *fmt);
358 int (*try_mbus_fmt)(struct v4l2_subdev *sd,
359 struct v4l2_mbus_framefmt *fmt);
360 int (*s_mbus_fmt)(struct v4l2_subdev *sd,
361 struct v4l2_mbus_framefmt *fmt);
362 int (*g_mbus_config)(struct v4l2_subdev *sd,
363 struct v4l2_mbus_config *cfg);
364 int (*s_mbus_config)(struct v4l2_subdev *sd,
365 const struct v4l2_mbus_config *cfg);
366 int (*s_rx_buffer)(struct v4l2_subdev *sd, void *buf,
367 unsigned int *size);
368};
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399struct v4l2_subdev_vbi_ops {
400 int (*decode_vbi_line)(struct v4l2_subdev *sd, struct v4l2_decode_vbi_line *vbi_line);
401 int (*s_vbi_data)(struct v4l2_subdev *sd, const struct v4l2_sliced_vbi_data *vbi_data);
402 int (*g_vbi_data)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_data *vbi_data);
403 int (*g_sliced_vbi_cap)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_cap *cap);
404 int (*s_raw_fmt)(struct v4l2_subdev *sd, struct v4l2_vbi_format *fmt);
405 int (*g_sliced_fmt)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt);
406 int (*s_sliced_fmt)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt);
407};
408
409
410
411
412
413
414
415
416
417
418
419struct v4l2_subdev_sensor_ops {
420 int (*g_skip_top_lines)(struct v4l2_subdev *sd, u32 *lines);
421 int (*g_skip_frames)(struct v4l2_subdev *sd, u32 *frames);
422};
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447enum v4l2_subdev_ir_mode {
448 V4L2_SUBDEV_IR_MODE_PULSE_WIDTH,
449};
450
451struct v4l2_subdev_ir_parameters {
452
453 unsigned int bytes_per_data_element;
454 enum v4l2_subdev_ir_mode mode;
455
456 bool enable;
457 bool interrupt_enable;
458 bool shutdown;
459
460 bool modulation;
461 u32 max_pulse_width;
462 unsigned int carrier_freq;
463 unsigned int duty_cycle;
464 bool invert_level;
465
466
467 bool invert_carrier_sense;
468
469
470 u32 noise_filter_min_width;
471 unsigned int carrier_range_lower;
472 unsigned int carrier_range_upper;
473 u32 resolution;
474};
475
476struct v4l2_subdev_ir_ops {
477
478 int (*rx_read)(struct v4l2_subdev *sd, u8 *buf, size_t count,
479 ssize_t *num);
480
481 int (*rx_g_parameters)(struct v4l2_subdev *sd,
482 struct v4l2_subdev_ir_parameters *params);
483 int (*rx_s_parameters)(struct v4l2_subdev *sd,
484 struct v4l2_subdev_ir_parameters *params);
485
486
487 int (*tx_write)(struct v4l2_subdev *sd, u8 *buf, size_t count,
488 ssize_t *num);
489
490 int (*tx_g_parameters)(struct v4l2_subdev *sd,
491 struct v4l2_subdev_ir_parameters *params);
492 int (*tx_s_parameters)(struct v4l2_subdev *sd,
493 struct v4l2_subdev_ir_parameters *params);
494};
495
496
497
498
499
500
501
502struct v4l2_subdev_pad_ops {
503 int (*enum_mbus_code)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
504 struct v4l2_subdev_mbus_code_enum *code);
505 int (*enum_frame_size)(struct v4l2_subdev *sd,
506 struct v4l2_subdev_fh *fh,
507 struct v4l2_subdev_frame_size_enum *fse);
508 int (*enum_frame_interval)(struct v4l2_subdev *sd,
509 struct v4l2_subdev_fh *fh,
510 struct v4l2_subdev_frame_interval_enum *fie);
511 int (*get_fmt)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
512 struct v4l2_subdev_format *format);
513 int (*set_fmt)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
514 struct v4l2_subdev_format *format);
515 int (*set_crop)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
516 struct v4l2_subdev_crop *crop);
517 int (*get_crop)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
518 struct v4l2_subdev_crop *crop);
519 int (*get_selection)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
520 struct v4l2_subdev_selection *sel);
521 int (*set_selection)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
522 struct v4l2_subdev_selection *sel);
523 int (*get_edid)(struct v4l2_subdev *sd, struct v4l2_subdev_edid *edid);
524 int (*set_edid)(struct v4l2_subdev *sd, struct v4l2_subdev_edid *edid);
525#ifdef CONFIG_MEDIA_CONTROLLER
526 int (*link_validate)(struct v4l2_subdev *sd, struct media_link *link,
527 struct v4l2_subdev_format *source_fmt,
528 struct v4l2_subdev_format *sink_fmt);
529#endif
530 int (*get_frame_desc)(struct v4l2_subdev *sd, unsigned int pad,
531 struct v4l2_mbus_frame_desc *fd);
532 int (*set_frame_desc)(struct v4l2_subdev *sd, unsigned int pad,
533 struct v4l2_mbus_frame_desc *fd);
534};
535
536struct v4l2_subdev_ops {
537 const struct v4l2_subdev_core_ops *core;
538 const struct v4l2_subdev_tuner_ops *tuner;
539 const struct v4l2_subdev_audio_ops *audio;
540 const struct v4l2_subdev_video_ops *video;
541 const struct v4l2_subdev_vbi_ops *vbi;
542 const struct v4l2_subdev_ir_ops *ir;
543 const struct v4l2_subdev_sensor_ops *sensor;
544 const struct v4l2_subdev_pad_ops *pad;
545};
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561struct v4l2_subdev_internal_ops {
562 int (*registered)(struct v4l2_subdev *sd);
563 void (*unregistered)(struct v4l2_subdev *sd);
564 int (*open)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);
565 int (*close)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh);
566};
567
568#define V4L2_SUBDEV_NAME_SIZE 32
569
570
571#define V4L2_SUBDEV_FL_IS_I2C (1U << 0)
572
573#define V4L2_SUBDEV_FL_IS_SPI (1U << 1)
574
575#define V4L2_SUBDEV_FL_HAS_DEVNODE (1U << 2)
576
577#define V4L2_SUBDEV_FL_HAS_EVENTS (1U << 3)
578
579
580
581
582struct v4l2_subdev {
583#if defined(CONFIG_MEDIA_CONTROLLER)
584 struct media_entity entity;
585#endif
586 struct list_head list;
587 struct module *owner;
588 u32 flags;
589 struct v4l2_device *v4l2_dev;
590 const struct v4l2_subdev_ops *ops;
591
592 const struct v4l2_subdev_internal_ops *internal_ops;
593
594 struct v4l2_ctrl_handler *ctrl_handler;
595
596 char name[V4L2_SUBDEV_NAME_SIZE];
597
598 u32 grp_id;
599
600 void *dev_priv;
601 void *host_priv;
602
603 struct video_device *devnode;
604};
605
606#define media_entity_to_v4l2_subdev(ent) \
607 container_of(ent, struct v4l2_subdev, entity)
608#define vdev_to_v4l2_subdev(vdev) \
609 ((struct v4l2_subdev *)video_get_drvdata(vdev))
610
611
612
613
614struct v4l2_subdev_fh {
615 struct v4l2_fh vfh;
616#if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
617 struct {
618 struct v4l2_mbus_framefmt try_fmt;
619 struct v4l2_rect try_crop;
620 struct v4l2_rect try_compose;
621 } *pad;
622#endif
623};
624
625#define to_v4l2_subdev_fh(fh) \
626 container_of(fh, struct v4l2_subdev_fh, vfh)
627
628#if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
629#define __V4L2_SUBDEV_MK_GET_TRY(rtype, fun_name, field_name) \
630 static inline struct rtype * \
631 v4l2_subdev_get_try_##fun_name(struct v4l2_subdev_fh *fh, \
632 unsigned int pad) \
633 { \
634 BUG_ON(unlikely(pad >= vdev_to_v4l2_subdev( \
635 fh->vfh.vdev)->entity.num_pads)); \
636 return &fh->pad[pad].field_name; \
637 }
638
639__V4L2_SUBDEV_MK_GET_TRY(v4l2_mbus_framefmt, format, try_fmt)
640__V4L2_SUBDEV_MK_GET_TRY(v4l2_rect, crop, try_compose)
641__V4L2_SUBDEV_MK_GET_TRY(v4l2_rect, compose, try_compose)
642#endif
643
644extern const struct v4l2_file_operations v4l2_subdev_fops;
645
646static inline void v4l2_set_subdevdata(struct v4l2_subdev *sd, void *p)
647{
648 sd->dev_priv = p;
649}
650
651static inline void *v4l2_get_subdevdata(const struct v4l2_subdev *sd)
652{
653 return sd->dev_priv;
654}
655
656static inline void v4l2_set_subdev_hostdata(struct v4l2_subdev *sd, void *p)
657{
658 sd->host_priv = p;
659}
660
661static inline void *v4l2_get_subdev_hostdata(const struct v4l2_subdev *sd)
662{
663 return sd->host_priv;
664}
665
666#ifdef CONFIG_MEDIA_CONTROLLER
667int v4l2_subdev_link_validate_default(struct v4l2_subdev *sd,
668 struct media_link *link,
669 struct v4l2_subdev_format *source_fmt,
670 struct v4l2_subdev_format *sink_fmt);
671int v4l2_subdev_link_validate(struct media_link *link);
672#endif
673void v4l2_subdev_init(struct v4l2_subdev *sd,
674 const struct v4l2_subdev_ops *ops);
675
676
677
678
679
680
681#define v4l2_subdev_call(sd, o, f, args...) \
682 (!(sd) ? -ENODEV : (((sd)->ops->o && (sd)->ops->o->f) ? \
683 (sd)->ops->o->f((sd) , ##args) : -ENOIOCTLCMD))
684
685
686#define v4l2_subdev_notify(sd, notification, arg) \
687 ((!(sd) || !(sd)->v4l2_dev || !(sd)->v4l2_dev->notify) ? -ENODEV : \
688 (sd)->v4l2_dev->notify((sd), (notification), (arg)))
689
690#endif
691