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