diff --git a/arch/powerpc/include/asm/prom.h
b/arch/powerpc/include/asm/prom.h
index 42ee294..b48bbfe 100644
--- a/arch/powerpc/include/asm/prom.h
+++ b/arch/powerpc/include/asm/prom.h
@@ -44,7 +44,7 @@ void of_parse_dma_window(struct device_node *dn, const
void *dma_window_prop,
 extern void kdump_move_device_tree(void);

 /* CPU OF node matching */
-struct device_node *of_get_cpu_node(int cpu, unsigned int *thread);
+struct device_node *arch_of_get_cpu_node_by_tid(int cpu, unsigned int
*thread);

 #ifdef CONFIG_NUMA
 extern int of_node_to_nid(struct device_node *device);
diff --git a/arch/powerpc/kernel/cacheinfo.c
b/arch/powerpc/kernel/cacheinfo.c
index 9262cf2..c60eef9 100644
--- a/arch/powerpc/kernel/cacheinfo.c
+++ b/arch/powerpc/kernel/cacheinfo.c
@@ -434,7 +434,7 @@ static struct cache
*cache_chain_instantiate(unsigned int cpu_id)

 	pr_debug("creating cache object(s) for CPU %i\n", cpu_id);

-	cpu_node = of_get_cpu_node(cpu_id, NULL);
+	cpu_node = of_get_cpu_node(cpu_id);
 	WARN_ONCE(!cpu_node, "no OF node found for CPU %i\n", cpu_id);
 	if (!cpu_node)
 		goto out;
@@ -764,7 +764,7 @@ static struct cache *cache_lookup_by_cpu(unsigned
int cpu_id)
 	struct device_node *cpu_node;
 	struct cache *cache;

-	cpu_node = of_get_cpu_node(cpu_id, NULL);
+	cpu_node = of_get_cpu_node(cpu_id);
 	WARN_ONCE(!cpu_node, "no OF node found for CPU %i\n", cpu_id);
 	if (!cpu_node)
 		return NULL;
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c
index af09e32..fe48a70 100644
--- a/arch/powerpc/kernel/prom.c
+++ b/arch/powerpc/kernel/prom.c
@@ -33,6 +33,7 @@
 #include <linux/irq.h>
 #include <linux/memblock.h>
 #include <linux/of.h>
+#include <linux/cpu.h>

 #include <asm/prom.h>
 #include <asm/rtas.h>
@@ -834,15 +835,23 @@ static int __init prom_reconfig_setup(void)
 __initcall(prom_reconfig_setup);
 #endif

+bool arch_match_cpu_phys_id(int cpu, u64 phys_id)
+{
+	return phys_id == get_hard_smp_processor_id(cpu);
+}
+
 /* Find the device node for a given logical cpu number, also returns
the cpu
  * local thread number (index in ibm,interrupt-server#s) if relevant and
  * asked for (non NULL)
  */
-struct device_node *of_get_cpu_node(int cpu, unsigned int *thread)
+struct device_node *arch_of_get_cpunode_by_tid(int cpu, unsigned int
*thread)
 {
 	int hardid;
 	struct device_node *np;

+	if (thread == NULL)
+		return of_get_cpu_node(cpu);
+
 	hardid = get_hard_smp_processor_id(cpu);

 	for_each_node_by_type(np, "cpu") {
@@ -855,14 +864,9 @@ struct device_node *of_get_cpu_node(int cpu,
unsigned int *thread)
 		intserv = of_get_property(np, "ibm,ppc-interrupt-server#s",
 				&plen);
 		if (intserv == NULL) {
-			const u32 *reg = of_get_property(np, "reg", NULL);
-			if (reg == NULL)
-				continue;
-			if (*reg == hardid) {
-				if (thread)
-					*thread = 0;
-				return np;
-			}
+			np = of_get_cpu_node(cpu);
+			*thread = 0;
+			return np;
 		} else {
 			plen /= sizeof(u32);
 			for (t = 0; t < plen; t++) {
@@ -876,7 +880,6 @@ struct device_node *of_get_cpu_node(int cpu,
unsigned int *thread)
 	}
 	return NULL;
 }
-EXPORT_SYMBOL(of_get_cpu_node);

 #if defined(CONFIG_DEBUG_FS) && defined(DEBUG)
 static struct debugfs_blob_wrapper flat_dt_blob;
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
index 38b0ba6..cc0e3a27 100644
--- a/arch/powerpc/kernel/smp.c
+++ b/arch/powerpc/kernel/smp.c
@@ -560,7 +560,7 @@ int cpu_to_core_id(int cpu)
 	const int *reg;
 	int id = -1;

-	np = of_get_cpu_node(cpu, NULL);
+	np = of_get_cpu_node(cpu);
 	if (!np)
 		goto out;

@@ -598,7 +598,7 @@ static struct device_node *cpu_to_l2cache(int cpu)
 	if (!cpu_present(cpu))
 		return NULL;

-	np = of_get_cpu_node(cpu, NULL);
+	np = of_get_cpu_node(cpu);
 	if (np == NULL)
 		return NULL;

diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
index 5850798..4b06158 100644
--- a/arch/powerpc/mm/numa.c
+++ b/arch/powerpc/mm/numa.c
@@ -520,7 +520,7 @@ static int of_drconf_to_nid_single(struct
of_drconf_cell *drmem,
 static int numa_setup_cpu(unsigned long lcpu)
 {
 	int nid = 0;
-	struct device_node *cpu = of_get_cpu_node(lcpu, NULL);
+	struct device_node *cpu = of_get_cpu_node(lcpu);

 	if (!cpu) {
 		WARN_ON(1);
@@ -699,7 +699,7 @@ static int __init parse_numa_properties(void)
 		struct device_node *cpu;
 		int nid;

-		cpu = of_get_cpu_node(i, NULL);
+		cpu = of_get_cpu_node(i);
 		BUG_ON(!cpu);
 		nid = of_node_to_nid_single(cpu);
 		of_node_put(cpu);
diff --git a/arch/powerpc/platforms/44x/currituck.c
b/arch/powerpc/platforms/44x/currituck.c
index 7f1b71a..84eb64e 100644
--- a/arch/powerpc/platforms/44x/currituck.c
+++ b/arch/powerpc/platforms/44x/currituck.c
@@ -98,7 +98,7 @@ static void smp_ppc47x_setup_cpu(int cpu)

 static int smp_ppc47x_kick_cpu(int cpu)
 {
-	struct device_node *cpunode = of_get_cpu_node(cpu, NULL);
+	struct device_node *cpunode = of_get_cpu_node(cpu);
 	const u64 *spin_table_addr_prop;
 	u32 *spin_table;
 	extern void start_secondary_47x(void);
diff --git a/arch/powerpc/platforms/44x/iss4xx.c
b/arch/powerpc/platforms/44x/iss4xx.c
index 4241bc8..8195456 100644
--- a/arch/powerpc/platforms/44x/iss4xx.c
+++ b/arch/powerpc/platforms/44x/iss4xx.c
@@ -88,7 +88,7 @@ static void smp_iss4xx_setup_cpu(int cpu)

 static int smp_iss4xx_kick_cpu(int cpu)
 {
-	struct device_node *cpunode = of_get_cpu_node(cpu, NULL);
+	struct device_node *cpunode = of_get_cpu_node(cpu);
 	const u64 *spin_table_addr_prop;
 	u32 *spin_table;
 	extern void start_secondary_47x(void);
diff --git a/arch/powerpc/platforms/85xx/smp.c
b/arch/powerpc/platforms/85xx/smp.c
index 5ced4f5..e32c532 100644
--- a/arch/powerpc/platforms/85xx/smp.c
+++ b/arch/powerpc/platforms/85xx/smp.c
@@ -156,7 +156,7 @@ static int smp_85xx_kick_cpu(int nr)

 	pr_debug("smp_85xx_kick_cpu: kick CPU #%d\n", nr);

-	np = of_get_cpu_node(nr, NULL);
+	np = of_get_cpu_node(nr);
 	cpu_rel_addr = of_get_property(np, "cpu-release-addr", NULL);

 	if (cpu_rel_addr == NULL) {
diff --git a/arch/powerpc/platforms/cell/cbe_regs.c
b/arch/powerpc/platforms/cell/cbe_regs.c
index 1428d58..a055b74 100644
--- a/arch/powerpc/platforms/cell/cbe_regs.c
+++ b/arch/powerpc/platforms/cell/cbe_regs.c
@@ -182,7 +182,7 @@ static struct device_node *cbe_get_be_node(int cpu_id)
 			return np;

 		for (i=0; i<len; i++)
-			if (of_find_node_by_phandle(cpu_handle[i]) ==
of_get_cpu_node(cpu_id, NULL))
+			if (of_find_node_by_phandle(cpu_handle[i]) == of_get_cpu_node(cpu_id))
 				return np;
 	}

@@ -240,7 +240,8 @@ void __init cbe_regs_init(void)

 	/* Build local fast map of CPUs */
 	for_each_possible_cpu(i) {
-		cbe_thread_map[i].cpu_node = of_get_cpu_node(i, &thread_id);
+		cbe_thread_map[i].cpu_node =
+				arch_of_get_cpunode_by_tid(i, &thread_id);
 		cbe_thread_map[i].be_node = cbe_get_be_node(i);
 		cbe_thread_map[i].thread_id = thread_id;
 	}
diff --git a/arch/powerpc/platforms/wsp/ics.c
b/arch/powerpc/platforms/wsp/ics.c
index 2d3b1dd..b83bc2e 100644
--- a/arch/powerpc/platforms/wsp/ics.c
+++ b/arch/powerpc/platforms/wsp/ics.c
@@ -137,7 +137,7 @@ void cpus_on_chip(int chip_id, cpumask_t *mask,
cpumask_t *ret)

 	cpumask_clear(ret);
 	for_each_cpu(cpu, mask) {
-		cpu_dn = of_get_cpu_node(cpu, NULL);
+		cpu_dn = of_get_cpu_node(cpu);
 		if (!cpu_dn)
 			continue;

@@ -649,7 +649,7 @@ static void __init wsp_ics_set_default_server(void)
 	u32 hwid;

 	/* Find the server number for the boot cpu. */
-	np = of_get_cpu_node(boot_cpuid, NULL);
+	np = of_get_cpu_node(boot_cpuid);
 	BUG_ON(!np);

 	hwid = get_hard_smp_processor_id(boot_cpuid);
diff --git a/arch/powerpc/platforms/wsp/smp.c
b/arch/powerpc/platforms/wsp/smp.c
index 332a18b..2abe794 100644
--- a/arch/powerpc/platforms/wsp/smp.c
+++ b/arch/powerpc/platforms/wsp/smp.c
@@ -40,7 +40,7 @@ int smp_a2_kick_cpu(int nr)
 	if (nr < 0 || nr >= NR_CPUS)
 		return -ENOENT;

-	np = of_get_cpu_node(nr, &thr_idx);
+	np = arch_of_get_cpunode_by_tid(nr, &thr_idx);
 	if (!np)
 		return -ENODEV;

diff --git a/arch/powerpc/platforms/wsp/wsp.c
b/arch/powerpc/platforms/wsp/wsp.c
index d25cc96..43a17a2 100644
--- a/arch/powerpc/platforms/wsp/wsp.c
+++ b/arch/powerpc/platforms/wsp/wsp.c
@@ -90,7 +90,7 @@ void wsp_halt(void)
 	struct device_node *mine;
 	struct device_node *me;

-	me = of_get_cpu_node(smp_processor_id(), NULL);
+	me = of_get_cpu_node(smp_processor_id());
 	mine = scom_find_parent(me);

 	/* This will halt all the A2s but not power off the chip */
diff --git a/arch/powerpc/sysdev/xics/xics-common.c
b/arch/powerpc/sysdev/xics/xics-common.c
index 9049d9f..d16082f 100644
--- a/arch/powerpc/sysdev/xics/xics-common.c
+++ b/arch/powerpc/sysdev/xics/xics-common.c
@@ -53,7 +53,7 @@ void xics_update_irq_servers(void)
 	u32 hcpuid;

 	/* Find the server numbers for the boot cpu. */
-	np = of_get_cpu_node(boot_cpuid, NULL);
+	np = of_get_cpu_node(boot_cpuid);
 	BUG_ON(!np);

 	hcpuid = get_hard_smp_processor_id(boot_cpuid);
diff --git a/drivers/cpufreq/pasemi-cpufreq.c
b/drivers/cpufreq/pasemi-cpufreq.c
index b704da4..692755f 100644
--- a/drivers/cpufreq/pasemi-cpufreq.c
+++ b/drivers/cpufreq/pasemi-cpufreq.c
@@ -149,7 +149,7 @@ static int pas_cpufreq_cpu_init(struct
cpufreq_policy *policy)
 	struct device_node *cpu, *dn;
 	int err = -ENODEV;

-	cpu = of_get_cpu_node(policy->cpu, NULL);
+	cpu = of_get_cpu_node(policy->cpu);

 	if (!cpu)
 		goto out;
diff --git a/drivers/cpufreq/ppc-corenet-cpufreq.c
b/drivers/cpufreq/ppc-corenet-cpufreq.c
index 3cae452..64fb70a 100644
--- a/drivers/cpufreq/ppc-corenet-cpufreq.c
+++ b/drivers/cpufreq/ppc-corenet-cpufreq.c
@@ -150,7 +150,7 @@ static int corenet_cpufreq_cpu_init(struct
cpufreq_policy *policy)
 	struct cpu_data *data;
 	unsigned int cpu = policy->cpu;

-	np = of_get_cpu_node(cpu, NULL);
+	np = of_get_cpu_node(cpu);
 	if (!np)
 		return -ENODEV;

diff --git a/drivers/cpufreq/ppc_cbe_cpufreq.c
b/drivers/cpufreq/ppc_cbe_cpufreq.c
index 5936f8d..0700445 100644
--- a/drivers/cpufreq/ppc_cbe_cpufreq.c
+++ b/drivers/cpufreq/ppc_cbe_cpufreq.c
@@ -75,7 +75,7 @@ static int cbe_cpufreq_cpu_init(struct cpufreq_policy
*policy)
 	int i, cur_pmode;
 	struct device_node *cpu;

-	cpu = of_get_cpu_node(policy->cpu, NULL);
+	cpu = of_get_cpu_node(policy->cpu);

 	if (!cpu)
