aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi
diff options
context:
space:
mode:
authorGeert Uytterhoeven <geert+renesas@glider.be>2015-11-30 09:28:07 -0500
committerMark Brown <broonie@kernel.org>2015-12-01 13:52:20 -0500
commitbd6c1644a2f6f46cdf89388e81168a70711fce3a (patch)
tree99f2cbbdffc782f170312d07c170269f39465cdb /drivers/spi
parent3b1884c24c98dada51fc4b05735773f0078711d2 (diff)
spi: Mark instantiated device nodes with OF_POPULATE
Mark (and unmark) device nodes with the POPULATE flag as appropriate. This is required to avoid multi probing when enabling and populating SPI buses in DT overlays. Based on commit 4f001fd30145a6a8 ("i2c: Mark instantiated device nodes with OF_POPULATE"). Suggested-by: Mark Brown <broonie@kernel.org> Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/spi')
-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)