|
@@ -22,37 +22,7 @@
|
|
#include <asm/uaccess.h>
|
|
#include <asm/uaccess.h>
|
|
#include <asm/mmu.h>
|
|
#include <asm/mmu.h>
|
|
|
|
|
|
-/**
|
|
|
|
- * derive_parent - basically like dirname(1)
|
|
|
|
- * @path: the full_name of a node to be added to the tree
|
|
|
|
- *
|
|
|
|
- * Returns the node which should be the parent of the node
|
|
|
|
- * described by path. E.g., for path = "/foo/bar", returns
|
|
|
|
- * the node with full_name = "/foo".
|
|
|
|
- */
|
|
|
|
-static struct device_node *derive_parent(const char *path)
|
|
|
|
-{
|
|
|
|
- struct device_node *parent = NULL;
|
|
|
|
- char *parent_path = "/";
|
|
|
|
- size_t parent_path_len = strrchr(path, '/') - path + 1;
|
|
|
|
-
|
|
|
|
- /* reject if path is "/" */
|
|
|
|
- if (!strcmp(path, "/"))
|
|
|
|
- return ERR_PTR(-EINVAL);
|
|
|
|
-
|
|
|
|
- if (strrchr(path, '/') != path) {
|
|
|
|
- parent_path = kmalloc(parent_path_len, GFP_KERNEL);
|
|
|
|
- if (!parent_path)
|
|
|
|
- return ERR_PTR(-ENOMEM);
|
|
|
|
- strlcpy(parent_path, path, parent_path_len);
|
|
|
|
- }
|
|
|
|
- parent = of_find_node_by_path(parent_path);
|
|
|
|
- if (!parent)
|
|
|
|
- return ERR_PTR(-EINVAL);
|
|
|
|
- if (strcmp(parent_path, "/"))
|
|
|
|
- kfree(parent_path);
|
|
|
|
- return parent;
|
|
|
|
-}
|
|
|
|
|
|
+#include "of_helpers.h"
|
|
|
|
|
|
static int pSeries_reconfig_add_node(const char *path, struct property *proplist)
|
|
static int pSeries_reconfig_add_node(const char *path, struct property *proplist)
|
|
{
|
|
{
|
|
@@ -71,7 +41,7 @@ static int pSeries_reconfig_add_node(const char *path, struct property *proplist
|
|
of_node_set_flag(np, OF_DYNAMIC);
|
|
of_node_set_flag(np, OF_DYNAMIC);
|
|
of_node_init(np);
|
|
of_node_init(np);
|
|
|
|
|
|
- np->parent = derive_parent(path);
|
|
|
|
|
|
+ np->parent = pseries_of_derive_parent(path);
|
|
if (IS_ERR(np->parent)) {
|
|
if (IS_ERR(np->parent)) {
|
|
err = PTR_ERR(np->parent);
|
|
err = PTR_ERR(np->parent);
|
|
goto out_err;
|
|
goto out_err;
|