aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorNathan Lynch <ntl@pobox.com>2008-12-10 09:46:04 -0500
committerPaul Mackerras <paulus@samba.org>2008-12-20 22:21:14 -0500
commite523f723d69cde44e10116d7f49b277da0c6702c (patch)
treedc6443159ddfe4965264593c9f493f927e8b1d52 /arch
parent749820928a2fd47ff536773d869d2c3f8038b7d1 (diff)
powerpc: Add of_find_next_cache_node()
We have more than one piece of code that looks up cache nodes manually using the "l2-cache" property. Add a common helper routine which does this and handles ePAPR's "next-level-cache" property as well as powermac. Signed-off-by: Nathan Lynch <ntl@pobox.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/include/asm/prom.h3
-rw-r--r--arch/powerpc/kernel/prom.c31
2 files changed, 34 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/prom.h b/arch/powerpc/include/asm/prom.h
index eb3bd2e1c7f6..6ff04185d2aa 100644
--- a/arch/powerpc/include/asm/prom.h
+++ b/arch/powerpc/include/asm/prom.h
@@ -253,6 +253,9 @@ extern void kdump_move_device_tree(void);
253/* CPU OF node matching */ 253/* CPU OF node matching */
254struct device_node *of_get_cpu_node(int cpu, unsigned int *thread); 254struct device_node *of_get_cpu_node(int cpu, unsigned int *thread);
255 255
256/* cache lookup */
257struct device_node *of_find_next_cache_node(struct device_node *np);
258
256/* Get the MAC address */ 259/* Get the MAC address */
257extern const void *of_get_mac_address(struct device_node *np); 260extern const void *of_get_mac_address(struct device_node *np);
258 261
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c
index 3a2dc7e6586a..d8266dd61dda 100644
--- a/arch/powerpc/kernel/prom.c
+++ b/arch/powerpc/kernel/prom.c
@@ -1271,6 +1271,37 @@ struct device_node *of_find_node_by_phandle(phandle handle)
1271EXPORT_SYMBOL(of_find_node_by_phandle); 1271EXPORT_SYMBOL(of_find_node_by_phandle);
1272 1272
1273/** 1273/**
1274 * of_find_next_cache_node - Find a node's subsidiary cache
1275 * @np: node of type "cpu" or "cache"
1276 *
1277 * Returns a node pointer with refcount incremented, use
1278 * of_node_put() on it when done. Caller should hold a reference
1279 * to np.
1280 */
1281struct device_node *of_find_next_cache_node(struct device_node *np)
1282{
1283 struct device_node *child;
1284 const phandle *handle;
1285
1286 handle = of_get_property(np, "l2-cache", NULL);
1287 if (!handle)
1288 handle = of_get_property(np, "next-level-cache", NULL);
1289
1290 if (handle)
1291 return of_find_node_by_phandle(*handle);
1292
1293 /* OF on pmac has nodes instead of properties named "l2-cache"
1294 * beneath CPU nodes.
1295 */
1296 if (!strcmp(np->type, "cpu"))
1297 for_each_child_of_node(np, child)
1298 if (!strcmp(child->type, "cache"))
1299 return child;
1300
1301 return NULL;
1302}
1303
1304/**
1274 * of_find_all_nodes - Get next node in global list 1305 * of_find_all_nodes - Get next node in global list
1275 * @prev: Previous node or NULL to start iteration 1306 * @prev: Previous node or NULL to start iteration
1276 * of_node_put() will be called on it 1307 * of_node_put() will be called on it