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