acpi-wmi: unsigned cannot be less than 0
[safe/jmp/linux-2.6] / drivers / of / base.c
index 4270eb4..cd17092 100644 (file)
@@ -329,6 +329,41 @@ struct device_node *of_find_compatible_node(struct device_node *from,
 EXPORT_SYMBOL(of_find_compatible_node);
 
 /**
+ *     of_find_node_with_property - Find a node which has a property with
+ *                                   the given name.
+ *     @from:          The node to start searching from or NULL, the node
+ *                     you pass will not be searched, only the next one
+ *                     will; typically, you pass what the previous call
+ *                     returned. of_node_put() will be called on it
+ *     @prop_name:     The name of the property to look for.
+ *
+ *     Returns a node pointer with refcount incremented, use
+ *     of_node_put() on it when done.
+ */
+struct device_node *of_find_node_with_property(struct device_node *from,
+       const char *prop_name)
+{
+       struct device_node *np;
+       struct property *pp;
+
+       read_lock(&devtree_lock);
+       np = from ? from->allnext : allnodes;
+       for (; np; np = np->allnext) {
+               for (pp = np->properties; pp != 0; pp = pp->next) {
+                       if (of_prop_cmp(pp->name, prop_name) == 0) {
+                               of_node_get(np);
+                               goto out;
+                       }
+               }
+       }
+out:
+       of_node_put(from);
+       read_unlock(&devtree_lock);
+       return np;
+}
+EXPORT_SYMBOL(of_find_node_with_property);
+
+/**
  * of_match_node - Tell if an device_node has a matching of_match structure
  *     @matches:       array of of device match structures to search in
  *     @node:          the of device structure to match against
@@ -410,7 +445,7 @@ struct of_modalias_table {
        char *modalias;
 };
 static struct of_modalias_table of_modalias_table[] = {
-       /* Empty for now; add entries as needed */
+       { "fsl,mcu-mpc8349emitx", "mcu-mpc8349emitx" },
 };
 
 /**
@@ -464,8 +499,8 @@ EXPORT_SYMBOL_GPL(of_modalias_node);
  * @list_name: property name that contains a list
  * @cells_name:        property name that specifies phandles' arguments count
  * @index:     index of a phandle to parse out
- * @out_node:  pointer to device_node struct pointer (will be filled)
- * @out_args:  pointer to arguments pointer (will be filled)
+ * @out_node:  optional pointer to device_node struct pointer (will be filled)
+ * @out_args:  optional pointer to arguments pointer (will be filled)
  *
  * This function is useful to parse lists of phandles and their arguments.
  * Returns 0 on success and fills out_node and out_args, on error returns
@@ -499,7 +534,7 @@ int of_parse_phandles_with_args(struct device_node *np, const char *list_name,
        int size;
        int cur_index = 0;
        struct device_node *node = NULL;
-       const void *args;
+       const void *args = NULL;
 
        list = of_get_property(np, list_name, &size);
        if (!list) {
@@ -512,14 +547,12 @@ int of_parse_phandles_with_args(struct device_node *np, const char *list_name,
                const u32 *cells;
                const phandle *phandle;
 
-               phandle = list;
-               args = list + 1;
+               phandle = list++;
+               args = list;
 
                /* one cell hole in the list = <>; */
-               if (!*phandle) {
-                       list++;
+               if (!*phandle)
                        goto next;
-               }
 
                node = of_find_node_by_phandle(*phandle);
                if (!node) {
@@ -535,8 +568,7 @@ int of_parse_phandles_with_args(struct device_node *np, const char *list_name,
                        goto err1;
                }
 
-               /* Next phandle is at offset of one phandle cell + #cells */
-               list += 1 + *cells;
+               list += *cells;
                if (list > list_end) {
                        pr_debug("%s: insufficient arguments length\n",
                                 np->full_name);
@@ -548,16 +580,26 @@ next:
 
                of_node_put(node);
                node = NULL;
+               args = NULL;
                cur_index++;
        }
 
        if (!node) {
-               ret = -ENOENT;
+               /*
+                * args w/o node indicates that the loop above has stopped at
+                * the 'hole' cell. Report this differently.
+                */
+               if (args)
+                       ret = -EEXIST;
+               else
+                       ret = -ENOENT;
                goto err0;
        }
 
-       *out_node = node;
-       *out_args = args;
+       if (out_node)
+               *out_node = node;
+       if (out_args)
+               *out_args = args;
 
        return 0;
 err1: