Lines Matching +full:a +full:- +full:child +full:- +full:node +full:- +full:property
2 * pSeries_reconfig.c - support for dynamic reconfiguration (including PCI
33 * Add a node to /proc/device-tree.
39 ent = proc_mkdir(strrchr(np->full_name, '/') + 1, np->parent->pde); in add_node_proc_entries()
46 struct property *pp = np->properties; in remove_node_proc_entries()
47 struct device_node *parent = np->parent; in remove_node_proc_entries()
50 remove_proc_entry(pp->name, np->pde); in remove_node_proc_entries()
51 pp = pp->next; in remove_node_proc_entries()
53 if (np->pde) in remove_node_proc_entries()
54 remove_proc_entry(np->pde->name, parent->pde); in remove_node_proc_entries()
69 * derive_parent - basically like dirname(1)
70 * @path: the full_name of a node to be added to the tree
72 * Returns the node which should be the parent of the node
74 * the node with full_name = "/foo".
80 size_t parent_path_len = strrchr(path, '/') - path + 1; in derive_parent()
84 return ERR_PTR(-EINVAL); in derive_parent()
89 return ERR_PTR(-ENOMEM); in derive_parent()
94 return ERR_PTR(-EINVAL); in derive_parent()
120 static int pSeries_reconfig_add_node(const char *path, struct property *proplist) in pSeries_reconfig_add_node()
123 int err = -ENOMEM; in pSeries_reconfig_add_node()
129 np->full_name = kstrdup(path, GFP_KERNEL); in pSeries_reconfig_add_node()
130 if (!np->full_name) in pSeries_reconfig_add_node()
133 np->properties = proplist; in pSeries_reconfig_add_node()
135 kref_init(&np->kref); in pSeries_reconfig_add_node()
137 np->parent = derive_parent(path); in pSeries_reconfig_add_node()
138 if (IS_ERR(np->parent)) { in pSeries_reconfig_add_node()
139 err = PTR_ERR(np->parent); in pSeries_reconfig_add_node()
145 printk(KERN_ERR "Failed to add device node %s\n", path); in pSeries_reconfig_add_node()
153 of_node_put(np->parent); in pSeries_reconfig_add_node()
159 of_node_put(np->parent); in pSeries_reconfig_add_node()
160 kfree(np->full_name); in pSeries_reconfig_add_node()
168 struct device_node *parent, *child; in pSeries_reconfig_remove_node() local
172 return -EINVAL; in pSeries_reconfig_remove_node()
174 if ((child = of_get_next_child(np, NULL))) { in pSeries_reconfig_remove_node()
175 of_node_put(child); in pSeries_reconfig_remove_node()
177 return -EBUSY; in pSeries_reconfig_remove_node()
191 * /proc/powerpc/ofdt - yucky binary interface for adding and removing
193 * in-kernel wrapper for the RTAS ibm,configure-connector call.
196 static void release_prop_list(const struct property *prop) in release_prop_list()
198 struct property *next; in release_prop_list()
200 next = prop->next; in release_prop_list()
201 kfree(prop->name); in release_prop_list()
202 kfree(prop->value); in release_prop_list()
209 * parse_next_property - process the next property from raw input buffer
210 * @buf: input buffer, must be nul-terminated
212 * @name: return value; set to property name in buf
214 * @value: return value; set to the property value in buf
229 printk(KERN_ERR "property parse failed in %s at line %d\n", in parse_next_property()
236 printk(KERN_ERR "property parse failed in %s at line %d\n", in parse_next_property()
242 *length = -1; in parse_next_property()
244 if (*length == -1) { in parse_next_property()
245 printk(KERN_ERR "property parse failed in %s at line %d\n", in parse_next_property()
250 printk(KERN_ERR "property parse failed in %s at line %d\n", in parse_next_property()
259 printk(KERN_ERR "property parse failed in %s at line %d\n", in parse_next_property()
264 printk(KERN_ERR "property parse failed in %s at line %d\n", in parse_next_property()
274 static struct property *new_property(const char *name, const int length, in new_property()
275 const unsigned char *value, struct property *last) in new_property()
277 struct property *new = kzalloc(sizeof(*new), GFP_KERNEL); in new_property()
282 if (!(new->name = kmalloc(strlen(name) + 1, GFP_KERNEL))) in new_property()
284 if (!(new->value = kmalloc(length + 1, GFP_KERNEL))) in new_property()
287 strcpy(new->name, name); in new_property()
288 memcpy(new->value, value, length); in new_property()
289 *(((char *)new->value) + length) = 0; in new_property()
290 new->length = length; in new_property()
291 new->next = last; in new_property()
295 kfree(new->name); in new_property()
296 kfree(new->value); in new_property()
305 struct property *prop = NULL; in do_add_node()
313 return -EINVAL; in do_add_node()
319 return -EINVAL; in do_add_node()
322 /* rv = build_prop_list(tmp, bufsize - (tmp - buf), &proplist); */ in do_add_node()
325 struct property *last = prop; in do_add_node()
329 rv = -ENOMEM; in do_add_node()
335 rv = -EINVAL; in do_add_node()
349 struct device_node *node; in do_remove_node() local
350 int rv = -ENODEV; in do_remove_node()
352 if ((node = of_find_node_by_path(buf))) in do_remove_node()
353 rv = pSeries_reconfig_remove_node(node); in do_remove_node()
355 of_node_put(node); in do_remove_node()
381 struct property *prop = NULL; in do_add_property()
390 return -ENODEV; in do_add_property()
393 return -EINVAL; in do_add_property()
397 return -ENOMEM; in do_add_property()
408 struct property *prop; in do_remove_property()
412 return -ENODEV; in do_remove_property()
419 return -EINVAL; in do_remove_property()
432 struct property *newprop, *oldprop; in do_update_property()
437 return -ENODEV; in do_update_property()
441 return -EINVAL; in do_update_property()
445 return -ENOMEM; in do_update_property()
447 if (!strcmp(name, "slb-size") || !strcmp(name, "ibm,slb-size")) in do_update_property()
454 return -ENODEV; in do_update_property()
461 /* For memory under the ibm,dynamic-reconfiguration-memory node in do_update_property()
463 * to the ibm,dynamic-memory property instead of adding/removing a in do_update_property()
464 * memory node in the device tree. For these cases we still need to in do_update_property()
467 if (!strcmp(name, "ibm,dynamic-memory")) { in do_update_property()
473 return -EINVAL; in do_update_property()
491 * ofdt_write - perform operations on the Open Firmware device tree
510 rv = -ENOMEM; in ofdt_write()
514 rv = -EFAULT; in ofdt_write()
522 rv = -EINVAL; in ofdt_write()
529 rv = do_add_node(tmp, count - (tmp - kbuf)); in ofdt_write()
533 rv = do_add_property(tmp, count - (tmp - kbuf)); in ofdt_write()
535 rv = do_remove_property(tmp, count - (tmp - kbuf)); in ofdt_write()
537 rv = do_update_property(tmp, count - (tmp - kbuf)); in ofdt_write()
539 rv = -EINVAL; in ofdt_write()
550 /* create /proc/powerpc/ofdt write-only by root */
560 ent->size = 0; in proc_ppc64_create_ofdt()