diff options
author | Hans Verkuil <hverkuil@xs4all.nl> | 2009-03-08 16:02:10 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-03-30 11:43:20 -0400 |
commit | 98ec633972a70cf71d71bc8762804f0af4792d08 (patch) | |
tree | 8f924a6d5804b56a24a58a1e60ea69d53996ece7 | |
parent | 005759613b95264fba9138010f112bc138c857c2 (diff) |
V4L/DVB (11021): v4l2-device: add a notify callback.
Add a notify callback to v4l2_device to let sub-devices notify their
parent of special events.
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r-- | Documentation/video4linux/v4l2-framework.txt | 10 | ||||
-rw-r--r-- | include/media/v4l2-device.h | 3 | ||||
-rw-r--r-- | include/media/v4l2-subdev.h | 5 |
3 files changed, 18 insertions, 0 deletions
diff --git a/Documentation/video4linux/v4l2-framework.txt b/Documentation/video4linux/v4l2-framework.txt index df0247ed13d8..4207590b2ac8 100644 --- a/Documentation/video4linux/v4l2-framework.txt +++ b/Documentation/video4linux/v4l2-framework.txt | |||
@@ -94,6 +94,11 @@ usb_device or platform_device. It is rare for dev to be NULL, but it happens | |||
94 | with ISA devices or when one device creates multiple PCI devices, thus making | 94 | with ISA devices or when one device creates multiple PCI devices, thus making |
95 | it impossible to associate v4l2_dev with a particular parent. | 95 | it impossible to associate v4l2_dev with a particular parent. |
96 | 96 | ||
97 | You can also supply a notify() callback that can be called by sub-devices to | ||
98 | notify you of events. Whether you need to set this depends on the sub-device. | ||
99 | Any notifications a sub-device supports must be defined in a header in | ||
100 | include/media/<subdevice>.h. | ||
101 | |||
97 | You unregister with: | 102 | You unregister with: |
98 | 103 | ||
99 | v4l2_device_unregister(struct v4l2_device *v4l2_dev); | 104 | v4l2_device_unregister(struct v4l2_device *v4l2_dev); |
@@ -281,6 +286,11 @@ e.g. AUDIO_CONTROLLER and specify that as the group ID value when calling | |||
281 | v4l2_device_call_all(). That ensures that it will only go to the subdev | 286 | v4l2_device_call_all(). That ensures that it will only go to the subdev |
282 | that needs it. | 287 | that needs it. |
283 | 288 | ||
289 | If the sub-device needs to notify its v4l2_device parent of an event, then | ||
290 | it can call v4l2_subdev_notify(sd, notification, arg). This macro checks | ||
291 | whether there is a notify() callback defined and returns -ENODEV if not. | ||
292 | Otherwise the result of the notify() call is returned. | ||
293 | |||
284 | The advantage of using v4l2_subdev is that it is a generic struct and does | 294 | The advantage of using v4l2_subdev is that it is a generic struct and does |
285 | not contain any knowledge about the underlying hardware. So a driver might | 295 | not contain any knowledge about the underlying hardware. So a driver might |
286 | contain several subdevs that use an I2C bus, but also a subdev that is | 296 | contain several subdevs that use an I2C bus, but also a subdev that is |
diff --git a/include/media/v4l2-device.h b/include/media/v4l2-device.h index 5d7146dc2913..3d8e96f6ceb3 100644 --- a/include/media/v4l2-device.h +++ b/include/media/v4l2-device.h | |||
@@ -44,6 +44,9 @@ struct v4l2_device { | |||
44 | spinlock_t lock; | 44 | spinlock_t lock; |
45 | /* unique device name, by default the driver name + bus ID */ | 45 | /* unique device name, by default the driver name + bus ID */ |
46 | char name[V4L2_DEVICE_NAME_SIZE]; | 46 | char name[V4L2_DEVICE_NAME_SIZE]; |
47 | /* notify callback called by some sub-devices. */ | ||
48 | void (*notify)(struct v4l2_subdev *sd, | ||
49 | unsigned int notification, void *arg); | ||
47 | }; | 50 | }; |
48 | 51 | ||
49 | /* Initialize v4l2_dev and make dev->driver_data point to v4l2_dev. | 52 | /* Initialize v4l2_dev and make dev->driver_data point to v4l2_dev. |
diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h index 05b69652e6c4..1b97a2c33a73 100644 --- a/include/media/v4l2-subdev.h +++ b/include/media/v4l2-subdev.h | |||
@@ -191,4 +191,9 @@ static inline void v4l2_subdev_init(struct v4l2_subdev *sd, | |||
191 | (!(sd) ? -ENODEV : (((sd) && (sd)->ops->o && (sd)->ops->o->f) ? \ | 191 | (!(sd) ? -ENODEV : (((sd) && (sd)->ops->o && (sd)->ops->o->f) ? \ |
192 | (sd)->ops->o->f((sd) , ##args) : -ENOIOCTLCMD)) | 192 | (sd)->ops->o->f((sd) , ##args) : -ENOIOCTLCMD)) |
193 | 193 | ||
194 | /* Send a notification to v4l2_device. */ | ||
195 | #define v4l2_subdev_notify(sd, notification, arg) \ | ||
196 | ((!(sd) || !(sd)->v4l2_dev || !(sd)->v4l2_dev->notify) ? -ENODEV : \ | ||
197 | (sd)->v4l2_dev->notify((sd), (notification), (arg))) | ||
198 | |||
194 | #endif | 199 | #endif |