]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/of/fdt.c
Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[karo-tx-linux.git] / drivers / of / fdt.c
index a0972219ccfc5fccee139c46d9f4fd97445973e2..43bd69dceabfd36b43368366b8afdc9fa2b30106 100644 (file)
@@ -507,6 +507,9 @@ void *__unflatten_device_tree(const void *blob,
 
        /* Allocate memory for the expanded device tree */
        mem = dt_alloc(size + 4, __alignof__(struct device_node));
+       if (!mem)
+               return NULL;
+
        memset(mem, 0, size);
 
        *(__be32 *)(mem + size) = cpu_to_be32(0xdeadbeef);
@@ -755,6 +758,36 @@ int __init of_scan_flat_dt(int (*it)(unsigned long node,
        return rc;
 }
 
+/**
+ * of_scan_flat_dt_subnodes - scan sub-nodes of a node call callback on each.
+ * @it: callback function
+ * @data: context data pointer
+ *
+ * This function is used to scan sub-nodes of a node.
+ */
+int __init of_scan_flat_dt_subnodes(unsigned long parent,
+                                   int (*it)(unsigned long node,
+                                             const char *uname,
+                                             void *data),
+                                   void *data)
+{
+       const void *blob = initial_boot_params;
+       int node;
+
+       fdt_for_each_subnode(node, blob, parent) {
+               const char *pathp;
+               int rc;
+
+               pathp = fdt_get_name(blob, node, NULL);
+               if (*pathp == '/')
+                       pathp = kbasename(pathp);
+               rc = it(node, pathp, data);
+               if (rc)
+                       return rc;
+       }
+       return 0;
+}
+
 /**
  * of_get_flat_dt_subnode_by_name - get the subnode by given name
  *
@@ -814,6 +847,14 @@ int __init of_flat_dt_match(unsigned long node, const char *const *compat)
        return of_fdt_match(initial_boot_params, node, compat);
 }
 
+/**
+ * of_get_flat_dt_prop - Given a node in the flat blob, return the phandle
+ */
+uint32_t __init of_get_flat_dt_phandle(unsigned long node)
+{
+       return fdt_get_phandle(initial_boot_params, node);
+}
+
 struct fdt_scan_status {
        const char *name;
        int namelen;