diff options
Diffstat (limited to 'arch/powerpc/kernel/prom.c')
-rw-r--r-- | arch/powerpc/kernel/prom.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index af42ddab3ab4..37ff99bd98b4 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
@@ -52,6 +52,7 @@ | |||
52 | #include <asm/pSeries_reconfig.h> | 52 | #include <asm/pSeries_reconfig.h> |
53 | #include <asm/pci-bridge.h> | 53 | #include <asm/pci-bridge.h> |
54 | #include <asm/kexec.h> | 54 | #include <asm/kexec.h> |
55 | #include <asm/system.h> | ||
55 | 56 | ||
56 | #ifdef DEBUG | 57 | #ifdef DEBUG |
57 | #define DBG(fmt...) printk(KERN_ERR fmt) | 58 | #define DBG(fmt...) printk(KERN_ERR fmt) |
@@ -1005,7 +1006,7 @@ static void __init early_reserve_mem(void) | |||
1005 | 1006 | ||
1006 | void __init early_init_devtree(void *params) | 1007 | void __init early_init_devtree(void *params) |
1007 | { | 1008 | { |
1008 | DBG(" -> early_init_devtree()\n"); | 1009 | DBG(" -> early_init_devtree(%p)\n", params); |
1009 | 1010 | ||
1010 | /* Setup flat device-tree pointer */ | 1011 | /* Setup flat device-tree pointer */ |
1011 | initial_boot_params = params; | 1012 | initial_boot_params = params; |
@@ -1055,8 +1056,6 @@ void __init early_init_devtree(void *params) | |||
1055 | DBG(" <- early_init_devtree()\n"); | 1056 | DBG(" <- early_init_devtree()\n"); |
1056 | } | 1057 | } |
1057 | 1058 | ||
1058 | #undef printk | ||
1059 | |||
1060 | int of_n_addr_cells(struct device_node* np) | 1059 | int of_n_addr_cells(struct device_node* np) |
1061 | { | 1060 | { |
1062 | const int *ip; | 1061 | const int *ip; |
@@ -1375,8 +1374,17 @@ static void of_node_release(struct kref *kref) | |||
1375 | struct device_node *node = kref_to_device_node(kref); | 1374 | struct device_node *node = kref_to_device_node(kref); |
1376 | struct property *prop = node->properties; | 1375 | struct property *prop = node->properties; |
1377 | 1376 | ||
1378 | if (!OF_IS_DYNAMIC(node)) | 1377 | /* We should never be releasing nodes that haven't been detached. */ |
1378 | if (!of_node_check_flag(node, OF_DETACHED)) { | ||
1379 | printk("WARNING: Bad of_node_put() on %s\n", node->full_name); | ||
1380 | dump_stack(); | ||
1381 | kref_init(&node->kref); | ||
1382 | return; | ||
1383 | } | ||
1384 | |||
1385 | if (!of_node_check_flag(node, OF_DYNAMIC)) | ||
1379 | return; | 1386 | return; |
1387 | |||
1380 | while (prop) { | 1388 | while (prop) { |
1381 | struct property *next = prop->next; | 1389 | struct property *next = prop->next; |
1382 | kfree(prop->name); | 1390 | kfree(prop->name); |
@@ -1432,6 +1440,8 @@ void of_detach_node(const struct device_node *np) | |||
1432 | write_lock(&devtree_lock); | 1440 | write_lock(&devtree_lock); |
1433 | 1441 | ||
1434 | parent = np->parent; | 1442 | parent = np->parent; |
1443 | if (!parent) | ||
1444 | goto out_unlock; | ||
1435 | 1445 | ||
1436 | if (allnodes == np) | 1446 | if (allnodes == np) |
1437 | allnodes = np->allnext; | 1447 | allnodes = np->allnext; |
@@ -1455,6 +1465,9 @@ void of_detach_node(const struct device_node *np) | |||
1455 | prevsib->sibling = np->sibling; | 1465 | prevsib->sibling = np->sibling; |
1456 | } | 1466 | } |
1457 | 1467 | ||
1468 | of_node_set_flag(np, OF_DETACHED); | ||
1469 | |||
1470 | out_unlock: | ||
1458 | write_unlock(&devtree_lock); | 1471 | write_unlock(&devtree_lock); |
1459 | } | 1472 | } |
1460 | 1473 | ||
@@ -1716,22 +1729,18 @@ struct device_node *of_get_cpu_node(int cpu, unsigned int *thread) | |||
1716 | } | 1729 | } |
1717 | EXPORT_SYMBOL(of_get_cpu_node); | 1730 | EXPORT_SYMBOL(of_get_cpu_node); |
1718 | 1731 | ||
1719 | #ifdef DEBUG | 1732 | #if defined(CONFIG_DEBUG_FS) && defined(DEBUG) |
1720 | static struct debugfs_blob_wrapper flat_dt_blob; | 1733 | static struct debugfs_blob_wrapper flat_dt_blob; |
1721 | 1734 | ||
1722 | static int __init export_flat_device_tree(void) | 1735 | static int __init export_flat_device_tree(void) |
1723 | { | 1736 | { |
1724 | struct dentry *d; | 1737 | struct dentry *d; |
1725 | 1738 | ||
1726 | d = debugfs_create_dir("powerpc", NULL); | ||
1727 | if (!d) | ||
1728 | return 1; | ||
1729 | |||
1730 | flat_dt_blob.data = initial_boot_params; | 1739 | flat_dt_blob.data = initial_boot_params; |
1731 | flat_dt_blob.size = initial_boot_params->totalsize; | 1740 | flat_dt_blob.size = initial_boot_params->totalsize; |
1732 | 1741 | ||
1733 | d = debugfs_create_blob("flat-device-tree", S_IFREG | S_IRUSR, | 1742 | d = debugfs_create_blob("flat-device-tree", S_IFREG | S_IRUSR, |
1734 | d, &flat_dt_blob); | 1743 | powerpc_debugfs_root, &flat_dt_blob); |
1735 | if (!d) | 1744 | if (!d) |
1736 | return 1; | 1745 | return 1; |
1737 | 1746 | ||