aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans Verkuil <hverkuil@xs4all.nl>2009-03-08 16:02:10 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-03-30 11:43:20 -0400
commit98ec633972a70cf71d71bc8762804f0af4792d08 (patch)
tree8f924a6d5804b56a24a58a1e60ea69d53996ece7
parent005759613b95264fba9138010f112bc138c857c2 (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.txt10
-rw-r--r--include/media/v4l2-device.h3
-rw-r--r--include/media/v4l2-subdev.h5
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
94with ISA devices or when one device creates multiple PCI devices, thus making 94with ISA devices or when one device creates multiple PCI devices, thus making
95it impossible to associate v4l2_dev with a particular parent. 95it impossible to associate v4l2_dev with a particular parent.
96 96
97You can also supply a notify() callback that can be called by sub-devices to
98notify you of events. Whether you need to set this depends on the sub-device.
99Any notifications a sub-device supports must be defined in a header in
100include/media/<subdevice>.h.
101
97You unregister with: 102You 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
281v4l2_device_call_all(). That ensures that it will only go to the subdev 286v4l2_device_call_all(). That ensures that it will only go to the subdev
282that needs it. 287that needs it.
283 288
289If the sub-device needs to notify its v4l2_device parent of an event, then
290it can call v4l2_subdev_notify(sd, notification, arg). This macro checks
291whether there is a notify() callback defined and returns -ENODEV if not.
292Otherwise the result of the notify() call is returned.
293
284The advantage of using v4l2_subdev is that it is a generic struct and does 294The advantage of using v4l2_subdev is that it is a generic struct and does
285not contain any knowledge about the underlying hardware. So a driver might 295not contain any knowledge about the underlying hardware. So a driver might
286contain several subdevs that use an I2C bus, but also a subdev that is 296contain 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