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

2019-09-06 Thread Dmitry Torokhov
On Fri, Sep 06, 2019 at 03:27:43PM +0300, Andy Shevchenko wrote:
> 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?

It may or it may not. I'll remove __inticonst from below as well to not
confuse things.

> 
> > 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?

Yes.

> 
> > +   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 = ...;

OK, it will be gone actually.

> 
> > -   DEV_PROP_MAX,
> > +   DEV_PROP_MAX
> 
> It seems it wasn't ever used, so, can be dropped completely.

OK.

> 
> > @@ -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?

Right, I think we can always store references as arrays, even when we
only need single entry, thus we do not need to increase the size of the
structure.

I just posted v2 implementing that, please take another look.

Thanks.

-- 
Dmitry


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

2019-09-06 Thread Heikki Krogerus
On Fri, Sep 06, 2019 at 03:40:43PM +0300, Andy Shevchenko wrote:
> On Fri, Sep 06, 2019 at 02:17:44PM +0300, Heikki Krogerus wrote:
> > 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",
> > > };
> > > 
> > > 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),
> > >   { }
> > > };
> > > 
> > > Signed-off-by: Dmitry Torokhov 
> > 
> > This looks really good to me. I'll wait for Andy's comments on the
> > idea, but to me it makes sense.
> 
> Idea in general is fine. Though, taking into consideration, for example,
> drivers/mfd/intel-lpss-pci.c, the size of predefined structures bumps a lot.
> I think we always should keep a pointer. In this case we may not add another
> property type.

Yeah, you have a point.

thanks,

-- 
heikki


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

2019-09-06 Thread Andy Shevchenko
On Fri, Sep 06, 2019 at 02:17:44PM +0300, Heikki Krogerus wrote:
> 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",
> > };
> > 
> > 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),
> > { }
> > };
> > 
> > Signed-off-by: Dmitry Torokhov 
> 
> This looks really good to me. I'll wait for Andy's comments on the
> idea, but to me it makes sense.

Idea in general is fine. Though, taking into consideration, for example,
drivers/mfd/intel-lpss-pci.c, the size of predefined structures bumps a lot.
I think we always should keep a pointer. In this case we may not add another
property type.

-- 
With Best Regards,
Andy Shevchenko




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

2019-09-06 Thread Andy Shevchenko
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




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

2019-09-06 Thread Heikki Krogerus
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",
> };
> 
> 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),
>   { }
> };
> 
> Signed-off-by: Dmitry Torokhov 

This looks really good to me. I'll wait for Andy's comments on the
idea, but to me it makes sense.

Thanks Dmitry!

-- 
heikki