On Wed, Jul 2, 2025 at 7:16 AM Anup Patel <apatel@xxxxxxxxxxxxxxxx> wrote: > > From: Sunil V L <sunilvl@xxxxxxxxxxxxxxxx> > > Currently, ACPI doesn't support cells property when > fwnode_property_get_reference_args() is called. What exactly do you mean by "cells property" here and below? > ACPI always expects > the number of arguments to be passed. However, the above mentioned > call being a common interface for OF and ACPI, it is better to have > single calling convention which works for both. Hence, add support > for cells property on the reference device to get the number of > arguments dynamically. > > Signed-off-by: Sunil V L <sunilvl@xxxxxxxxxxxxxxxx> > Signed-off-by: Anup Patel <apatel@xxxxxxxxxxxxxxxx> > --- > drivers/acpi/property.c | 22 ++++++++++++++++++---- > drivers/base/property.c | 2 +- > 2 files changed, 19 insertions(+), 5 deletions(-) > > diff --git a/drivers/acpi/property.c b/drivers/acpi/property.c > index d4863746fb11..d08b0ea5c915 100644 > --- a/drivers/acpi/property.c > +++ b/drivers/acpi/property.c > @@ -882,6 +882,17 @@ static struct fwnode_handle *acpi_parse_string_ref(const struct fwnode_handle *f > return &dn->fwnode; > } > > +static unsigned int acpi_fwnode_get_args_count(const struct acpi_device *device, > + const char *nargs_prop) > +{ > + const union acpi_object *obj; > + > + if (acpi_dev_get_property(device, nargs_prop, ACPI_TYPE_INTEGER, &obj)) > + return 0; > + > + return obj->integer.value; > +} > + > static int acpi_fwnode_get_reference_args(const struct fwnode_handle *fwnode, > const char *propname, const char *nargs_prop, > unsigned int args_count, unsigned int index, > @@ -892,6 +903,7 @@ static int acpi_fwnode_get_reference_args(const struct fwnode_handle *fwnode, > const struct acpi_device_data *data; > struct fwnode_handle *ref_fwnode; > struct acpi_device *device; > + unsigned int nargs_count; > int ret, idx = 0; > > data = acpi_device_data_of_node(fwnode); > @@ -960,11 +972,12 @@ static int acpi_fwnode_get_reference_args(const struct fwnode_handle *fwnode, > if (!device) > return -EINVAL; > > + nargs_count = acpi_fwnode_get_args_count(device, nargs_prop); I think it should work the same way as it used to for the callers that pass args_count, so maybe if (!args_count) args_count = acpi_fwnode_get_args_count(device, nargs_prop); > element++; > - > ret = acpi_get_ref_args(idx == index ? args : NULL, > acpi_fwnode_handle(device), > - &element, end, args_count); > + &element, end, > + nargs_count ? nargs_count : args_count); And this change would not be necessary? And analogously below. > if (ret < 0) > return ret; > > @@ -978,11 +991,12 @@ static int acpi_fwnode_get_reference_args(const struct fwnode_handle *fwnode, > if (!ref_fwnode) > return -EINVAL; > > + device = to_acpi_device_node(ref_fwnode); > + nargs_count = acpi_fwnode_get_args_count(device, nargs_prop); > element++; > - > ret = acpi_get_ref_args(idx == index ? args : NULL, > ref_fwnode, &element, end, > - args_count); > + nargs_count ? nargs_count : args_count); > if (ret < 0) > return ret; > > diff --git a/drivers/base/property.c b/drivers/base/property.c > index f626d5bbe806..6a63860579dd 100644 > --- a/drivers/base/property.c > +++ b/drivers/base/property.c > @@ -578,7 +578,7 @@ EXPORT_SYMBOL_GPL(fwnode_property_match_property_string); > * @prop: The name of the property > * @nargs_prop: The name of the property telling the number of > * arguments in the referred node. NULL if @nargs is known, > - * otherwise @nargs is ignored. Only relevant on OF. > + * otherwise @nargs is ignored. > * @nargs: Number of arguments. Ignored if @nargs_prop is non-NULL. > * @index: Index of the reference, from zero onwards. > * @args: Result structure with reference and integer arguments. > --