of/overlay: add of overlay notifications
This patch add of overlay notifications.
When DT overlays are being added, some drivers/subsystems
need to see device tree overlays before the changes go into
the live tree.
This is distinct from reconfig notifiers that are
post-apply or post-remove and which issue very granular
notifications without providing access to the context
of a whole overlay.
The following 4 notificatons are issued:
OF_OVERLAY_PRE_APPLY
OF_OVERLAY_POST_APPLY
OF_OVERLAY_PRE_REMOVE
OF_OVERLAY_POST_REMOVE
In the case of pre-apply notification, if the notifier
returns error, the overlay will be rejected.
This patch exports two functions for registering/unregistering
notifications:
of_overlay_notifier_register(struct notifier_block *nb)
of_overlay_notifier_unregister(struct notifier_block *nb)
The of_mutex is held during these notifications. The
notification data includes pointers to the overlay target
and the overlay:
struct of_overlay_notify_data {
struct device_node *overlay;
struct device_node *target;
};
Signed-off-by: Alan Tull <atull@opensource.altera.com>
Acked-by: Rob Herring <robh@kernel.org>
Acked-by: Moritz Fischer <moritz.fischer@ettus.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
c1eac0d034
commit
39a842e22c
@@ -1266,6 +1266,18 @@ static inline bool of_device_is_system_power_controller(const struct device_node
|
||||
* Overlay support
|
||||
*/
|
||||
|
||||
enum of_overlay_notify_action {
|
||||
OF_OVERLAY_PRE_APPLY,
|
||||
OF_OVERLAY_POST_APPLY,
|
||||
OF_OVERLAY_PRE_REMOVE,
|
||||
OF_OVERLAY_POST_REMOVE,
|
||||
};
|
||||
|
||||
struct of_overlay_notify_data {
|
||||
struct device_node *overlay;
|
||||
struct device_node *target;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_OF_OVERLAY
|
||||
|
||||
/* ID based overlays; the API for external users */
|
||||
@@ -1273,6 +1285,9 @@ int of_overlay_create(struct device_node *tree);
|
||||
int of_overlay_destroy(int id);
|
||||
int of_overlay_destroy_all(void);
|
||||
|
||||
int of_overlay_notifier_register(struct notifier_block *nb);
|
||||
int of_overlay_notifier_unregister(struct notifier_block *nb);
|
||||
|
||||
#else
|
||||
|
||||
static inline int of_overlay_create(struct device_node *tree)
|
||||
@@ -1290,6 +1305,16 @@ static inline int of_overlay_destroy_all(void)
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static inline int of_overlay_notifier_register(struct notifier_block *nb)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int of_overlay_notifier_unregister(struct notifier_block *nb)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_OF_H */
|
||||
|
||||
Reference in New Issue
Block a user