mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-09 14:43:16 +00:00
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: 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>
This commit is contained in:
parent
fbab5b2c09
commit
440c47331b
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user