Commit 98ec6339 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

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: default avatarHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 00575961
...@@ -94,6 +94,11 @@ usb_device or platform_device. It is rare for dev to be NULL, but it happens ...@@ -94,6 +94,11 @@ usb_device or platform_device. It is rare for dev to be NULL, but it happens
with ISA devices or when one device creates multiple PCI devices, thus making with ISA devices or when one device creates multiple PCI devices, thus making
it impossible to associate v4l2_dev with a particular parent. it impossible to associate v4l2_dev with a particular parent.
You can also supply a notify() callback that can be called by sub-devices to
notify you of events. Whether you need to set this depends on the sub-device.
Any notifications a sub-device supports must be defined in a header in
include/media/<subdevice>.h.
You unregister with: You unregister with:
v4l2_device_unregister(struct v4l2_device *v4l2_dev); 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,6 +286,11 @@ e.g. AUDIO_CONTROLLER and specify that as the group ID value when calling
v4l2_device_call_all(). That ensures that it will only go to the subdev v4l2_device_call_all(). That ensures that it will only go to the subdev
that needs it. that needs it.
If the sub-device needs to notify its v4l2_device parent of an event, then
it can call v4l2_subdev_notify(sd, notification, arg). This macro checks
whether there is a notify() callback defined and returns -ENODEV if not.
Otherwise the result of the notify() call is returned.
The advantage of using v4l2_subdev is that it is a generic struct and does The advantage of using v4l2_subdev is that it is a generic struct and does
not contain any knowledge about the underlying hardware. So a driver might not contain any knowledge about the underlying hardware. So a driver might
contain several subdevs that use an I2C bus, but also a subdev that is contain several subdevs that use an I2C bus, but also a subdev that is
......
...@@ -44,6 +44,9 @@ struct v4l2_device { ...@@ -44,6 +44,9 @@ struct v4l2_device {
spinlock_t lock; spinlock_t lock;
/* unique device name, by default the driver name + bus ID */ /* unique device name, by default the driver name + bus ID */
char name[V4L2_DEVICE_NAME_SIZE]; char name[V4L2_DEVICE_NAME_SIZE];
/* notify callback called by some sub-devices. */
void (*notify)(struct v4l2_subdev *sd,
unsigned int notification, void *arg);
}; };
/* Initialize v4l2_dev and make dev->driver_data point to v4l2_dev. /* Initialize v4l2_dev and make dev->driver_data point to v4l2_dev.
......
...@@ -191,4 +191,9 @@ static inline void v4l2_subdev_init(struct v4l2_subdev *sd, ...@@ -191,4 +191,9 @@ static inline void v4l2_subdev_init(struct v4l2_subdev *sd,
(!(sd) ? -ENODEV : (((sd) && (sd)->ops->o && (sd)->ops->o->f) ? \ (!(sd) ? -ENODEV : (((sd) && (sd)->ops->o && (sd)->ops->o->f) ? \
(sd)->ops->o->f((sd) , ##args) : -ENOIOCTLCMD)) (sd)->ops->o->f((sd) , ##args) : -ENOIOCTLCMD))
/* Send a notification to v4l2_device. */
#define v4l2_subdev_notify(sd, notification, arg) \
((!(sd) || !(sd)->v4l2_dev || !(sd)->v4l2_dev->notify) ? -ENODEV : \
(sd)->v4l2_dev->notify((sd), (notification), (arg)))
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment