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:
Родитель
ca9dc8d42b
Коммит
2d12b6b381
|
@ -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 | \
|
||||
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,
|
||||
void (*release)(struct device *));
|
||||
void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,
|
||||
|
|
|
@ -39,7 +39,7 @@ static const char *dummy_hid = "device";
|
|||
|
||||
static LIST_HEAD(acpi_dep_list);
|
||||
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 LIST_HEAD(acpi_scan_handlers_list);
|
||||
DEFINE_MUTEX(acpi_device_lock);
|
||||
|
@ -52,12 +52,6 @@ struct acpi_dep_data {
|
|||
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)
|
||||
{
|
||||
mutex_lock(&acpi_scan_lock);
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include <linux/dynamic_debug.h>
|
||||
|
||||
#include "internal.h"
|
||||
#include "sleep.h"
|
||||
|
||||
#define _COMPONENT ACPI_BUS_COMPONENT
|
||||
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);
|
||||
|
||||
/**
|
||||
* 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
|
||||
* because __setup cannot be used in modules.
|
||||
|
|
|
@ -87,6 +87,8 @@ acpi_evaluate_dsm_typed(acpi_handle handle, const u8 *uuid, int rev, int func,
|
|||
.package.elements = (eles) \
|
||||
}
|
||||
|
||||
bool acpi_dev_present(const char *hid);
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
|
||||
#include <linux/proc_fs.h>
|
||||
|
|
Загрузка…
Ссылка в новой задаче