diff options
| author | Benoit Cousson <b-cousson@ti.com> | 2011-09-27 11:45:43 -0400 |
|---|---|---|
| committer | Kevin Hilman <khilman@ti.com> | 2011-10-04 12:52:23 -0400 |
| commit | 4fcd15a032cec4b2684a32c86e895b50cdbee50c (patch) | |
| tree | 21f86422ba269e5ddec5916fbd88bc294e9d7451 /drivers | |
| parent | f718e2c034bf6ff872106344935006230764cb12 (diff) | |
of: Add helpers to get one string in multiple strings property
Add of_property_read_string_index and of_property_count_strings
to retrieve one string inside a property that will contains
severals strings.
Signed-off-by: Benoit Cousson <b-cousson@ti.com>
Acked-by: Grant Likely <grant.likely@secretlab.ca>
Signed-off-by: Kevin Hilman <khilman@ti.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/of/base.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/drivers/of/base.c b/drivers/of/base.c index 3ff22e32b602..f7239b33d762 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c | |||
| @@ -662,6 +662,90 @@ int of_property_read_string(struct device_node *np, const char *propname, | |||
| 662 | EXPORT_SYMBOL_GPL(of_property_read_string); | 662 | EXPORT_SYMBOL_GPL(of_property_read_string); |
| 663 | 663 | ||
| 664 | /** | 664 | /** |
| 665 | * of_property_read_string_index - Find and read a string from a multiple | ||
| 666 | * strings property. | ||
| 667 | * @np: device node from which the property value is to be read. | ||
| 668 | * @propname: name of the property to be searched. | ||
| 669 | * @index: index of the string in the list of strings | ||
| 670 | * @out_string: pointer to null terminated return string, modified only if | ||
| 671 | * return value is 0. | ||
| 672 | * | ||
| 673 | * Search for a property in a device tree node and retrieve a null | ||
| 674 | * terminated string value (pointer to data, not a copy) in the list of strings | ||
| 675 | * contained in that property. | ||
| 676 | * Returns 0 on success, -EINVAL if the property does not exist, -ENODATA if | ||
| 677 | * property does not have a value, and -EILSEQ if the string is not | ||
| 678 | * null-terminated within the length of the property data. | ||
| 679 | * | ||
| 680 | * The out_string pointer is modified only if a valid string can be decoded. | ||
| 681 | */ | ||
| 682 | int of_property_read_string_index(struct device_node *np, const char *propname, | ||
| 683 | int index, const char **output) | ||
| 684 | { | ||
| 685 | struct property *prop = of_find_property(np, propname, NULL); | ||
| 686 | int i = 0; | ||
| 687 | size_t l = 0, total = 0; | ||
| 688 | const char *p; | ||
| 689 | |||
| 690 | if (!prop) | ||
| 691 | return -EINVAL; | ||
| 692 | if (!prop->value) | ||
| 693 | return -ENODATA; | ||
| 694 | if (strnlen(prop->value, prop->length) >= prop->length) | ||
| 695 | return -EILSEQ; | ||
| 696 | |||
| 697 | p = prop->value; | ||
| 698 | |||
| 699 | for (i = 0; total < prop->length; total += l, p += l) { | ||
| 700 | l = strlen(p) + 1; | ||
| 701 | if ((*p != 0) && (i++ == index)) { | ||
| 702 | *output = p; | ||
| 703 | return 0; | ||
| 704 | } | ||
| 705 | } | ||
| 706 | return -ENODATA; | ||
| 707 | } | ||
| 708 | EXPORT_SYMBOL_GPL(of_property_read_string_index); | ||
| 709 | |||
| 710 | |||
| 711 | /** | ||
| 712 | * of_property_count_strings - Find and return the number of strings from a | ||
| 713 | * multiple strings property. | ||
| 714 | * @np: device node from which the property value is to be read. | ||
| 715 | * @propname: name of the property to be searched. | ||
| 716 | * | ||
| 717 | * Search for a property in a device tree node and retrieve the number of null | ||
| 718 | * terminated string contain in it. Returns the number of strings on | ||
| 719 | * success, -EINVAL if the property does not exist, -ENODATA if property | ||
| 720 | * does not have a value, and -EILSEQ if the string is not null-terminated | ||
| 721 | * within the length of the property data. | ||
| 722 | */ | ||
| 723 | int of_property_count_strings(struct device_node *np, const char *propname) | ||
| 724 | { | ||
| 725 | struct property *prop = of_find_property(np, propname, NULL); | ||
| 726 | int i = 0; | ||
| 727 | size_t l = 0, total = 0; | ||
| 728 | const char *p; | ||
| 729 | |||
| 730 | if (!prop) | ||
| 731 | return -EINVAL; | ||
| 732 | if (!prop->value) | ||
| 733 | return -ENODATA; | ||
| 734 | if (strnlen(prop->value, prop->length) >= prop->length) | ||
| 735 | return -EILSEQ; | ||
| 736 | |||
| 737 | p = prop->value; | ||
| 738 | |||
| 739 | for (i = 0; total < prop->length; total += l, p += l) { | ||
| 740 | l = strlen(p) + 1; | ||
| 741 | if (*p != 0) | ||
| 742 | i++; | ||
| 743 | } | ||
| 744 | return i; | ||
| 745 | } | ||
| 746 | EXPORT_SYMBOL_GPL(of_property_count_strings); | ||
| 747 | |||
| 748 | /** | ||
| 665 | * of_parse_phandle - Resolve a phandle property to a device_node pointer | 749 | * of_parse_phandle - Resolve a phandle property to a device_node pointer |
| 666 | * @np: Pointer to device node holding phandle property | 750 | * @np: Pointer to device node holding phandle property |
| 667 | * @phandle_name: Name of property holding a phandle value | 751 | * @phandle_name: Name of property holding a phandle value |
