On Thu, May 14, 2026 at 04:45:44PM +0800, ChaoHuang wrote: > From: Chao Huang > > Add a new helper function to iterate over all SPI controllers. > This provides a convenient way for SPI core code and drivers > to perform operations on all registered controllers. > This helper is useful for scenarios like statistics gathering, > configuration updates, or debugging operations that need to > process all SPI controllers in the system. Do you have an actual user for this or is this just purely theoretical at this point? It'd make a lot more sense to add this along with a user. > +int spi_for_each_controller(int (*fn)(struct spi_controller *, void *), void *data) > +{ > + struct spi_controller *ctlr; > + int ret = 0; > + > + mutex_lock(&board_lock); > + list_for_each_entry(ctlr, &spi_controller_list, list) { > + ret = fn(ctlr, data); When unregistering controllers we do start the teardown process before we pull the device off the controller list, and drop the lock while doing so. That's probably fine for a lot of uses. There's also some obvious potential for things to go wrong here with something in the callback deadlocking, though that's a bit of a "don't do that kind of thing". > + if (ret) > + break; > + } > + mutex_unlock(&board_lock); > + > + return ret; > +} > +EXPORT_SYMBOL_GPL(spi_for_each_controller); > + > static int __init spi_init(void) > { > int status; > diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h > index 79513f5941cc..8fcf3faf9739 100644 > --- a/include/linux/spi/spi.h > +++ b/include/linux/spi/spi.h > @@ -934,6 +934,8 @@ static inline int acpi_spi_count_resources(struct acpi_device *adev) > } > #endif > > +int spi_for_each_controller(int (*fn)(struct spi_controller *, void *), void *data); > + > /* > * SPI resource management while processing a SPI message > */ > -- > 2.25.1 >