Commit 66586bab authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Rafael J. Wysocki

device property: keep single value inplace

We may save a lot of lines of code and space by keeping single values inside
the struct property_entry. Refactor the implementation to do so.
Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 318a1971
...@@ -72,7 +72,10 @@ static void *pset_prop_find(struct property_set *pset, const char *propname, ...@@ -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, ...@@ -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, ...@@ -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), return pset_prop_read_string(to_pset_node(fwnode), propname, val);
propname, val, 1);
return -ENXIO; return -ENXIO;
} }
EXPORT_SYMBOL_GPL(fwnode_property_read_string); EXPORT_SYMBOL_GPL(fwnode_property_read_string);
......
...@@ -145,19 +145,34 @@ static inline int fwnode_property_read_u64(struct fwnode_handle *fwnode, ...@@ -145,19 +145,34 @@ static inline int fwnode_property_read_u64(struct fwnode_handle *fwnode,
* struct property_entry - "Built-in" device property representation. * struct property_entry - "Built-in" device property representation.
* @name: Name of the property. * @name: Name of the property.
* @length: Length of data making up the value. * @length: Length of data making up the value.
* @value: Value of the property (an array of items of the given type). * @is_array: True when the property is an array.
* @is_string: True when property is a string.
* @pointer: Pointer to the property (an array of items of the given type).
* @value: Value of the property (when it is a single item of the given type).
*/ */
struct property_entry { struct property_entry {
const char *name; const char *name;
size_t length; size_t length;
bool is_array;
bool is_string;
union { union {
void *raw_data; union {
u8 *u8_data; void *raw_data;
u16 *u16_data; u8 *u8_data;
u32 *u32_data; u16 *u16_data;
u64 *u64_data; u32 *u32_data;
const char **str; u64 *u64_data;
} value; const char **str;
} pointer;
union {
unsigned long long raw_data;
u8 u8_data;
u16 u16_data;
u32 u32_data;
u64 u64_data;
const char *str;
} value;
};
}; };
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment