summaryrefslogtreecommitdiffstats
path: root/drivers/media/v4l2-core/v4l2-async.c
diff options
context:
space:
mode:
authorSakari Ailus <sakari.ailus@linux.intel.com>2017-09-06 10:48:33 -0400
committerMauro Carvalho Chehab <mchehab@s-opensource.com>2017-10-31 13:54:18 -0400
commit479bc5a8c662e9d9de47e95ee26ebaf15f36a771 (patch)
treee1d8350943b58976cdf91a71bc0385eaa658346d /drivers/media/v4l2-core/v4l2-async.c
parent24def9b586349ec1ecea7989fc219e688d1d1e74 (diff)
downloadlinux-479bc5a8c662e9d9de47e95ee26ebaf15f36a771.tar.bz2
media: v4l: async: Allow async notifier register call succeed with no subdevs
The information on how many async sub-devices would be bindable to a notifier is typically dependent on information from platform firmware and it's not driver's business to be aware of that. Many V4L2 main drivers are perfectly usable (and useful) without async sub-devices and so if there aren't any around, just proceed call the notifier's complete callback immediately without registering the notifier itself. If a driver needs to check whether there are async sub-devices available, it can be done by inspecting the notifier's num_subdevs field which tells the number of async sub-devices. Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Acked-by: Hans Verkuil <hans.verkuil@cisco.com> Acked-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-async.c')
-rw-r--r--drivers/media/v4l2-core/v4l2-async.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/media/v4l2-core/v4l2-async.c b/drivers/media/v4l2-core/v4l2-async.c
index 46db85685894..1b536d68cedf 100644
--- a/drivers/media/v4l2-core/v4l2-async.c
+++ b/drivers/media/v4l2-core/v4l2-async.c
@@ -180,14 +180,22 @@ int v4l2_async_notifier_register(struct v4l2_device *v4l2_dev,
int ret;
int i;
- if (!v4l2_dev || !notifier->num_subdevs ||
- notifier->num_subdevs > V4L2_MAX_SUBDEVS)
+ if (!v4l2_dev || notifier->num_subdevs > V4L2_MAX_SUBDEVS)
return -EINVAL;
notifier->v4l2_dev = v4l2_dev;
INIT_LIST_HEAD(&notifier->waiting);
INIT_LIST_HEAD(&notifier->done);
+ if (!notifier->num_subdevs) {
+ int ret;
+
+ ret = v4l2_async_notifier_call_complete(notifier);
+ notifier->v4l2_dev = NULL;
+
+ return ret;
+ }
+
for (i = 0; i < notifier->num_subdevs; i++) {
asd = notifier->subdevs[i];