124 lines
3.6 KiB
Diff
124 lines
3.6 KiB
Diff
|
From 66586baba56679baa2da1a10a96ccf15b1e96b95 Mon Sep 17 00:00:00 2001
|
||
|
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||
|
Date: Mon, 30 Nov 2015 17:11:32 +0200
|
||
|
Subject: [PATCH 04/16] 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: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||
|
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||
|
---
|
||
|
drivers/base/property.c | 33 ++++++++++++++++++++++++++++++---
|
||
|
include/linux/property.h | 31 +++++++++++++++++++++++--------
|
||
|
2 files changed, 53 insertions(+), 11 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/base/property.c b/drivers/base/property.c
|
||
|
index 86834bd..ad3cb09 100644
|
||
|
--- a/drivers/base/property.c
|
||
|
+++ b/drivers/base/property.c
|
||
|
@@ -72,7 +72,10 @@ static void *pset_prop_find(struct property_set *pset, const char *propname,
|
||
|
prop = pset_prop_get(pset, propname);
|
||
|
if (!prop)
|
||
|
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)
|
||
|
return ERR_PTR(-ENODATA);
|
||
|
if (length > prop->length)
|
||
|
@@ -167,6 +170,31 @@ static int pset_prop_read_string_array(struct property_set *pset,
|
||
|
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)
|
||
|
{
|
||
|
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,
|
||
|
val, 1);
|
||
|
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;
|
||
|
}
|
||
|
EXPORT_SYMBOL_GPL(fwnode_property_read_string);
|
||
|
diff --git a/include/linux/property.h b/include/linux/property.h
|
||
|
index c29460a..69a8a08 100644
|
||
|
--- a/include/linux/property.h
|
||
|
+++ b/include/linux/property.h
|
||
|
@@ -145,19 +145,34 @@ static inline int fwnode_property_read_u64(struct fwnode_handle *fwnode,
|
||
|
* struct property_entry - "Built-in" device property representation.
|
||
|
* @name: Name of the property.
|
||
|
* @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 {
|
||
|
const char *name;
|
||
|
size_t length;
|
||
|
+ bool is_array;
|
||
|
+ bool is_string;
|
||
|
union {
|
||
|
- void *raw_data;
|
||
|
- u8 *u8_data;
|
||
|
- u16 *u16_data;
|
||
|
- u32 *u32_data;
|
||
|
- u64 *u64_data;
|
||
|
- const char **str;
|
||
|
- } value;
|
||
|
+ union {
|
||
|
+ void *raw_data;
|
||
|
+ u8 *u8_data;
|
||
|
+ u16 *u16_data;
|
||
|
+ u32 *u32_data;
|
||
|
+ u64 *u64_data;
|
||
|
+ 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;
|
||
|
+ };
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
--
|
||
|
2.5.0
|
||
|
|