So far of_node_init() just initializes a kref, later we'll have to
initialize other fields (for example node->data_lock).

Signed-off-by: Anton Vorontsov <avoront...@ru.mvista.com>
---
 arch/microblaze/kernel/prom.c             |    4 ++--
 arch/powerpc/kernel/prom.c                |    4 ++--
 arch/powerpc/platforms/iseries/vio.c      |    5 +++--
 arch/powerpc/platforms/pseries/dlpar.c    |    7 ++++---
 arch/powerpc/platforms/pseries/reconfig.c |    7 ++++---
 arch/powerpc/sysdev/msi_bitmap.c          |    4 ++--
 arch/sparc/kernel/prom_common.c           |    6 +++---
 drivers/of/base.c                         |   10 ++++++++++
 include/linux/of.h                        |    2 ++
 9 files changed, 32 insertions(+), 17 deletions(-)

diff --git a/arch/microblaze/kernel/prom.c b/arch/microblaze/kernel/prom.c
index b817df1..0003453 100644
--- a/arch/microblaze/kernel/prom.c
+++ b/arch/microblaze/kernel/prom.c
@@ -30,6 +30,7 @@
 #include <linux/debugfs.h>
 #include <linux/irq.h>
 #include <linux/lmb.h>
+#include <linux/of.h>
 
 #include <asm/prom.h>
 #include <asm/page.h>
@@ -255,7 +256,7 @@ static unsigned long __init unflatten_dt_node(unsigned long 
mem,
        np = unflatten_dt_alloc(&mem, sizeof(struct device_node) + allocl,
                                __alignof__(struct device_node));
        if (allnextpp) {
-               memset(np, 0, sizeof(*np));
+               of_node_init(np);
                np->full_name = ((char *)np) + sizeof(struct device_node);
                if (new_format) {
                        char *p2 = np->full_name;
@@ -287,7 +288,6 @@ static unsigned long __init unflatten_dt_node(unsigned long 
mem,
                                dad->next->sibling = np;
                        dad->next = np;
                }
-               kref_init(&np->kref);
        }
        while (1) {
                u32 sz, noff;
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c
index 4ec3008..d8c2528 100644
--- a/arch/powerpc/kernel/prom.c
+++ b/arch/powerpc/kernel/prom.c
@@ -32,6 +32,7 @@
 #include <linux/debugfs.h>
 #include <linux/irq.h>
 #include <linux/lmb.h>
+#include <linux/of.h>
 
 #include <asm/prom.h>
 #include <asm/rtas.h>
@@ -290,7 +291,7 @@ static unsigned long __init unflatten_dt_node(unsigned long 
mem,
        np = unflatten_dt_alloc(&mem, sizeof(struct device_node) + allocl,
                                __alignof__(struct device_node));
        if (allnextpp) {
-               memset(np, 0, sizeof(*np));
+               of_node_init(np);
                np->full_name = ((char*)np) + sizeof(struct device_node);
                if (new_format) {
                        char *p = np->full_name;
@@ -321,7 +322,6 @@ static unsigned long __init unflatten_dt_node(unsigned long 
mem,
                                dad->next->sibling = np;
                        dad->next = np;
                }
-               kref_init(&np->kref);
        }
        while(1) {
                u32 sz, noff;
diff --git a/arch/powerpc/platforms/iseries/vio.c 
b/arch/powerpc/platforms/iseries/vio.c
index 2aa8b56..5f91a96 100644
--- a/arch/powerpc/platforms/iseries/vio.c
+++ b/arch/powerpc/platforms/iseries/vio.c
@@ -83,10 +83,12 @@ static void free_property(struct property *np)
 static struct device_node *new_node(const char *path,
                struct device_node *parent)
 {
-       struct device_node *np = kzalloc(sizeof(*np), GFP_KERNEL);
+       struct device_node *np = kmalloc(sizeof(*np), GFP_KERNEL);
 
        if (!np)
                return NULL;
+
+       of_node_init(np);
        np->full_name = kmalloc(strlen(path) + 1, GFP_KERNEL);
        if (!np->full_name) {
                kfree(np);
@@ -94,7 +96,6 @@ static struct device_node *new_node(const char *path,
        }
        strcpy(np->full_name, path);
        of_node_set_flag(np, OF_DYNAMIC);
-       kref_init(&np->kref);
        np->parent = of_node_get(parent);
        return np;
 }
diff --git a/arch/powerpc/platforms/pseries/dlpar.c 
b/arch/powerpc/platforms/pseries/dlpar.c
index 37bce52..72043ad 100644
--- a/arch/powerpc/platforms/pseries/dlpar.c
+++ b/arch/powerpc/platforms/pseries/dlpar.c
@@ -11,11 +11,11 @@
  */
 
 #include <linux/kernel.h>
-#include <linux/kref.h>
 #include <linux/notifier.h>
 #include <linux/proc_fs.h>
 #include <linux/spinlock.h>
 #include <linux/cpu.h>
+#include <linux/of.h>
 #include "offline_states.h"
 
 #include <asm/prom.h>
@@ -69,10 +69,12 @@ static struct device_node *dlpar_parse_cc_node(struct 
cc_workarea *ccwa)
        struct device_node *dn;
        char *name;
 
-       dn = kzalloc(sizeof(*dn), GFP_KERNEL);
+       dn = kmalloc(sizeof(*dn), GFP_KERNEL);
        if (!dn)
                return NULL;
 
+       of_node_init(dn);
+
        /* The configure connector reported name does not contain a
         * preceeding '/', so we allocate a buffer large enough to
         * prepend this to the full_name.
@@ -242,7 +244,6 @@ int dlpar_attach_node(struct device_node *dn)
        int rc;
 
        of_node_set_flag(dn, OF_DYNAMIC);
-       kref_init(&dn->kref);
        dn->parent = derive_parent(dn->full_name);
        if (!dn->parent)
                return -ENOMEM;
diff --git a/arch/powerpc/platforms/pseries/reconfig.c 
b/arch/powerpc/platforms/pseries/reconfig.c
index a2305d2..a0b65b7 100644
--- a/arch/powerpc/platforms/pseries/reconfig.c
+++ b/arch/powerpc/platforms/pseries/reconfig.c
@@ -12,9 +12,9 @@
  */
 
 #include <linux/kernel.h>
-#include <linux/kref.h>
 #include <linux/notifier.h>
 #include <linux/proc_fs.h>
+#include <linux/of.h>
 
 #include <asm/prom.h>
 #include <asm/machdep.h>
@@ -113,10 +113,12 @@ static int pSeries_reconfig_add_node(const char *path, 
struct property *proplist
        struct device_node *np;
        int err = -ENOMEM;
 
-       np = kzalloc(sizeof(*np), GFP_KERNEL);
+       np = kmalloc(sizeof(*np), GFP_KERNEL);
        if (!np)
                goto out_err;
 
+       of_node_init(np);
+
        np->full_name = kmalloc(strlen(path) + 1, GFP_KERNEL);
        if (!np->full_name)
                goto out_err;
@@ -125,7 +127,6 @@ static int pSeries_reconfig_add_node(const char *path, 
struct property *proplist
 
        np->properties = proplist;
        of_node_set_flag(np, OF_DYNAMIC);
-       kref_init(&np->kref);
 
        np->parent = derive_parent(path);
        if (IS_ERR(np->parent)) {
diff --git a/arch/powerpc/sysdev/msi_bitmap.c b/arch/powerpc/sysdev/msi_bitmap.c
index 5a32cbe..0f259ff 100644
--- a/arch/powerpc/sysdev/msi_bitmap.c
+++ b/arch/powerpc/sysdev/msi_bitmap.c
@@ -10,6 +10,7 @@
 
 #include <linux/kernel.h>
 #include <linux/bitmap.h>
+#include <linux/of.h>
 #include <asm/msi_bitmap.h>
 
 int msi_bitmap_alloc_hwirqs(struct msi_bitmap *bmp, int num)
@@ -199,8 +200,7 @@ void __init test_of_node(void)
        DECLARE_BITMAP(expected, size);
 
        /* There should really be a struct device_node allocator */
-       memset(&of_node, 0, sizeof(of_node));
-       kref_init(&of_node.kref);
+       of_node_init(&of_node);
        of_node.full_name = node_name;
 
        check(0 == msi_bitmap_alloc(&bmp, size, &of_node));
diff --git a/arch/sparc/kernel/prom_common.c b/arch/sparc/kernel/prom_common.c
index d80a65d..dbfad05 100644
--- a/arch/sparc/kernel/prom_common.c
+++ b/arch/sparc/kernel/prom_common.c
@@ -229,11 +229,11 @@ static struct device_node * __init 
prom_create_node(phandle node,
                return NULL;
 
        dp = prom_early_alloc(sizeof(*dp));
-       dp->unique_id = prom_unique_id++;
-       dp->parent = parent;
 
-       kref_init(&dp->kref);
+       of_node_init(dp);
 
+       dp->unique_id = prom_unique_id++;
+       dp->parent = parent;
        dp->name = get_one_property(node, "name");
        dp->type = get_one_property(node, "device_type");
        dp->node = node;
diff --git a/drivers/of/base.c b/drivers/of/base.c
index e6627b2..716d439 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -28,6 +28,16 @@ struct device_node *allnodes;
  */
 DEFINE_RWLOCK(devtree_lock);
 
+/**
+ * of_node_init - Initialize a device node
+ * @n: Node to initialize
+ */
+void of_node_init(struct device_node *np)
+{
+       memset(np, 0, sizeof(*np));
+       kref_init(&np->kref);
+}
+
 int of_n_addr_cells(struct device_node *np)
 {
        const int *ip;
diff --git a/include/linux/of.h b/include/linux/of.h
index e7facd8..717d690 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -63,6 +63,8 @@ struct device_node {
 #endif
 };
 
+extern void of_node_init(struct device_node *np);
+
 static inline int of_node_check_flag(struct device_node *n, unsigned long flag)
 {
        return test_bit(flag, &n->_flags);
-- 
1.6.5.7

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to