spi: Drop duplicate IDR allocation code in spi_register_controller()
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 10 Jul 2023 15:49:19 +0000 (18:49 +0300)
committerMark Brown <broonie@kernel.org>
Mon, 10 Jul 2023 17:27:43 +0000 (18:27 +0100)
Refactor spi_register_controller() to drop duplicate IDR allocation.
Instead of if-else-if branching use two sequential if:s, which allows
to re-use the logic of IDR allocation in all cases.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20230710154932.68377-3-andriy.shevchenko@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi.c

index 8f3282a..6d74218 100644 (file)
@@ -3081,6 +3081,20 @@ static int spi_controller_check_ops(struct spi_controller *ctlr)
        return 0;
 }
 
+/* Allocate dynamic bus number using Linux idr */
+static int spi_controller_id_alloc(struct spi_controller *ctlr, int start, int end)
+{
+       int id;
+
+       mutex_lock(&board_lock);
+       id = idr_alloc(&spi_master_idr, ctlr, start, end, GFP_KERNEL);
+       mutex_unlock(&board_lock);
+       if (WARN(id < 0, "couldn't get idr"))
+               return id == -ENOSPC ? -EBUSY : id;
+       ctlr->bus_num = id;
+       return 0;
+}
+
 /**
  * spi_register_controller - register SPI master or slave controller
  * @ctlr: initialized master, originally from spi_alloc_master() or
@@ -3108,8 +3122,8 @@ int spi_register_controller(struct spi_controller *ctlr)
 {
        struct device           *dev = ctlr->dev.parent;
        struct boardinfo        *bi;
+       int                     first_dynamic;
        int                     status;
-       int                     id, first_dynamic;
 
        if (!dev)
                return -ENODEV;
@@ -3122,27 +3136,13 @@ int spi_register_controller(struct spi_controller *ctlr)
        if (status)
                return status;
 
+       if (ctlr->bus_num < 0)
+               ctlr->bus_num = of_alias_get_id(ctlr->dev.of_node, "spi");
        if (ctlr->bus_num >= 0) {
                /* Devices with a fixed bus num must check-in with the num */
-               mutex_lock(&board_lock);
-               id = idr_alloc(&spi_master_idr, ctlr, ctlr->bus_num,
-                       ctlr->bus_num + 1, GFP_KERNEL);
-               mutex_unlock(&board_lock);
-               if (WARN(id < 0, "couldn't get idr"))
-                       return id == -ENOSPC ? -EBUSY : id;
-               ctlr->bus_num = id;
-       } else {
-               /* Allocate dynamic bus number using Linux idr */
-               id = of_alias_get_id(ctlr->dev.of_node, "spi");
-               if (id >= 0) {
-                       ctlr->bus_num = id;
-                       mutex_lock(&board_lock);
-                       id = idr_alloc(&spi_master_idr, ctlr, ctlr->bus_num,
-                                      ctlr->bus_num + 1, GFP_KERNEL);
-                       mutex_unlock(&board_lock);
-                       if (WARN(id < 0, "couldn't get idr"))
-                               return id == -ENOSPC ? -EBUSY : id;
-               }
+               status = spi_controller_id_alloc(ctlr, ctlr->bus_num, ctlr->bus_num + 1);
+               if (status)
+                       return status;
        }
        if (ctlr->bus_num < 0) {
                first_dynamic = of_alias_get_highest_id("spi");
@@ -3151,13 +3151,9 @@ int spi_register_controller(struct spi_controller *ctlr)
                else
                        first_dynamic++;
 
-               mutex_lock(&board_lock);
-               id = idr_alloc(&spi_master_idr, ctlr, first_dynamic,
-                              0, GFP_KERNEL);
-               mutex_unlock(&board_lock);
-               if (WARN(id < 0, "couldn't get idr"))
-                       return id;
-               ctlr->bus_num = id;
+               status = spi_controller_id_alloc(ctlr, first_dynamic, 0);
+               if (status)
+                       return status;
        }
        ctlr->bus_lock_flag = 0;
        init_completion(&ctlr->xfer_completion);