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; return0;
}
/* 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); return0;
}
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);
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_DEVNODEflag.
*/
list_for_each_entry(sd, &v4l2_dev->subdevs, list) { if (!(sd->flags & V4L2_SUBDEV_FL_HAS_DEVNODE)) continue;
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.