Encapsulate the reference counting logic for OF nodes assigned to platform devices created with platform_device_alloc() in a helper function. Make the kerneldoc state that this is the proper interface for assigning OF nodes to dynamically allocated platform devices. This will allow us to switch to counting the references of the device's firmware nodes, not only the OF nodes.
Signed-off-by: Bartosz Golaszewski <[email protected]> --- drivers/base/platform.c | 18 ++++++++++++++++++ include/linux/platform_device.h | 3 +++ 2 files changed, 21 insertions(+) diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 4824d9a2edbe9ff86cc9893cd74688e9cbb6483e..ec53383fa17ac29ea3b15b61f97ae65ae8ca22ac 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c @@ -693,6 +693,24 @@ int platform_device_add_data(struct platform_device *pdev, const void *data, } EXPORT_SYMBOL_GPL(platform_device_add_data); +/** + * platform_device_set_of_node - assign an OF node to device + * @pdev: platform device to add the node for + * @np: new device node + * + * Assign an OF node to this platform device. Internally keep track of the + * reference count. Devices created with platform_device_alloc() must use this + * function instead of assigning the node manually. + */ +void platform_device_set_of_node(struct platform_device *pdev, + struct device_node *np) +{ + of_node_put(pdev->dev.of_node); + pdev->dev.of_node = of_node_get(np); + pdev->dev.fwnode = of_fwnode_handle(np); +} +EXPORT_SYMBOL_GPL(platform_device_set_of_node); + /** * platform_device_add - add a platform device to device hierarchy * @pdev: platform device we're adding diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index 975400a472e30e2f98cc8f13bc36a63129bd4fcf..21f7d8a7f4b5c9a47d56d80a69802b3f84457ef7 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h @@ -19,6 +19,7 @@ struct irq_affinity; struct mfd_cell; struct property_entry; struct platform_device_id; +struct device_node; struct platform_device { const char *name; @@ -262,6 +263,8 @@ extern int platform_device_add_resources(struct platform_device *pdev, unsigned int num); extern int platform_device_add_data(struct platform_device *pdev, const void *data, size_t size); +void platform_device_set_of_node(struct platform_device *pdev, + struct device_node *np); extern int platform_device_add(struct platform_device *pdev); extern void platform_device_del(struct platform_device *pdev); extern void platform_device_put(struct platform_device *pdev); -- 2.47.3
