ACPI: utils: Add api to read _SUB from ACPI
Add a wrapper function to read the _SUB string from ACPI. Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Link: https://lore.kernel.org/r/20220707151037.3901050-2-sbinding@opensource.cirrus.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
7fb72b7bf1
commit
93064e15c8
|
@ -291,6 +291,44 @@ int acpi_get_local_address(acpi_handle handle, u32 *addr)
|
|||
}
|
||||
EXPORT_SYMBOL(acpi_get_local_address);
|
||||
|
||||
#define ACPI_MAX_SUB_BUF_SIZE 9
|
||||
|
||||
const char *acpi_get_subsystem_id(acpi_handle handle)
|
||||
{
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
union acpi_object *obj;
|
||||
acpi_status status;
|
||||
const char *sub;
|
||||
size_t len;
|
||||
|
||||
status = acpi_evaluate_object(handle, METHOD_NAME__SUB, NULL, &buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_handle_debug(handle, "Reading ACPI _SUB failed: %#x\n", status);
|
||||
return ERR_PTR(-ENODATA);
|
||||
}
|
||||
|
||||
obj = buffer.pointer;
|
||||
if (obj->type == ACPI_TYPE_STRING) {
|
||||
len = strlen(obj->string.pointer);
|
||||
if (len < ACPI_MAX_SUB_BUF_SIZE && len > 0) {
|
||||
sub = kstrdup(obj->string.pointer, GFP_KERNEL);
|
||||
if (!sub)
|
||||
sub = ERR_PTR(-ENOMEM);
|
||||
} else {
|
||||
acpi_handle_err(handle, "ACPI _SUB Length %zu is Invalid\n", len);
|
||||
sub = ERR_PTR(-ENODATA);
|
||||
}
|
||||
} else {
|
||||
acpi_handle_warn(handle, "Warning ACPI _SUB did not return a string\n");
|
||||
sub = ERR_PTR(-ENODATA);
|
||||
}
|
||||
|
||||
acpi_os_free(buffer.pointer);
|
||||
|
||||
return sub;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_get_subsystem_id);
|
||||
|
||||
acpi_status
|
||||
acpi_evaluate_reference(acpi_handle handle,
|
||||
acpi_string pathname,
|
||||
|
|
|
@ -762,6 +762,7 @@ static inline u64 acpi_arch_get_root_pointer(void)
|
|||
#endif
|
||||
|
||||
int acpi_get_local_address(acpi_handle handle, u32 *addr);
|
||||
const char *acpi_get_subsystem_id(acpi_handle handle);
|
||||
|
||||
#else /* !CONFIG_ACPI */
|
||||
|
||||
|
@ -1023,6 +1024,11 @@ static inline int acpi_get_local_address(acpi_handle handle, u32 *addr)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline const char *acpi_get_subsystem_id(acpi_handle handle)
|
||||
{
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
static inline int acpi_register_wakeup_handler(int wake_irq,
|
||||
bool (*wakeup)(void *context), void *context)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue