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