of: platform: Destroy child devices symmetrically
Iterate over child devices in reverse when unpopulating a platform device to make this step symmetrical with the population step. This fixes an issue in the Tegra DRM driver where upon module unload the DPAUX controller tries to unregister an I2C controller but will end up waiting indefinitely because one of the SOR devices is keeping a reference to it. Since the SOR devices are instantiated after the DPAUX devices, they would only be removed (and hence release their reference to the I2C controller) after the DPAUX devices have been removed. While destroying the child devices in reverse order helps in this situation, it isn't fully safe to do so either. An even better way would be for the child devices to be reordered to match the probe order, which would work irrespective of the instantiation order. However, reordering by probe order would be fairly complicated and doesn't fix any known issues, so we'll go with the simpler fix for now. Signed-off-by: Thierry Reding <treding@nvidia.com> Link: https://lore.kernel.org/r/20200806153650.3883530-1-thierry.reding@gmail.com Signed-off-by: Rob Herring <robh@kernel.org>
This commit is contained in:
parent
1c5711876b
commit
70a29209f6
|
@ -590,7 +590,7 @@ EXPORT_SYMBOL_GPL(of_platform_device_destroy);
|
|||
void of_platform_depopulate(struct device *parent)
|
||||
{
|
||||
if (parent->of_node && of_node_check_flag(parent->of_node, OF_POPULATED_BUS)) {
|
||||
device_for_each_child(parent, NULL, of_platform_device_destroy);
|
||||
device_for_each_child_reverse(parent, NULL, of_platform_device_destroy);
|
||||
of_node_clear_flag(parent->of_node, OF_POPULATED_BUS);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue