media: v4l: async: Introduce helpers for calling async ops callbacks
authorSakari Ailus <sakari.ailus@linux.intel.com>
Fri, 1 Sep 2017 12:27:32 +0000 (08:27 -0400)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Tue, 31 Oct 2017 17:52:45 +0000 (13:52 -0400)
Add three helper functions to call async operations callbacks. Besides
simplifying callbacks, this allows async notifiers to have no ops set,
i.e. it can be left NULL.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Acked-by: Hans Verkuil <hans.verkuil@cisco.com>
Acked-by: Pavel Machek <pavel@ucw.cz>
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>
drivers/media/v4l2-core/v4l2-async.c

index 9d6fc5f..e170682 100644 (file)
 #include <media/v4l2-fwnode.h>
 #include <media/v4l2-subdev.h>
 
+static int v4l2_async_notifier_call_bound(struct v4l2_async_notifier *n,
+                                         struct v4l2_subdev *subdev,
+                                         struct v4l2_async_subdev *asd)
+{
+       if (!n->ops || !n->ops->bound)
+               return 0;
+
+       return n->ops->bound(n, subdev, asd);
+}
+
+static void v4l2_async_notifier_call_unbind(struct v4l2_async_notifier *n,
+                                           struct v4l2_subdev *subdev,
+                                           struct v4l2_async_subdev *asd)
+{
+       if (!n->ops || !n->ops->unbind)
+               return;
+
+       n->ops->unbind(n, subdev, asd);
+}
+
+static int v4l2_async_notifier_call_complete(struct v4l2_async_notifier *n)
+{
+       if (!n->ops || !n->ops->complete)
+               return 0;
+
+       return n->ops->complete(n);
+}
+
 static bool match_i2c(struct v4l2_subdev *sd, struct v4l2_async_subdev *asd)
 {
 #if IS_ENABLED(CONFIG_I2C)
@@ -102,16 +130,13 @@ static int v4l2_async_match_notify(struct v4l2_async_notifier *notifier,
 {
        int ret;
 
-       if (notifier->ops->bound) {
-               ret = notifier->ops->bound(notifier, sd, asd);
-               if (ret < 0)
-                       return ret;
-       }
+       ret = v4l2_async_notifier_call_bound(notifier, sd, asd);
+       if (ret < 0)
+               return ret;
 
        ret = v4l2_device_register_subdev(notifier->v4l2_dev, sd);
        if (ret < 0) {
-               if (notifier->ops->unbind)
-                       notifier->ops->unbind(notifier, sd, asd);
+               v4l2_async_notifier_call_unbind(notifier, sd, asd);
                return ret;
        }
 
@@ -140,8 +165,7 @@ static void v4l2_async_notifier_unbind_all_subdevs(
        struct v4l2_subdev *sd, *tmp;
 
        list_for_each_entry_safe(sd, tmp, &notifier->done, async_list) {
-               if (notifier->ops->unbind)
-                       notifier->ops->unbind(notifier, sd, sd->asd);
+               v4l2_async_notifier_call_unbind(notifier, sd, sd->asd);
                v4l2_async_cleanup(sd);
 
                list_move(&sd->async_list, &subdev_list);
@@ -198,8 +222,8 @@ int v4l2_async_notifier_register(struct v4l2_device *v4l2_dev,
                }
        }
 
-       if (list_empty(&notifier->waiting) && notifier->ops->complete) {
-               ret = notifier->ops->complete(notifier);
+       if (list_empty(&notifier->waiting)) {
+               ret = v4l2_async_notifier_call_complete(notifier);
                if (ret)
                        goto err_complete;
        }
@@ -296,10 +320,10 @@ int v4l2_async_register_subdev(struct v4l2_subdev *sd)
                if (ret)
                        goto err_unlock;
 
-               if (!list_empty(&notifier->waiting) || !notifier->ops->complete)
+               if (!list_empty(&notifier->waiting))
                        goto out_unlock;
 
-               ret = notifier->ops->complete(notifier);
+               ret = v4l2_async_notifier_call_complete(notifier);
                if (ret)
                        goto err_cleanup;
 
@@ -315,8 +339,7 @@ out_unlock:
        return 0;
 
 err_cleanup:
-       if (notifier->ops->unbind)
-               notifier->ops->unbind(notifier, sd, sd->asd);
+       v4l2_async_notifier_call_unbind(notifier, sd, sd->asd);
        v4l2_async_cleanup(sd);
 
 err_unlock:
@@ -335,8 +358,7 @@ void v4l2_async_unregister_subdev(struct v4l2_subdev *sd)
 
                list_add(&sd->asd->list, &notifier->waiting);
 
-               if (notifier->ops->unbind)
-                       notifier->ops->unbind(notifier, sd, sd->asd);
+               v4l2_async_notifier_call_unbind(notifier, sd, sd->asd);
        }
 
        v4l2_async_cleanup(sd);