aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/spi/spi.c19
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 */
614void spi_unregister_device(struct spi_device *spi) 614void 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}
619EXPORT_SYMBOL_GPL(spi_unregister_device); 623EXPORT_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)