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