|
@@ -2143,8 +2143,17 @@ int spi_register_controller(struct spi_controller *ctlr)
|
|
|
*/
|
|
|
if (ctlr->num_chipselect == 0)
|
|
|
return -EINVAL;
|
|
|
- /* allocate dynamic bus number using Linux idr */
|
|
|
- if ((ctlr->bus_num < 0) && ctlr->dev.of_node) {
|
|
|
+ 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 if (ctlr->dev.of_node) {
|
|
|
+ /* allocate dynamic bus number using Linux idr */
|
|
|
id = of_alias_get_id(ctlr->dev.of_node, "spi");
|
|
|
if (id >= 0) {
|
|
|
ctlr->bus_num = id;
|