#include <linux/cpu.h>
 #include <linux/module.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/of_graph.h>
 #include <linux/spinlock.h>
 #include <linux/slab.h>
        return NULL;
 }
 
+/**
+ * of_find_last_cache_level - Find the level at which the last cache is
+ *             present for the given logical cpu
+ *
+ * @cpu: cpu number(logical index) for which the last cache level is needed
+ *
+ * Returns the the level at which the last cache is present. It is exactly
+ * same as  the total number of cache levels for the given logical cpu.
+ */
+int of_find_last_cache_level(unsigned int cpu)
+{
+       u32 cache_level = 0;
+       struct device_node *prev = NULL, *np = of_cpu_device_node_get(cpu);
+
+       while (np) {
+               prev = np;
+               of_node_put(np);
+               np = of_find_next_cache_node(np);
+       }
+
+       of_property_read_u32(prev, "cache-level", &cache_level);
+
+       return cache_level;
+}
+
 /**
  * of_graph_parse_endpoint() - parse common endpoint node properties
  * @node: pointer to endpoint device_node
 
 
 /* cache lookup */
 extern struct device_node *of_find_next_cache_node(const struct device_node *);
+extern int of_find_last_cache_level(unsigned int cpu);
 extern struct device_node *of_find_node_with_property(
        struct device_node *from, const char *prop_name);