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:
Sakari Ailus 2017-09-25 01:47:44 +03:00 committed by Tao Huang
parent 7c4d65f119
commit 255a3eb2b7
4 changed files with 71 additions and 0 deletions

View File

@ -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);

View File

@ -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>");

View File

@ -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

View File

@ -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;
};