From: Daniel Scally <djrscally@gmail.com>
To: linux-acpi@vger.kernel.org, linux-clk@vger.kernel.org,
platform-driver-x86@vger.kernel.org
Cc: rafael@kernel.org, lenb@kernel.org, mturquette@baylibre.com,
sboyd@kernel.org, hdegoede@redhat.com, markgross@kernel.org,
robert.moore@intel.com
Subject: [PATCH 1/6] ACPI: scan: Add acpi_dev_get_next_consumer_dev()
Date: Wed, 16 Feb 2022 22:52:59 +0000 [thread overview]
Message-ID: <20220216225304.53911-2-djrscally@gmail.com> (raw)
In-Reply-To: <20220216225304.53911-1-djrscally@gmail.com>
In commit b83e2b306736 ("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.
Extend the functionality by adding a new function that fetches the
next consumer of a supplier device. We can then simplify the original
function by simply calling the new one.
Signed-off-by: Daniel Scally <djrscally@gmail.com>
---
drivers/acpi/scan.c | 47 ++++++++++++++++++++++++++++++++++-------
include/acpi/acpi_bus.h | 2 ++
2 files changed, 41 insertions(+), 8 deletions(-)
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 4463c2eda61e..b3ed664ee1cb 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -2256,9 +2256,21 @@ static void acpi_bus_attach(struct acpi_device *device, bool first_pass)
device->handler->hotplug.notify_online(device);
}
-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 = *(struct acpi_device **)data;
+
+ /*
+ * 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)
+ *(struct acpi_device **)data = NULL;
+
+ return 0;
+ }
adev = acpi_bus_get_acpi_device(dep->consumer);
if (adev) {
@@ -2389,23 +2401,42 @@ bool acpi_dev_ready_for_enumeration(const struct acpi_device *device)
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
+ * @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.
*
* The caller is 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_dev_get_first_consumer_dev_cb, &adev);
+ acpi_dev_get_next_consumer_dev_cb, &adev);
- return adev;
+ acpi_dev_put(start);
+ return adev == start ? NULL : adev;
+}
+EXPORT_SYMBOL_GPL(acpi_dev_get_next_consumer_dev);
+
+/**
+ * acpi_dev_get_first_consumer_dev - Return ACPI device dependent on @supplier
+ * @supplier: Pointer to the dependee device
+ *
+ * Returns the first &struct acpi_device which declares itself dependent on
+ * @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
+ * longer needed.
+ */
+struct acpi_device *acpi_dev_get_first_consumer_dev(struct acpi_device *supplier)
+{
+ return acpi_dev_get_next_consumer_dev(supplier, NULL);
}
EXPORT_SYMBOL_GPL(acpi_dev_get_first_consumer_dev);
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index ca88c4706f2b..8b06fef04722 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -720,6 +720,8 @@ bool acpi_dev_hid_uid_match(struct acpi_device *adev, const char *hid2, const ch
void acpi_dev_clear_dependencies(struct acpi_device *supplier);
bool acpi_dev_ready_for_enumeration(const struct acpi_device *device);
+struct acpi_device *acpi_dev_get_next_consumer_dev(struct acpi_device *supplier,
+ struct acpi_device *start);
struct acpi_device *acpi_dev_get_first_consumer_dev(struct acpi_device *supplier);
struct acpi_device *
acpi_dev_get_next_match_dev(struct acpi_device *adev, const char *hid, const char *uid, s64 hrv);
--
2.25.1
next prev parent reply other threads:[~2022-02-16 22:53 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-16 22:52 [PATCH 0/6] Add multiple-consumer support to int3472-tps68470 driver Daniel Scally
2022-02-16 22:52 ` Daniel Scally [this message]
2022-02-21 9:50 ` [PATCH 1/6] ACPI: scan: Add acpi_dev_get_next_consumer_dev() Hans de Goede
2022-02-21 9:51 ` Hans de Goede
2022-02-16 22:53 ` [PATCH 2/6] ACPI: bus: Add iterator for dependent devices Daniel Scally
2022-02-21 9:52 ` Hans de Goede
2022-02-16 22:53 ` [PATCH 3/6] platform/x86: int3472: Support multiple clock consumers Daniel Scally
2022-02-17 3:22 ` kernel test robot
2022-02-22 14:44 ` Hans de Goede
2022-02-22 14:47 ` Daniel Scally
2022-02-21 9:59 ` Hans de Goede
2022-02-25 0:49 ` Stephen Boyd
2022-02-25 9:22 ` Hans de Goede
2022-02-16 22:53 ` [PATCH 4/6] platform/x86: int3472: Add terminator to gpiod_lookup_table Daniel Scally
2022-02-21 10:00 ` Hans de Goede
2022-02-21 13:46 ` Hans de Goede
2022-02-16 22:53 ` [PATCH 5/6] platform/x86: int3472: Support multiple gpio lookups in board data Daniel Scally
2022-02-21 10:03 ` Hans de Goede
2022-02-16 22:53 ` [PATCH 6/6] platform/x86: int3472: Add board data for Surface Go2 IR camera Daniel Scally
2022-02-21 10:05 ` Hans de Goede
2022-02-17 9:55 ` [PATCH 0/6] Add multiple-consumer support to int3472-tps68470 driver Hans de Goede
2022-02-18 8:45 ` Daniel Scally
2022-02-21 10:07 ` Hans de Goede
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220216225304.53911-2-djrscally@gmail.com \
--to=djrscally@gmail.com \
--cc=hdegoede@redhat.com \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-clk@vger.kernel.org \
--cc=markgross@kernel.org \
--cc=mturquette@baylibre.com \
--cc=platform-driver-x86@vger.kernel.org \
--cc=rafael@kernel.org \
--cc=robert.moore@intel.com \
--cc=sboyd@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox