diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 62aa3f062f3d..2c616024f7c0 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -3050,9 +3050,9 @@ free_bus_id: } EXPORT_SYMBOL_GPL(spi_register_controller); -static void devm_spi_unregister(void *ctlr) +static void devm_spi_unregister(struct device *dev, void *res) { - spi_unregister_controller(ctlr); + spi_unregister_controller(*(struct spi_controller **)res); } /** @@ -3071,13 +3071,22 @@ static void devm_spi_unregister(void *ctlr) int devm_spi_register_controller(struct device *dev, struct spi_controller *ctlr) { + struct spi_controller **ptr; int ret; - ret = spi_register_controller(ctlr); - if (ret) - return ret; + ptr = devres_alloc(devm_spi_unregister, sizeof(*ptr), GFP_KERNEL); + if (!ptr) + return -ENOMEM; - return devm_add_action_or_reset(dev, devm_spi_unregister, ctlr); + ret = spi_register_controller(ctlr); + if (!ret) { + *ptr = ctlr; + devres_add(dev, ptr); + } else { + devres_free(ptr); + } + + return ret; } EXPORT_SYMBOL_GPL(devm_spi_register_controller);