Re: [PATCH 1/3] software node: implement reference properties

From: Andy Shevchenko
Date: Fri Sep 06 2019 - 08:27:49 EST


On Thu, Sep 05, 2019 at 09:38:07PM -0700, Dmitry Torokhov wrote:
> 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:
>
> const struct software_node gpio_bank_b_node = {
> .name = "B",
> };

Why this can't be __initconst?

> const struct property_entry simone_key_enter_props[] __initconst = {
> PROPERTY_ENTRY_U32("linux,code", KEY_ENTER),
> PROPERTY_ENTRY_STRING("label", "enter"),
> PROPERTY_ENTRY_REF("gpios", &gpio_bank_b_node, 123, GPIO_ACTIVE_LOW),
> { }
> };

So it's basically mimics the concept of phandle, right?

> + ref_args = prop->is_array ?
> + &prop->pointer.ref[index] : &prop->value.ref;

Better to do if with explicit 'if ()' as it's done in the rest of the code.

if (prop->is_array)
ref_args = ...;
else
ref_args = ...;

> - DEV_PROP_MAX,
> + DEV_PROP_MAX

It seems it wasn't ever used, so, can be dropped completely.

> @@ -240,6 +255,7 @@ struct property_entry {
> const u32 *u32_data;
> const u64 *u64_data;
> const char * const *str;
> + const struct software_node_ref_args *ref;
> } pointer;
> union {
> u8 u8_data;
> @@ -247,6 +263,7 @@ struct property_entry {
> u32 u32_data;
> u64 u64_data;
> const char *str;
> + struct software_node_ref_args ref;

Hmm... This bumps the size of union a lot for each existing property_entry.
Is there any other way? Maybe we can keep pointer and allocate memory for it
when copying?

> } value;

> +#define PROPERTY_ENTRY_REF_ARRAY(_name_, _val_) \
> +(struct property_entry) { \
> + .name = _name_, \
> + .length = ARRAY_SIZE(_val_) * \
> + sizeof(struct software_node_ref_args), \

I would rather leave it on one line and shift right all \:s in this macro.

> + .is_array = true, \
> + .type = DEV_PROP_REF, \
> + .pointer.ref = _val_, \
> +}
> +

> +#define PROPERTY_ENTRY_REF(_name_, _ref_, ...) \
> +(struct property_entry) { \
> + .name = _name_, \
> + .length = sizeof(struct software_node_ref_args), \
> + .type = DEV_PROP_REF, \
> + .value.ref.node = _ref_, \

> + .value.ref.nargs = \
> + ARRAY_SIZE(((u64[]){ 0, ##__VA_ARGS__ })) - 1, \

Ditto.

> + .value.ref.args = { __VA_ARGS__ }, \
> +}

--
With Best Regards,
Andy Shevchenko