|
@@ -613,8 +613,12 @@ EXPORT_SYMBOL_GPL(spi_new_device);
|
|
|
*/
|
|
|
void spi_unregister_device(struct spi_device *spi)
|
|
|
{
|
|
|
- if (spi)
|
|
|
- device_unregister(&spi->dev);
|
|
|
+ if (!spi)
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (spi->dev.of_node)
|
|
|
+ of_node_clear_flag(spi->dev.of_node, OF_POPULATED);
|
|
|
+ device_unregister(&spi->dev);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(spi_unregister_device);
|
|
|
|
|
@@ -1561,6 +1565,8 @@ static void of_register_spi_devices(struct spi_master *master)
|
|
|
return;
|
|
|
|
|
|
for_each_available_child_of_node(master->dev.of_node, nc) {
|
|
|
+ if (of_node_test_and_set_flag(nc, OF_POPULATED))
|
|
|
+ continue;
|
|
|
spi = of_register_spi_device(master, nc);
|
|
|
if (IS_ERR(spi))
|
|
|
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,
|
|
|
if (master == NULL)
|
|
|
return NOTIFY_OK; /* not for us */
|
|
|
|
|
|
+ if (of_node_test_and_set_flag(rd->dn, OF_POPULATED)) {
|
|
|
+ put_device(&master->dev);
|
|
|
+ return NOTIFY_OK;
|
|
|
+ }
|
|
|
+
|
|
|
spi = of_register_spi_device(master, rd->dn);
|
|
|
put_device(&master->dev);
|
|
|
|
|
@@ -2656,6 +2667,10 @@ static int of_spi_notify(struct notifier_block *nb, unsigned long action,
|
|
|
break;
|
|
|
|
|
|
case OF_RECONFIG_CHANGE_REMOVE:
|
|
|
+ /* already depopulated? */
|
|
|
+ if (!of_node_check_flag(rd->dn, OF_POPULATED))
|
|
|
+ return NOTIFY_OK;
|
|
|
+
|
|
|
/* find our device by node */
|
|
|
spi = of_find_spi_device_by_node(rd->dn);
|
|
|
if (spi == NULL)
|