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