|
@@ -661,6 +661,90 @@ int of_property_read_string(struct device_node *np, const char *propname,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(of_property_read_string);
|
|
|
|
|
|
+/**
|
|
|
+ * of_property_read_string_index - Find and read a string from a multiple
|
|
|
+ * strings property.
|
|
|
+ * @np: device node from which the property value is to be read.
|
|
|
+ * @propname: name of the property to be searched.
|
|
|
+ * @index: index of the string in the list of strings
|
|
|
+ * @out_string: pointer to null terminated return string, modified only if
|
|
|
+ * return value is 0.
|
|
|
+ *
|
|
|
+ * Search for a property in a device tree node and retrieve a null
|
|
|
+ * terminated string value (pointer to data, not a copy) in the list of strings
|
|
|
+ * contained in that property.
|
|
|
+ * Returns 0 on success, -EINVAL if the property does not exist, -ENODATA if
|
|
|
+ * property does not have a value, and -EILSEQ if the string is not
|
|
|
+ * null-terminated within the length of the property data.
|
|
|
+ *
|
|
|
+ * The out_string pointer is modified only if a valid string can be decoded.
|
|
|
+ */
|
|
|
+int of_property_read_string_index(struct device_node *np, const char *propname,
|
|
|
+ int index, const char **output)
|
|
|
+{
|
|
|
+ struct property *prop = of_find_property(np, propname, NULL);
|
|
|
+ int i = 0;
|
|
|
+ size_t l = 0, total = 0;
|
|
|
+ const char *p;
|
|
|
+
|
|
|
+ if (!prop)
|
|
|
+ return -EINVAL;
|
|
|
+ if (!prop->value)
|
|
|
+ return -ENODATA;
|
|
|
+ if (strnlen(prop->value, prop->length) >= prop->length)
|
|
|
+ return -EILSEQ;
|
|
|
+
|
|
|
+ p = prop->value;
|
|
|
+
|
|
|
+ for (i = 0; total < prop->length; total += l, p += l) {
|
|
|
+ l = strlen(p) + 1;
|
|
|
+ if ((*p != 0) && (i++ == index)) {
|
|
|
+ *output = p;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return -ENODATA;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(of_property_read_string_index);
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * of_property_count_strings - Find and return the number of strings from a
|
|
|
+ * multiple strings property.
|
|
|
+ * @np: device node from which the property value is to be read.
|
|
|
+ * @propname: name of the property to be searched.
|
|
|
+ *
|
|
|
+ * Search for a property in a device tree node and retrieve the number of null
|
|
|
+ * terminated string contain in it. Returns the number of strings on
|
|
|
+ * success, -EINVAL if the property does not exist, -ENODATA if property
|
|
|
+ * does not have a value, and -EILSEQ if the string is not null-terminated
|
|
|
+ * within the length of the property data.
|
|
|
+ */
|
|
|
+int of_property_count_strings(struct device_node *np, const char *propname)
|
|
|
+{
|
|
|
+ struct property *prop = of_find_property(np, propname, NULL);
|
|
|
+ int i = 0;
|
|
|
+ size_t l = 0, total = 0;
|
|
|
+ const char *p;
|
|
|
+
|
|
|
+ if (!prop)
|
|
|
+ return -EINVAL;
|
|
|
+ if (!prop->value)
|
|
|
+ return -ENODATA;
|
|
|
+ if (strnlen(prop->value, prop->length) >= prop->length)
|
|
|
+ return -EILSEQ;
|
|
|
+
|
|
|
+ p = prop->value;
|
|
|
+
|
|
|
+ for (i = 0; total < prop->length; total += l, p += l) {
|
|
|
+ l = strlen(p) + 1;
|
|
|
+ if (*p != 0)
|
|
|
+ i++;
|
|
|
+ }
|
|
|
+ return i;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(of_property_count_strings);
|
|
|
+
|
|
|
/**
|
|
|
* of_parse_phandle - Resolve a phandle property to a device_node pointer
|
|
|
* @np: Pointer to device node holding phandle property
|