mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 22:14:04 +02:00
FROMLIST: v4l: async: Add a convenience function for registering sensors
Add a convenience function for parsing firmware for information on related devices using v4l2_async_notifier_parse_fwnode_sensor_common() registering the notifier and finally the async sub-device itself. This should be useful for sensor drivers that do not have device specific requirements related to firmware information parsing or the async framework. Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> (cherry picked from commit dd202f9d5346cacd785a482952f54b205eafcc64) https://git.linuxtv.org/sailus/media_tree.git/log/?h=010f7f4393fd http://www.spinics.net/lists/linux-media/msg122688.html Signed-off-by: Marc Herbert <marc.herbert@intel.com> Conflicts: include/media/v4l2-subdev.h (convert to older documentation style) BUG=b:64133998 TEST=media device topology shows subdevs registered successfully TEST=no camera regression Change-Id: Ia4af50d7204173d17d04faf9575f6605a1400e46 Reviewed-on: https://chromium-review.googlesource.com/693700 Commit-Ready: Tomasz Figa <tfiga@chromium.org> Tested-by: Hyungwoo Yang <hyungwoo.yang@intel.com> Reviewed-by: Tomasz Figa <tfiga@chromium.org> Signed-off-by: Jacob Chen <jacob2.chen@rock-chips.com>
This commit is contained in:
parent
7c4d65f119
commit
255a3eb2b7
|
|
@ -584,6 +584,11 @@ void v4l2_async_unregister_subdev(struct v4l2_subdev *sd)
|
|||
{
|
||||
struct v4l2_async_notifier *notifier = sd->notifier;
|
||||
|
||||
if (sd->subdev_notifier)
|
||||
v4l2_async_notifier_unregister(sd->subdev_notifier);
|
||||
v4l2_async_notifier_cleanup(sd->subdev_notifier);
|
||||
kfree(sd->subdev_notifier);
|
||||
|
||||
if (!sd->asd) {
|
||||
if (!list_empty(&sd->async_list))
|
||||
v4l2_async_cleanup(sd);
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
|
||||
#include <media/v4l2-async.h>
|
||||
#include <media/v4l2-fwnode.h>
|
||||
#include <media/v4l2-subdev.h>
|
||||
|
||||
static int v4l2_fwnode_endpoint_parse_csi_bus(struct fwnode_handle *fwnode,
|
||||
struct v4l2_fwnode_endpoint *vep)
|
||||
|
|
@ -765,6 +766,46 @@ int v4l2_async_notifier_parse_fwnode_sensor_common(
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(v4l2_async_notifier_parse_fwnode_sensor_common);
|
||||
|
||||
int v4l2_async_register_subdev_sensor_common(struct v4l2_subdev *sd)
|
||||
{
|
||||
struct v4l2_async_notifier *notifier;
|
||||
int ret;
|
||||
|
||||
if (WARN_ON(!sd->dev))
|
||||
return -ENODEV;
|
||||
|
||||
notifier = kzalloc(sizeof(*notifier), GFP_KERNEL);
|
||||
if (!notifier)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = v4l2_async_notifier_parse_fwnode_sensor_common(sd->dev,
|
||||
notifier);
|
||||
if (ret < 0)
|
||||
goto out_cleanup;
|
||||
|
||||
ret = v4l2_async_subdev_notifier_register(sd, notifier);
|
||||
if (ret < 0)
|
||||
goto out_cleanup;
|
||||
|
||||
ret = v4l2_async_register_subdev(sd);
|
||||
if (ret < 0)
|
||||
goto out_unregister;
|
||||
|
||||
sd->subdev_notifier = notifier;
|
||||
|
||||
return 0;
|
||||
|
||||
out_unregister:
|
||||
v4l2_async_notifier_unregister(notifier);
|
||||
|
||||
out_cleanup:
|
||||
v4l2_async_notifier_cleanup(notifier);
|
||||
kfree(notifier);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(v4l2_async_register_subdev_sensor_common);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Sakari Ailus <sakari.ailus@linux.intel.com>");
|
||||
MODULE_AUTHOR("Sylwester Nawrocki <s.nawrocki@samsung.com>");
|
||||
|
|
|
|||
|
|
@ -172,6 +172,28 @@ void v4l2_async_notifier_cleanup(struct v4l2_async_notifier *notifier);
|
|||
*/
|
||||
int v4l2_async_register_subdev(struct v4l2_subdev *sd);
|
||||
|
||||
/**
|
||||
* v4l2_async_register_subdev_sensor_common - registers a sensor sub-device to
|
||||
* the asynchronous sub-device
|
||||
* framework and parse set up common
|
||||
* sensor related devices
|
||||
*
|
||||
* @sd: pointer to struct &v4l2_subdev
|
||||
*
|
||||
* This function is just like v4l2_async_register_subdev() with the exception
|
||||
* that calling it will also parse firmware interfaces for remote references
|
||||
* using v4l2_async_notifier_parse_fwnode_sensor_common() and registers the
|
||||
* async sub-devices. The sub-device is similarly unregistered by calling
|
||||
* v4l2_async_unregister_subdev().
|
||||
*
|
||||
* While registered, the subdev module is marked as in-use.
|
||||
*
|
||||
* An error is returned if the module is no longer loaded on any attempts
|
||||
* to register it.
|
||||
*/
|
||||
int __must_check v4l2_async_register_subdev_sensor_common(
|
||||
struct v4l2_subdev *sd);
|
||||
|
||||
/**
|
||||
* v4l2_async_unregister_subdev - unregisters a sub-device to the asynchronous
|
||||
* subdevice framework
|
||||
|
|
|
|||
|
|
@ -750,6 +750,9 @@ struct v4l2_subdev {
|
|||
/* Pointer to the managing notifier. */
|
||||
struct v4l2_async_notifier *notifier;
|
||||
/* common part of subdevice platform data */
|
||||
struct v4l2_async_notifier *subdev_notifier;
|
||||
/* A sub-device notifier implicitly registered for the sub-device
|
||||
using v4l2_device_register_sensor_subdev(). */
|
||||
struct v4l2_subdev_platform_data *pdata;
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user