* [PATCH v4 01/14] software node: remove DEV_PROP_MAX
2019-09-11 5:12 [PATCH v4 00/14] software node: add support for reference properties Dmitry Torokhov
@ 2019-09-11 5:12 ` Dmitry Torokhov
2019-09-11 5:12 ` [PATCH v4 02/14] software node: introduce PROPERTY_ENTRY_ARRAY_XXX_LEN() Dmitry Torokhov
` (13 subsequent siblings)
14 siblings, 0 replies; 21+ messages in thread
From: Dmitry Torokhov @ 2019-09-11 5:12 UTC (permalink / raw)
To: Rafael J. Wysocki, Heikki Krogerus
Cc: Andy Shevchenko, Linus Walleij, linux-kernel, platform-driver-x86
This definition is not used anywhere, let's remove it.
Suggested-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
include/linux/property.h | 1 -
1 file changed, 1 deletion(-)
diff --git a/include/linux/property.h b/include/linux/property.h
index 9b3d4ca3a73a..44c1704f7163 100644
--- a/include/linux/property.h
+++ b/include/linux/property.h
@@ -22,7 +22,6 @@ enum dev_prop_type {
DEV_PROP_U32,
DEV_PROP_U64,
DEV_PROP_STRING,
- DEV_PROP_MAX,
};
enum dev_dma_attr {
--
2.23.0.162.g0b9fbb3734-goog
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 02/14] software node: introduce PROPERTY_ENTRY_ARRAY_XXX_LEN()
2019-09-11 5:12 [PATCH v4 00/14] software node: add support for reference properties Dmitry Torokhov
2019-09-11 5:12 ` [PATCH v4 01/14] software node: remove DEV_PROP_MAX Dmitry Torokhov
@ 2019-09-11 5:12 ` Dmitry Torokhov
2019-09-11 5:12 ` [PATCH v4 03/14] efi/apple-properties: use PROPERTY_ENTRY_U8_ARRAY_LEN Dmitry Torokhov
` (12 subsequent siblings)
14 siblings, 0 replies; 21+ messages in thread
From: Dmitry Torokhov @ 2019-09-11 5:12 UTC (permalink / raw)
To: Rafael J. Wysocki, Heikki Krogerus, Ard Biesheuvel
Cc: Andy Shevchenko, Linus Walleij, linux-kernel, platform-driver-x86
Sometimes we want to initialize property entry array from a regular
pointer, when we can't determine length automatically via ARRAY_SIZE.
Let's introduce PROPERTY_ENTRY_ARRAY_XXX_LEN macros that take explicit
"len" argument.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
include/linux/property.h | 45 +++++++++++++++++++++++++---------------
1 file changed, 28 insertions(+), 17 deletions(-)
diff --git a/include/linux/property.h b/include/linux/property.h
index 44c1704f7163..f89b930ca4b7 100644
--- a/include/linux/property.h
+++ b/include/linux/property.h
@@ -256,33 +256,44 @@ struct property_entry {
* and structs.
*/
-#define PROPERTY_ENTRY_INTEGER_ARRAY(_name_, _type_, _Type_, _val_) \
+#define PROPERTY_ENTRY_ARRAY_LEN(_name_, _type_, _Type_, _val_, _len_) \
(struct property_entry) { \
.name = _name_, \
- .length = ARRAY_SIZE(_val_) * sizeof(_type_), \
+ .length = (_len_) * sizeof(_type_), \
.is_array = true, \
.type = DEV_PROP_##_Type_, \
{ .pointer = { ._type_##_data = _val_ } }, \
}
-#define PROPERTY_ENTRY_U8_ARRAY(_name_, _val_) \
- PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u8, U8, _val_)
-#define PROPERTY_ENTRY_U16_ARRAY(_name_, _val_) \
- PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u16, U16, _val_)
-#define PROPERTY_ENTRY_U32_ARRAY(_name_, _val_) \
- PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u32, U32, _val_)
-#define PROPERTY_ENTRY_U64_ARRAY(_name_, _val_) \
- PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u64, U64, _val_)
+#define PROPERTY_ENTRY_U8_ARRAY_LEN(_name_, _val_, _len_) \
+ PROPERTY_ENTRY_ARRAY_LEN(_name_, u8, U8, _val_, _len_)
+#define PROPERTY_ENTRY_U16_ARRAY_LEN(_name_, _val_, _len_) \
+ PROPERTY_ENTRY_ARRAY_LEN(_name_, u16, U16, _val_, _len_)
+#define PROPERTY_ENTRY_U32_ARRAY_LEN(_name_, _val_, _len_) \
+ PROPERTY_ENTRY_ARRAY_LEN(_name_, u32, U32, _val_, _len_)
+#define PROPERTY_ENTRY_U64_ARRAY_LEN(_name_, _val_, _len_) \
+ PROPERTY_ENTRY_ARRAY_LEN(_name_, u64, U64, _val_, _len_)
-#define PROPERTY_ENTRY_STRING_ARRAY(_name_, _val_) \
-(struct property_entry) { \
- .name = _name_, \
- .length = ARRAY_SIZE(_val_) * sizeof(const char *), \
- .is_array = true, \
- .type = DEV_PROP_STRING, \
- { .pointer = { .str = _val_ } }, \
+#define PROPERTY_ENTRY_STRING_ARRAY_LEN(_name_, _val_, _len_) \
+(struct property_entry) { \
+ .name = _name_, \
+ .length = (_len_) * sizeof(const char *), \
+ .is_array = true, \
+ .type = DEV_PROP_STRING, \
+ { .pointer = { .str = _val_ } }, \
}
+#define PROPERTY_ENTRY_U8_ARRAY(_name_, _val_) \
+ PROPERTY_ENTRY_U8_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
+#define PROPERTY_ENTRY_U16_ARRAY(_name_, _val_) \
+ PROPERTY_ENTRY_U16_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
+#define PROPERTY_ENTRY_U32_ARRAY(_name_, _val_) \
+ PROPERTY_ENTRY_U32_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
+#define PROPERTY_ENTRY_U64_ARRAY(_name_, _val_) \
+ PROPERTY_ENTRY_U64_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
+#define PROPERTY_ENTRY_STRING_ARRAY(_name_, _val_) \
+ PROPERTY_ENTRY_STRING_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
+
#define PROPERTY_ENTRY_INTEGER(_name_, _type_, _Type_, _val_) \
(struct property_entry) { \
.name = _name_, \
--
2.23.0.162.g0b9fbb3734-goog
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 03/14] efi/apple-properties: use PROPERTY_ENTRY_U8_ARRAY_LEN
2019-09-11 5:12 [PATCH v4 00/14] software node: add support for reference properties Dmitry Torokhov
2019-09-11 5:12 ` [PATCH v4 01/14] software node: remove DEV_PROP_MAX Dmitry Torokhov
2019-09-11 5:12 ` [PATCH v4 02/14] software node: introduce PROPERTY_ENTRY_ARRAY_XXX_LEN() Dmitry Torokhov
@ 2019-09-11 5:12 ` Dmitry Torokhov
2019-09-11 5:12 ` [PATCH v4 04/14] software node: mark internal macros with double underscores Dmitry Torokhov
` (11 subsequent siblings)
14 siblings, 0 replies; 21+ messages in thread
From: Dmitry Torokhov @ 2019-09-11 5:12 UTC (permalink / raw)
To: Rafael J. Wysocki, Heikki Krogerus, Ard Biesheuvel
Cc: Andy Shevchenko, Linus Walleij, linux-kernel, platform-driver-x86
Let's switch to using PROPERTY_ENTRY_U8_ARRAY_LEN() to initialize
property entries. Also, when dumping data, rely on local variables
instead of poking into the property entry structure directly.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/firmware/efi/apple-properties.c | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/drivers/firmware/efi/apple-properties.c b/drivers/firmware/efi/apple-properties.c
index 0e206c9e0d7a..5ccf39986a14 100644
--- a/drivers/firmware/efi/apple-properties.c
+++ b/drivers/firmware/efi/apple-properties.c
@@ -53,7 +53,8 @@ static void __init unmarshal_key_value_pairs(struct dev_header *dev_header,
for (i = 0; i < dev_header->prop_count; i++) {
int remaining = dev_header->len - (ptr - (void *)dev_header);
- u32 key_len, val_len;
+ u32 key_len, val_len, entry_len;
+ const u8 *entry_data;
char *key;
if (sizeof(key_len) > remaining)
@@ -85,17 +86,14 @@ static void __init unmarshal_key_value_pairs(struct dev_header *dev_header,
ucs2_as_utf8(key, ptr + sizeof(key_len),
key_len - sizeof(key_len));
- entry[i].name = key;
- entry[i].length = val_len - sizeof(val_len);
- entry[i].is_array = !!entry[i].length;
- entry[i].type = DEV_PROP_U8;
- entry[i].pointer.u8_data = ptr + key_len + sizeof(val_len);
-
+ entry_data = ptr + key_len + sizeof(val_len);
+ entry_len = val_len - sizeof(val_len);
+ entry[i] = PROPERTY_ENTRY_U8_ARRAY_LEN(key, entry_data,
+ entry_len);
if (dump_properties) {
- dev_info(dev, "property: %s\n", entry[i].name);
+ dev_info(dev, "property: %s\n", key);
print_hex_dump(KERN_INFO, pr_fmt(), DUMP_PREFIX_OFFSET,
- 16, 1, entry[i].pointer.u8_data,
- entry[i].length, true);
+ 16, 1, entry_data, entry_len, true);
}
ptr += key_len + val_len;
--
2.23.0.162.g0b9fbb3734-goog
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 04/14] software node: mark internal macros with double underscores
2019-09-11 5:12 [PATCH v4 00/14] software node: add support for reference properties Dmitry Torokhov
` (2 preceding siblings ...)
2019-09-11 5:12 ` [PATCH v4 03/14] efi/apple-properties: use PROPERTY_ENTRY_U8_ARRAY_LEN Dmitry Torokhov
@ 2019-09-11 5:12 ` Dmitry Torokhov
2019-09-11 5:12 ` [PATCH v4 05/14] software node: clean up property_copy_string_array() Dmitry Torokhov
` (10 subsequent siblings)
14 siblings, 0 replies; 21+ messages in thread
From: Dmitry Torokhov @ 2019-09-11 5:12 UTC (permalink / raw)
To: Rafael J. Wysocki, Heikki Krogerus
Cc: Andy Shevchenko, Linus Walleij, linux-kernel, platform-driver-x86
Let's mark PROPERTY_ENTRY_* macros that are internal with double leading
underscores so users are not tempted to use them.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
include/linux/property.h | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/include/linux/property.h b/include/linux/property.h
index f89b930ca4b7..2c9d4d209296 100644
--- a/include/linux/property.h
+++ b/include/linux/property.h
@@ -256,7 +256,7 @@ struct property_entry {
* and structs.
*/
-#define PROPERTY_ENTRY_ARRAY_LEN(_name_, _type_, _Type_, _val_, _len_) \
+#define __PROPERTY_ENTRY_ARRAY_LEN(_name_, _type_, _Type_, _val_, _len_)\
(struct property_entry) { \
.name = _name_, \
.length = (_len_) * sizeof(_type_), \
@@ -266,13 +266,13 @@ struct property_entry {
}
#define PROPERTY_ENTRY_U8_ARRAY_LEN(_name_, _val_, _len_) \
- PROPERTY_ENTRY_ARRAY_LEN(_name_, u8, U8, _val_, _len_)
+ __PROPERTY_ENTRY_ARRAY_LEN(_name_, u8, U8, _val_, _len_)
#define PROPERTY_ENTRY_U16_ARRAY_LEN(_name_, _val_, _len_) \
- PROPERTY_ENTRY_ARRAY_LEN(_name_, u16, U16, _val_, _len_)
+ __PROPERTY_ENTRY_ARRAY_LEN(_name_, u16, U16, _val_, _len_)
#define PROPERTY_ENTRY_U32_ARRAY_LEN(_name_, _val_, _len_) \
- PROPERTY_ENTRY_ARRAY_LEN(_name_, u32, U32, _val_, _len_)
+ __PROPERTY_ENTRY_ARRAY_LEN(_name_, u32, U32, _val_, _len_)
#define PROPERTY_ENTRY_U64_ARRAY_LEN(_name_, _val_, _len_) \
- PROPERTY_ENTRY_ARRAY_LEN(_name_, u64, U64, _val_, _len_)
+ __PROPERTY_ENTRY_ARRAY_LEN(_name_, u64, U64, _val_, _len_)
#define PROPERTY_ENTRY_STRING_ARRAY_LEN(_name_, _val_, _len_) \
(struct property_entry) { \
@@ -294,7 +294,7 @@ struct property_entry {
#define PROPERTY_ENTRY_STRING_ARRAY(_name_, _val_) \
PROPERTY_ENTRY_STRING_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
-#define PROPERTY_ENTRY_INTEGER(_name_, _type_, _Type_, _val_) \
+#define __PROPERTY_ENTRY_INTEGER(_name_, _type_, _Type_, _val_) \
(struct property_entry) { \
.name = _name_, \
.length = sizeof(_type_), \
@@ -303,13 +303,13 @@ struct property_entry {
}
#define PROPERTY_ENTRY_U8(_name_, _val_) \
- PROPERTY_ENTRY_INTEGER(_name_, u8, U8, _val_)
+ __PROPERTY_ENTRY_INTEGER(_name_, u8, U8, _val_)
#define PROPERTY_ENTRY_U16(_name_, _val_) \
- PROPERTY_ENTRY_INTEGER(_name_, u16, U16, _val_)
+ __PROPERTY_ENTRY_INTEGER(_name_, u16, U16, _val_)
#define PROPERTY_ENTRY_U32(_name_, _val_) \
- PROPERTY_ENTRY_INTEGER(_name_, u32, U32, _val_)
+ __PROPERTY_ENTRY_INTEGER(_name_, u32, U32, _val_)
#define PROPERTY_ENTRY_U64(_name_, _val_) \
- PROPERTY_ENTRY_INTEGER(_name_, u64, U64, _val_)
+ __PROPERTY_ENTRY_INTEGER(_name_, u64, U64, _val_)
#define PROPERTY_ENTRY_STRING(_name_, _val_) \
(struct property_entry) { \
--
2.23.0.162.g0b9fbb3734-goog
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 05/14] software node: clean up property_copy_string_array()
2019-09-11 5:12 [PATCH v4 00/14] software node: add support for reference properties Dmitry Torokhov
` (3 preceding siblings ...)
2019-09-11 5:12 ` [PATCH v4 04/14] software node: mark internal macros with double underscores Dmitry Torokhov
@ 2019-09-11 5:12 ` Dmitry Torokhov
2019-09-11 5:12 ` [PATCH v4 06/14] software node: get rid of property_set_pointer() Dmitry Torokhov
` (9 subsequent siblings)
14 siblings, 0 replies; 21+ messages in thread
From: Dmitry Torokhov @ 2019-09-11 5:12 UTC (permalink / raw)
To: Rafael J. Wysocki, Heikki Krogerus
Cc: Andy Shevchenko, Linus Walleij, linux-kernel, platform-driver-x86
Because property_copy_string_array() stores the newly allocated pointer in the
destination property, we have an awkward code in property_entry_copy_data()
where we fetch the new pointer from dst.
Let's change property_copy_string_array() to return pointer and rely on the
common path in property_entry_copy_data() to store it in destination structure.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/base/swnode.c | 19 ++++++++-----------
1 file changed, 8 insertions(+), 11 deletions(-)
diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
index ee2a405cca9a..7bad41a8f65d 100644
--- a/drivers/base/swnode.c
+++ b/drivers/base/swnode.c
@@ -337,8 +337,8 @@ static void property_entry_free_data(const struct property_entry *p)
kfree(p->name);
}
-static int property_copy_string_array(struct property_entry *dst,
- const struct property_entry *src)
+static const char * const *
+property_copy_string_array(const struct property_entry *src)
{
const char **d;
size_t nval = src->length / sizeof(*d);
@@ -346,7 +346,7 @@ static int property_copy_string_array(struct property_entry *dst,
d = kcalloc(nval, sizeof(*d), GFP_KERNEL);
if (!d)
- return -ENOMEM;
+ return NULL;
for (i = 0; i < nval; i++) {
d[i] = kstrdup(src->pointer.str[i], GFP_KERNEL);
@@ -354,12 +354,11 @@ static int property_copy_string_array(struct property_entry *dst,
while (--i >= 0)
kfree(d[i]);
kfree(d);
- return -ENOMEM;
+ return NULL;
}
}
- dst->pointer.str = d;
- return 0;
+ return d;
}
static int property_entry_copy_data(struct property_entry *dst,
@@ -367,17 +366,15 @@ static int property_entry_copy_data(struct property_entry *dst,
{
const void *pointer = property_get_pointer(src);
const void *new;
- int error;
if (src->is_array) {
if (!src->length)
return -ENODATA;
if (src->type == DEV_PROP_STRING) {
- error = property_copy_string_array(dst, src);
- if (error)
- return error;
- new = dst->pointer.str;
+ new = property_copy_string_array(src);
+ if (!new)
+ return -ENOMEM;
} else {
new = kmemdup(pointer, src->length, GFP_KERNEL);
if (!new)
--
2.23.0.162.g0b9fbb3734-goog
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 06/14] software node: get rid of property_set_pointer()
2019-09-11 5:12 [PATCH v4 00/14] software node: add support for reference properties Dmitry Torokhov
` (4 preceding siblings ...)
2019-09-11 5:12 ` [PATCH v4 05/14] software node: clean up property_copy_string_array() Dmitry Torokhov
@ 2019-09-11 5:12 ` Dmitry Torokhov
2019-09-11 8:29 ` Andy Shevchenko
2019-09-11 5:12 ` [PATCH v4 07/14] software node: remove property_entry_read_uNN_array functions Dmitry Torokhov
` (8 subsequent siblings)
14 siblings, 1 reply; 21+ messages in thread
From: Dmitry Torokhov @ 2019-09-11 5:12 UTC (permalink / raw)
To: Rafael J. Wysocki, Heikki Krogerus
Cc: Andy Shevchenko, Linus Walleij, linux-kernel, platform-driver-x86
Instead of explicitly setting values of integer types when copying
property entries lets just copy entire value union when processing
non-array values.
When handling array values assign the pointer there using the newly
introduced "raw" pointer union member. This allows us to remove
property_set_pointer().
In property_get_pointer() we do not need to handle each data type
separately, we can simply return either the raw pointer or pointer to
values union.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/base/swnode.c | 90 +++++++++-------------------------------
include/linux/property.h | 12 ++----
2 files changed, 22 insertions(+), 80 deletions(-)
diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
index 7bad41a8f65d..726195d334e4 100644
--- a/drivers/base/swnode.c
+++ b/drivers/base/swnode.c
@@ -103,71 +103,15 @@ property_entry_get(const struct property_entry *prop, const char *name)
return NULL;
}
-static void
-property_set_pointer(struct property_entry *prop, const void *pointer)
-{
- switch (prop->type) {
- case DEV_PROP_U8:
- if (prop->is_array)
- prop->pointer.u8_data = pointer;
- else
- prop->value.u8_data = *((u8 *)pointer);
- break;
- case DEV_PROP_U16:
- if (prop->is_array)
- prop->pointer.u16_data = pointer;
- else
- prop->value.u16_data = *((u16 *)pointer);
- break;
- case DEV_PROP_U32:
- if (prop->is_array)
- prop->pointer.u32_data = pointer;
- else
- prop->value.u32_data = *((u32 *)pointer);
- break;
- case DEV_PROP_U64:
- if (prop->is_array)
- prop->pointer.u64_data = pointer;
- else
- prop->value.u64_data = *((u64 *)pointer);
- break;
- case DEV_PROP_STRING:
- if (prop->is_array)
- prop->pointer.str = pointer;
- else
- prop->value.str = pointer;
- break;
- default:
- break;
- }
-}
-
static const void *property_get_pointer(const struct property_entry *prop)
{
- switch (prop->type) {
- case DEV_PROP_U8:
- if (prop->is_array)
- return prop->pointer.u8_data;
- return &prop->value.u8_data;
- case DEV_PROP_U16:
- if (prop->is_array)
- return prop->pointer.u16_data;
- return &prop->value.u16_data;
- case DEV_PROP_U32:
- if (prop->is_array)
- return prop->pointer.u32_data;
- return &prop->value.u32_data;
- case DEV_PROP_U64:
- if (prop->is_array)
- return prop->pointer.u64_data;
- return &prop->value.u64_data;
- case DEV_PROP_STRING:
- if (prop->is_array)
- return prop->pointer.str;
- return &prop->value.str;
- default:
+ if (!prop->length)
return NULL;
- }
+
+ if (prop->is_array)
+ return prop->pointer;
+
+ return &prop->value;
}
static const void *property_entry_find(const struct property_entry *props,
@@ -322,13 +266,15 @@ static int property_entry_read_string_array(const struct property_entry *props,
static void property_entry_free_data(const struct property_entry *p)
{
const void *pointer = property_get_pointer(p);
+ const char * const *src_str;
size_t i, nval;
if (p->is_array) {
- if (p->type == DEV_PROP_STRING && p->pointer.str) {
+ if (p->type == DEV_PROP_STRING && p->pointer) {
+ src_str = p->pointer;
nval = p->length / sizeof(const char *);
for (i = 0; i < nval; i++)
- kfree(p->pointer.str[i]);
+ kfree(src_str[i]);
}
kfree(pointer);
} else if (p->type == DEV_PROP_STRING) {
@@ -341,6 +287,7 @@ static const char * const *
property_copy_string_array(const struct property_entry *src)
{
const char **d;
+ const char * const *src_str = src->pointer;
size_t nval = src->length / sizeof(*d);
int i;
@@ -349,8 +296,8 @@ property_copy_string_array(const struct property_entry *src)
return NULL;
for (i = 0; i < nval; i++) {
- d[i] = kstrdup(src->pointer.str[i], GFP_KERNEL);
- if (!d[i] && src->pointer.str[i]) {
+ d[i] = kstrdup(src_str[i], GFP_KERNEL);
+ if (!d[i] && src_str[i]) {
while (--i >= 0)
kfree(d[i]);
kfree(d);
@@ -380,20 +327,21 @@ static int property_entry_copy_data(struct property_entry *dst,
if (!new)
return -ENOMEM;
}
+
+ dst->is_array = true;
+ dst->pointer = new;
} else if (src->type == DEV_PROP_STRING) {
new = kstrdup(src->value.str, GFP_KERNEL);
if (!new && src->value.str)
return -ENOMEM;
+
+ dst->value.str = new;
} else {
- new = pointer;
+ dst->value = src->value;
}
dst->length = src->length;
- dst->is_array = src->is_array;
dst->type = src->type;
-
- property_set_pointer(dst, new);
-
dst->name = kstrdup(src->name, GFP_KERNEL);
if (!dst->name)
goto out_free_data;
diff --git a/include/linux/property.h b/include/linux/property.h
index 2c9d4d209296..ec8f84d564a8 100644
--- a/include/linux/property.h
+++ b/include/linux/property.h
@@ -233,13 +233,7 @@ struct property_entry {
bool is_array;
enum dev_prop_type type;
union {
- union {
- const u8 *u8_data;
- const u16 *u16_data;
- const u32 *u32_data;
- const u64 *u64_data;
- const char * const *str;
- } pointer;
+ const void *pointer;
union {
u8 u8_data;
u16 u16_data;
@@ -262,7 +256,7 @@ struct property_entry {
.length = (_len_) * sizeof(_type_), \
.is_array = true, \
.type = DEV_PROP_##_Type_, \
- { .pointer = { ._type_##_data = _val_ } }, \
+ { .pointer = _val_ }, \
}
#define PROPERTY_ENTRY_U8_ARRAY_LEN(_name_, _val_, _len_) \
@@ -280,7 +274,7 @@ struct property_entry {
.length = (_len_) * sizeof(const char *), \
.is_array = true, \
.type = DEV_PROP_STRING, \
- { .pointer = { .str = _val_ } }, \
+ { .pointer = _val_ }, \
}
#define PROPERTY_ENTRY_U8_ARRAY(_name_, _val_) \
--
2.23.0.162.g0b9fbb3734-goog
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH v4 06/14] software node: get rid of property_set_pointer()
2019-09-11 5:12 ` [PATCH v4 06/14] software node: get rid of property_set_pointer() Dmitry Torokhov
@ 2019-09-11 8:29 ` Andy Shevchenko
2019-09-11 8:37 ` Dmitry Torokhov
0 siblings, 1 reply; 21+ messages in thread
From: Andy Shevchenko @ 2019-09-11 8:29 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: Rafael J. Wysocki, Heikki Krogerus, Andy Shevchenko,
Linus Walleij, Linux Kernel Mailing List, Platform Driver
On Wed, Sep 11, 2019 at 8:15 AM Dmitry Torokhov
<dmitry.torokhov@gmail.com> wrote:
>
> Instead of explicitly setting values of integer types when copying
> property entries lets just copy entire value union when processing
> non-array values.
>
> When handling array values assign the pointer there using the newly
> introduced "raw" pointer union member. This allows us to remove
> property_set_pointer().
>
> In property_get_pointer() we do not need to handle each data type
> separately, we can simply return either the raw pointer or pointer to
> values union.
Same as before, typechecking is good thing to have for my point of view.
Others may have different opinions.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v4 06/14] software node: get rid of property_set_pointer()
2019-09-11 8:29 ` Andy Shevchenko
@ 2019-09-11 8:37 ` Dmitry Torokhov
2019-09-11 9:21 ` Andy Shevchenko
0 siblings, 1 reply; 21+ messages in thread
From: Dmitry Torokhov @ 2019-09-11 8:37 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Rafael J. Wysocki, Heikki Krogerus, Andy Shevchenko,
Linus Walleij, Linux Kernel Mailing List, Platform Driver
On Wed, Sep 11, 2019 at 11:29:10AM +0300, Andy Shevchenko wrote:
> On Wed, Sep 11, 2019 at 8:15 AM Dmitry Torokhov
> <dmitry.torokhov@gmail.com> wrote:
> >
> > Instead of explicitly setting values of integer types when copying
> > property entries lets just copy entire value union when processing
> > non-array values.
> >
> > When handling array values assign the pointer there using the newly
> > introduced "raw" pointer union member. This allows us to remove
> > property_set_pointer().
> >
> > In property_get_pointer() we do not need to handle each data type
> > separately, we can simply return either the raw pointer or pointer to
> > values union.
>
> Same as before, typechecking is good thing to have for my point of view.
> Others may have different opinions.
OK, I'll just point out that typechecking is a red herring here as
everything was and still is accessed through void pointers, and we
trusted the type set on property. Users of static properties should use
PROPERTY_ENTRY_XXX() for initialization and do not poke into struct
property_entry directly.
I suppose it is up to Rafael to decide here.
Thanks.
--
Dmitry
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v4 06/14] software node: get rid of property_set_pointer()
2019-09-11 8:37 ` Dmitry Torokhov
@ 2019-09-11 9:21 ` Andy Shevchenko
0 siblings, 0 replies; 21+ messages in thread
From: Andy Shevchenko @ 2019-09-11 9:21 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: Rafael J. Wysocki, Heikki Krogerus, Linus Walleij,
Linux Kernel Mailing List, Platform Driver
On Wed, Sep 11, 2019 at 01:37:25AM -0700, Dmitry Torokhov wrote:
> On Wed, Sep 11, 2019 at 11:29:10AM +0300, Andy Shevchenko wrote:
> > On Wed, Sep 11, 2019 at 8:15 AM Dmitry Torokhov
> > <dmitry.torokhov@gmail.com> wrote:
> > >
> > > Instead of explicitly setting values of integer types when copying
> > > property entries lets just copy entire value union when processing
> > > non-array values.
> > >
> > > When handling array values assign the pointer there using the newly
> > > introduced "raw" pointer union member. This allows us to remove
> > > property_set_pointer().
> > >
> > > In property_get_pointer() we do not need to handle each data type
> > > separately, we can simply return either the raw pointer or pointer to
> > > values union.
> >
> > Same as before, typechecking is good thing to have for my point of view.
> > Others may have different opinions.
>
> OK, I'll just point out that typechecking is a red herring here as
> everything was and still is accessed through void pointers, and we
> trusted the type set on property. Users of static properties should use
> PROPERTY_ENTRY_XXX() for initialization and do not poke into struct
> property_entry directly.
>
> I suppose it is up to Rafael to decide here.
Yes, and perhaps Mika as they were the main authors of the idea and
implementation.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v4 07/14] software node: remove property_entry_read_uNN_array functions
2019-09-11 5:12 [PATCH v4 00/14] software node: add support for reference properties Dmitry Torokhov
` (5 preceding siblings ...)
2019-09-11 5:12 ` [PATCH v4 06/14] software node: get rid of property_set_pointer() Dmitry Torokhov
@ 2019-09-11 5:12 ` Dmitry Torokhov
2019-09-11 5:12 ` [PATCH v4 08/14] software node: unify PROPERTY_ENTRY_XXX macros Dmitry Torokhov
` (7 subsequent siblings)
14 siblings, 0 replies; 21+ messages in thread
From: Dmitry Torokhov @ 2019-09-11 5:12 UTC (permalink / raw)
To: Rafael J. Wysocki, Heikki Krogerus
Cc: Andy Shevchenko, Linus Walleij, linux-kernel, platform-driver-x86
There is absolutely no reason to have them as we can handle it all nicely in
property_entry_read_int_array().
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/base/swnode.c | 85 +++++++------------------------------------
1 file changed, 14 insertions(+), 71 deletions(-)
diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
index 726195d334e4..a019b5e90d3b 100644
--- a/drivers/base/swnode.c
+++ b/drivers/base/swnode.c
@@ -131,66 +131,6 @@ static const void *property_entry_find(const struct property_entry *props,
return pointer;
}
-static int property_entry_read_u8_array(const struct property_entry *props,
- const char *propname,
- u8 *values, size_t nval)
-{
- const void *pointer;
- size_t length = nval * sizeof(*values);
-
- pointer = property_entry_find(props, propname, length);
- if (IS_ERR(pointer))
- return PTR_ERR(pointer);
-
- memcpy(values, pointer, length);
- return 0;
-}
-
-static int property_entry_read_u16_array(const struct property_entry *props,
- const char *propname,
- u16 *values, size_t nval)
-{
- const void *pointer;
- size_t length = nval * sizeof(*values);
-
- pointer = property_entry_find(props, propname, length);
- if (IS_ERR(pointer))
- return PTR_ERR(pointer);
-
- memcpy(values, pointer, length);
- return 0;
-}
-
-static int property_entry_read_u32_array(const struct property_entry *props,
- const char *propname,
- u32 *values, size_t nval)
-{
- const void *pointer;
- size_t length = nval * sizeof(*values);
-
- pointer = property_entry_find(props, propname, length);
- if (IS_ERR(pointer))
- return PTR_ERR(pointer);
-
- memcpy(values, pointer, length);
- return 0;
-}
-
-static int property_entry_read_u64_array(const struct property_entry *props,
- const char *propname,
- u64 *values, size_t nval)
-{
- const void *pointer;
- size_t length = nval * sizeof(*values);
-
- pointer = property_entry_find(props, propname, length);
- if (IS_ERR(pointer))
- return PTR_ERR(pointer);
-
- memcpy(values, pointer, length);
- return 0;
-}
-
static int
property_entry_count_elems_of_size(const struct property_entry *props,
const char *propname, size_t length)
@@ -209,21 +149,24 @@ static int property_entry_read_int_array(const struct property_entry *props,
unsigned int elem_size, void *val,
size_t nval)
{
+ const void *pointer;
+ size_t length;
+
if (!val)
return property_entry_count_elems_of_size(props, name,
elem_size);
- switch (elem_size) {
- case sizeof(u8):
- return property_entry_read_u8_array(props, name, val, nval);
- case sizeof(u16):
- return property_entry_read_u16_array(props, name, val, nval);
- case sizeof(u32):
- return property_entry_read_u32_array(props, name, val, nval);
- case sizeof(u64):
- return property_entry_read_u64_array(props, name, val, nval);
- }
- return -ENXIO;
+ if (!is_power_of_2(elem_size) || elem_size > sizeof(u64))
+ return -ENXIO;
+
+ length = nval * elem_size;
+
+ pointer = property_entry_find(props, name, length);
+ if (IS_ERR(pointer))
+ return PTR_ERR(pointer);
+
+ memcpy(val, pointer, length);
+ return 0;
}
static int property_entry_read_string_array(const struct property_entry *props,
--
2.23.0.162.g0b9fbb3734-goog
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 08/14] software node: unify PROPERTY_ENTRY_XXX macros
2019-09-11 5:12 [PATCH v4 00/14] software node: add support for reference properties Dmitry Torokhov
` (6 preceding siblings ...)
2019-09-11 5:12 ` [PATCH v4 07/14] software node: remove property_entry_read_uNN_array functions Dmitry Torokhov
@ 2019-09-11 5:12 ` Dmitry Torokhov
2019-09-11 5:12 ` [PATCH v4 09/14] software node: simplify property_entry_read_string_array() Dmitry Torokhov
` (6 subsequent siblings)
14 siblings, 0 replies; 21+ messages in thread
From: Dmitry Torokhov @ 2019-09-11 5:12 UTC (permalink / raw)
To: Rafael J. Wysocki, Heikki Krogerus
Cc: Andy Shevchenko, Linus Walleij, linux-kernel, platform-driver-x86
We can unify string properties initializer macros with integer
initializers.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
include/linux/property.h | 64 +++++++++++++++++-----------------------
1 file changed, 27 insertions(+), 37 deletions(-)
diff --git a/include/linux/property.h b/include/linux/property.h
index ec8f84d564a8..238e1507925f 100644
--- a/include/linux/property.h
+++ b/include/linux/property.h
@@ -245,37 +245,33 @@ struct property_entry {
};
/*
- * Note: the below four initializers for the anonymous union are carefully
+ * Note: the below initializers for the anonymous union are carefully
* crafted to avoid gcc-4.4.4's problems with initialization of anon unions
* and structs.
*/
-#define __PROPERTY_ENTRY_ARRAY_LEN(_name_, _type_, _Type_, _val_, _len_)\
+#define __PROPERTY_ENTRY_ELEMENT_SIZE(_elem_) \
+ sizeof(((struct property_entry *)NULL)->value._elem_)
+
+#define __PROPERTY_ENTRY_ARRAY_LEN(_name_, _elem_, _Type_, _val_, _len_)\
(struct property_entry) { \
.name = _name_, \
- .length = (_len_) * sizeof(_type_), \
+ .length = (_len_) * __PROPERTY_ENTRY_ELEMENT_SIZE(_elem_), \
.is_array = true, \
.type = DEV_PROP_##_Type_, \
{ .pointer = _val_ }, \
}
#define PROPERTY_ENTRY_U8_ARRAY_LEN(_name_, _val_, _len_) \
- __PROPERTY_ENTRY_ARRAY_LEN(_name_, u8, U8, _val_, _len_)
+ __PROPERTY_ENTRY_ARRAY_LEN(_name_, u8_data, U8, _val_, _len_)
#define PROPERTY_ENTRY_U16_ARRAY_LEN(_name_, _val_, _len_) \
- __PROPERTY_ENTRY_ARRAY_LEN(_name_, u16, U16, _val_, _len_)
+ __PROPERTY_ENTRY_ARRAY_LEN(_name_, u16_data, U16, _val_, _len_)
#define PROPERTY_ENTRY_U32_ARRAY_LEN(_name_, _val_, _len_) \
- __PROPERTY_ENTRY_ARRAY_LEN(_name_, u32, U32, _val_, _len_)
+ __PROPERTY_ENTRY_ARRAY_LEN(_name_, u32_data, U32, _val_, _len_)
#define PROPERTY_ENTRY_U64_ARRAY_LEN(_name_, _val_, _len_) \
- __PROPERTY_ENTRY_ARRAY_LEN(_name_, u64, U64, _val_, _len_)
-
+ __PROPERTY_ENTRY_ARRAY_LEN(_name_, u64_data, U64, _val_, _len_)
#define PROPERTY_ENTRY_STRING_ARRAY_LEN(_name_, _val_, _len_) \
-(struct property_entry) { \
- .name = _name_, \
- .length = (_len_) * sizeof(const char *), \
- .is_array = true, \
- .type = DEV_PROP_STRING, \
- { .pointer = _val_ }, \
-}
+ __PROPERTY_ENTRY_ARRAY_LEN(_name_, str, STRING, _val_, _len_)
#define PROPERTY_ENTRY_U8_ARRAY(_name_, _val_) \
PROPERTY_ENTRY_U8_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
@@ -288,30 +284,24 @@ struct property_entry {
#define PROPERTY_ENTRY_STRING_ARRAY(_name_, _val_) \
PROPERTY_ENTRY_STRING_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
-#define __PROPERTY_ENTRY_INTEGER(_name_, _type_, _Type_, _val_) \
-(struct property_entry) { \
- .name = _name_, \
- .length = sizeof(_type_), \
- .type = DEV_PROP_##_Type_, \
- { .value = { ._type_##_data = _val_ } }, \
+#define __PROPERTY_ENTRY_ELEMENT(_name_, _elem_, _Type_, _val_) \
+(struct property_entry) { \
+ .name = _name_, \
+ .length = __PROPERTY_ENTRY_ELEMENT_SIZE(_elem_), \
+ .type = DEV_PROP_##_Type_, \
+ { .value = { ._elem_ = _val_ } }, \
}
-#define PROPERTY_ENTRY_U8(_name_, _val_) \
- __PROPERTY_ENTRY_INTEGER(_name_, u8, U8, _val_)
-#define PROPERTY_ENTRY_U16(_name_, _val_) \
- __PROPERTY_ENTRY_INTEGER(_name_, u16, U16, _val_)
-#define PROPERTY_ENTRY_U32(_name_, _val_) \
- __PROPERTY_ENTRY_INTEGER(_name_, u32, U32, _val_)
-#define PROPERTY_ENTRY_U64(_name_, _val_) \
- __PROPERTY_ENTRY_INTEGER(_name_, u64, U64, _val_)
-
-#define PROPERTY_ENTRY_STRING(_name_, _val_) \
-(struct property_entry) { \
- .name = _name_, \
- .length = sizeof(const char *), \
- .type = DEV_PROP_STRING, \
- { .value = { .str = _val_ } }, \
-}
+#define PROPERTY_ENTRY_U8(_name_, _val_) \
+ __PROPERTY_ENTRY_ELEMENT(_name_, u8_data, U8, _val_)
+#define PROPERTY_ENTRY_U16(_name_, _val_) \
+ __PROPERTY_ENTRY_ELEMENT(_name_, u16_data, U16, _val_)
+#define PROPERTY_ENTRY_U32(_name_, _val_) \
+ __PROPERTY_ENTRY_ELEMENT(_name_, u32_data, U32, _val_)
+#define PROPERTY_ENTRY_U64(_name_, _val_) \
+ __PROPERTY_ENTRY_ELEMENT(_name_, u64_data, U64, _val_)
+#define PROPERTY_ENTRY_STRING(_name_, _val_) \
+ __PROPERTY_ENTRY_ELEMENT(_name_, str, STRING, _val_)
#define PROPERTY_ENTRY_BOOL(_name_) \
(struct property_entry) { \
--
2.23.0.162.g0b9fbb3734-goog
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 09/14] software node: simplify property_entry_read_string_array()
2019-09-11 5:12 [PATCH v4 00/14] software node: add support for reference properties Dmitry Torokhov
` (7 preceding siblings ...)
2019-09-11 5:12 ` [PATCH v4 08/14] software node: unify PROPERTY_ENTRY_XXX macros Dmitry Torokhov
@ 2019-09-11 5:12 ` Dmitry Torokhov
2019-09-11 5:12 ` [PATCH v4 10/14] software node: rename is_array to is_inline Dmitry Torokhov
` (5 subsequent siblings)
14 siblings, 0 replies; 21+ messages in thread
From: Dmitry Torokhov @ 2019-09-11 5:12 UTC (permalink / raw)
To: Rafael J. Wysocki, Heikki Krogerus
Cc: Andy Shevchenko, Linus Walleij, linux-kernel, platform-driver-x86
There is no need to treat string arrays and single strings separately, we can go
exclusively by the element length in relation to data type size.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/base/swnode.c | 21 +++++++--------------
1 file changed, 7 insertions(+), 14 deletions(-)
diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
index a019b5e90d3b..9c3e566c753e 100644
--- a/drivers/base/swnode.c
+++ b/drivers/base/swnode.c
@@ -173,28 +173,21 @@ static int property_entry_read_string_array(const struct property_entry *props,
const char *propname,
const char **strings, size_t nval)
{
- const struct property_entry *prop;
const void *pointer;
- size_t array_len, length;
+ size_t length;
+ int array_len;
/* Find out the array length. */
- prop = property_entry_get(props, propname);
- if (!prop)
- return -EINVAL;
-
- if (prop->is_array)
- /* Find the length of an array. */
- array_len = property_entry_count_elems_of_size(props, propname,
- sizeof(const char *));
- else
- /* The array length for a non-array string property is 1. */
- array_len = 1;
+ array_len = property_entry_count_elems_of_size(props, propname,
+ sizeof(const char *));
+ if (array_len < 0)
+ return array_len;
/* Return how many there are if strings is NULL. */
if (!strings)
return array_len;
- array_len = min(nval, array_len);
+ array_len = min_t(size_t, nval, array_len);
length = array_len * sizeof(*strings);
pointer = property_entry_find(props, propname, length);
--
2.23.0.162.g0b9fbb3734-goog
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 10/14] software node: rename is_array to is_inline
2019-09-11 5:12 [PATCH v4 00/14] software node: add support for reference properties Dmitry Torokhov
` (8 preceding siblings ...)
2019-09-11 5:12 ` [PATCH v4 09/14] software node: simplify property_entry_read_string_array() Dmitry Torokhov
@ 2019-09-11 5:12 ` Dmitry Torokhov
2019-09-11 5:12 ` [PATCH v4 11/14] software node: move small properties inline when copying Dmitry Torokhov
` (4 subsequent siblings)
14 siblings, 0 replies; 21+ messages in thread
From: Dmitry Torokhov @ 2019-09-11 5:12 UTC (permalink / raw)
To: Rafael J. Wysocki, Heikki Krogerus
Cc: Andy Shevchenko, Linus Walleij, linux-kernel, platform-driver-x86
We do not need a special flag to know if we are dealing with an array,
as we can get that data from ratio between element length and the data
size, however we do need a flag to know whether the data is stored
directly inside property_entry or separately.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/base/swnode.c | 9 +++++----
include/linux/property.h | 12 +++++++-----
2 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
index 9c3e566c753e..83e2a706a86e 100644
--- a/drivers/base/swnode.c
+++ b/drivers/base/swnode.c
@@ -108,7 +108,7 @@ static const void *property_get_pointer(const struct property_entry *prop)
if (!prop->length)
return NULL;
- if (prop->is_array)
+ if (!prop->is_inline)
return prop->pointer;
return &prop->value;
@@ -205,7 +205,7 @@ static void property_entry_free_data(const struct property_entry *p)
const char * const *src_str;
size_t i, nval;
- if (p->is_array) {
+ if (!p->is_inline) {
if (p->type == DEV_PROP_STRING && p->pointer) {
src_str = p->pointer;
nval = p->length / sizeof(const char *);
@@ -250,7 +250,7 @@ static int property_entry_copy_data(struct property_entry *dst,
const void *pointer = property_get_pointer(src);
const void *new;
- if (src->is_array) {
+ if (!src->is_inline) {
if (!src->length)
return -ENODATA;
@@ -264,15 +264,16 @@ static int property_entry_copy_data(struct property_entry *dst,
return -ENOMEM;
}
- dst->is_array = true;
dst->pointer = new;
} else if (src->type == DEV_PROP_STRING) {
new = kstrdup(src->value.str, GFP_KERNEL);
if (!new && src->value.str)
return -ENOMEM;
+ dst->is_inline = true;
dst->value.str = new;
} else {
+ dst->is_inline = true;
dst->value = src->value;
}
diff --git a/include/linux/property.h b/include/linux/property.h
index 238e1507925f..ac7823d58cfe 100644
--- a/include/linux/property.h
+++ b/include/linux/property.h
@@ -222,15 +222,17 @@ static inline int fwnode_property_count_u64(const 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.
- * @is_array: True when the property is an array.
+ * @is_inline: True when the property value is stored directly in
+ * &struct property_entry instance.
* @type: Type of the data in unions.
- * @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).
+ * @pointer: Pointer to the property when it is stored separately from
+ * the &struct property_entry instance.
+ * @value: Value of the property when it is stored inline.
*/
struct property_entry {
const char *name;
size_t length;
- bool is_array;
+ bool is_inline;
enum dev_prop_type type;
union {
const void *pointer;
@@ -257,7 +259,6 @@ struct property_entry {
(struct property_entry) { \
.name = _name_, \
.length = (_len_) * __PROPERTY_ENTRY_ELEMENT_SIZE(_elem_), \
- .is_array = true, \
.type = DEV_PROP_##_Type_, \
{ .pointer = _val_ }, \
}
@@ -288,6 +289,7 @@ struct property_entry {
(struct property_entry) { \
.name = _name_, \
.length = __PROPERTY_ENTRY_ELEMENT_SIZE(_elem_), \
+ .is_inline = true, \
.type = DEV_PROP_##_Type_, \
{ .value = { ._elem_ = _val_ } }, \
}
--
2.23.0.162.g0b9fbb3734-goog
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 11/14] software node: move small properties inline when copying
2019-09-11 5:12 [PATCH v4 00/14] software node: add support for reference properties Dmitry Torokhov
` (9 preceding siblings ...)
2019-09-11 5:12 ` [PATCH v4 10/14] software node: rename is_array to is_inline Dmitry Torokhov
@ 2019-09-11 5:12 ` Dmitry Torokhov
2019-09-11 5:12 ` [PATCH v4 12/14] software node: implement reference properties Dmitry Torokhov
` (3 subsequent siblings)
14 siblings, 0 replies; 21+ messages in thread
From: Dmitry Torokhov @ 2019-09-11 5:12 UTC (permalink / raw)
To: Rafael J. Wysocki, Heikki Krogerus
Cc: Andy Shevchenko, Linus Walleij, linux-kernel, platform-driver-x86
When copying/duplicating set of properties, move smaller properties that
were stored separately directly inside property entry structures. We can
move:
- up to 8 bytes from U8 arrays
- up to 4 words
- up to 2 double words
- one U64 value
- one or 2 strings.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/base/swnode.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
index 83e2a706a86e..1aa6559993ec 100644
--- a/drivers/base/swnode.c
+++ b/drivers/base/swnode.c
@@ -277,6 +277,16 @@ static int property_entry_copy_data(struct property_entry *dst,
dst->value = src->value;
}
+ if (!dst->is_inline && dst->length <= sizeof(dst->value)) {
+ /* We have an opportunity to move the data inline */
+ const void *tmp = dst->pointer;
+
+ memcpy(&dst->value, tmp, dst->length);
+ dst->is_inline = true;
+
+ kfree(tmp);
+ }
+
dst->length = src->length;
dst->type = src->type;
dst->name = kstrdup(src->name, GFP_KERNEL);
--
2.23.0.162.g0b9fbb3734-goog
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 12/14] software node: implement reference properties
2019-09-11 5:12 [PATCH v4 00/14] software node: add support for reference properties Dmitry Torokhov
` (10 preceding siblings ...)
2019-09-11 5:12 ` [PATCH v4 11/14] software node: move small properties inline when copying Dmitry Torokhov
@ 2019-09-11 5:12 ` Dmitry Torokhov
2019-09-11 5:12 ` [PATCH v4 13/14] platform/x86: intel_cht_int33fe: use inline " Dmitry Torokhov
` (2 subsequent siblings)
14 siblings, 0 replies; 21+ messages in thread
From: Dmitry Torokhov @ 2019-09-11 5:12 UTC (permalink / raw)
To: Rafael J. Wysocki, Heikki Krogerus
Cc: Andy Shevchenko, Linus Walleij, linux-kernel, platform-driver-x86
It is possible to store references to software nodes in the same fashion as
other static properties, so that users do not need to define separate
structures:
static const struct software_node gpio_bank_b_node = {
.name = "B",
};
static const struct property_entry simone_key_enter_props[] = {
PROPERTY_ENTRY_U32("linux,code", KEY_ENTER),
PROPERTY_ENTRY_STRING("label", "enter"),
PROPERTY_ENTRY_REF("gpios", &gpio_bank_b_node, 123, GPIO_ACTIVE_LOW),
{ }
};
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/base/swnode.c | 48 +++++++++++++++++++++++++++------
include/linux/property.h | 57 +++++++++++++++++++++++++++++-----------
2 files changed, 81 insertions(+), 24 deletions(-)
diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
index 1aa6559993ec..07e1325789d2 100644
--- a/drivers/base/swnode.c
+++ b/drivers/base/swnode.c
@@ -265,6 +265,12 @@ static int property_entry_copy_data(struct property_entry *dst,
}
dst->pointer = new;
+ } else if (src->type == DEV_PROP_REF) {
+ /*
+ * Reference properties are never stored inline as
+ * they are too big.
+ */
+ return -EINVAL;
} else if (src->type == DEV_PROP_STRING) {
new = kstrdup(src->value.str, GFP_KERNEL);
if (!new && src->value.str)
@@ -460,21 +466,47 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode,
{
struct swnode *swnode = to_swnode(fwnode);
const struct software_node_reference *ref;
+ const struct software_node_ref_args *ref_array;
+ const struct software_node_ref_args *ref_args;
const struct property_entry *prop;
struct fwnode_handle *refnode;
int i;
- if (!swnode || !swnode->node->references)
+ if (!swnode)
return -ENOENT;
- for (ref = swnode->node->references; ref->name; ref++)
- if (!strcmp(ref->name, propname))
- break;
+ prop = property_entry_get(swnode->node->properties, propname);
+ if (prop) {
+ if (prop->type != DEV_PROP_REF)
+ return -EINVAL;
- if (!ref->name || index > (ref->nrefs - 1))
- return -ENOENT;
+ /*
+ * We expect that references are never stored inline, even
+ * single ones, as they are too big.
+ */
+ if (prop->is_inline)
+ return -EINVAL;
+
+ if (index * sizeof(*ref_args) >= prop->length)
+ return -ENOENT;
+
+ ref_array = prop->pointer;
+ ref_args = &ref_array[index];
+ } else {
+ if (!swnode->node->references)
+ return -ENOENT;
+
+ for (ref = swnode->node->references; ref->name; ref++)
+ if (!strcmp(ref->name, propname))
+ break;
+
+ if (!ref->name || index > (ref->nrefs - 1))
+ return -ENOENT;
+
+ ref_args = &ref->refs[index];
+ }
- refnode = software_node_fwnode(ref->refs[index].node);
+ refnode = software_node_fwnode(ref_args->node);
if (!refnode)
return -ENOENT;
@@ -493,7 +525,7 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode,
args->nargs = nargs;
for (i = 0; i < nargs; i++)
- args->args[i] = ref->refs[index].args[i];
+ args->args[i] = ref_args->args[i];
return 0;
}
diff --git a/include/linux/property.h b/include/linux/property.h
index ac7823d58cfe..08d3e9d126ef 100644
--- a/include/linux/property.h
+++ b/include/linux/property.h
@@ -22,6 +22,7 @@ enum dev_prop_type {
DEV_PROP_U32,
DEV_PROP_U64,
DEV_PROP_STRING,
+ DEV_PROP_REF,
};
enum dev_dma_attr {
@@ -218,6 +219,20 @@ static inline int fwnode_property_count_u64(const struct fwnode_handle *fwnode,
return fwnode_property_read_u64_array(fwnode, propname, NULL, 0);
}
+struct software_node;
+
+/**
+ * struct software_node_ref_args - Reference property with additional arguments
+ * @node: Reference to a software node
+ * @nargs: Number of elements in @args array
+ * @args: Integer arguments
+ */
+struct software_node_ref_args {
+ const struct software_node *node;
+ unsigned int nargs;
+ u64 args[NR_FWNODE_REFERENCE_ARGS];
+};
+
/**
* struct property_entry - "Built-in" device property representation.
* @name: Name of the property.
@@ -255,14 +270,20 @@ struct property_entry {
#define __PROPERTY_ENTRY_ELEMENT_SIZE(_elem_) \
sizeof(((struct property_entry *)NULL)->value._elem_)
-#define __PROPERTY_ENTRY_ARRAY_LEN(_name_, _elem_, _Type_, _val_, _len_)\
+#define __PROPERTY_ENTRY_ARRAY_ELSIZE_LEN(_name_, _elsize_, _Type_, \
+ _val_, _len_) \
(struct property_entry) { \
.name = _name_, \
- .length = (_len_) * __PROPERTY_ENTRY_ELEMENT_SIZE(_elem_), \
+ .length = (_len_) * (_elsize_), \
.type = DEV_PROP_##_Type_, \
{ .pointer = _val_ }, \
}
+#define __PROPERTY_ENTRY_ARRAY_LEN(_name_, _elem_, _Type_, _val_, _len_)\
+ __PROPERTY_ENTRY_ARRAY_ELSIZE_LEN(_name_, \
+ __PROPERTY_ENTRY_ELEMENT_SIZE(_elem_), \
+ _Type_, _val_, _len_)
+
#define PROPERTY_ENTRY_U8_ARRAY_LEN(_name_, _val_, _len_) \
__PROPERTY_ENTRY_ARRAY_LEN(_name_, u8_data, U8, _val_, _len_)
#define PROPERTY_ENTRY_U16_ARRAY_LEN(_name_, _val_, _len_) \
@@ -273,6 +294,10 @@ struct property_entry {
__PROPERTY_ENTRY_ARRAY_LEN(_name_, u64_data, U64, _val_, _len_)
#define PROPERTY_ENTRY_STRING_ARRAY_LEN(_name_, _val_, _len_) \
__PROPERTY_ENTRY_ARRAY_LEN(_name_, str, STRING, _val_, _len_)
+#define PROPERTY_ENTRY_REF_ARRAY_LEN(_name_, _val_, _len_) \
+ __PROPERTY_ENTRY_ARRAY_ELSIZE_LEN(_name_, \
+ sizeof(struct software_node_ref_args), \
+ REF, _val_, _len_)
#define PROPERTY_ENTRY_U8_ARRAY(_name_, _val_) \
PROPERTY_ENTRY_U8_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
@@ -284,6 +309,8 @@ struct property_entry {
PROPERTY_ENTRY_U64_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
#define PROPERTY_ENTRY_STRING_ARRAY(_name_, _val_) \
PROPERTY_ENTRY_STRING_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
+#define PROPERTY_ENTRY_REF_ARRAY(_name_, _val_) \
+ PROPERTY_ENTRY_REF_ARRAY_LEN(_name_, _val_, ARRAY_SIZE(_val_))
#define __PROPERTY_ENTRY_ELEMENT(_name_, _elem_, _Type_, _val_) \
(struct property_entry) { \
@@ -310,6 +337,18 @@ struct property_entry {
.name = _name_, \
}
+#define PROPERTY_ENTRY_REF(_name_, _ref_, ...) \
+(struct property_entry) { \
+ .name = _name_, \
+ .length = sizeof(struct software_node_ref_args), \
+ .type = DEV_PROP_REF, \
+ { .pointer = &(const struct software_node_ref_args) { \
+ .node = _ref_, \
+ .nargs = ARRAY_SIZE(((u64[]){ 0, ##__VA_ARGS__ })) - 1, \
+ .args = { __VA_ARGS__ }, \
+ } }, \
+}
+
struct property_entry *
property_entries_dup(const struct property_entry *properties);
@@ -373,20 +412,6 @@ int fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
/* -------------------------------------------------------------------------- */
/* Software fwnode support - when HW description is incomplete or missing */
-struct software_node;
-
-/**
- * struct software_node_ref_args - Reference with additional arguments
- * @node: Reference to a software node
- * @nargs: Number of elements in @args array
- * @args: Integer arguments
- */
-struct software_node_ref_args {
- const struct software_node *node;
- unsigned int nargs;
- u64 args[NR_FWNODE_REFERENCE_ARGS];
-};
-
/**
* struct software_node_reference - Named software node reference property
* @name: Name of the property
--
2.23.0.162.g0b9fbb3734-goog
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 13/14] platform/x86: intel_cht_int33fe: use inline reference properties
2019-09-11 5:12 [PATCH v4 00/14] software node: add support for reference properties Dmitry Torokhov
` (11 preceding siblings ...)
2019-09-11 5:12 ` [PATCH v4 12/14] software node: implement reference properties Dmitry Torokhov
@ 2019-09-11 5:12 ` Dmitry Torokhov
2019-09-11 5:12 ` [PATCH v4 14/14] software node: remove separate handling of references Dmitry Torokhov
2019-10-03 0:32 ` [PATCH v4 00/14] software node: add support for reference properties Dmitry Torokhov
14 siblings, 0 replies; 21+ messages in thread
From: Dmitry Torokhov @ 2019-09-11 5:12 UTC (permalink / raw)
To: Rafael J. Wysocki, Heikki Krogerus
Cc: Andy Shevchenko, Linus Walleij, linux-kernel, platform-driver-x86
Now that static device properties allow defining reference properties
together with all other types of properties, instead of managing them
separately, let's adjust the driver.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/platform/x86/intel_cht_int33fe.c | 81 ++++++++++++------------
1 file changed, 41 insertions(+), 40 deletions(-)
diff --git a/drivers/platform/x86/intel_cht_int33fe.c b/drivers/platform/x86/intel_cht_int33fe.c
index 1d5d877b9582..4177c5424931 100644
--- a/drivers/platform/x86/intel_cht_int33fe.c
+++ b/drivers/platform/x86/intel_cht_int33fe.c
@@ -46,30 +46,6 @@ struct cht_int33fe_data {
struct fwnode_handle *dp;
};
-static const struct software_node nodes[];
-
-static const struct software_node_ref_args pi3usb30532_ref = {
- &nodes[INT33FE_NODE_PI3USB30532]
-};
-
-static const struct software_node_ref_args dp_ref = {
- &nodes[INT33FE_NODE_DISPLAYPORT]
-};
-
-static struct software_node_ref_args mux_ref;
-
-static const struct software_node_reference usb_connector_refs[] = {
- { "orientation-switch", 1, &pi3usb30532_ref},
- { "mode-switch", 1, &pi3usb30532_ref},
- { "displayport", 1, &dp_ref},
- { }
-};
-
-static const struct software_node_reference fusb302_refs[] = {
- { "usb-role-switch", 1, &mux_ref},
- { }
-};
-
/*
* Grrr I severly dislike buggy BIOS-es. At least one BIOS enumerates
* the max17047 both through the INT33FE ACPI device (it is right there
@@ -105,8 +81,18 @@ static const struct property_entry max17047_props[] = {
{ }
};
+/*
+ * We are not using inline property here because those are constant,
+ * and we need to adjust this one at runtime to point to real
+ * software node.
+ */
+static struct software_node_ref_args fusb302_mux_refs[] = {
+ { .node = NULL },
+};
+
static const struct property_entry fusb302_props[] = {
PROPERTY_ENTRY_STRING("linux,extcon-name", "cht_wcove_pwrsrc"),
+ PROPERTY_ENTRY_REF_ARRAY("usb-role-switch", fusb302_mux_refs),
{ }
};
@@ -122,6 +108,8 @@ static const u32 snk_pdo[] = {
PDO_VAR(5000, 12000, 3000),
};
+static const struct software_node nodes[];
+
static const struct property_entry usb_connector_props[] = {
PROPERTY_ENTRY_STRING("data-role", "dual"),
PROPERTY_ENTRY_STRING("power-role", "dual"),
@@ -129,15 +117,21 @@ static const struct property_entry usb_connector_props[] = {
PROPERTY_ENTRY_U32_ARRAY("source-pdos", src_pdo),
PROPERTY_ENTRY_U32_ARRAY("sink-pdos", snk_pdo),
PROPERTY_ENTRY_U32("op-sink-microwatt", 2500000),
+ PROPERTY_ENTRY_REF("orientation-switch",
+ &nodes[INT33FE_NODE_PI3USB30532]),
+ PROPERTY_ENTRY_REF("mode-switch",
+ &nodes[INT33FE_NODE_PI3USB30532]),
+ PROPERTY_ENTRY_REF("displayport",
+ &nodes[INT33FE_NODE_DISPLAYPORT]),
{ }
};
static const struct software_node nodes[] = {
- { "fusb302", NULL, fusb302_props, fusb302_refs },
+ { "fusb302", NULL, fusb302_props },
{ "max17047", NULL, max17047_props },
{ "pi3usb30532" },
{ "displayport" },
- { "connector", &nodes[0], usb_connector_props, usb_connector_refs },
+ { "connector", &nodes[0], usb_connector_props },
{ }
};
@@ -173,9 +167,10 @@ static void cht_int33fe_remove_nodes(struct cht_int33fe_data *data)
{
software_node_unregister_nodes(nodes);
- if (mux_ref.node) {
- fwnode_handle_put(software_node_fwnode(mux_ref.node));
- mux_ref.node = NULL;
+ if (fusb302_mux_refs[0].node) {
+ fwnode_handle_put(
+ software_node_fwnode(fusb302_mux_refs[0].node));
+ fusb302_mux_refs[0].node = NULL;
}
if (data->dp) {
@@ -187,25 +182,31 @@ static void cht_int33fe_remove_nodes(struct cht_int33fe_data *data)
static int cht_int33fe_add_nodes(struct cht_int33fe_data *data)
{
+ const struct software_node *mux_ref_node;
int ret;
- ret = software_node_register_nodes(nodes);
- if (ret)
- return ret;
-
- /* The devices that are not created in this driver need extra steps. */
-
/*
* There is no ACPI device node for the USB role mux, so we need to wait
* until the mux driver has created software node for the mux device.
* It means we depend on the mux driver. This function will return
* -EPROBE_DEFER until the mux device is registered.
*/
- mux_ref.node = software_node_find_by_name(NULL, "intel-xhci-usb-sw");
- if (!mux_ref.node) {
- ret = -EPROBE_DEFER;
- goto err_remove_nodes;
- }
+ mux_ref_node = software_node_find_by_name(NULL, "intel-xhci-usb-sw");
+ if (!mux_ref_node)
+ return -EPROBE_DEFER;
+
+ /*
+ * Update node used in "usb-role-switch" property. Note that we
+ * rely on software_node_register_nodes() to use the original
+ * instance of properties instead of copying them.
+ */
+ fusb302_mux_refs[0].node = mux_ref_node;
+
+ ret = software_node_register_nodes(nodes);
+ if (ret)
+ return ret;
+
+ /* The devices that are not created in this driver need extra steps. */
/*
* The DP connector does have ACPI device node. In this case we can just
--
2.23.0.162.g0b9fbb3734-goog
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 14/14] software node: remove separate handling of references
2019-09-11 5:12 [PATCH v4 00/14] software node: add support for reference properties Dmitry Torokhov
` (12 preceding siblings ...)
2019-09-11 5:12 ` [PATCH v4 13/14] platform/x86: intel_cht_int33fe: use inline " Dmitry Torokhov
@ 2019-09-11 5:12 ` Dmitry Torokhov
2019-10-03 0:32 ` [PATCH v4 00/14] software node: add support for reference properties Dmitry Torokhov
14 siblings, 0 replies; 21+ messages in thread
From: Dmitry Torokhov @ 2019-09-11 5:12 UTC (permalink / raw)
To: Rafael J. Wysocki, Heikki Krogerus
Cc: Andy Shevchenko, Linus Walleij, linux-kernel, platform-driver-x86
Now that all users of references have moved to reference properties,
we can remove separate handling of references.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/base/swnode.c | 46 +++++++++++++++-------------------------
include/linux/property.h | 14 ------------
2 files changed, 17 insertions(+), 43 deletions(-)
diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
index 07e1325789d2..ef38ea9f730b 100644
--- a/drivers/base/swnode.c
+++ b/drivers/base/swnode.c
@@ -465,9 +465,8 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode,
struct fwnode_reference_args *args)
{
struct swnode *swnode = to_swnode(fwnode);
- const struct software_node_reference *ref;
const struct software_node_ref_args *ref_array;
- const struct software_node_ref_args *ref_args;
+ const struct software_node_ref_args *ref;
const struct property_entry *prop;
struct fwnode_handle *refnode;
int i;
@@ -476,37 +475,26 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode,
return -ENOENT;
prop = property_entry_get(swnode->node->properties, propname);
- if (prop) {
- if (prop->type != DEV_PROP_REF)
- return -EINVAL;
-
- /*
- * We expect that references are never stored inline, even
- * single ones, as they are too big.
- */
- if (prop->is_inline)
- return -EINVAL;
-
- if (index * sizeof(*ref_args) >= prop->length)
- return -ENOENT;
+ if (!prop)
+ return -ENOENT;
- ref_array = prop->pointer;
- ref_args = &ref_array[index];
- } else {
- if (!swnode->node->references)
- return -ENOENT;
+ if (prop->type != DEV_PROP_REF)
+ return -EINVAL;
- for (ref = swnode->node->references; ref->name; ref++)
- if (!strcmp(ref->name, propname))
- break;
+ /*
+ * We expect that references are never stored inline, even
+ * single ones, as they are too big.
+ */
+ if (prop->is_inline)
+ return -EINVAL;
- if (!ref->name || index > (ref->nrefs - 1))
- return -ENOENT;
+ if (index * sizeof(*ref) >= prop->length)
+ return -ENOENT;
- ref_args = &ref->refs[index];
- }
+ ref_array = prop->pointer;
+ ref = &ref_array[index];
- refnode = software_node_fwnode(ref_args->node);
+ refnode = software_node_fwnode(ref->node);
if (!refnode)
return -ENOENT;
@@ -525,7 +513,7 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode,
args->nargs = nargs;
for (i = 0; i < nargs; i++)
- args->args[i] = ref_args->args[i];
+ args->args[i] = ref->args[i];
return 0;
}
diff --git a/include/linux/property.h b/include/linux/property.h
index 08d3e9d126ef..fa5a2ddc0c7b 100644
--- a/include/linux/property.h
+++ b/include/linux/property.h
@@ -412,30 +412,16 @@ int fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
/* -------------------------------------------------------------------------- */
/* Software fwnode support - when HW description is incomplete or missing */
-/**
- * struct software_node_reference - Named software node reference property
- * @name: Name of the property
- * @nrefs: Number of elements in @refs array
- * @refs: Array of references with optional arguments
- */
-struct software_node_reference {
- const char *name;
- unsigned int nrefs;
- const struct software_node_ref_args *refs;
-};
-
/**
* struct software_node - Software node description
* @name: Name of the software node
* @parent: Parent of the software node
* @properties: Array of device properties
- * @references: Array of software node reference properties
*/
struct software_node {
const char *name;
const struct software_node *parent;
const struct property_entry *properties;
- const struct software_node_reference *references;
};
bool is_software_node(const struct fwnode_handle *fwnode);
--
2.23.0.162.g0b9fbb3734-goog
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH v4 00/14] software node: add support for reference properties
2019-09-11 5:12 [PATCH v4 00/14] software node: add support for reference properties Dmitry Torokhov
` (13 preceding siblings ...)
2019-09-11 5:12 ` [PATCH v4 14/14] software node: remove separate handling of references Dmitry Torokhov
@ 2019-10-03 0:32 ` Dmitry Torokhov
2019-10-03 8:39 ` Rafael J. Wysocki
14 siblings, 1 reply; 21+ messages in thread
From: Dmitry Torokhov @ 2019-10-03 0:32 UTC (permalink / raw)
To: Rafael J. Wysocki, Heikki Krogerus
Cc: Andy Shevchenko, Linus Walleij, linux-kernel, platform-driver-x86
Hi Rafael,
On Tue, Sep 10, 2019 at 10:12:17PM -0700, Dmitry Torokhov wrote:
> These series implement "references" properties for software nodes as true
> properties, instead of managing them completely separately.
>
> The first 10 patches are generic cleanups and consolidation and unification
> of the existing code; patch #11 implements PROPERTY_EMTRY_REF() and friends;
> patch #12 converts the user of references to the property syntax, and patch
> #13 removes the remains of references as entities that are managed
> separately.
Now that merge window is over could you please take a look at the
series?
Thanks!
--
Dmitry
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v4 00/14] software node: add support for reference properties
2019-10-03 0:32 ` [PATCH v4 00/14] software node: add support for reference properties Dmitry Torokhov
@ 2019-10-03 8:39 ` Rafael J. Wysocki
2019-10-11 23:25 ` Dmitry Torokhov
0 siblings, 1 reply; 21+ messages in thread
From: Rafael J. Wysocki @ 2019-10-03 8:39 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: Rafael J. Wysocki, Heikki Krogerus, Andy Shevchenko,
Linus Walleij, Linux Kernel Mailing List, Platform Driver
On Thu, Oct 3, 2019 at 2:32 AM Dmitry Torokhov
<dmitry.torokhov@gmail.com> wrote:
>
> Hi Rafael,
>
> On Tue, Sep 10, 2019 at 10:12:17PM -0700, Dmitry Torokhov wrote:
> > These series implement "references" properties for software nodes as true
> > properties, instead of managing them completely separately.
> >
> > The first 10 patches are generic cleanups and consolidation and unification
> > of the existing code; patch #11 implements PROPERTY_EMTRY_REF() and friends;
> > patch #12 converts the user of references to the property syntax, and patch
> > #13 removes the remains of references as entities that are managed
> > separately.
>
> Now that merge window is over could you please take a look at the
> series?
I will.
It would help to resend the whole series with a CC to linux-acpi, though.
Thanks!
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v4 00/14] software node: add support for reference properties
2019-10-03 8:39 ` Rafael J. Wysocki
@ 2019-10-11 23:25 ` Dmitry Torokhov
0 siblings, 0 replies; 21+ messages in thread
From: Dmitry Torokhov @ 2019-10-11 23:25 UTC (permalink / raw)
To: Rafael J. Wysocki
Cc: Heikki Krogerus, Andy Shevchenko, Linus Walleij,
Linux Kernel Mailing List, Platform Driver
On Thu, Oct 03, 2019 at 10:39:24AM +0200, Rafael J. Wysocki wrote:
> On Thu, Oct 3, 2019 at 2:32 AM Dmitry Torokhov
> <dmitry.torokhov@gmail.com> wrote:
> >
> > Hi Rafael,
> >
> > On Tue, Sep 10, 2019 at 10:12:17PM -0700, Dmitry Torokhov wrote:
> > > These series implement "references" properties for software nodes as true
> > > properties, instead of managing them completely separately.
> > >
> > > The first 10 patches are generic cleanups and consolidation and unification
> > > of the existing code; patch #11 implements PROPERTY_EMTRY_REF() and friends;
> > > patch #12 converts the user of references to the property syntax, and patch
> > > #13 removes the remains of references as entities that are managed
> > > separately.
> >
> > Now that merge window is over could you please take a look at the
> > series?
>
> I will.
>
> It would help to resend the whole series with a CC to linux-acpi, though.
Rebased to next-20191011 and sent to linux-acpi and others.
Thanks!
--
Dmitry
^ permalink raw reply [flat|nested] 21+ messages in thread