[03/11] rcar-vin: Improve async notifier cleanup paths
Commit Message
The cleanup code for the async notifiers can be refactored to own
functions to reduce code duplication and improve readability. While at
it rename the CSI-2 initialization function _csi2_ instead of _mc_ to
match.
Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
---
drivers/media/platform/rcar-vin/rcar-core.c | 51 ++++++++++++---------
1 file changed, 30 insertions(+), 21 deletions(-)
Comments
Hi Niklas
On Tue, Apr 13, 2021 at 08:02:45PM +0200, Niklas Söderlund wrote:
> The cleanup code for the async notifiers can be refactored to own
> functions to reduce code duplication and improve readability. While at
> it rename the CSI-2 initialization function _csi2_ instead of _mc_ to
> match.
>
> Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> ---
> drivers/media/platform/rcar-vin/rcar-core.c | 51 ++++++++++++---------
> 1 file changed, 30 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/media/platform/rcar-vin/rcar-core.c b/drivers/media/platform/rcar-vin/rcar-core.c
> index d4932f7b42647ee1..da23d55aa72b7f0d 100644
> --- a/drivers/media/platform/rcar-vin/rcar-core.c
> +++ b/drivers/media/platform/rcar-vin/rcar-core.c
> @@ -383,6 +383,16 @@ static void rvin_group_put(struct rvin_dev *vin)
> kref_put(&group->refcount, rvin_group_release);
> }
>
> +static void rvin_group_notifier_cleanup(struct rvin_dev *vin)
> +{
> + mutex_lock(&vin->group->lock);
> + if (&vin->v4l2_dev == vin->group->notifier.v4l2_dev) {
> + v4l2_async_notifier_unregister(&vin->group->notifier);
> + v4l2_async_notifier_cleanup(&vin->group->notifier);
> + }
> + mutex_unlock(&vin->group->lock);
> +}
> +
> /* -----------------------------------------------------------------------------
> * Controls
> */
> @@ -676,6 +686,12 @@ static int rvin_parallel_parse_of(struct rvin_dev *vin)
> return ret;
> }
>
> +static void rvin_parallel_cleanup(struct rvin_dev *vin)
> +{
> + v4l2_async_notifier_unregister(&vin->notifier);
> + v4l2_async_notifier_cleanup(&vin->notifier);
> +}
> +
> static int rvin_parallel_init(struct rvin_dev *vin)
> {
> int ret;
> @@ -937,7 +953,16 @@ static int rvin_mc_parse_of_graph(struct rvin_dev *vin)
> return 0;
> }
>
> -static int rvin_mc_init(struct rvin_dev *vin)
> +static void rvin_csi2_cleanup(struct rvin_dev *vin)
> +{
> + if (!vin->info->use_mc)
> + return;
> +
> + rvin_group_notifier_cleanup(vin);
> + rvin_group_put(vin);
> +}
> +
> +static int rvin_csi2_init(struct rvin_dev *vin)
> {
> int ret;
>
> @@ -1445,7 +1470,7 @@ static int rcar_vin_probe(struct platform_device *pdev)
> platform_set_drvdata(pdev, vin);
>
> if (vin->info->use_mc) {
> - ret = rvin_mc_init(vin);
> + ret = rvin_csi2_init(vin);
> if (ret)
> goto error_dma_unregister;
> }
> @@ -1458,20 +1483,9 @@ static int rcar_vin_probe(struct platform_device *pdev)
> pm_runtime_enable(&pdev->dev);
>
> return 0;
> -
Intentional ?
Reviewed-by: Jacopo Mondi <jacopo+renesas@jmondi.org>
Thanks
j
> error_group_unregister:
> rvin_free_controls(vin);
> -
> - if (vin->info->use_mc) {
> - mutex_lock(&vin->group->lock);
> - if (&vin->v4l2_dev == vin->group->notifier.v4l2_dev) {
> - v4l2_async_notifier_unregister(&vin->group->notifier);
> - v4l2_async_notifier_cleanup(&vin->group->notifier);
> - }
> - mutex_unlock(&vin->group->lock);
> - rvin_group_put(vin);
> - }
> -
> + rvin_csi2_cleanup(vin);
> error_dma_unregister:
> rvin_dma_unregister(vin);
>
> @@ -1486,14 +1500,9 @@ static int rcar_vin_remove(struct platform_device *pdev)
>
> rvin_v4l2_unregister(vin);
>
> - v4l2_async_notifier_unregister(&vin->notifier);
> - v4l2_async_notifier_cleanup(&vin->notifier);
> + rvin_parallel_cleanup(vin);
>
> - if (vin->info->use_mc) {
> - v4l2_async_notifier_unregister(&vin->group->notifier);
> - v4l2_async_notifier_cleanup(&vin->group->notifier);
> - rvin_group_put(vin);
> - }
> + rvin_csi2_cleanup(vin);
>
> rvin_free_controls(vin);
>
> --
> 2.31.1
>
@@ -383,6 +383,16 @@ static void rvin_group_put(struct rvin_dev *vin)
kref_put(&group->refcount, rvin_group_release);
}
+static void rvin_group_notifier_cleanup(struct rvin_dev *vin)
+{
+ mutex_lock(&vin->group->lock);
+ if (&vin->v4l2_dev == vin->group->notifier.v4l2_dev) {
+ v4l2_async_notifier_unregister(&vin->group->notifier);
+ v4l2_async_notifier_cleanup(&vin->group->notifier);
+ }
+ mutex_unlock(&vin->group->lock);
+}
+
/* -----------------------------------------------------------------------------
* Controls
*/
@@ -676,6 +686,12 @@ static int rvin_parallel_parse_of(struct rvin_dev *vin)
return ret;
}
+static void rvin_parallel_cleanup(struct rvin_dev *vin)
+{
+ v4l2_async_notifier_unregister(&vin->notifier);
+ v4l2_async_notifier_cleanup(&vin->notifier);
+}
+
static int rvin_parallel_init(struct rvin_dev *vin)
{
int ret;
@@ -937,7 +953,16 @@ static int rvin_mc_parse_of_graph(struct rvin_dev *vin)
return 0;
}
-static int rvin_mc_init(struct rvin_dev *vin)
+static void rvin_csi2_cleanup(struct rvin_dev *vin)
+{
+ if (!vin->info->use_mc)
+ return;
+
+ rvin_group_notifier_cleanup(vin);
+ rvin_group_put(vin);
+}
+
+static int rvin_csi2_init(struct rvin_dev *vin)
{
int ret;
@@ -1445,7 +1470,7 @@ static int rcar_vin_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, vin);
if (vin->info->use_mc) {
- ret = rvin_mc_init(vin);
+ ret = rvin_csi2_init(vin);
if (ret)
goto error_dma_unregister;
}
@@ -1458,20 +1483,9 @@ static int rcar_vin_probe(struct platform_device *pdev)
pm_runtime_enable(&pdev->dev);
return 0;
-
error_group_unregister:
rvin_free_controls(vin);
-
- if (vin->info->use_mc) {
- mutex_lock(&vin->group->lock);
- if (&vin->v4l2_dev == vin->group->notifier.v4l2_dev) {
- v4l2_async_notifier_unregister(&vin->group->notifier);
- v4l2_async_notifier_cleanup(&vin->group->notifier);
- }
- mutex_unlock(&vin->group->lock);
- rvin_group_put(vin);
- }
-
+ rvin_csi2_cleanup(vin);
error_dma_unregister:
rvin_dma_unregister(vin);
@@ -1486,14 +1500,9 @@ static int rcar_vin_remove(struct platform_device *pdev)
rvin_v4l2_unregister(vin);
- v4l2_async_notifier_unregister(&vin->notifier);
- v4l2_async_notifier_cleanup(&vin->notifier);
+ rvin_parallel_cleanup(vin);
- if (vin->info->use_mc) {
- v4l2_async_notifier_unregister(&vin->group->notifier);
- v4l2_async_notifier_cleanup(&vin->group->notifier);
- rvin_group_put(vin);
- }
+ rvin_csi2_cleanup(vin);
rvin_free_controls(vin);