Blame view

kernel/linux-imx6_3.14.28/include/media/v4l2-async.h 2.82 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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
  /*
   * V4L2 asynchronous subdevice registration API
   *
   * Copyright (C) 2012-2013, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
  
  #ifndef V4L2_ASYNC_H
  #define V4L2_ASYNC_H
  
  #include <linux/list.h>
  #include <linux/mutex.h>
  
  struct device;
  struct device_node;
  struct v4l2_device;
  struct v4l2_subdev;
  struct v4l2_async_notifier;
  
  /* A random max subdevice number, used to allocate an array on stack */
  #define V4L2_MAX_SUBDEVS 128U
  
  enum v4l2_async_match_type {
  	V4L2_ASYNC_MATCH_CUSTOM,
  	V4L2_ASYNC_MATCH_DEVNAME,
  	V4L2_ASYNC_MATCH_I2C,
  	V4L2_ASYNC_MATCH_OF,
  };
  
  /**
   * struct v4l2_async_subdev - sub-device descriptor, as known to a bridge
   * @bus_type:	subdevice bus type to select the appropriate matching method
   * @match:	union of per-bus type matching data sets
   * @list:	used to link struct v4l2_async_subdev objects, waiting to be
   *		probed, to a notifier->waiting list
   */
  struct v4l2_async_subdev {
  	enum v4l2_async_match_type match_type;
  	union {
  		struct {
  			const struct device_node *node;
  		} of;
  		struct {
  			const char *name;
  		} device_name;
  		struct {
  			int adapter_id;
  			unsigned short address;
  		} i2c;
  		struct {
  			bool (*match)(struct device *,
  				      struct v4l2_async_subdev *);
  			void *priv;
  		} custom;
  	} match;
  
  	/* v4l2-async core private: not to be used by drivers */
  	struct list_head list;
  };
  
  /**
   * v4l2_async_notifier - v4l2_device notifier data
   * @num_subdevs:number of subdevices
   * @subdevs:	array of pointers to subdevice descriptors
   * @v4l2_dev:	pointer to struct v4l2_device
   * @waiting:	list of struct v4l2_async_subdev, waiting for their drivers
   * @done:	list of struct v4l2_subdev, already probed
   * @list:	member in a global list of notifiers
   * @bound:	a subdevice driver has successfully probed one of subdevices
   * @complete:	all subdevices have been probed successfully
   * @unbind:	a subdevice is leaving
   */
  struct v4l2_async_notifier {
  	unsigned int num_subdevs;
  	struct v4l2_async_subdev **subdevs;
  	struct v4l2_device *v4l2_dev;
  	struct list_head waiting;
  	struct list_head done;
  	struct list_head list;
  	int (*bound)(struct v4l2_async_notifier *notifier,
  		     struct v4l2_subdev *subdev,
  		     struct v4l2_async_subdev *asd);
  	int (*complete)(struct v4l2_async_notifier *notifier);
  	void (*unbind)(struct v4l2_async_notifier *notifier,
  		       struct v4l2_subdev *subdev,
  		       struct v4l2_async_subdev *asd);
  };
  
  int v4l2_async_notifier_register(struct v4l2_device *v4l2_dev,
  				 struct v4l2_async_notifier *notifier);
  void v4l2_async_notifier_unregister(struct v4l2_async_notifier *notifier);
  int v4l2_async_register_subdev(struct v4l2_subdev *sd);
  void v4l2_async_unregister_subdev(struct v4l2_subdev *sd);
  #endif