|
@@ -1270,6 +1270,37 @@ struct device_node *of_find_node_by_phandle(phandle handle)
|
|
|
}
|
|
|
EXPORT_SYMBOL(of_find_node_by_phandle);
|
|
|
|
|
|
+/**
|
|
|
+ * of_find_next_cache_node - Find a node's subsidiary cache
|
|
|
+ * @np: node of type "cpu" or "cache"
|
|
|
+ *
|
|
|
+ * Returns a node pointer with refcount incremented, use
|
|
|
+ * of_node_put() on it when done. Caller should hold a reference
|
|
|
+ * to np.
|
|
|
+ */
|
|
|
+struct device_node *of_find_next_cache_node(struct device_node *np)
|
|
|
+{
|
|
|
+ struct device_node *child;
|
|
|
+ const phandle *handle;
|
|
|
+
|
|
|
+ handle = of_get_property(np, "l2-cache", NULL);
|
|
|
+ if (!handle)
|
|
|
+ handle = of_get_property(np, "next-level-cache", NULL);
|
|
|
+
|
|
|
+ if (handle)
|
|
|
+ return of_find_node_by_phandle(*handle);
|
|
|
+
|
|
|
+ /* OF on pmac has nodes instead of properties named "l2-cache"
|
|
|
+ * beneath CPU nodes.
|
|
|
+ */
|
|
|
+ if (!strcmp(np->type, "cpu"))
|
|
|
+ for_each_child_of_node(np, child)
|
|
|
+ if (!strcmp(child->type, "cache"))
|
|
|
+ return child;
|
|
|
+
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* of_find_all_nodes - Get next node in global list
|
|
|
* @prev: Previous node or NULL to start iteration
|