aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/platforms/pseries/dlpar.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/platforms/pseries/dlpar.c')
-rw-r--r--arch/powerpc/platforms/pseries/dlpar.c34
1 files changed, 6 insertions, 28 deletions
diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c
index 0f1b706506ed..a1a7b9a67ffd 100644
--- a/arch/powerpc/platforms/pseries/dlpar.c
+++ b/arch/powerpc/platforms/pseries/dlpar.c
@@ -13,17 +13,16 @@
13#include <linux/kernel.h> 13#include <linux/kernel.h>
14#include <linux/kref.h> 14#include <linux/kref.h>
15#include <linux/notifier.h> 15#include <linux/notifier.h>
16#include <linux/proc_fs.h>
17#include <linux/spinlock.h> 16#include <linux/spinlock.h>
18#include <linux/cpu.h> 17#include <linux/cpu.h>
19#include <linux/slab.h> 18#include <linux/slab.h>
19#include <linux/of.h>
20#include "offline_states.h" 20#include "offline_states.h"
21 21
22#include <asm/prom.h> 22#include <asm/prom.h>
23#include <asm/machdep.h> 23#include <asm/machdep.h>
24#include <asm/uaccess.h> 24#include <asm/uaccess.h>
25#include <asm/rtas.h> 25#include <asm/rtas.h>
26#include <asm/pSeries_reconfig.h>
27 26
28struct cc_workarea { 27struct cc_workarea {
29 u32 drc_index; 28 u32 drc_index;
@@ -255,9 +254,6 @@ static struct device_node *derive_parent(const char *path)
255 254
256int dlpar_attach_node(struct device_node *dn) 255int dlpar_attach_node(struct device_node *dn)
257{ 256{
258#ifdef CONFIG_PROC_DEVICETREE
259 struct proc_dir_entry *ent;
260#endif
261 int rc; 257 int rc;
262 258
263 of_node_set_flag(dn, OF_DYNAMIC); 259 of_node_set_flag(dn, OF_DYNAMIC);
@@ -266,44 +262,26 @@ int dlpar_attach_node(struct device_node *dn)
266 if (!dn->parent) 262 if (!dn->parent)
267 return -ENOMEM; 263 return -ENOMEM;
268 264
269 rc = pSeries_reconfig_notify(PSERIES_RECONFIG_ADD, dn); 265 rc = of_attach_node(dn);
270 if (rc) { 266 if (rc) {
271 printk(KERN_ERR "Failed to add device node %s\n", 267 printk(KERN_ERR "Failed to add device node %s\n",
272 dn->full_name); 268 dn->full_name);
273 return rc; 269 return rc;
274 } 270 }
275 271
276 of_attach_node(dn);
277
278#ifdef CONFIG_PROC_DEVICETREE
279 ent = proc_mkdir(strrchr(dn->full_name, '/') + 1, dn->parent->pde);
280 if (ent)
281 proc_device_tree_add_node(dn, ent);
282#endif
283
284 of_node_put(dn->parent); 272 of_node_put(dn->parent);
285 return 0; 273 return 0;
286} 274}
287 275
288int dlpar_detach_node(struct device_node *dn) 276int dlpar_detach_node(struct device_node *dn)
289{ 277{
290#ifdef CONFIG_PROC_DEVICETREE 278 int rc;
291 struct device_node *parent = dn->parent;
292 struct property *prop = dn->properties;
293
294 while (prop) {
295 remove_proc_entry(prop->name, dn->pde);
296 prop = prop->next;
297 }
298 279
299 if (dn->pde) 280 rc = of_detach_node(dn);
300 remove_proc_entry(dn->pde->name, parent->pde); 281 if (rc)
301#endif 282 return rc;
302 283
303 pSeries_reconfig_notify(PSERIES_RECONFIG_REMOVE, dn);
304 of_detach_node(dn);
305 of_node_put(dn); /* Must decrement the refcount */ 284 of_node_put(dn); /* Must decrement the refcount */
306
307 return 0; 285 return 0;
308} 286}
309 287