diff options
Diffstat (limited to 'include/media/v4l2-subdev.h')
-rw-r--r-- | include/media/v4l2-subdev.h | 113 |
1 files changed, 97 insertions, 16 deletions
diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h index daf1e57d9b26..1562c4ff3a65 100644 --- a/include/media/v4l2-subdev.h +++ b/include/media/v4l2-subdev.h | |||
@@ -21,7 +21,11 @@ | |||
21 | #ifndef _V4L2_SUBDEV_H | 21 | #ifndef _V4L2_SUBDEV_H |
22 | #define _V4L2_SUBDEV_H | 22 | #define _V4L2_SUBDEV_H |
23 | 23 | ||
24 | #include <linux/v4l2-subdev.h> | ||
25 | #include <media/media-entity.h> | ||
24 | #include <media/v4l2-common.h> | 26 | #include <media/v4l2-common.h> |
27 | #include <media/v4l2-dev.h> | ||
28 | #include <media/v4l2-fh.h> | ||
25 | #include <media/v4l2-mediabus.h> | 29 | #include <media/v4l2-mediabus.h> |
26 | 30 | ||
27 | /* generic v4l2_device notify callback notification values */ | 31 | /* generic v4l2_device notify callback notification values */ |
@@ -36,7 +40,10 @@ | |||
36 | 40 | ||
37 | struct v4l2_device; | 41 | struct v4l2_device; |
38 | struct v4l2_ctrl_handler; | 42 | struct v4l2_ctrl_handler; |
43 | struct v4l2_event_subscription; | ||
44 | struct v4l2_fh; | ||
39 | struct v4l2_subdev; | 45 | struct v4l2_subdev; |
46 | struct v4l2_subdev_fh; | ||
40 | struct tuner_setup; | 47 | struct tuner_setup; |
41 | 48 | ||
42 | /* decode_vbi_line */ | 49 | /* decode_vbi_line */ |
@@ -160,6 +167,10 @@ struct v4l2_subdev_core_ops { | |||
160 | int (*s_power)(struct v4l2_subdev *sd, int on); | 167 | int (*s_power)(struct v4l2_subdev *sd, int on); |
161 | int (*interrupt_service_routine)(struct v4l2_subdev *sd, | 168 | int (*interrupt_service_routine)(struct v4l2_subdev *sd, |
162 | u32 status, bool *handled); | 169 | u32 status, bool *handled); |
170 | int (*subscribe_event)(struct v4l2_subdev *sd, struct v4l2_fh *fh, | ||
171 | struct v4l2_event_subscription *sub); | ||
172 | int (*unsubscribe_event)(struct v4l2_subdev *sd, struct v4l2_fh *fh, | ||
173 | struct v4l2_event_subscription *sub); | ||
163 | }; | 174 | }; |
164 | 175 | ||
165 | /* s_mode: switch the tuner to a specific tuner mode. Replacement of s_radio. | 176 | /* s_mode: switch the tuner to a specific tuner mode. Replacement of s_radio. |
@@ -257,6 +268,10 @@ struct v4l2_subdev_video_ops { | |||
257 | int (*s_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop); | 268 | int (*s_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop); |
258 | int (*g_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param); | 269 | int (*g_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param); |
259 | int (*s_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param); | 270 | int (*s_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param); |
271 | int (*g_frame_interval)(struct v4l2_subdev *sd, | ||
272 | struct v4l2_subdev_frame_interval *interval); | ||
273 | int (*s_frame_interval)(struct v4l2_subdev *sd, | ||
274 | struct v4l2_subdev_frame_interval *interval); | ||
260 | int (*enum_framesizes)(struct v4l2_subdev *sd, struct v4l2_frmsizeenum *fsize); | 275 | int (*enum_framesizes)(struct v4l2_subdev *sd, struct v4l2_frmsizeenum *fsize); |
261 | int (*enum_frameintervals)(struct v4l2_subdev *sd, struct v4l2_frmivalenum *fival); | 276 | int (*enum_frameintervals)(struct v4l2_subdev *sd, struct v4l2_frmivalenum *fival); |
262 | int (*enum_dv_presets) (struct v4l2_subdev *sd, | 277 | int (*enum_dv_presets) (struct v4l2_subdev *sd, |
@@ -271,6 +286,8 @@ struct v4l2_subdev_video_ops { | |||
271 | struct v4l2_dv_timings *timings); | 286 | struct v4l2_dv_timings *timings); |
272 | int (*enum_mbus_fmt)(struct v4l2_subdev *sd, unsigned int index, | 287 | int (*enum_mbus_fmt)(struct v4l2_subdev *sd, unsigned int index, |
273 | enum v4l2_mbus_pixelcode *code); | 288 | enum v4l2_mbus_pixelcode *code); |
289 | int (*enum_mbus_fsizes)(struct v4l2_subdev *sd, | ||
290 | struct v4l2_frmsizeenum *fsize); | ||
274 | int (*g_mbus_fmt)(struct v4l2_subdev *sd, | 291 | int (*g_mbus_fmt)(struct v4l2_subdev *sd, |
275 | struct v4l2_mbus_framefmt *fmt); | 292 | struct v4l2_mbus_framefmt *fmt); |
276 | int (*try_mbus_fmt)(struct v4l2_subdev *sd, | 293 | int (*try_mbus_fmt)(struct v4l2_subdev *sd, |
@@ -324,9 +341,13 @@ struct v4l2_subdev_vbi_ops { | |||
324 | * This is needed for some sensors, which always corrupt | 341 | * This is needed for some sensors, which always corrupt |
325 | * several top lines of the output image, or which send their | 342 | * several top lines of the output image, or which send their |
326 | * metadata in them. | 343 | * metadata in them. |
344 | * @g_skip_frames: number of frames to skip at stream start. This is needed for | ||
345 | * buggy sensors that generate faulty frames when they are | ||
346 | * turned on. | ||
327 | */ | 347 | */ |
328 | struct v4l2_subdev_sensor_ops { | 348 | struct v4l2_subdev_sensor_ops { |
329 | int (*g_skip_top_lines)(struct v4l2_subdev *sd, u32 *lines); | 349 | int (*g_skip_top_lines)(struct v4l2_subdev *sd, u32 *lines); |
350 | int (*g_skip_frames)(struct v4l2_subdev *sd, u32 *frames); | ||
330 | }; | 351 | }; |
331 | 352 | ||
332 | /* | 353 | /* |
@@ -401,6 +422,25 @@ struct v4l2_subdev_ir_ops { | |||
401 | struct v4l2_subdev_ir_parameters *params); | 422 | struct v4l2_subdev_ir_parameters *params); |
402 | }; | 423 | }; |
403 | 424 | ||
425 | struct v4l2_subdev_pad_ops { | ||
426 | int (*enum_mbus_code)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh, | ||
427 | struct v4l2_subdev_mbus_code_enum *code); | ||
428 | int (*enum_frame_size)(struct v4l2_subdev *sd, | ||
429 | struct v4l2_subdev_fh *fh, | ||
430 | struct v4l2_subdev_frame_size_enum *fse); | ||
431 | int (*enum_frame_interval)(struct v4l2_subdev *sd, | ||
432 | struct v4l2_subdev_fh *fh, | ||
433 | struct v4l2_subdev_frame_interval_enum *fie); | ||
434 | int (*get_fmt)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh, | ||
435 | struct v4l2_subdev_format *format); | ||
436 | int (*set_fmt)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh, | ||
437 | struct v4l2_subdev_format *format); | ||
438 | int (*set_crop)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh, | ||
439 | struct v4l2_subdev_crop *crop); | ||
440 | int (*get_crop)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh, | ||
441 | struct v4l2_subdev_crop *crop); | ||
442 | }; | ||
443 | |||
404 | struct v4l2_subdev_ops { | 444 | struct v4l2_subdev_ops { |
405 | const struct v4l2_subdev_core_ops *core; | 445 | const struct v4l2_subdev_core_ops *core; |
406 | const struct v4l2_subdev_tuner_ops *tuner; | 446 | const struct v4l2_subdev_tuner_ops *tuner; |
@@ -409,6 +449,7 @@ struct v4l2_subdev_ops { | |||
409 | const struct v4l2_subdev_vbi_ops *vbi; | 449 | const struct v4l2_subdev_vbi_ops *vbi; |
410 | const struct v4l2_subdev_ir_ops *ir; | 450 | const struct v4l2_subdev_ir_ops *ir; |
411 | const struct v4l2_subdev_sensor_ops *sensor; | 451 | const struct v4l2_subdev_sensor_ops *sensor; |
452 | const struct v4l2_subdev_pad_ops *pad; | ||
412 | }; | 453 | }; |
413 | 454 | ||
414 | /* | 455 | /* |
@@ -420,23 +461,36 @@ struct v4l2_subdev_ops { | |||
420 | * | 461 | * |
421 | * unregistered: called when this subdev is unregistered. When called the | 462 | * unregistered: called when this subdev is unregistered. When called the |
422 | * v4l2_dev field is still set to the correct v4l2_device. | 463 | * v4l2_dev field is still set to the correct v4l2_device. |
464 | * | ||
465 | * open: called when the subdev device node is opened by an application. | ||
466 | * | ||
467 | * close: called when the subdev device node is closed. | ||
423 | */ | 468 | */ |
424 | struct v4l2_subdev_internal_ops { | 469 | struct v4l2_subdev_internal_ops { |
425 | int (*registered)(struct v4l2_subdev *sd); | 470 | int (*registered)(struct v4l2_subdev *sd); |
426 | void (*unregistered)(struct v4l2_subdev *sd); | 471 | void (*unregistered)(struct v4l2_subdev *sd); |
472 | int (*open)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh); | ||
473 | int (*close)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh); | ||
427 | }; | 474 | }; |
428 | 475 | ||
429 | #define V4L2_SUBDEV_NAME_SIZE 32 | 476 | #define V4L2_SUBDEV_NAME_SIZE 32 |
430 | 477 | ||
431 | /* Set this flag if this subdev is a i2c device. */ | 478 | /* Set this flag if this subdev is a i2c device. */ |
432 | #define V4L2_SUBDEV_FL_IS_I2C (1U << 0) | 479 | #define V4L2_SUBDEV_FL_IS_I2C (1U << 0) |
433 | /* Set this flag if this subdev is a spi device. */ | 480 | /* Set this flag if this subdev is a spi device. */ |
434 | #define V4L2_SUBDEV_FL_IS_SPI (1U << 1) | 481 | #define V4L2_SUBDEV_FL_IS_SPI (1U << 1) |
482 | /* Set this flag if this subdev needs a device node. */ | ||
483 | #define V4L2_SUBDEV_FL_HAS_DEVNODE (1U << 2) | ||
484 | /* Set this flag if this subdev generates events. */ | ||
485 | #define V4L2_SUBDEV_FL_HAS_EVENTS (1U << 3) | ||
435 | 486 | ||
436 | /* Each instance of a subdev driver should create this struct, either | 487 | /* Each instance of a subdev driver should create this struct, either |
437 | stand-alone or embedded in a larger struct. | 488 | stand-alone or embedded in a larger struct. |
438 | */ | 489 | */ |
439 | struct v4l2_subdev { | 490 | struct v4l2_subdev { |
491 | #if defined(CONFIG_MEDIA_CONTROLLER) | ||
492 | struct media_entity entity; | ||
493 | #endif | ||
440 | struct list_head list; | 494 | struct list_head list; |
441 | struct module *owner; | 495 | struct module *owner; |
442 | u32 flags; | 496 | u32 flags; |
@@ -453,8 +507,47 @@ struct v4l2_subdev { | |||
453 | /* pointer to private data */ | 507 | /* pointer to private data */ |
454 | void *dev_priv; | 508 | void *dev_priv; |
455 | void *host_priv; | 509 | void *host_priv; |
510 | /* subdev device node */ | ||
511 | struct video_device devnode; | ||
512 | /* number of events to be allocated on open */ | ||
513 | unsigned int nevents; | ||
514 | }; | ||
515 | |||
516 | #define media_entity_to_v4l2_subdev(ent) \ | ||
517 | container_of(ent, struct v4l2_subdev, entity) | ||
518 | #define vdev_to_v4l2_subdev(vdev) \ | ||
519 | container_of(vdev, struct v4l2_subdev, devnode) | ||
520 | |||
521 | /* | ||
522 | * Used for storing subdev information per file handle | ||
523 | */ | ||
524 | struct v4l2_subdev_fh { | ||
525 | struct v4l2_fh vfh; | ||
526 | #if defined(CONFIG_VIDEO_V4L2_SUBDEV_API) | ||
527 | struct v4l2_mbus_framefmt *try_fmt; | ||
528 | struct v4l2_rect *try_crop; | ||
529 | #endif | ||
456 | }; | 530 | }; |
457 | 531 | ||
532 | #define to_v4l2_subdev_fh(fh) \ | ||
533 | container_of(fh, struct v4l2_subdev_fh, vfh) | ||
534 | |||
535 | #if defined(CONFIG_VIDEO_V4L2_SUBDEV_API) | ||
536 | static inline struct v4l2_mbus_framefmt * | ||
537 | v4l2_subdev_get_try_format(struct v4l2_subdev_fh *fh, unsigned int pad) | ||
538 | { | ||
539 | return &fh->try_fmt[pad]; | ||
540 | } | ||
541 | |||
542 | static inline struct v4l2_rect * | ||
543 | v4l2_subdev_get_try_crop(struct v4l2_subdev_fh *fh, unsigned int pad) | ||
544 | { | ||
545 | return &fh->try_crop[pad]; | ||
546 | } | ||
547 | #endif | ||
548 | |||
549 | extern const struct v4l2_file_operations v4l2_subdev_fops; | ||
550 | |||
458 | static inline void v4l2_set_subdevdata(struct v4l2_subdev *sd, void *p) | 551 | static inline void v4l2_set_subdevdata(struct v4l2_subdev *sd, void *p) |
459 | { | 552 | { |
460 | sd->dev_priv = p; | 553 | sd->dev_priv = p; |
@@ -475,20 +568,8 @@ static inline void *v4l2_get_subdev_hostdata(const struct v4l2_subdev *sd) | |||
475 | return sd->host_priv; | 568 | return sd->host_priv; |
476 | } | 569 | } |
477 | 570 | ||
478 | static inline void v4l2_subdev_init(struct v4l2_subdev *sd, | 571 | void v4l2_subdev_init(struct v4l2_subdev *sd, |
479 | const struct v4l2_subdev_ops *ops) | 572 | const struct v4l2_subdev_ops *ops); |
480 | { | ||
481 | INIT_LIST_HEAD(&sd->list); | ||
482 | /* ops->core MUST be set */ | ||
483 | BUG_ON(!ops || !ops->core); | ||
484 | sd->ops = ops; | ||
485 | sd->v4l2_dev = NULL; | ||
486 | sd->flags = 0; | ||
487 | sd->name[0] = '\0'; | ||
488 | sd->grp_id = 0; | ||
489 | sd->dev_priv = NULL; | ||
490 | sd->host_priv = NULL; | ||
491 | } | ||
492 | 573 | ||
493 | /* Call an ops of a v4l2_subdev, doing the right checks against | 574 | /* Call an ops of a v4l2_subdev, doing the right checks against |
494 | NULL pointers. | 575 | NULL pointers. |