On Mon, Jun 26, 2023 at 1:00 PM Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> wrote: > > In some cases we can't have a physical node associated with > the ACPI device. Yet we want to match it against ID table and > get respective driver data. Introduce the helper for that. I think that the problem is really to find a struct acpi_device_id in a given list matching a given struct acpi_device. > Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> > --- > drivers/acpi/bus.c | 15 +++++++++++---- > include/linux/acpi.h | 9 +++++++++ > 2 files changed, 20 insertions(+), 4 deletions(-) > > diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c > index 20cdfb37da79..ee88bfb60ac2 100644 > --- a/drivers/acpi/bus.c > +++ b/drivers/acpi/bus.c > @@ -850,6 +850,16 @@ static bool __acpi_match_device(const struct acpi_device *device, > return true; > } > > +const struct acpi_device_id *acpi_match_acpi_device(const struct acpi_device_id *ids, > + const struct acpi_device *adev) > +{ > + const struct acpi_device_id *id = NULL; > + > + __acpi_match_device(adev, ids, NULL, &id, NULL); > + return id; > +} > +EXPORT_SYMBOL_GPL(acpi_match_acpi_device); This is fine, but it requires a kerneldoc comment (as an exported function). Of course, the code in scan.c can use it even if it is not exported. > + > /** > * acpi_match_device - Match a struct device against a given list of ACPI IDs > * @ids: Array of struct acpi_device_id object to match against. > @@ -864,10 +874,7 @@ static bool __acpi_match_device(const struct acpi_device *device, > const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids, > const struct device *dev) > { > - const struct acpi_device_id *id = NULL; > - > - __acpi_match_device(acpi_companion_match(dev), ids, NULL, &id, NULL); > - return id; > + return acpi_match_acpi_device(ids, acpi_companion_match(dev)); > } > EXPORT_SYMBOL_GPL(acpi_match_device); > > diff --git a/include/linux/acpi.h b/include/linux/acpi.h > index 640f1c07c894..641dc4843987 100644 > --- a/include/linux/acpi.h > +++ b/include/linux/acpi.h > @@ -707,6 +707,9 @@ extern int acpi_nvs_register(__u64 start, __u64 size); > extern int acpi_nvs_for_each_region(int (*func)(__u64, __u64, void *), > void *data); > > +const struct acpi_device_id *acpi_match_acpi_device(const struct acpi_device_id *ids, > + const struct acpi_device *adev); > + > const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids, > const struct device *dev); > > @@ -922,6 +925,12 @@ static inline int acpi_nvs_for_each_region(int (*func)(__u64, __u64, void *), > > struct acpi_device_id; > > +static inline const struct acpi_device_id *acpi_match_acpi_device( > + const struct acpi_device_id *ids, const struct acpi_device *adev) > +{ > + return NULL; > +} > + > static inline const struct acpi_device_id *acpi_match_device( > const struct acpi_device_id *ids, const struct device *dev) > { > -- > 2.40.0.1.gaa8946217a0b >