diff options
author | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2019-02-25 18:05:39 +0300 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2019-02-27 10:47:59 +0100 |
commit | 886ca88be6b357fd2bc5f04ffb45fdcc26a7453d (patch) | |
tree | 543e625d99889d5c7888bd2de37eed1357c726c8 /drivers/acpi | |
parent | 5908e6b738e3357af42c10e1183753c70a0117a9 (diff) | |
download | linux-886ca88be6b357fd2bc5f04ffb45fdcc26a7453d.tar.bz2 |
ACPI / bus: Respect PRP0001 when retrieving device match data
In the PRP0001 case, the compatible string may have additional data
affiliated with the device. When we call device_get_match_data() on
such device, we will get nothing since currently
acpi_device_get_match_data() doesn't respect PRP0001.
To fix the above, try acpi_of_match_device() if there is no ACPI
table in the driver.
Anyway, note that the device is expected to get its own proper
ACPI ID.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/acpi')
-rw-r--r-- | drivers/acpi/bus.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index 147f6c7ea59c..6ecbbabf1233 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c @@ -799,10 +799,24 @@ const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids, } EXPORT_SYMBOL_GPL(acpi_match_device); +static const void *acpi_of_device_get_match_data(const struct device *dev) +{ + struct acpi_device *adev = ACPI_COMPANION(dev); + const struct of_device_id *match = NULL; + + if (!acpi_of_match_device(adev, dev->driver->of_match_table, &match)) + return NULL; + + return match->data; +} + const void *acpi_device_get_match_data(const struct device *dev) { const struct acpi_device_id *match; + if (!dev->driver->acpi_match_table) + return acpi_of_device_get_match_data(dev); + match = acpi_match_device(dev->driver->acpi_match_table, dev); if (!match) return NULL; |