int v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev)
{ if (v4l2_dev == NULL) return -EINVAL;
INIT_LIST_HEAD(&v4l2_dev->subdevs);
spin_lock_init(&v4l2_dev->lock);
v4l2_prio_init(&v4l2_dev->prio);
kref_init(&v4l2_dev->ref);
get_device(dev);
v4l2_dev->dev = dev; if (dev == NULL) { /* If dev == NULL, then name must be filled in by the caller */ if (WARN_ON(!v4l2_dev->name[0])) return -EINVAL; return 0;
}
/* Set name to driver name + device name if it is empty. */ if (!v4l2_dev->name[0])
snprintf(v4l2_dev->name, sizeof(v4l2_dev->name), "%s %s",
dev->driver->name, dev_name(dev)); if (!dev_get_drvdata(dev))
dev_set_drvdata(dev, v4l2_dev); return 0;
}
EXPORT_SYMBOL_GPL(v4l2_device_register);
if (v4l2_dev->release)
v4l2_dev->release(v4l2_dev);
}
int v4l2_device_put(struct v4l2_device *v4l2_dev)
{ return kref_put(&v4l2_dev->ref, v4l2_device_release);
}
EXPORT_SYMBOL_GPL(v4l2_device_put);
int v4l2_device_set_name(struct v4l2_device *v4l2_dev, constchar *basename,
atomic_t *instance)
{ int num = atomic_inc_return(instance) - 1; int len = strlen(basename);
/* Just return if v4l2_dev is NULL or if it was already
* unregistered before. */ if (v4l2_dev == NULL || !v4l2_dev->name[0]) return;
v4l2_device_disconnect(v4l2_dev);
int __v4l2_device_register_subdev(struct v4l2_device *v4l2_dev, struct v4l2_subdev *sd, struct module *module)
{ int err;
/* Check for valid input */ if (!v4l2_dev || !sd || sd->v4l2_dev || !sd->name[0]) return -EINVAL;
/* * The reason to acquire the module here is to avoid unloading * a module of sub-device which is registered to a media * device. To make it possible to unload modules for media * devices that also register sub-devices, do not * try_module_get() such sub-device owners.
*/
sd->owner_v4l2_dev = v4l2_dev->dev && v4l2_dev->dev->driver &&
module == v4l2_dev->dev->driver->owner;
if (!sd->owner_v4l2_dev && !try_module_get(module)) return -ENODEV;
sd->v4l2_dev = v4l2_dev; /* This just returns 0 if either of the two args is NULL */
err = v4l2_ctrl_add_handler(v4l2_dev->ctrl_handler, sd->ctrl_handler,
NULL, true); if (err) goto error_module;
#ifdefined(CONFIG_MEDIA_CONTROLLER) /* Register the entity. */ if (v4l2_dev->mdev) {
err = media_device_register_entity(v4l2_dev->mdev, &sd->entity); if (err < 0) goto error_module;
} #endif
if (sd->internal_ops && sd->internal_ops->registered) {
err = sd->internal_ops->registered(sd); if (err) goto error_unregister;
}
int __v4l2_device_register_subdev_nodes(struct v4l2_device *v4l2_dev, bool read_only)
{ struct video_device *vdev; struct v4l2_subdev *sd; int err;
/* Register a device node for every subdev marked with the * V4L2_SUBDEV_FL_HAS_DEVNODE flag.
*/
list_for_each_entry(sd, &v4l2_dev->subdevs, list) { if (!(sd->flags & V4L2_SUBDEV_FL_HAS_DEVNODE)) continue;
if (sd->internal_ops && sd->internal_ops->unregistered)
sd->internal_ops->unregistered(sd);
sd->v4l2_dev = NULL;
#ifdefined(CONFIG_MEDIA_CONTROLLER) if (v4l2_dev->mdev) { /* * No need to explicitly remove links, as both pads and * links are removed by the function below, in the right order
*/
media_device_unregister_entity(&sd->entity);
} #endif if (sd->devnode)
video_unregister_device(sd->devnode); else
v4l2_subdev_release(sd);
}
EXPORT_SYMBOL_GPL(v4l2_device_unregister_subdev);
Messung V0.5
¤ Dauer der Verarbeitung: 0.23 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.