ACPI / utils: Add acpi_dev_present()

There's an idiom in use by 7 Linux drivers to detect the presence of a
particular ACPI HID by walking the namespace with acpi_get_devices().
The callback passed to acpi_get_devices() is mostly identical across
the drivers, leading to lots of duplicate code.

Add acpi_dev_present(), the ACPI equivalent to pci_dev_present(),
allowing us to deduplicate all that boilerplate in the drivers.

Signed-off-by: Lukas Wunner <lukas@wunner.de>
Reviewed-by: Hanjun Guo <hanjun.guo@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
Lukas Wunner 2015-11-25 21:19:55 +01:00 committed by Rafael J. Wysocki
parent ca9dc8d42b
commit 2d12b6b381
4 changed files with 42 additions and 7 deletions

View File

@ -86,6 +86,14 @@ bool acpi_scan_is_offline(struct acpi_device *adev, bool uevent);
#define ACPI_STA_DEFAULT (ACPI_STA_DEVICE_PRESENT | ACPI_STA_DEVICE_ENABLED | \ #define ACPI_STA_DEFAULT (ACPI_STA_DEVICE_PRESENT | ACPI_STA_DEVICE_ENABLED | \
ACPI_STA_DEVICE_UI | ACPI_STA_DEVICE_FUNCTIONING) ACPI_STA_DEVICE_UI | ACPI_STA_DEVICE_FUNCTIONING)
extern struct list_head acpi_bus_id_list;
struct acpi_device_bus_id{
char bus_id[15];
unsigned int instance_no;
struct list_head node;
};
int acpi_device_add(struct acpi_device *device, int acpi_device_add(struct acpi_device *device,
void (*release)(struct device *)); void (*release)(struct device *));
void acpi_init_device_object(struct acpi_device *device, acpi_handle handle, void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,

View File

@ -39,7 +39,7 @@ static const char *dummy_hid = "device";
static LIST_HEAD(acpi_dep_list); static LIST_HEAD(acpi_dep_list);
static DEFINE_MUTEX(acpi_dep_list_lock); static DEFINE_MUTEX(acpi_dep_list_lock);
static LIST_HEAD(acpi_bus_id_list); LIST_HEAD(acpi_bus_id_list);
static DEFINE_MUTEX(acpi_scan_lock); static DEFINE_MUTEX(acpi_scan_lock);
static LIST_HEAD(acpi_scan_handlers_list); static LIST_HEAD(acpi_scan_handlers_list);
DEFINE_MUTEX(acpi_device_lock); DEFINE_MUTEX(acpi_device_lock);
@ -52,12 +52,6 @@ struct acpi_dep_data {
acpi_handle slave; acpi_handle slave;
}; };
struct acpi_device_bus_id{
char bus_id[15];
unsigned int instance_no;
struct list_head node;
};
void acpi_scan_lock_acquire(void) void acpi_scan_lock_acquire(void)
{ {
mutex_lock(&acpi_scan_lock); mutex_lock(&acpi_scan_lock);

View File

@ -29,6 +29,7 @@
#include <linux/dynamic_debug.h> #include <linux/dynamic_debug.h>
#include "internal.h" #include "internal.h"
#include "sleep.h"
#define _COMPONENT ACPI_BUS_COMPONENT #define _COMPONENT ACPI_BUS_COMPONENT
ACPI_MODULE_NAME("utils"); ACPI_MODULE_NAME("utils");
@ -709,6 +710,36 @@ bool acpi_check_dsm(acpi_handle handle, const u8 *uuid, int rev, u64 funcs)
} }
EXPORT_SYMBOL(acpi_check_dsm); EXPORT_SYMBOL(acpi_check_dsm);
/**
* acpi_dev_present - Detect presence of a given ACPI device in the system.
* @hid: Hardware ID of the device.
*
* Return %true if the device was present at the moment of invocation.
* Note that if the device is pluggable, it may since have disappeared.
*
* For this function to work, acpi_bus_scan() must have been executed
* which happens in the subsys_initcall() subsection. Hence, do not
* call from a subsys_initcall() or earlier (use acpi_get_devices()
* instead). Calling from module_init() is fine (which is synonymous
* with device_initcall()).
*/
bool acpi_dev_present(const char *hid)
{
struct acpi_device_bus_id *acpi_device_bus_id;
bool found = false;
mutex_lock(&acpi_device_lock);
list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node)
if (!strcmp(acpi_device_bus_id->bus_id, hid)) {
found = true;
break;
}
mutex_unlock(&acpi_device_lock);
return found;
}
EXPORT_SYMBOL(acpi_dev_present);
/* /*
* 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.

View File

@ -87,6 +87,8 @@ acpi_evaluate_dsm_typed(acpi_handle handle, const u8 *uuid, int rev, int func,
.package.elements = (eles) \ .package.elements = (eles) \
} }
bool acpi_dev_present(const char *hid);
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
#include <linux/proc_fs.h> #include <linux/proc_fs.h>