diff options
Diffstat (limited to 'drivers/spi/spi.c')
-rw-r--r-- | drivers/spi/spi.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 93e9de46977a..682a6a48fec3 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
@@ -485,6 +485,15 @@ void spi_unregister_master(struct spi_master *master) | |||
485 | } | 485 | } |
486 | EXPORT_SYMBOL_GPL(spi_unregister_master); | 486 | EXPORT_SYMBOL_GPL(spi_unregister_master); |
487 | 487 | ||
488 | static int __spi_master_match(struct device *dev, void *data) | ||
489 | { | ||
490 | struct spi_master *m; | ||
491 | u16 *bus_num = data; | ||
492 | |||
493 | m = container_of(dev, struct spi_master, dev); | ||
494 | return m->bus_num == *bus_num; | ||
495 | } | ||
496 | |||
488 | /** | 497 | /** |
489 | * spi_busnum_to_master - look up master associated with bus_num | 498 | * spi_busnum_to_master - look up master associated with bus_num |
490 | * @bus_num: the master's bus number | 499 | * @bus_num: the master's bus number |
@@ -499,17 +508,12 @@ struct spi_master *spi_busnum_to_master(u16 bus_num) | |||
499 | { | 508 | { |
500 | struct device *dev; | 509 | struct device *dev; |
501 | struct spi_master *master = NULL; | 510 | struct spi_master *master = NULL; |
502 | struct spi_master *m; | 511 | |
503 | 512 | dev = class_find_device(&spi_master_class, &bus_num, | |
504 | down(&spi_master_class.sem); | 513 | __spi_master_match); |
505 | list_for_each_entry(dev, &spi_master_class.children, node) { | 514 | if (dev) |
506 | m = container_of(dev, struct spi_master, dev); | 515 | master = container_of(dev, struct spi_master, dev); |
507 | if (m->bus_num == bus_num) { | 516 | /* reference got in class_find_device */ |
508 | master = spi_master_get(m); | ||
509 | break; | ||
510 | } | ||
511 | } | ||
512 | up(&spi_master_class.sem); | ||
513 | return master; | 517 | return master; |
514 | } | 518 | } |
515 | EXPORT_SYMBOL_GPL(spi_busnum_to_master); | 519 | EXPORT_SYMBOL_GPL(spi_busnum_to_master); |