media: ipu3-cio2: Fix reference counting when looping over ACPI devices
authorAndy Shevchenko <andy.shevchenko@gmail.com>
Sun, 4 Apr 2021 18:14:09 +0000 (20:14 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Wed, 2 Jun 2021 09:52:00 +0000 (11:52 +0200)
When we continue, due to device is disabled, loop we have to drop
reference count. When we have an array full of devices we have to also
drop the reference count. Note, in this case the
cio2_bridge_unregister_sensors() is called by the caller.

Fixes: 803abec64ef9 ("media: ipu3-cio2: Add cio2-bridge to ipu3-cio2 driver")
Signed-off-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: Daniel Scally <djrscally@gmail.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/pci/intel/ipu3/cio2-bridge.c

index e8511787c1e439a72588e9f8609a965372e20bec..4657e99df0339ed3a94e8541b730b0727f4642af 100644 (file)
@@ -173,14 +173,15 @@ static int cio2_bridge_connect_sensor(const struct cio2_sensor_config *cfg,
        int ret;
 
        for_each_acpi_dev_match(adev, cfg->hid, NULL, -1) {
-               if (!adev->status.enabled)
+               if (!adev->status.enabled) {
+                       acpi_dev_put(adev);
                        continue;
+               }
 
                if (bridge->n_sensors >= CIO2_NUM_PORTS) {
+                       acpi_dev_put(adev);
                        dev_err(&cio2->dev, "Exceeded available CIO2 ports\n");
-                       cio2_bridge_unregister_sensors(bridge);
-                       ret = -EINVAL;
-                       goto err_out;
+                       return -EINVAL;
                }
 
                sensor = &bridge->sensors[bridge->n_sensors];
@@ -228,7 +229,6 @@ err_free_swnodes:
        software_node_unregister_nodes(sensor->swnodes);
 err_put_adev:
        acpi_dev_put(sensor->adev);
-err_out:
        return ret;
 }