Commit ddddc18b authored by Sakari Ailus's avatar Sakari Ailus Committed by Mauro Carvalho Chehab

media: v4l: async: Introduce helpers for calling async ops callbacks

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: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Acked-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Acked-by: default avatarPavel Machek <pavel@ucw.cz>
Acked-by: default avatarNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Reviewed-by: default avatarSebastian Reichel <sebastian.reichel@collabora.co.uk>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent b6ee3f0d
...@@ -25,6 +25,34 @@ ...@@ -25,6 +25,34 @@
#include <media/v4l2-fwnode.h> #include <media/v4l2-fwnode.h>
#include <media/v4l2-subdev.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) static bool match_i2c(struct v4l2_subdev *sd, struct v4l2_async_subdev *asd)
{ {
#if IS_ENABLED(CONFIG_I2C) #if IS_ENABLED(CONFIG_I2C)
...@@ -102,16 +130,13 @@ static int v4l2_async_match_notify(struct v4l2_async_notifier *notifier, ...@@ -102,16 +130,13 @@ static int v4l2_async_match_notify(struct v4l2_async_notifier *notifier,
{ {
int ret; int ret;
if (notifier->ops->bound) { ret = v4l2_async_notifier_call_bound(notifier, sd, asd);
ret = notifier->ops->bound(notifier, sd, asd); if (ret < 0)
if (ret < 0) return ret;
return ret;
}
ret = v4l2_device_register_subdev(notifier->v4l2_dev, sd); ret = v4l2_device_register_subdev(notifier->v4l2_dev, sd);
if (ret < 0) { if (ret < 0) {
if (notifier->ops->unbind) v4l2_async_notifier_call_unbind(notifier, sd, asd);
notifier->ops->unbind(notifier, sd, asd);
return ret; return ret;
} }
...@@ -140,8 +165,7 @@ static void v4l2_async_notifier_unbind_all_subdevs( ...@@ -140,8 +165,7 @@ static void v4l2_async_notifier_unbind_all_subdevs(
struct v4l2_subdev *sd, *tmp; struct v4l2_subdev *sd, *tmp;
list_for_each_entry_safe(sd, tmp, &notifier->done, async_list) { list_for_each_entry_safe(sd, tmp, &notifier->done, async_list) {
if (notifier->ops->unbind) v4l2_async_notifier_call_unbind(notifier, sd, sd->asd);
notifier->ops->unbind(notifier, sd, sd->asd);
v4l2_async_cleanup(sd); v4l2_async_cleanup(sd);
list_move(&sd->async_list, &subdev_list); list_move(&sd->async_list, &subdev_list);
...@@ -198,8 +222,8 @@ int v4l2_async_notifier_register(struct v4l2_device *v4l2_dev, ...@@ -198,8 +222,8 @@ int v4l2_async_notifier_register(struct v4l2_device *v4l2_dev,
} }
} }
if (list_empty(&notifier->waiting) && notifier->ops->complete) { if (list_empty(&notifier->waiting)) {
ret = notifier->ops->complete(notifier); ret = v4l2_async_notifier_call_complete(notifier);
if (ret) if (ret)
goto err_complete; goto err_complete;
} }
...@@ -296,10 +320,10 @@ int v4l2_async_register_subdev(struct v4l2_subdev *sd) ...@@ -296,10 +320,10 @@ int v4l2_async_register_subdev(struct v4l2_subdev *sd)
if (ret) if (ret)
goto err_unlock; goto err_unlock;
if (!list_empty(&notifier->waiting) || !notifier->ops->complete) if (!list_empty(&notifier->waiting))
goto out_unlock; goto out_unlock;
ret = notifier->ops->complete(notifier); ret = v4l2_async_notifier_call_complete(notifier);
if (ret) if (ret)
goto err_cleanup; goto err_cleanup;
...@@ -315,8 +339,7 @@ int v4l2_async_register_subdev(struct v4l2_subdev *sd) ...@@ -315,8 +339,7 @@ int v4l2_async_register_subdev(struct v4l2_subdev *sd)
return 0; return 0;
err_cleanup: err_cleanup:
if (notifier->ops->unbind) v4l2_async_notifier_call_unbind(notifier, sd, sd->asd);
notifier->ops->unbind(notifier, sd, sd->asd);
v4l2_async_cleanup(sd); v4l2_async_cleanup(sd);
err_unlock: err_unlock:
...@@ -335,8 +358,7 @@ void v4l2_async_unregister_subdev(struct v4l2_subdev *sd) ...@@ -335,8 +358,7 @@ void v4l2_async_unregister_subdev(struct v4l2_subdev *sd)
list_add(&sd->asd->list, &notifier->waiting); list_add(&sd->asd->list, &notifier->waiting);
if (notifier->ops->unbind) v4l2_async_notifier_call_unbind(notifier, sd, sd->asd);
notifier->ops->unbind(notifier, sd, sd->asd);
} }
v4l2_async_cleanup(sd); v4l2_async_cleanup(sd);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment