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