[PATCH v2] of: Keep track of populated platform devices
From: Pawel Moll <hidden>
Date: 2014-05-15 15:08:53
Also in:
linux-devicetree
On Wed, 2014-05-14 at 11:56 +0100, Grant Likely wrote:
quoted
Agreed, but, unless I'm missing some fundamental issue, I believe we can solve the flag clearing problem in a generic way: --8<-----------diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c index 3cf61a1..0f489fb 100644 --- a/drivers/amba/bus.c +++ b/drivers/amba/bus.c@@ -17,6 +17,7 @@ #include <linux/pm_runtime.h> #include <linux/amba/bus.h> #include <linux/sizes.h> +#include <linux/of_device.h> #include <asm/irq.h>@@ -268,6 +269,7 @@ static void amba_device_release(struct device *dev) { struct amba_device *d = to_amba_device(dev); + of_device_node_put(dev); if (d->res.parent) release_resource(&d->res); kfree(d);diff --git a/include/linux/of_device.h b/include/linux/of_device.h index ef37021..fd14d46 100644 --- a/include/linux/of_device.h +++ b/include/linux/of_device.h@@ -41,6 +41,8 @@ extern int of_device_uevent_modalias(struct device *dev, struct kobj_uevent_env static inline void of_device_node_put(struct device *dev) { + if (dev->of_node) + of_node_clear_flag(dev->of_node, OF_POPULATED); of_node_put(dev->of_node); } --8<-----------This will work even if one manually unregisters a DT-originating device, because of_device_node_put() would be called in both amba and platform device (kobj) release path.Doing it that way will also catch platform_devices that were created apart from of_platform_populate() and manually attached to an of_node, which is done some times. It will also break whenever multiple devices reference the same node if they call of_device_node_put(). For example, a platform device providing an i2c bus will have a child device that represents the i2c bus, and that i2c device will point to the same node.
Yes, can I see it doing this. Without
The flag clear really does need to be kept in the
platform_device_unpopulate path because it is only to be used internally
by of_platform_{populate,depopulate}Ok, will move it there.
quoted
By the way, the fact that today amba_device_release() doesn't do of_device_node_put() seems like a bug to me? (node's reference counter won't be decremented)Yes, that is a bug. I want to get some unittests added to the DT code to verify that reference counts are being tracked correctly. Right now it is an utter mess.
Ok. If I move the flag, this bit is not longer an integral part of the patch so will split it into a separate one, but merge the _depopulate() one instead. Thanks! Pawe?