diff options
| -rw-r--r-- | drivers/spi/spi.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 3f135cc9a70e..c7486a373af1 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
| @@ -613,8 +613,12 @@ EXPORT_SYMBOL_GPL(spi_new_device); | |||
| 613 | */ | 613 | */ |
| 614 | void spi_unregister_device(struct spi_device *spi) | 614 | void spi_unregister_device(struct spi_device *spi) |
| 615 | { | 615 | { |
| 616 | if (spi) | 616 | if (!spi) |
| 617 | device_unregister(&spi->dev); | 617 | return; |
| 618 | |||
| 619 | if (spi->dev.of_node) | ||
| 620 | of_node_clear_flag(spi->dev.of_node, OF_POPULATED); | ||
| 621 | device_unregister(&spi->dev); | ||
| 618 | } | 622 | } |
| 619 | EXPORT_SYMBOL_GPL(spi_unregister_device); | 623 | EXPORT_SYMBOL_GPL(spi_unregister_device); |
| 620 | 624 | ||
| @@ -1561,6 +1565,8 @@ static void of_register_spi_devices(struct spi_master *master) | |||
| 1561 | return; | 1565 | return; |
| 1562 | 1566 | ||
| 1563 | for_each_available_child_of_node(master->dev.of_node, nc) { | 1567 | for_each_available_child_of_node(master->dev.of_node, nc) { |
| 1568 | if (of_node_test_and_set_flag(nc, OF_POPULATED)) | ||
| 1569 | continue; | ||
| 1564 | spi = of_register_spi_device(master, nc); | 1570 | spi = of_register_spi_device(master, nc); |
| 1565 | if (IS_ERR(spi)) | 1571 | if (IS_ERR(spi)) |
| 1566 | dev_warn(&master->dev, "Failed to create SPI device for %s\n", | 1572 | dev_warn(&master->dev, "Failed to create SPI device for %s\n", |
| @@ -2645,6 +2651,11 @@ static int of_spi_notify(struct notifier_block *nb, unsigned long action, | |||
| 2645 | if (master == NULL) | 2651 | if (master == NULL) |
| 2646 | return NOTIFY_OK; /* not for us */ | 2652 | return NOTIFY_OK; /* not for us */ |
| 2647 | 2653 | ||
| 2654 | if (of_node_test_and_set_flag(rd->dn, OF_POPULATED)) { | ||
| 2655 | put_device(&master->dev); | ||
| 2656 | return NOTIFY_OK; | ||
| 2657 | } | ||
| 2658 | |||
| 2648 | spi = of_register_spi_device(master, rd->dn); | 2659 | spi = of_register_spi_device(master, rd->dn); |
| 2649 | put_device(&master->dev); | 2660 | put_device(&master->dev); |
| 2650 | 2661 | ||
| @@ -2656,6 +2667,10 @@ static int of_spi_notify(struct notifier_block *nb, unsigned long action, | |||
| 2656 | break; | 2667 | break; |
| 2657 | 2668 | ||
| 2658 | case OF_RECONFIG_CHANGE_REMOVE: | 2669 | case OF_RECONFIG_CHANGE_REMOVE: |
| 2670 | /* already depopulated? */ | ||
| 2671 | if (!of_node_check_flag(rd->dn, OF_POPULATED)) | ||
| 2672 | return NOTIFY_OK; | ||
| 2673 | |||
| 2659 | /* find our device by node */ | 2674 | /* find our device by node */ |
| 2660 | spi = of_find_spi_device_by_node(rd->dn); | 2675 | spi = of_find_spi_device_by_node(rd->dn); |
| 2661 | if (spi == NULL) | 2676 | if (spi == NULL) |
