aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Vorontsov <avorontsov@ru.mvista.com>2008-12-05 03:15:46 -0500
committerPaul Mackerras <paulus@samba.org>2008-12-20 22:21:14 -0500
commit7736a3db98bed028d0e5235f8958a730acfd822e (patch)
tree27ab46e431b71294c24dbbf721bdbc581f977f14
parentc1bb7c6d04ebdf48998649100c5267a9139debf5 (diff)
of: of_parse_phandles_with_args() learns to differentiate 'hole' cells
Given this list (contains three gpio specifiers, one of which is a hole): gpios = <&phandle1 1 2 3 0 /* a hole */ &phandle2 4 5 6>; of_parse_phandles_with_args() would report -ENOENT for the `hole' specifier item, the same error value is used to report the end of the list, for example. Sometimes we want to differentiate holes from real errors -- for example when we want to count all the [syntax correct] specifiers. With this patch of_parse_phandles_with_args() will report -EEXITS when somebody requested to parse a hole. Also, make the out_{node,args} arguments optional, when counting we don't really need the out values. Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r--drivers/of/base.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/drivers/of/base.c b/drivers/of/base.c
index cf04d4dd4a5..cd17092b82b 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -499,8 +499,8 @@ EXPORT_SYMBOL_GPL(of_modalias_node);
499 * @list_name: property name that contains a list 499 * @list_name: property name that contains a list
500 * @cells_name: property name that specifies phandles' arguments count 500 * @cells_name: property name that specifies phandles' arguments count
501 * @index: index of a phandle to parse out 501 * @index: index of a phandle to parse out
502 * @out_node: pointer to device_node struct pointer (will be filled) 502 * @out_node: optional pointer to device_node struct pointer (will be filled)
503 * @out_args: pointer to arguments pointer (will be filled) 503 * @out_args: optional pointer to arguments pointer (will be filled)
504 * 504 *
505 * This function is useful to parse lists of phandles and their arguments. 505 * This function is useful to parse lists of phandles and their arguments.
506 * Returns 0 on success and fills out_node and out_args, on error returns 506 * Returns 0 on success and fills out_node and out_args, on error returns
@@ -534,7 +534,7 @@ int of_parse_phandles_with_args(struct device_node *np, const char *list_name,
534 int size; 534 int size;
535 int cur_index = 0; 535 int cur_index = 0;
536 struct device_node *node = NULL; 536 struct device_node *node = NULL;
537 const void *args; 537 const void *args = NULL;
538 538
539 list = of_get_property(np, list_name, &size); 539 list = of_get_property(np, list_name, &size);
540 if (!list) { 540 if (!list) {
@@ -580,16 +580,26 @@ next:
580 580
581 of_node_put(node); 581 of_node_put(node);
582 node = NULL; 582 node = NULL;
583 args = NULL;
583 cur_index++; 584 cur_index++;
584 } 585 }
585 586
586 if (!node) { 587 if (!node) {
587 ret = -ENOENT; 588 /*
589 * args w/o node indicates that the loop above has stopped at
590 * the 'hole' cell. Report this differently.
591 */
592 if (args)
593 ret = -EEXIST;
594 else
595 ret = -ENOENT;
588 goto err0; 596 goto err0;
589 } 597 }
590 598
591 *out_node = node; 599 if (out_node)
592 *out_args = args; 600 *out_node = node;
601 if (out_args)
602 *out_args = args;
593 603
594 return 0; 604 return 0;
595err1: 605err1: