of: Keep track of populated platform devices
In "Device Tree powered" systems, platform devices are usually massively populated with of_platform_populate() call, executed at some level of initcalls, either by generic architecture or by platform-specific code. There are situations though where certain devices must be created (and bound with drivers) before all the others. This presents a challenge, as devices created explicitly would be created again by of_platform_populate(). This patch tries to solve that issue in a generic way, adding a "populated" flag for a DT node description. Subsequent of_platform_populate() will skip such nodes (and its children) in a similar way to the non-available ones. This patch also adds of_platform_depopulate() as an operation complementary to the _populate() one. It removes a platform or an amba device populated from the Device Tree, together with its all children (leaving, however, devices without associated of_node untouched) clearing the "populated" flag on the way. Signed-off-by: Pawel Moll <pawel.moll@arm.com> Reviewed-by: Rob Herring <robh@kernel.org> Acked-by: Grant Likely <grant.likely@linaro.org>
This commit is contained in:
parent
d6d211db37
commit
c6e126de43
3 changed files with 81 additions and 5 deletions
|
@ -130,6 +130,12 @@ static inline int of_node_check_flag(struct device_node *n, unsigned long flag)
|
|||
return test_bit(flag, &n->_flags);
|
||||
}
|
||||
|
||||
static inline int of_node_test_and_set_flag(struct device_node *n,
|
||||
unsigned long flag)
|
||||
{
|
||||
return test_and_set_bit(flag, &n->_flags);
|
||||
}
|
||||
|
||||
static inline void of_node_set_flag(struct device_node *n, unsigned long flag)
|
||||
{
|
||||
set_bit(flag, &n->_flags);
|
||||
|
@ -197,6 +203,7 @@ static inline unsigned long of_read_ulong(const __be32 *cell, int size)
|
|||
/* flag descriptions */
|
||||
#define OF_DYNAMIC 1 /* node and properties were allocated via kmalloc */
|
||||
#define OF_DETACHED 2 /* node has been detached from the device tree */
|
||||
#define OF_POPULATED 3 /* device already created for the node */
|
||||
|
||||
#define OF_IS_DYNAMIC(x) test_bit(OF_DYNAMIC, &x->_flags)
|
||||
#define OF_MARK_DYNAMIC(x) set_bit(OF_DYNAMIC, &x->_flags)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue