diff mbox series

[v1,2/3] ACPI: utils: Add acpi_get_first_match_physical_node()

Message ID 20230123171006.58274-2-andriy.shevchenko@linux.intel.com
State New
Headers show
Series [v1,1/3] ACPI: video: Fix refcounting in apple_gmux_backlight_present() | expand

Commit Message

Andy Shevchenko Jan. 23, 2023, 5:10 p.m. UTC
There are drivers that are using a logic that is combined in the offered
acpi_get_first_match_physical_node(). The rationale to have this helper
not only redunction of the lines of code, but improving the robustness
by properly handling the reference counters on the error paths.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/acpi/utils.c    | 28 ++++++++++++++++++++++++++++
 include/acpi/acpi_bus.h |  3 +++
 include/linux/acpi.h    |  6 ++++++
 3 files changed, 37 insertions(+)

Comments

Andy Shevchenko Jan. 25, 2023, 3:21 p.m. UTC | #1
On Mon, Jan 23, 2023 at 07:10:05PM +0200, Andy Shevchenko wrote:
> There are drivers that are using a logic that is combined in the offered
> acpi_get_first_match_physical_node(). The rationale to have this helper
> not only redunction of the lines of code, but improving the robustness
> by properly handling the reference counters on the error paths.

After rebasing on top of the latest code base (with Hans' patches included) I
checked the users of similar code flow and found that there is no sense to
provide this helper now. It's only one user for this API as is, otherwise it
needs an access to struct acpi_device, which the proposed API doesn't provide.

Hence, self-NAK.
diff mbox series

Patch

diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c
index 2ea14648a661..052e263d2246 100644
--- a/drivers/acpi/utils.c
+++ b/drivers/acpi/utils.c
@@ -965,6 +965,34 @@  acpi_dev_get_first_match_dev(const char *hid, const char *uid, s64 hrv)
 }
 EXPORT_SYMBOL(acpi_dev_get_first_match_dev);
 
+/**
+ * acpi_get_first_match_physical_node - Return the physical node of the first match of ACPI device
+ * @hid: Hardware ID of the device.
+ * @uid: Unique ID of the device, pass NULL to not check _UID
+ * @hrv: Hardware Revision of the device, pass -1 to not check _HRV
+ *
+ * Return the physical node of the first match of ACPI device if a matching
+ * device was present at the moment of invocation, or NULL otherwise.
+ *
+ * The caller is responsible for invoking put_device() on the returned device.
+ *
+ * See additional information in acpi_dev_present() as well.
+ */
+struct device *acpi_get_first_match_physical_node(const char *hid, const char *uid, s64 hrv)
+{
+	struct acpi_device *adev;
+	struct device *dev;
+
+	adev = acpi_dev_get_first_match_dev(hid, uid, hrv);
+	if (!adev)
+		return NULL;
+
+	dev = get_device(acpi_get_first_physical_node(adev));
+	acpi_dev_put(adev);
+	return dev;
+}
+EXPORT_SYMBOL(acpi_get_first_match_physical_node);
+
 /**
  * acpi_reduced_hardware - Return if this is an ACPI-reduced-hw machine
  *
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index 0584e9f6e339..e62af2f71362 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -777,6 +777,9 @@  acpi_dev_get_first_match_dev(const char *hid, const char *uid, s64 hrv);
 	     adev;							\
 	     adev = acpi_dev_get_next_match_dev(adev, hid, uid, hrv))
 
+struct device *
+acpi_get_first_match_physical_node(const char *hid, const char *uid, s64 hrv);
+
 static inline struct acpi_device *acpi_dev_get(struct acpi_device *adev)
 {
 	return adev ? to_acpi_device(get_device(&adev->dev)) : NULL;
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index 4b12dad5a8a4..29bae77d819a 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -814,6 +814,12 @@  acpi_dev_get_first_match_dev(const char *hid, const char *uid, s64 hrv)
 	return NULL;
 }
 
+static inline struct device *
+acpi_get_first_match_physical_node(const char *hid, const char *uid, s64 hrv)
+{
+	return NULL;
+}
+
 static inline bool acpi_reduced_hardware(void)
 {
 	return false;