media: rcar-vin: Improve async notifier cleanup paths
authorNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Fri, 9 Jul 2021 14:25:52 +0000 (16:25 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Thu, 30 Sep 2021 08:07:34 +0000 (10:07 +0200)
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>
Reviewed-by: Jacopo Mondi <jacopo+renesas@jmondi.org>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/rcar-vin/rcar-core.c

index bea38807521693447f7cc4de96ff8770949d7ef0..2957fa10252fd1e027cc2882371c2cac5340b0f5 100644 (file)
@@ -383,6 +383,16 @@ out:
        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 @@ out:
        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;
 
@@ -1449,7 +1474,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;
        }
@@ -1462,20 +1487,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);
 
@@ -1490,14 +1504,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);