Commit 93064e15 authored by Stefan Binding's avatar Stefan Binding Committed by Mark Brown

ACPI: utils: Add api to read _SUB from ACPI

Add a wrapper function to read the _SUB string from ACPI.
Signed-off-by: default avatarStefan Binding <sbinding@opensource.cirrus.com>
Acked-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://lore.kernel.org/r/20220707151037.3901050-2-sbinding@opensource.cirrus.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 7fb72b7b
...@@ -291,6 +291,44 @@ int acpi_get_local_address(acpi_handle handle, u32 *addr) ...@@ -291,6 +291,44 @@ int acpi_get_local_address(acpi_handle handle, u32 *addr)
} }
EXPORT_SYMBOL(acpi_get_local_address); 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_status
acpi_evaluate_reference(acpi_handle handle, acpi_evaluate_reference(acpi_handle handle,
acpi_string pathname, acpi_string pathname,
......
...@@ -762,6 +762,7 @@ static inline u64 acpi_arch_get_root_pointer(void) ...@@ -762,6 +762,7 @@ static inline u64 acpi_arch_get_root_pointer(void)
#endif #endif
int acpi_get_local_address(acpi_handle handle, u32 *addr); int acpi_get_local_address(acpi_handle handle, u32 *addr);
const char *acpi_get_subsystem_id(acpi_handle handle);
#else /* !CONFIG_ACPI */ #else /* !CONFIG_ACPI */
...@@ -1023,6 +1024,11 @@ static inline int acpi_get_local_address(acpi_handle handle, u32 *addr) ...@@ -1023,6 +1024,11 @@ static inline int acpi_get_local_address(acpi_handle handle, u32 *addr)
return -ENODEV; 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, static inline int acpi_register_wakeup_handler(int wake_irq,
bool (*wakeup)(void *context), void *context) bool (*wakeup)(void *context), void *context)
{ {
......
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