Commit 67dcf8a3 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Rafael J. Wysocki

ACPI: utils: Introduce acpi_dev_get_first_match_name()

Sometimes the user wants to have device name of the match rather than
just checking if device present or not. To make life easier for such
users introduce acpi_dev_get_first_match_name() helper based on code
for acpi_dev_present().

For example, GPIO driver for Intel Merrifield needs to know the device
name of pin control to be able to apply GPIO mapping table to the proper
device.

To be more consistent with the purpose rename

  struct acpi_dev_present_info  -> struct acpi_dev_match_info
  acpi_dev_present_cb()         -> acpi_dev_match_cb()

in the utils.c file.
Tested-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent b2cd1df6
...@@ -737,16 +737,17 @@ bool acpi_dev_found(const char *hid) ...@@ -737,16 +737,17 @@ bool acpi_dev_found(const char *hid)
} }
EXPORT_SYMBOL(acpi_dev_found); EXPORT_SYMBOL(acpi_dev_found);
struct acpi_dev_present_info { struct acpi_dev_match_info {
const char *dev_name;
struct acpi_device_id hid[2]; struct acpi_device_id hid[2];
const char *uid; const char *uid;
s64 hrv; s64 hrv;
}; };
static int acpi_dev_present_cb(struct device *dev, void *data) static int acpi_dev_match_cb(struct device *dev, void *data)
{ {
struct acpi_device *adev = to_acpi_device(dev); struct acpi_device *adev = to_acpi_device(dev);
struct acpi_dev_present_info *match = data; struct acpi_dev_match_info *match = data;
unsigned long long hrv; unsigned long long hrv;
acpi_status status; acpi_status status;
...@@ -757,6 +758,8 @@ static int acpi_dev_present_cb(struct device *dev, void *data) ...@@ -757,6 +758,8 @@ static int acpi_dev_present_cb(struct device *dev, void *data)
strcmp(adev->pnp.unique_id, match->uid))) strcmp(adev->pnp.unique_id, match->uid)))
return 0; return 0;
match->dev_name = acpi_dev_name(adev);
if (match->hrv == -1) if (match->hrv == -1)
return 1; return 1;
...@@ -789,20 +792,44 @@ static int acpi_dev_present_cb(struct device *dev, void *data) ...@@ -789,20 +792,44 @@ static int acpi_dev_present_cb(struct device *dev, void *data)
*/ */
bool acpi_dev_present(const char *hid, const char *uid, s64 hrv) bool acpi_dev_present(const char *hid, const char *uid, s64 hrv)
{ {
struct acpi_dev_present_info match = {}; struct acpi_dev_match_info match = {};
struct device *dev; struct device *dev;
strlcpy(match.hid[0].id, hid, sizeof(match.hid[0].id)); strlcpy(match.hid[0].id, hid, sizeof(match.hid[0].id));
match.uid = uid; match.uid = uid;
match.hrv = hrv; match.hrv = hrv;
dev = bus_find_device(&acpi_bus_type, NULL, &match, dev = bus_find_device(&acpi_bus_type, NULL, &match, acpi_dev_match_cb);
acpi_dev_present_cb);
return !!dev; return !!dev;
} }
EXPORT_SYMBOL(acpi_dev_present); EXPORT_SYMBOL(acpi_dev_present);
/**
* acpi_dev_get_first_match_name - Return name of 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 device name if a matching device was present
* at the moment of invocation, or NULL otherwise.
*
* See additional information in acpi_dev_present() as well.
*/
const char *
acpi_dev_get_first_match_name(const char *hid, const char *uid, s64 hrv)
{
struct acpi_dev_match_info match = {};
struct device *dev;
strlcpy(match.hid[0].id, hid, sizeof(match.hid[0].id));
match.uid = uid;
match.hrv = hrv;
dev = bus_find_device(&acpi_bus_type, NULL, &match, acpi_dev_match_cb);
return dev ? match.dev_name : NULL;
}
EXPORT_SYMBOL(acpi_dev_get_first_match_name);
/* /*
* acpi_backlight= handling, this is done here rather then in video_detect.c * acpi_backlight= handling, this is done here rather then in video_detect.c
* because __setup cannot be used in modules. * because __setup cannot be used in modules.
......
...@@ -91,6 +91,9 @@ acpi_evaluate_dsm_typed(acpi_handle handle, const guid_t *guid, u64 rev, ...@@ -91,6 +91,9 @@ acpi_evaluate_dsm_typed(acpi_handle handle, const guid_t *guid, u64 rev,
bool acpi_dev_found(const char *hid); bool acpi_dev_found(const char *hid);
bool acpi_dev_present(const char *hid, const char *uid, s64 hrv); bool acpi_dev_present(const char *hid, const char *uid, s64 hrv);
const char *
acpi_dev_get_first_match_name(const char *hid, const char *uid, s64 hrv);
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
......
...@@ -640,6 +640,12 @@ static inline bool acpi_dev_present(const char *hid, const char *uid, s64 hrv) ...@@ -640,6 +640,12 @@ static inline bool acpi_dev_present(const char *hid, const char *uid, s64 hrv)
return false; return false;
} }
static inline const char *
acpi_dev_get_first_match_name(const char *hid, const char *uid, s64 hrv)
{
return NULL;
}
static inline bool is_acpi_node(struct fwnode_handle *fwnode) static inline bool is_acpi_node(struct fwnode_handle *fwnode)
{ {
return false; return false;
......
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