software nodes: Split software_node_notify()
Split software_node_notify_remove) out of software_node_notify() and make device_platform_notify() call the latter on device addition and the former on device removal. While at it, put the headers of the above functions into base.h, because they don't need to be present in a global header file. No intentional functional impact. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
This commit is contained in:
@@ -11,6 +11,8 @@
|
||||
#include <linux/property.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "base.h"
|
||||
|
||||
struct swnode {
|
||||
struct kobject kobj;
|
||||
struct fwnode_handle fwnode;
|
||||
@@ -1053,7 +1055,7 @@ int device_add_software_node(struct device *dev, const struct software_node *nod
|
||||
* balance.
|
||||
*/
|
||||
if (device_is_registered(dev))
|
||||
software_node_notify(dev, KOBJ_ADD);
|
||||
software_node_notify(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1074,7 +1076,8 @@ void device_remove_software_node(struct device *dev)
|
||||
return;
|
||||
|
||||
if (device_is_registered(dev))
|
||||
software_node_notify(dev, KOBJ_REMOVE);
|
||||
software_node_notify_remove(dev);
|
||||
|
||||
set_secondary_fwnode(dev, NULL);
|
||||
kobject_put(&swnode->kobj);
|
||||
}
|
||||
@@ -1117,44 +1120,44 @@ int device_create_managed_software_node(struct device *dev,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(device_create_managed_software_node);
|
||||
|
||||
int software_node_notify(struct device *dev, unsigned long action)
|
||||
void software_node_notify(struct device *dev)
|
||||
{
|
||||
struct swnode *swnode;
|
||||
int ret;
|
||||
|
||||
swnode = dev_to_swnode(dev);
|
||||
if (!swnode)
|
||||
return 0;
|
||||
return;
|
||||
|
||||
switch (action) {
|
||||
case KOBJ_ADD:
|
||||
ret = sysfs_create_link(&dev->kobj, &swnode->kobj, "software_node");
|
||||
if (ret)
|
||||
break;
|
||||
ret = sysfs_create_link(&dev->kobj, &swnode->kobj, "software_node");
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
ret = sysfs_create_link(&swnode->kobj, &dev->kobj,
|
||||
dev_name(dev));
|
||||
if (ret) {
|
||||
sysfs_remove_link(&dev->kobj, "software_node");
|
||||
break;
|
||||
}
|
||||
kobject_get(&swnode->kobj);
|
||||
break;
|
||||
case KOBJ_REMOVE:
|
||||
sysfs_remove_link(&swnode->kobj, dev_name(dev));
|
||||
ret = sysfs_create_link(&swnode->kobj, &dev->kobj, dev_name(dev));
|
||||
if (ret) {
|
||||
sysfs_remove_link(&dev->kobj, "software_node");
|
||||
kobject_put(&swnode->kobj);
|
||||
|
||||
if (swnode->managed) {
|
||||
set_secondary_fwnode(dev, NULL);
|
||||
kobject_put(&swnode->kobj);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
return;
|
||||
}
|
||||
|
||||
return 0;
|
||||
kobject_get(&swnode->kobj);
|
||||
}
|
||||
|
||||
void software_node_notify_remove(struct device *dev)
|
||||
{
|
||||
struct swnode *swnode;
|
||||
|
||||
swnode = dev_to_swnode(dev);
|
||||
if (!swnode)
|
||||
return;
|
||||
|
||||
sysfs_remove_link(&swnode->kobj, dev_name(dev));
|
||||
sysfs_remove_link(&dev->kobj, "software_node");
|
||||
kobject_put(&swnode->kobj);
|
||||
|
||||
if (swnode->managed) {
|
||||
set_secondary_fwnode(dev, NULL);
|
||||
kobject_put(&swnode->kobj);
|
||||
}
|
||||
}
|
||||
|
||||
static int __init software_node_init(void)
|
||||
|
||||
Reference in New Issue
Block a user