/** * property_entries_dup - duplicate array of properties * @properties: array of properties to copy * * This function creates a deep copy of the given NULL-terminated array * of property entries.
*/ struct property_entry *
property_entries_dup(conststruct property_entry *properties)
{ struct property_entry *p; int i, n = 0; int ret;
if (!properties) return NULL;
while (properties[n].name)
n++;
p = kcalloc(n + 1, sizeof(*p), GFP_KERNEL); if (!p) return ERR_PTR(-ENOMEM);
for (i = 0; i < n; i++) {
ret = property_entry_copy_data(&p[i], &properties[i]); if (ret) { while (--i >= 0)
property_entry_free_data(&p[i]);
kfree(p); return ERR_PTR(ret);
}
}
/** * property_entries_free - free previously allocated array of properties * @properties: array of properties to destroy * * This function frees given NULL-terminated array of property entries, * along with their data.
*/ void property_entries_free(conststruct property_entry *properties)
{ conststruct property_entry *p;
if (!properties) return;
for (p = properties; p->name; p++)
property_entry_free_data(p);
while ((port = software_node_get_next_child(parent, old))) { /* * fwnode ports have naming style "port@", so we search for any * children that follow that convention.
*/ if (!strncmp(to_swnode(port)->node->name, "port@",
strlen("port@"))) return port;
old = port;
}
if (strlen("port@") >= strlen(parent_name) ||
strncmp(parent_name, "port@", strlen("port@"))) return -EINVAL;
/* Ports have naming style "port@n", we need to select the n */
ret = kstrtou32(parent_name + strlen("port@"), 10, &endpoint->port); if (ret) return ret;
/** * software_node_find_by_name - Find software node by name * @parent: Parent of the software node * @name: Name of the software node * * The function will find a node that is child of @parent and that is named * @name. If no node is found, the function returns NULL. * * NOTE: you will need to drop the reference with fwnode_handle_put() after use.
*/ conststruct software_node *
software_node_find_by_name(conststruct software_node *parent, constchar *name)
{ struct swnode *swnode = NULL; struct kobject *k;
/** * software_node_register_node_group - Register a group of software nodes * @node_group: NULL terminated array of software node pointers to be registered * * Register multiple software nodes at once. If any node in the array * has its .parent pointer set (which can only be to another software_node), * then its parent **must** have been registered before it is; either outside * of this function or by ordering the array such that parent comes before * child.
*/ int software_node_register_node_group(conststruct software_node **node_group)
{ unsignedint i; int ret;
if (!node_group) return 0;
for (i = 0; node_group[i]; i++) {
ret = software_node_register(node_group[i]); if (ret) {
software_node_unregister_node_group(node_group); return ret;
}
}
/** * software_node_unregister_node_group - Unregister a group of software nodes * @node_group: NULL terminated array of software node pointers to be unregistered * * Unregister multiple software nodes at once. If parent pointers are set up * in any of the software nodes then the array **must** be ordered such that * parents come before their children. * * NOTE: If you are uncertain whether the array is ordered such that * parents will be unregistered before their children, it is wiser to * remove the nodes individually, in the correct order (child before * parent).
*/ void software_node_unregister_node_group( conststruct software_node **node_group)
{ unsignedint i = 0;
if (!node_group) return;
while (node_group[i])
i++;
while (i--)
software_node_unregister(node_group[i]);
}
EXPORT_SYMBOL_GPL(software_node_unregister_node_group);
/** * software_node_register - Register static software node * @node: The software node to be registered
*/ int software_node_register(conststruct software_node *node)
{ struct swnode *parent = software_node_to_swnode(node->parent);
if (software_node_to_swnode(node)) return -EEXIST;
/** * device_add_software_node - Assign software node to a device * @dev: The device the software node is meant for. * @node: The software node. * * This function will make @node the secondary firmware node pointer of @dev. If * @dev has no primary node, then @node will become the primary node. The * function will register @node automatically if it wasn't already registered.
*/ int device_add_software_node(struct device *dev, conststruct software_node *node)
{ struct swnode *swnode; int ret;
/* Only one software node per device. */ if (dev_to_swnode(dev)) return -EBUSY;
swnode = software_node_to_swnode(node); if (swnode) {
kobject_get(&swnode->kobj);
} else {
ret = software_node_register(node); if (ret) return ret;
swnode = software_node_to_swnode(node);
}
set_secondary_fwnode(dev, &swnode->fwnode);
/* * If the device has been fully registered by the time this function is * called, software_node_notify() must be called separately so that the * symlinks get created and the reference count of the node is kept in * balance.
*/ if (device_is_registered(dev))
software_node_notify(dev);
/** * device_remove_software_node - Remove device's software node * @dev: The device with the software node. * * This function will unregister the software node of @dev.
*/ void device_remove_software_node(struct device *dev)
{ struct swnode *swnode;
swnode = dev_to_swnode(dev); if (!swnode) return;
if (device_is_registered(dev))
software_node_notify_remove(dev);
/** * device_create_managed_software_node - Create a software node for a device * @dev: The device the software node is assigned to. * @properties: Device properties for the software node. * @parent: Parent of the software node. * * Creates a software node as a managed resource for @dev, which means the * lifetime of the newly created software node is tied to the lifetime of @dev. * Software nodes created with this function should not be reused or shared * because of that. The function takes a deep copy of @properties for the * software node. * * Since the new software node is assigned directly to @dev, and since it should * not be shared, it is not returned to the caller. The function returns 0 on * success, and errno in case of an error.
*/ int device_create_managed_software_node(struct device *dev, conststruct property_entry *properties, conststruct software_node *parent)
{ struct fwnode_handle *p = software_node_fwnode(parent); struct fwnode_handle *fwnode;
if (parent && !p) return -EINVAL;
fwnode = fwnode_create_software_node(properties, p); if (IS_ERR(fwnode)) return PTR_ERR(fwnode);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.