Commit cca8a7ef authored by Daniel Scally's avatar Daniel Scally Committed by Rafael J. Wysocki

ACPI: scan: Add acpi_dev_get_next_consumer_dev()

In commit b83e2b30 ("ACPI: scan: Add function to fetch dependent
of ACPI device") we added a means of fetching the first device to
declare itself dependent on another ACPI device in the _DEP method.
One assumption in that patch was that there would only be a single
consuming device, but this has not held.

Replace that function with a new function that fetches the next consumer
of a supplier device. Where no "previous" consumer is passed in, it
behaves identically to the original function.
Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarDaniel Scally <djrscally@gmail.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 98378956
...@@ -2235,9 +2235,22 @@ static int acpi_bus_attach(struct acpi_device *device, void *first_pass) ...@@ -2235,9 +2235,22 @@ static int acpi_bus_attach(struct acpi_device *device, void *first_pass)
return 0; return 0;
} }
static int acpi_dev_get_first_consumer_dev_cb(struct acpi_dep_data *dep, void *data) static int acpi_dev_get_next_consumer_dev_cb(struct acpi_dep_data *dep, void *data)
{ {
struct acpi_device *adev; struct acpi_device **adev_p = data;
struct acpi_device *adev = *adev_p;
/*
* If we're passed a 'previous' consumer device then we need to skip
* any consumers until we meet the previous one, and then NULL @data
* so the next one can be returned.
*/
if (adev) {
if (dep->consumer == adev->handle)
*adev_p = NULL;
return 0;
}
adev = acpi_get_acpi_dev(dep->consumer); adev = acpi_get_acpi_dev(dep->consumer);
if (adev) { if (adev) {
...@@ -2368,25 +2381,32 @@ bool acpi_dev_ready_for_enumeration(const struct acpi_device *device) ...@@ -2368,25 +2381,32 @@ bool acpi_dev_ready_for_enumeration(const struct acpi_device *device)
EXPORT_SYMBOL_GPL(acpi_dev_ready_for_enumeration); EXPORT_SYMBOL_GPL(acpi_dev_ready_for_enumeration);
/** /**
* acpi_dev_get_first_consumer_dev - Return ACPI device dependent on @supplier * acpi_dev_get_next_consumer_dev - Return the next adev dependent on @supplier
* @supplier: Pointer to the dependee device * @supplier: Pointer to the dependee device
* @start: Pointer to the current dependent device
* *
* Returns the first &struct acpi_device which declares itself dependent on * Returns the next &struct acpi_device which declares itself dependent on
* @supplier via the _DEP buffer, parsed from the acpi_dep_list. * @supplier via the _DEP buffer, parsed from the acpi_dep_list.
* *
* The caller is responsible for putting the reference to adev when it is no * If the returned adev is not passed as @start to this function, the caller is
* longer needed. * responsible for putting the reference to adev when it is no longer needed.
*/ */
struct acpi_device *acpi_dev_get_first_consumer_dev(struct acpi_device *supplier) struct acpi_device *acpi_dev_get_next_consumer_dev(struct acpi_device *supplier,
struct acpi_device *start)
{ {
struct acpi_device *adev = NULL; struct acpi_device *adev = start;
acpi_walk_dep_device_list(supplier->handle, acpi_walk_dep_device_list(supplier->handle,
acpi_dev_get_first_consumer_dev_cb, &adev); acpi_dev_get_next_consumer_dev_cb, &adev);
acpi_dev_put(start);
if (adev == start)
return NULL;
return adev; return adev;
} }
EXPORT_SYMBOL_GPL(acpi_dev_get_first_consumer_dev); EXPORT_SYMBOL_GPL(acpi_dev_get_next_consumer_dev);
/** /**
* acpi_bus_scan - Add ACPI device node objects in a given namespace scope. * acpi_bus_scan - Add ACPI device node objects in a given namespace scope.
......
...@@ -62,7 +62,7 @@ int skl_int3472_get_sensor_adev_and_name(struct device *dev, ...@@ -62,7 +62,7 @@ int skl_int3472_get_sensor_adev_and_name(struct device *dev,
struct acpi_device *sensor; struct acpi_device *sensor;
int ret = 0; int ret = 0;
sensor = acpi_dev_get_first_consumer_dev(adev); sensor = acpi_dev_get_next_consumer_dev(adev, NULL);
if (!sensor) { if (!sensor) {
dev_err(dev, "INT3472 seems to have no dependents.\n"); dev_err(dev, "INT3472 seems to have no dependents.\n");
return -ENODEV; return -ENODEV;
......
...@@ -742,7 +742,9 @@ bool acpi_dev_hid_uid_match(struct acpi_device *adev, const char *hid2, const ch ...@@ -742,7 +742,9 @@ bool acpi_dev_hid_uid_match(struct acpi_device *adev, const char *hid2, const ch
void acpi_dev_clear_dependencies(struct acpi_device *supplier); void acpi_dev_clear_dependencies(struct acpi_device *supplier);
bool acpi_dev_ready_for_enumeration(const struct acpi_device *device); bool acpi_dev_ready_for_enumeration(const struct acpi_device *device);
struct acpi_device *acpi_dev_get_first_consumer_dev(struct acpi_device *supplier); struct acpi_device *acpi_dev_get_next_consumer_dev(struct acpi_device *supplier,
struct acpi_device *start);
struct acpi_device * struct acpi_device *
acpi_dev_get_next_match_dev(struct acpi_device *adev, const char *hid, const char *uid, s64 hrv); acpi_dev_get_next_match_dev(struct acpi_device *adev, const char *hid, const char *uid, s64 hrv);
struct acpi_device * struct acpi_device *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment