Commit 440c4733 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Mark Brown

spi: Drop duplicate IDR allocation code in spi_register_controller()

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: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20230710154932.68377-3-andriy.shevchenko@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent fbab5b2c
...@@ -3081,6 +3081,20 @@ static int spi_controller_check_ops(struct spi_controller *ctlr) ...@@ -3081,6 +3081,20 @@ static int spi_controller_check_ops(struct spi_controller *ctlr)
return 0; 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 * spi_register_controller - register SPI master or slave controller
* @ctlr: initialized master, originally from spi_alloc_master() or * @ctlr: initialized master, originally from spi_alloc_master() or
...@@ -3108,8 +3122,8 @@ int spi_register_controller(struct spi_controller *ctlr) ...@@ -3108,8 +3122,8 @@ int spi_register_controller(struct spi_controller *ctlr)
{ {
struct device *dev = ctlr->dev.parent; struct device *dev = ctlr->dev.parent;
struct boardinfo *bi; struct boardinfo *bi;
int first_dynamic;
int status; int status;
int id, first_dynamic;
if (!dev) if (!dev)
return -ENODEV; return -ENODEV;
...@@ -3122,27 +3136,13 @@ int spi_register_controller(struct spi_controller *ctlr) ...@@ -3122,27 +3136,13 @@ int spi_register_controller(struct spi_controller *ctlr)
if (status) if (status)
return 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) { if (ctlr->bus_num >= 0) {
/* Devices with a fixed bus num must check-in with the num */ /* Devices with a fixed bus num must check-in with the num */
mutex_lock(&board_lock); status = spi_controller_id_alloc(ctlr, ctlr->bus_num, ctlr->bus_num + 1);
id = idr_alloc(&spi_master_idr, ctlr, ctlr->bus_num, if (status)
ctlr->bus_num + 1, GFP_KERNEL); return status;
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;
}
} }
if (ctlr->bus_num < 0) { if (ctlr->bus_num < 0) {
first_dynamic = of_alias_get_highest_id("spi"); first_dynamic = of_alias_get_highest_id("spi");
...@@ -3151,13 +3151,9 @@ int spi_register_controller(struct spi_controller *ctlr) ...@@ -3151,13 +3151,9 @@ int spi_register_controller(struct spi_controller *ctlr)
else else
first_dynamic++; first_dynamic++;
mutex_lock(&board_lock); status = spi_controller_id_alloc(ctlr, first_dynamic, 0);
id = idr_alloc(&spi_master_idr, ctlr, first_dynamic, if (status)
0, GFP_KERNEL); return status;
mutex_unlock(&board_lock);
if (WARN(id < 0, "couldn't get idr"))
return id;
ctlr->bus_num = id;
} }
ctlr->bus_lock_flag = 0; ctlr->bus_lock_flag = 0;
init_completion(&ctlr->xfer_completion); init_completion(&ctlr->xfer_completion);
......
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