|
@@ -72,7 +72,10 @@ static void *pset_prop_find(struct property_set *pset, const char *propname,
|
|
prop = pset_prop_get(pset, propname);
|
|
prop = pset_prop_get(pset, propname);
|
|
if (!prop)
|
|
if (!prop)
|
|
return ERR_PTR(-EINVAL);
|
|
return ERR_PTR(-EINVAL);
|
|
- pointer = prop->value.raw_data;
|
|
|
|
|
|
+ if (prop->is_array)
|
|
|
|
+ pointer = prop->pointer.raw_data;
|
|
|
|
+ else
|
|
|
|
+ pointer = &prop->value.raw_data;
|
|
if (!pointer)
|
|
if (!pointer)
|
|
return ERR_PTR(-ENODATA);
|
|
return ERR_PTR(-ENODATA);
|
|
if (length > prop->length)
|
|
if (length > prop->length)
|
|
@@ -167,6 +170,31 @@ static int pset_prop_read_string_array(struct property_set *pset,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int pset_prop_read_string(struct property_set *pset,
|
|
|
|
+ const char *propname, const char **strings)
|
|
|
|
+{
|
|
|
|
+ struct property_entry *prop;
|
|
|
|
+ const char **pointer;
|
|
|
|
+
|
|
|
|
+ prop = pset_prop_get(pset, propname);
|
|
|
|
+ if (!prop)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ if (!prop->is_string)
|
|
|
|
+ return -EILSEQ;
|
|
|
|
+ if (prop->is_array) {
|
|
|
|
+ pointer = prop->pointer.str;
|
|
|
|
+ if (!pointer)
|
|
|
|
+ return -ENODATA;
|
|
|
|
+ } else {
|
|
|
|
+ pointer = &prop->value.str;
|
|
|
|
+ if (*pointer && strnlen(*pointer, prop->length) >= prop->length)
|
|
|
|
+ return -EILSEQ;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ *strings = *pointer;
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static inline struct fwnode_handle *dev_fwnode(struct device *dev)
|
|
static inline struct fwnode_handle *dev_fwnode(struct device *dev)
|
|
{
|
|
{
|
|
return IS_ENABLED(CONFIG_OF) && dev->of_node ?
|
|
return IS_ENABLED(CONFIG_OF) && dev->of_node ?
|
|
@@ -566,8 +594,7 @@ int fwnode_property_read_string(struct fwnode_handle *fwnode,
|
|
return acpi_node_prop_read(fwnode, propname, DEV_PROP_STRING,
|
|
return acpi_node_prop_read(fwnode, propname, DEV_PROP_STRING,
|
|
val, 1);
|
|
val, 1);
|
|
else if (is_pset_node(fwnode))
|
|
else if (is_pset_node(fwnode))
|
|
- return pset_prop_read_string_array(to_pset_node(fwnode),
|
|
|
|
- propname, val, 1);
|
|
|
|
|
|
+ return pset_prop_read_string(to_pset_node(fwnode), propname, val);
|
|
return -ENXIO;
|
|
return -ENXIO;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(fwnode_property_read_string);
|
|
EXPORT_SYMBOL_GPL(fwnode_property_read_string);
|